Remove lookupVirtualTarget
Bug: 147578480
Bug: 140204899
Change-Id: If91e2e9bbdb6d5dc6bee2986c6d9edd298fd1b3a
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index a384ebc..ab5707a 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -91,7 +91,9 @@
@Override
public boolean registerInvokeVirtual(DexMethod method) {
- DexEncodedMethod target = appInfo.lookupVirtualTarget(method.holder, method);
+ ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
+ DexEncodedMethod target =
+ resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
if (target != null && target.method != method) {
addType(method.holder);
addMethod(target.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 666bc88..4e3df21 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -257,21 +257,6 @@
}
/**
- * Lookup virtual method starting in type and following the super chain.
- *
- * <p>This method will resolve the method on the holder of {@code method} and only return a
- * non-null value if the result of resolution was a virtual target.
- *
- * <p>TODO(b/140204899): Delete this method as it does resolution and not a "lookup of targets".
- */
- public DexEncodedMethod lookupVirtualTarget(DexType type, DexMethod method) {
- assert checkIfObsolete();
- assert type.isClassType() || type.isArrayType();
- ResolutionResult resolutionResult = resolveMethod(type, method);
- return resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
- }
-
- /**
* Implements resolution of a method descriptor against a target type.
*
* <p>This method will query the definition of the holder to decide on which resolution to use. If
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index dc425e4..b65b164 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -29,6 +29,7 @@
import com.android.tools.r8.graph.GraphLense.GraphLenseLookupResult;
import com.android.tools.r8.graph.GraphLense.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.GraphLense.RewrittenPrototypeDescription.RemovedArgumentsInfo;
+import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.graph.UseRegistry.MethodHandleUse;
import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
import com.android.tools.r8.ir.analysis.type.DestructivePhiTypeUpdater;
@@ -626,7 +627,9 @@
// Virtual invoke is already as specific as it can get.
return target;
}
- DexEncodedMethod newTarget = appView.appInfo().lookupVirtualTarget(receiverType, target);
+ ResolutionResult resolutionResult = appView.appInfo().resolveMethod(receiverType, target);
+ DexEncodedMethod newTarget =
+ resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
if (newTarget == null || newTarget.method == target) {
// Most likely due to a missing class, or invoke is already as specific as it gets.
return target;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
index c2fe04f..5af6c6f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
@@ -599,10 +600,12 @@
return candidateInfo.invalidate();
}
AppInfoWithLiveness appInfo = appView.appInfo();
+ ResolutionResult resolutionResult =
+ appInfo.resolveMethod(methodReferenced.holder, methodReferenced);
DexEncodedMethod methodInvoked =
user.isInvokeDirect()
- ? appInfo.lookupDirectTarget(methodReferenced, candidateInfo.candidate)
- : appInfo.lookupVirtualTarget(methodReferenced.holder, methodReferenced);
+ ? resolutionResult.lookupInvokeDirectTarget(candidateInfo.candidate, appInfo)
+ : resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
if (ListUtils.lastIndexMatching(invoke.inValues(), isAliasedValue) == 0
&& methodInvoked != null
&& methodInvoked.method.holder == candidateInfo.candidate.type) {
diff --git a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
index 03c8d70..07db6bd 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.graph;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -81,7 +82,11 @@
CodeInspector inspector = new CodeInspector(appInfo.app());
DexEncodedMethod method = getMethod(inspector, DEFAULT_CLASS_NAME, "int", "x",
ImmutableList.of());
- assertNull(appInfo.lookupVirtualTarget(method.method.holder, method.method));
+ assertFalse(
+ appInfo
+ .resolveMethod(method.method.holder, method.method)
+ .getSingleTarget()
+ .isVirtualMethod());
assertNull(appInfo.lookupDirectTarget(method.method, method.method.holder));
assertNotNull(appInfo.lookupStaticTarget(method.method, method.method.holder));
@@ -162,9 +167,13 @@
DexMethod methodXOnTest =
appInfo.dexItemFactory().createMethod(classTest, methodXProto, methodXName);
- assertNull(appInfo.lookupVirtualTarget(classTestSuper, methodXOnTestSuper));
- assertNull(appInfo.lookupVirtualTarget(classTest, methodXOnTestSuper));
- assertNull(appInfo.lookupVirtualTarget(classTest, methodXOnTest));
+ assertFalse(
+ appInfo
+ .resolveMethod(classTestSuper, methodXOnTestSuper)
+ .getSingleTarget()
+ .isVirtualMethod());
+ assertNull(appInfo.resolveMethod(classTest, methodXOnTestSuper).getSingleTarget());
+ assertNull(appInfo.resolveMethod(classTest, methodXOnTest).getSingleTarget());
assertNull(appInfo.lookupDirectTarget(methodXOnTestSuper, methodXOnTestSuper.holder));
assertNull(appInfo.lookupDirectTarget(methodXOnTest, methodXOnTest.holder));
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
index c2a5c6a..cffd09c 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
@@ -56,7 +56,7 @@
private void testVirtualLookup(DexProgramClass clazz, DexEncodedMethod method) {
// Check lookup will produce the same result.
DexMethod id = method.method;
- assertEquals(appInfo.lookupVirtualTarget(id.holder, method.method), method);
+ assertEquals(appInfo.resolveMethod(id.holder, method.method).getSingleTarget(), method);
// Check lookup targets with include method.
Set<DexEncodedMethod> targets =
diff --git a/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
index d8944f1..6162b15 100644
--- a/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
@@ -49,17 +49,23 @@
factory.createArrayType(2, fooType)
};
DexEncodedMethod langObjectNotifyMethod =
- appInfo.lookupVirtualTarget(
- fooType,
- factory.createMethod(fooType, factory.createProto(factory.voidType), "notify"));
+ appInfo
+ .resolveMethod(
+ fooType,
+ factory.createMethod(fooType, factory.createProto(factory.voidType), "notify"))
+ .getSingleTarget();
for (DexType arrType : arrayTypes) {
assertNull(
- appInfo.lookupVirtualTarget(
- arrType, factory.createMethod(arrType, factory.createProto(arrType), "clone")));
+ appInfo
+ .resolveMethod(
+ arrType, factory.createMethod(arrType, factory.createProto(arrType), "clone"))
+ .getSingleTarget());
DexEncodedMethod target =
- appInfo.lookupVirtualTarget(
- arrType,
- factory.createMethod(arrType, factory.createProto(factory.voidType), "notify"));
+ appInfo
+ .resolveMethod(
+ arrType,
+ factory.createMethod(arrType, factory.createProto(factory.voidType), "notify"))
+ .getSingleTarget();
assertEquals(langObjectNotifyMethod, target);
}
}