// 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.graph;

public interface DexDefinitionSupplier {

  /**
   * Lookup for the definition of a type independent of context.
   *
   * <p>This will make use of the compilers program, library and classpath precedence.
   *
   * @param type Type to look up the defintion for.
   * @return Definition of the type or null if no definition exists.
   */
  default DexClass contextIndependentDefinitionFor(DexType type) {
    return definitionFor(type);
  }

  /**
   * Lookup for the definition(s) of a type independent of context.
   *
   * <p>This will return multiple results if found in the precedence of library, program and
   * classpath.
   *
   * @param type Type to look up the definition for.
   * @return A {@link ClassResolutionResult} describing the result.
   */
  ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type);

  /**
   * Lookup for the definition of a type from a given context.
   *
   * <p>This ensures that a context overrides the usual lookup precedence if looking up itself.
   *
   * @param type Type to look up a definition for.
   * @param context Context from which the lookup is taking place.
   * @return Definition of the type or null if no definition exists.
   */
  default DexClass definitionFor(DexType type, DexProgramClass context) {
    return type == context.type ? context : contextIndependentDefinitionFor(type);
  }

  default DexClass definitionFor(DexType type, ProgramMethod context) {
    return definitionFor(type, context.getHolder());
  }

  /**
   * Lookup for the program definition of a type from a given context.
   *
   * <p>This ensures that a context overrides the usual lookup precedence if looking up itself.
   *
   * @param type Type to look up a definition for.
   * @param context Context from which the lookup is taking place.
   * @return Definition of the type if it is a program type or null if not or no definition exists.
   */
  default DexProgramClass programDefinitionFor(DexType type, DexProgramClass context) {
    return DexProgramClass.asProgramClassOrNull(definitionFor(type, context));
  }

  default DexProgramClass programDefinitionFor(DexType type, ProgramMethod context) {
    return programDefinitionFor(type, context.getHolder());
  }

  default <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
      DexClass definitionForHolder(DexEncodedMember<D, R> member, ProgramMethod context) {
    return definitionForHolder(member.getReference(), context.getHolder());
  }

  default <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
      DexClass definitionForHolder(DexEncodedMember<D, R> member, DexProgramClass context) {
    return definitionForHolder(member.getReference(), context);
  }

  default <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
      DexClass definitionForHolder(DexMember<D, R> member, ProgramMethod context) {
    return definitionFor(member.holder, context.getHolder());
  }

  default <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
      DexClass definitionForHolder(DexMember<D, R> member, DexProgramClass context) {
    return definitionFor(member.holder, context);
  }

  // Use definitionFor with a context or contextIndependentDefinitionFor without.
  @Deprecated
  DexClass definitionFor(DexType type);

  default DexClassAndMethod definitionFor(DexMethod method) {
    DexClass holder = definitionFor(method.getHolderType());
    return holder != null ? holder.lookupClassMethod(method) : null;
  }

  default ClassResolutionResult definitionForWithResolutionResult(
      DexType type, DexProgramClass context) {
    assert context.type != type || ClassResolutionResult.builder().add(context).build() == context;
    return context.type == type
        ? context
        : contextIndependentDefinitionForWithResolutionResult(type);
  }

  // Use programDefinitionFor with a context.
  @Deprecated
  default DexProgramClass definitionForProgramType(DexType type) {
    return DexProgramClass.asProgramClassOrNull(definitionFor(type));
  }

  // Use definitionForHolder with a context.
  @Deprecated
  default <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
      DexClass definitionForHolder(DexMember<D, R> member) {
    return definitionFor(member.holder);
  }

  DexItemFactory dexItemFactory();
}
