// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.android.tools.r8.retrace;

import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.Keep;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.TypeReference;
import com.android.tools.r8.retrace.internal.RetracerImpl;
import java.util.OptionalInt;

/** This is the main api interface for retrace. */
@Keep
public interface Retracer {

  RetraceClassResult retraceClass(ClassReference classReference);

  RetraceMethodResult retraceMethod(MethodReference methodReference);

  /**
   * Retrace a stack trace frame without knowing the full method signature.
   *
   * <p>This method retraces a frame of the format:
   *
   * <pre>
   *   [callee-frame-or-exception-line]
   *   com.example.Type.method(SourceFile:line)
   * </pre>
   *
   * where the context parameter described below is obtained from retracing the preceeding line
   * `callee-frame-or-exception-line`
   *
   * @param context The context of this frame as defined by the frame preceding it, i.e., the
   *     context obtained by retracing the callee frame (or exception line), with the rest of the
   *     arguments being those that represent the caller frame.
   * @param position The optional line/pc information of the frame.
   * @param classReference The class/holder information of the frame.
   * @param methodName The method name information of the frame. If the full method signature is
   *     known, the alternative retraceFrame method should be used instead.
   * @return The possibly ambiguous result of retracing the frame.
   */
  RetraceFrameResult retraceFrame(
      RetraceStackTraceContext context,
      OptionalInt position,
      ClassReference classReference,
      String methodName);

  /**
   * Retrace a stack frame with full method signature information.
   *
   * <p>Apart from having the full method signature this is the same as retracing without it.
   *
   * @param context The context of this frame as defined by the frame preceding it, i.e., the
   *     context obtained by retracing the callee frame (or exception line), with the rest of the
   *     arguments being those that represent the caller frame.
   * @param position The optional line/pc information of the frame.
   * @param methodReference The qualified method reference information of the frame.
   * @return The possibly ambiguous result of retracing the frame.
   */
  RetraceFrameResult retraceFrame(
      RetraceStackTraceContext context, OptionalInt position, MethodReference methodReference);

  RetraceFieldResult retraceField(FieldReference fieldReference);

  RetraceTypeResult retraceType(TypeReference typeReference);

  RetraceThrownExceptionResult retraceThrownException(ClassReference exception);

  static Retracer createDefault(
      ProguardMapProducer proguardMapProducer, DiagnosticsHandler diagnosticsHandler) {
    try {
      ProguardMappingProvider mappingProvider =
          ProguardMappingProvider.builder()
              .setProguardMapProducer(proguardMapProducer)
              .setDiagnosticsHandler(diagnosticsHandler)
              .allowLookupAllClasses()
              .build();
      return Retracer.builder()
          .setMappingProvider(mappingProvider)
          .setDiagnosticsHandler(diagnosticsHandler)
          .build();
    } catch (Exception e) {
      throw new InvalidMappingFileException(e);
    }
  }

  static RetracerBuilder builder() {
    return RetracerImpl.builder();
  }
}
