blob: 69685918815862f62d891c629658f29b0d867b11 [file] [log] [blame]
// 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();
}