Remove definitionFor(DexMethod)
Change-Id: I678677fe001c1dae361f2bde41e739c34bd82908
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index 5fe37ab..c94d67c 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -120,7 +120,7 @@
@Override
public boolean registerInvokeStatic(DexMethod method) {
- DexEncodedMethod target = appInfo.lookupStaticTarget(method, context);
+ DexEncodedMethod target = appInfo.unsafeResolveMethodDueToDexFormat(method).getSingleTarget();
if (target != null && target.method != method) {
addType(method.holder);
addMethod(target.method);
@@ -148,13 +148,13 @@
@Override
public boolean registerInstanceFieldWrite(DexField field) {
- addField(field, false);
+ addField(field);
return false;
}
@Override
public boolean registerInstanceFieldRead(DexField field) {
- addField(field, false);
+ addField(field);
return false;
}
@@ -166,13 +166,13 @@
@Override
public boolean registerStaticFieldRead(DexField field) {
- addField(field, true);
+ addField(field);
return false;
}
@Override
public boolean registerStaticFieldWrite(DexField field) {
- addField(field, true);
+ addField(field);
return false;
}
@@ -200,10 +200,9 @@
return descriptors.contains(type.toDescriptorString());
}
- private void addField(DexField field, boolean isStatic) {
+ private void addField(DexField field) {
addType(field.type);
- DexEncodedField baseField =
- isStatic ? appInfo.lookupStaticTarget(field) : appInfo.lookupInstanceTarget(field);
+ DexEncodedField baseField = appInfo.resolveField(field).getResolvedField();
if (baseField != null && baseField.holder() != field.holder) {
field = baseField.field;
}
@@ -229,13 +228,14 @@
addType(method.proto.returnType);
Set<DexMethod> typeMethods = methods.get(method.holder);
if (typeMethods != null) {
- DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
- assert encodedMethod != null : "Could not find method " + method.toString();
+ DexClass holder = appInfo.definitionForHolder(method);
+ DexEncodedMethod definition = method.lookupOnClass(holder);
+ assert definition != null : "Could not find method " + method.toString();
if (!allowObfuscation) {
noObfuscationTypes.add(method.holder);
}
- if (encodedMethod.accessFlags.isVisibilityDependingOnPackage()) {
- keepPackageNames.add(encodedMethod.holder().getPackageName());
+ if (definition.accessFlags.isVisibilityDependingOnPackage()) {
+ keepPackageNames.add(definition.holder().getPackageName());
}
typeMethods.add(method);
}
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 3706dec..60b8220 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -161,21 +161,6 @@
return definition == null ? Origin.unknown() : definition.origin;
}
- @Deprecated
- @Override
- public DexEncodedMethod definitionFor(DexMethod method) {
- assert checkIfObsolete();
- assert method.holder.isClassType();
- if (!method.holder.isClassType()) {
- return null;
- }
- DexClass clazz = definitionFor(method.holder);
- if (clazz == null) {
- return null;
- }
- return clazz.getMethodCollection().getMethod(method);
- }
-
/**
* Lookup static method on the method holder, or answers null.
*
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index b4534f5..9763f50 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -226,12 +226,6 @@
return this.sourceDebugExtensions.get(clazz);
}
- @Deprecated
- @Override
- public final DexEncodedMethod definitionFor(DexMethod method) {
- return appInfo().definitionFor(method);
- }
-
@Override
public final DexClass definitionFor(DexType type) {
return appInfo().definitionFor(type);
diff --git a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
index 214e41c..2ec6dbf 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
@@ -6,9 +6,6 @@
public interface DexDefinitionSupplier {
- @Deprecated
- DexEncodedMethod definitionFor(DexMethod method);
-
DexClass definitionFor(DexType type);
DexProgramClass definitionForProgramType(DexType type);
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 95922dc..ab9be40 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -73,13 +73,6 @@
return classpathClasses;
}
- @Deprecated
- @Override
- public DexEncodedMethod definitionFor(DexMethod method) {
- DexClass clazz = definitionFor(method.holder);
- return clazz != null ? clazz.lookupMethod(method) : null;
- }
-
@Override
public DexClass definitionFor(DexType type) {
assert type.isClassType() : "Cannot lookup definition for type: " + type;
diff --git a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
index 5a8f39f..3c7b2d8 100644
--- a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
+++ b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
@@ -21,7 +21,7 @@
}
void checkClass(DexClass clazz) {
- if (pinnedPredicate.isPinned(clazz.type)) {
+ if (pinnedPredicate.isPinned(clazz)) {
if (pinnedInstantiations == null) {
pinnedInstantiations = Sets.newIdentityHashSet();
}
@@ -30,7 +30,7 @@
}
void checkMethod(DexEncodedMethod method) {
- if (pinnedPredicate.isPinned(method.method)) {
+ if (pinnedPredicate.isPinned(method)) {
if (pinnedMethods == null) {
pinnedMethods = Sets.newIdentityHashSet();
}
@@ -70,7 +70,7 @@
}
DexEncodedMethod methodInClass = parent.lookupVirtualMethod(method);
if (methodInClass != null
- && (parent.isNotProgramClass() || pinnedPredicate.isPinned(methodInClass.method))) {
+ && (parent.isNotProgramClass() || pinnedPredicate.isPinned(methodInClass))) {
return true;
}
if (parent.superType != null) {
diff --git a/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java b/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
index d81becc..5828fd5 100644
--- a/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
+++ b/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
@@ -7,5 +7,5 @@
@FunctionalInterface
public interface PinnedPredicate {
- boolean isPinned(DexReference reference);
+ boolean isPinned(DexDefinition reference);
}
diff --git a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
index 4e96594..d8eab37 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -372,8 +372,7 @@
// This is assuming that the method is accessible, which implies self/nest access.
// Only include if the target has code or is native.
boolean isIncomplete =
- pinnedPredicate.isPinned(resolvedHolder.type)
- && pinnedPredicate.isPinned(resolvedMethod.method);
+ pinnedPredicate.isPinned(resolvedHolder) && pinnedPredicate.isPinned(resolvedMethod);
return LookupResult.createResult(
Collections.singletonMap(
resolvedMethod, DexClassAndMethod.create(resolvedHolder, resolvedMethod)),
@@ -541,18 +540,17 @@
LambdaDescriptor lambdaInstance, AppInfoWithClassHierarchy appInfo) {
if (lambdaInstance.getMainMethod().match(resolvedMethod)) {
DexMethod method = lambdaInstance.implHandle.asMethod();
- DexClass holder = appInfo.definitionFor(method.holder);
+ DexClass holder = appInfo.definitionForHolder(method);
if (holder == null) {
assert false;
return null;
}
- DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
- if (encodedMethod == null) {
+ DexEncodedMethod definition = holder.lookupMethod(method);
+ if (definition == null) {
// The targeted method might not exist, eg, Throwable.addSuppressed in an old library.
return null;
}
- return new LookupLambdaTarget(
- lambdaInstance, DexClassAndMethod.create(holder, encodedMethod));
+ return new LookupLambdaTarget(lambdaInstance, DexClassAndMethod.create(holder, definition));
}
return lookupMaximallySpecificDispatchTarget(lambdaInstance, appInfo);
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
index 41f5dc8..416f064 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
@@ -297,7 +297,9 @@
return false;
}
}
- DexEncodedMethod method = appView.definitionFor(instruction.getInvokedMethod());
+ DexMethod invokedMethod = instruction.getInvokedMethod();
+ DexClass holder = appView.definitionForHolder(invokedMethod);
+ DexEncodedMethod method = invokedMethod.lookupOnClass(holder);
return method != null && isTypeInitializedBy(instruction, type, method, appView, mode);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
index 00c88b8..e89d9b0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -117,10 +117,10 @@
return result;
}
// Allow optimizing static library invokes in D8.
- DexClass clazz = appView.definitionFor(getInvokedMethod().holder);
+ DexClass clazz = appView.definitionForHolder(getInvokedMethod());
if (clazz != null
&& (clazz.isLibraryClass() || appView.libraryMethodOptimizer().isModeled(clazz.type))) {
- return appView.definitionFor(getInvokedMethod());
+ return clazz.lookupMethod(getInvokedMethod());
}
// In D8, we can treat invoke-static instructions as having a single target if the invoke is
// targeting a method in the enclosing class.
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
index 2d95115..951a451 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -130,7 +130,7 @@
DexClass clazz = appView.definitionFor(holder);
if (clazz != null
&& (clazz.isLibraryClass() || appView.libraryMethodOptimizer().isModeled(clazz.type))) {
- DexEncodedMethod singleTargetCandidate = appView.definitionFor(method);
+ DexEncodedMethod singleTargetCandidate = clazz.lookupMethod(method);
if (singleTargetCandidate != null && (clazz.isFinal() || singleTargetCandidate.isFinal())) {
return singleTargetCandidate;
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index fbeff68..f1c403b 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.conversion;
+import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
@@ -126,10 +128,10 @@
.reprocess
.forEach(
reference -> {
- DexEncodedMethod definition = appView.definitionFor(reference);
+ DexProgramClass clazz =
+ asProgramClassOrNull(appView.definitionForHolder(reference));
+ DexEncodedMethod definition = reference.lookupOnClass(clazz);
if (definition != null) {
- DexProgramClass clazz =
- appView.definitionForHolder(definition).asProgramClass();
set.createAndAdd(clazz, definition);
}
});
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index 9e270af..8a25765 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -44,6 +44,7 @@
import static com.android.tools.r8.ir.code.Opcodes.XOR;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
@@ -549,7 +550,8 @@
{
InvokeDirect invoke = instruction.asInvokeDirect();
DexMethod invokedMethod = invoke.getInvokedMethod();
- DexEncodedMethod singleTarget = appView.definitionFor(invokedMethod);
+ DexClass holder = appView.definitionForHolder(invokedMethod);
+ DexEncodedMethod singleTarget = invokedMethod.lookupOnClass(holder);
if (singleTarget == null) {
return null;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
index 92c78af..e7e0fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
@@ -7,6 +7,7 @@
import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
@@ -101,10 +102,11 @@
}
private DexEncodedMethod lookupMethod(DexMethod method) {
- DexEncodedMethod encodedMethod = appView.definitionFor(method);
- if (encodedMethod != null) {
+ DexClass holder = appView.definitionForHolder(method);
+ DexEncodedMethod definition = method.lookupOnClass(holder);
+ if (definition != null) {
modeledLibraryTypes.add(method.holder);
- return encodedMethod;
+ return definition;
}
return null;
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index ba814e9..680bd5c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -121,11 +121,6 @@
}
@Override
- public DexEncodedMethod definitionFor(DexMethod method) {
- throw new Unreachable("Should not be called");
- }
-
- @Override
public DexClass definitionFor(DexType type) {
// TODO(b/157700128) Metadata cannot at this point keep anything alive. Therefore, if a type
// has been pruned it may still be referenced, so we do an early check here to ensure it will
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 87bfd9a..f617c31 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexClasspathClass;
+import com.android.tools.r8.graph.DexDefinition;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
@@ -1338,22 +1339,17 @@
return isInstantiatedDirectly(clazz) || isPinned(clazz.type) || isInstantiatedInterface(clazz);
}
- public boolean isPinnedNotProgramOrLibraryOverride(DexReference reference) {
- if (isPinned(reference)) {
+ public boolean isPinnedNotProgramOrLibraryOverride(DexDefinition definition) {
+ if (isPinned(definition.toReference())) {
return true;
}
- if (reference.isDexMethod()) {
- DexEncodedMethod method = definitionFor(reference.asDexMethod());
- return method == null
- || !method.isProgramMethod(this)
- || method.isLibraryMethodOverride().isPossiblyTrue();
- } else {
- assert reference.isDexType();
- DexClass clazz = definitionFor(reference.asDexType());
- return clazz == null
- || clazz.isNotProgramClass()
- || isInstantiatedInterface(clazz.asProgramClass());
+ if (definition.isDexEncodedMethod()) {
+ DexEncodedMethod method = definition.asDexEncodedMethod();
+ return !method.isProgramMethod(this) || method.isLibraryMethodOverride().isPossiblyTrue();
}
+ assert definition.isDexClass();
+ DexClass clazz = definition.asDexClass();
+ return clazz.isNotProgramClass() || isInstantiatedInterface(clazz.asProgramClass());
}
public SubtypingInfo computeSubtypingInfo() {
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 53057cc..76c9e4c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2496,7 +2496,7 @@
(type, subTypeConsumer, lambdaConsumer) ->
objectAllocationInfoCollection.forEachInstantiatedSubType(
type, subTypeConsumer, lambdaConsumer, appInfo),
- reference -> keepInfo.isPinned(reference, appInfo))
+ definition -> keepInfo.isPinned(definition.toReference(), appInfo))
.forEach(
target ->
markVirtualDispatchTargetAsLive(
@@ -4161,12 +4161,6 @@
this.enqueuer = enqueuer;
}
- @Deprecated
- @Override
- public DexEncodedMethod definitionFor(DexMethod method) {
- return enqueuer.definitionFor(method);
- }
-
@Override
public DexClass definitionFor(DexType type) {
return enqueuer.definitionFor(type);