Extend lookupVirtualDispatchTargets with context
This is necessary for checking access.
Bug: 148271337
Change-Id: Icbc3f24bf0b6edf881709794df00a99b91232063
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithSubtyping.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithSubtyping.java
index 495c0b3..634fad0 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithSubtyping.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithSubtyping.java
@@ -36,8 +36,17 @@
@Override
public LiveSubTypeResult getLiveSubTypes(DexType type) {
// TODO(b/139464956): Remove this when we start to have live type information in the enqueuer.
+ return getLiveResult(subtypes(type));
+ }
+
+ @Override
+ public LiveSubTypeResult getLiveImmediateSubtypes(DexType type) {
+ return getLiveResult(allImmediateSubtypes(type));
+ }
+
+ private LiveSubTypeResult getLiveResult(Collection<DexType> subTypes) {
Set<DexProgramClass> programClasses = new HashSet<>();
- for (DexType subtype : subtypes(type)) {
+ for (DexType subtype : subTypes) {
DexProgramClass subClass = definitionForProgramType(subtype);
if (subClass != null) {
programClasses.add(subClass);
diff --git a/src/main/java/com/android/tools/r8/graph/LiveSubTypeInfo.java b/src/main/java/com/android/tools/r8/graph/LiveSubTypeInfo.java
index f812d7e..b3c2d3b 100644
--- a/src/main/java/com/android/tools/r8/graph/LiveSubTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/LiveSubTypeInfo.java
@@ -6,11 +6,12 @@
import java.util.Set;
-@FunctionalInterface
public interface LiveSubTypeInfo {
LiveSubTypeResult getLiveSubTypes(DexType type);
+ LiveSubTypeResult getLiveImmediateSubtypes(DexType type);
+
class LiveSubTypeResult {
private final Set<DexProgramClass> programClasses;
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 c2bd3a4..6df06b3 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -7,10 +7,12 @@
import com.android.tools.r8.graph.LiveSubTypeInfo.LiveSubTypeResult;
import com.android.tools.r8.graph.LookupResult.LookupResultSuccess.LookupResultCollectionState;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.utils.SetUtils;
import com.google.common.collect.Sets;
import java.util.Collection;
import java.util.Collections;
+import java.util.Deque;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
@@ -79,10 +81,13 @@
DexProgramClass context, AppInfoWithClassHierarchy appInfo);
public abstract LookupResult lookupVirtualDispatchTargets(
- AppView<?> appView, LiveSubTypeInfo liveSubTypes);
+ DexProgramClass context,
+ AppView<? extends AppInfoWithClassHierarchy> appView,
+ LiveSubTypeInfo liveSubTypes);
- public final LookupResult lookupVirtualDispatchTargets(AppView<AppInfoWithLiveness> appView) {
- return lookupVirtualDispatchTargets(appView, appView.appInfo());
+ public final LookupResult lookupVirtualDispatchTargets(
+ DexProgramClass context, AppView<AppInfoWithLiveness> appView) {
+ return lookupVirtualDispatchTargets(context, appView, appView.appInfo());
}
/** Result for a resolution that succeeds with a known declaration/definition. */
@@ -102,6 +107,8 @@
this.resolvedHolder = resolvedHolder;
this.resolvedMethod = resolvedMethod;
this.initialResolutionHolder = initialResolutionHolder;
+ assert !resolvedMethod.isPrivateMethod()
+ || initialResolutionHolder.type == resolvedMethod.method.holder;
}
public DexClass getResolvedHolder() {
@@ -331,130 +338,91 @@
@Override
public LookupResult lookupVirtualDispatchTargets(
- AppView<?> appView, LiveSubTypeInfo liveSubTypeInfo) {
- return initialResolutionHolder.isInterface()
- ? lookupInterfaceTargets(appView, liveSubTypeInfo)
- : lookupVirtualTargets(appView, liveSubTypeInfo);
- }
-
- // TODO(b/140204899): Leverage refined receiver type if available.
- private LookupResult lookupVirtualTargets(AppView<?> appView, LiveSubTypeInfo liveSubTypeInfo) {
- assert !initialResolutionHolder.isInterface();
+ DexProgramClass context,
+ AppView<? extends AppInfoWithClassHierarchy> appView,
+ LiveSubTypeInfo liveSubTypeInfo) {
+ // Check that the initial resolution holder is accessible from the context.
+ if (context != null && !isAccessibleFrom(context, appView.appInfo())) {
+ return LookupResult.createFailedResult();
+ }
if (resolvedMethod.isPrivateMethod()) {
// If the resolved reference is private there is no dispatch.
// This is assuming that the method is accessible, which implies self/nest access.
- return LookupResult.createResult(
- Collections.singleton(resolvedMethod), LookupResultCollectionState.Complete);
- }
- assert resolvedMethod.isNonPrivateVirtualMethod();
- // First add the target for receiver type method.type.
- Set<DexEncodedMethod> result = SetUtils.newIdentityHashSet(resolvedMethod);
- // Add all matching targets from the subclass hierarchy.
- DexMethod method = resolvedMethod.method;
- // TODO(b/140204899): Instead of subtypes of holder, we could iterate subtypes of refined
- // receiver type if available.
- for (DexProgramClass programClass :
- liveSubTypeInfo.getLiveSubTypes(method.holder).getProgramClasses()) {
- if (!programClass.isInterface()) {
- ResolutionResult methods = appView.appInfo().resolveMethodOnClass(programClass, method);
- DexEncodedMethod target = methods.getSingleTarget();
- if (target != null && target.isNonPrivateVirtualMethod()) {
- result.add(target);
- }
- }
- }
- return LookupResult.createResult(result, LookupResultCollectionState.Complete);
- }
-
- // TODO(b/140204899): Leverage refined receiver type if available.
- private LookupResult lookupInterfaceTargets(
- AppView<?> appView, LiveSubTypeInfo liveSubTypeInfo) {
- assert initialResolutionHolder.isInterface();
- if (resolvedMethod.isPrivateMethod()) {
- // If the resolved reference is private there is no dispatch.
- // This is assuming that the method is accessible, which implies self/nest access.
- assert resolvedMethod.hasCode();
+ // Only include if the target has code or is native.
return LookupResult.createResult(
Collections.singleton(resolvedMethod), LookupResultCollectionState.Complete);
}
assert resolvedMethod.isNonPrivateVirtualMethod();
Set<DexEncodedMethod> result = Sets.newIdentityHashSet();
- // Add default interface methods to the list of targets.
- //
- // This helps to make sure we take into account synthesized lambda classes
- // that we are not aware of. Like in the following example, we know that all
- // classes, XX in this case, override B::bar(), but there are also synthesized
- // classes for lambda which don't, so we still need default method to be live.
- //
- // public static void main(String[] args) {
- // X x = () -> {};
- // x.bar();
- // }
- //
- // interface X {
- // void foo();
- // default void bar() { }
- // }
- //
- // class XX implements X {
- // public void foo() { }
- // public void bar() { }
- // }
- //
- addIfDefaultMethodWithLambdaInstantiations(liveSubTypeInfo, resolvedMethod, result);
-
+ LiveSubTypeResult initialLiveImmediateSubtypes =
+ liveSubTypeInfo.getLiveImmediateSubtypes(resolvedHolder.type);
+ addVirtualDispatchTarget(this, initialLiveImmediateSubtypes.getCallSites(), result);
+ Set<DexClass> seen = new HashSet<>();
+ Deque<DexClass> workingList =
+ new LinkedList<>(initialLiveImmediateSubtypes.getProgramClasses());
DexMethod method = resolvedMethod.method;
- Consumer<DexEncodedMethod> addIfNotAbstract =
- m -> {
- if (!m.accessFlags.isAbstract()) {
- result.add(m);
- }
- };
- // Default methods are looked up when looking at a specific subtype that does not override
- // them. Otherwise, we would look up default methods that are actually never used. However, we
- // have to add bridge methods, otherwise we can remove a bridge that will be used.
- Consumer<DexEncodedMethod> addIfNotAbstractAndBridge =
- m -> {
- if (!m.accessFlags.isAbstract() && m.accessFlags.isBridge()) {
- result.add(m);
- }
- };
-
- // TODO(b/140204899): Instead of subtypes of holder, we could iterate subtypes of refined
- // receiver type if available.
- for (DexProgramClass clazz :
- liveSubTypeInfo.getLiveSubTypes(method.holder).getProgramClasses()) {
- if (clazz.isInterface()) {
- ResolutionResult targetMethods =
- appView.appInfo().resolveMethodOnInterface(clazz, method);
- if (targetMethods.isSingleResolution()) {
- // Sub-interfaces can have default implementations that override the resolved method.
- // Therefore we have to add default methods in sub interfaces.
- DexEncodedMethod singleTarget = targetMethods.getSingleTarget();
- addIfDefaultMethodWithLambdaInstantiations(liveSubTypeInfo, singleTarget, result);
- addIfNotAbstractAndBridge.accept(singleTarget);
- }
- } else {
- ResolutionResult targetMethods = appView.appInfo().resolveMethodOnClass(clazz, method);
- if (targetMethods.isSingleResolution()) {
- addIfNotAbstract.accept(targetMethods.getSingleTarget());
- }
+ while (!workingList.isEmpty()) {
+ DexClass currentClass = workingList.pop();
+ if (!seen.add(currentClass)) {
+ continue;
}
+ ResolutionResult targetMethods = appView.appInfo().resolveMethod(currentClass, method);
+ if (!targetMethods.isSingleResolution()) {
+ continue;
+ }
+ SingleResolutionResult resolutionResult = targetMethods.asSingleResolution();
+ LiveSubTypeResult liveImmediateSubtypes =
+ liveSubTypeInfo.getLiveImmediateSubtypes(currentClass.type);
+ addVirtualDispatchTarget(resolutionResult, liveImmediateSubtypes.getCallSites(), result);
+ workingList.addAll(liveImmediateSubtypes.getProgramClasses());
}
return LookupResult.createResult(result, LookupResultCollectionState.Complete);
}
- private void addIfDefaultMethodWithLambdaInstantiations(
- LiveSubTypeInfo liveSubTypesInfo, DexEncodedMethod method, Set<DexEncodedMethod> result) {
- if (method == null) {
- return;
- }
- if (method.hasCode()) {
- LiveSubTypeResult liveSubTypes = liveSubTypesInfo.getLiveSubTypes(method.method.holder);
- // TODO(b/148769279): The below is basically if (true), but should be changed when we
- // have live sub type information.
- if (liveSubTypes.getCallSites() == null || liveSubTypes.getCallSites() != null) {
- result.add(method);
+ private static void addVirtualDispatchTarget(
+ SingleResolutionResult resolutionResult,
+ Set<DexCallSite> callSites,
+ Set<DexEncodedMethod> result) {
+ assert resolutionResult != null;
+ DexEncodedMethod singleTarget = resolutionResult.resolvedMethod;
+ if (resolutionResult.resolvedHolder.isInterface()) {
+ // Add default interface methods to the list of targets.
+ //
+ // This helps to make sure we take into account synthesized lambda classes
+ // that we are not aware of. Like in the following example, we know that all
+ // classes, XX in this case, override B::bar(), but there are also synthesized
+ // classes for lambda which don't, so we still need default method to be live.
+ //
+ // public static void main(String[] args) {
+ // X x = () -> {};
+ // x.bar();
+ // }
+ //
+ // interface X {
+ // void foo();
+ // default void bar() { }
+ // }
+ //
+ // class XX implements X {
+ // public void foo() { }
+ // public void bar() { }
+ // }
+ //
+ // TODO(b/148769279): The below is basically if (true) if it is a default method, but
+ // should be changed when we have live sub type information.
+ if (singleTarget.isDefaultMethod() && (callSites == null || callSites != null)) {
+ result.add(singleTarget);
+ }
+ // Default methods are looked up when looking at a specific subtype that does not override
+ // them. Otherwise, we would look up default methods that are actually never used.
+ // However, we have to add bridge methods, otherwise we can remove a bridge that will be
+ // used.
+ if (!singleTarget.accessFlags.isAbstract() && singleTarget.accessFlags.isBridge()) {
+ result.add(singleTarget);
+ }
+ } else {
+ if (singleTarget.isNonPrivateVirtualMethod()) {
+ result.add(singleTarget);
}
}
}
@@ -488,7 +456,9 @@
@Override
public LookupResult lookupVirtualDispatchTargets(
- AppView<?> appView, LiveSubTypeInfo liveSubTypeInfo) {
+ DexProgramClass context,
+ AppView<? extends AppInfoWithClassHierarchy> appView,
+ LiveSubTypeInfo liveSubTypeInfo) {
return LookupResult.getIncompleteEmptyResult();
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
index bdba162..df0c10d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
@@ -88,7 +88,8 @@
appView
.appInfo()
.resolveMethod(method.holder, method)
- .lookupVirtualDispatchTargets(appView.withLiveness())
+ .lookupVirtualDispatchTargets(
+ appView.definitionForProgramType(invocationContext), appView.withLiveness())
.asLookupResultSuccess();
if (lookupResult == null) {
return null;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
index 56462db..2bb3869 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
@@ -169,7 +169,7 @@
ResolutionResult resolutionResult = appView.appInfo().resolveMethod(method.holder, method);
DexEncodedMethod target = resolutionResult.getSingleTarget();
if (target != null) {
- processInvokeWithDynamicDispatch(type, target);
+ processInvokeWithDynamicDispatch(type, target, context.holder);
}
} else {
DexEncodedMethod singleTarget =
@@ -190,7 +190,7 @@
}
private void processInvokeWithDynamicDispatch(
- Invoke.Type type, DexEncodedMethod encodedTarget) {
+ Invoke.Type type, DexEncodedMethod encodedTarget, DexType context) {
DexMethod target = encodedTarget.method;
DexClass clazz = appView.definitionFor(target.holder);
if (clazz == null) {
@@ -214,7 +214,8 @@
appView.appInfo().resolveMethod(method.holder, method, isInterface);
if (resolution.isVirtualTarget()) {
LookupResult lookupResult =
- resolution.lookupVirtualDispatchTargets(appView, appView.appInfo());
+ resolution.lookupVirtualDispatchTargets(
+ appView.definitionForProgramType(context), appView);
if (lookupResult.isLookupResultSuccess()) {
return lookupResult.asLookupResultSuccess().getMethodTargets();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 96819d0..70a9795 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -442,7 +442,9 @@
// For each of the actual potential targets, derive constraints based on the accessibility
// of the method itself.
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ LookupResult lookupResult =
+ resolutionResult.lookupVirtualDispatchTargets(
+ appView.definitionForProgramType(invocationContext), appView);
if (lookupResult.isLookupResultFailure()) {
return ConstraintWithTarget.NEVER;
}
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 2bffc6b..ac05da8 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2175,10 +2175,11 @@
assert resolution.holder.isProgramClass();
assert interfaceInvoke == holder.isInterface();
+ DexProgramClass context = contextOrNull == null ? null : contextOrNull.holder;
LookupResult lookupResult =
// TODO(b/140214802): Call on the resolution once proper resolution and lookup is resolved.
new SingleResolutionResult(holder, resolution.holder, resolution.method)
- .lookupVirtualDispatchTargets(appView, appInfo);
+ .lookupVirtualDispatchTargets(context, appView, appInfo);
if (!lookupResult.isLookupResultSuccess()) {
return;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 9d4b394..6646265 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -699,7 +699,7 @@
return true;
}
- private boolean methodResolutionMayChange(DexClass source, DexClass target) {
+ private boolean methodResolutionMayChange(DexProgramClass source, DexProgramClass target) {
for (DexEncodedMethod virtualSourceMethod : source.virtualMethods()) {
DexEncodedMethod directTargetMethod = target.lookupDirectMethod(virtualSourceMethod.method);
if (directTargetMethod != null) {
@@ -738,7 +738,7 @@
LookupResult lookupResult =
appInfo
.resolveMethodOnInterface(method.method.holder, method.method)
- .lookupVirtualDispatchTargets(appView, appInfo);
+ .lookupVirtualDispatchTargets(target, appView);
assert lookupResult.isLookupResultSuccess();
if (lookupResult.isLookupResultFailure()) {
return true;
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 4484311..5ffd1db 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -36,7 +37,7 @@
private AndroidApp app;
private DirectMappedDexApplication program;
private AppInfoWithSubtyping appInfo;
- private AppView<?> appView;
+ private AppView<? extends AppInfoWithClassHierarchy> appView;
@Before
public void readGMSCore() throws Exception {
@@ -64,7 +65,8 @@
// Check lookup targets with include method.
ResolutionResult resolutionResult = appInfo.resolveMethodOnClass(clazz, method.method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView, appInfo);
+ LookupResult lookupResult =
+ resolutionResult.lookupVirtualDispatchTargets(clazz, appView, appInfo);
assertTrue(lookupResult.isLookupResultSuccess());
Set<DexEncodedMethod> targets = lookupResult.asLookupResultSuccess().getMethodTargets();
assertTrue(targets.contains(method));
@@ -74,7 +76,7 @@
LookupResult lookupResult =
appInfo
.resolveMethodOnInterface(clazz, method.method)
- .lookupVirtualDispatchTargets(appView, appInfo);
+ .lookupVirtualDispatchTargets(clazz, appView, appInfo);
assertTrue(lookupResult.isLookupResultSuccess());
Set<DexEncodedMethod> targets = lookupResult.asLookupResultSuccess().getMethodTargets();
if (appInfo.subtypes(method.method.holder).stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
index ba27c33..72ede27 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
@@ -223,7 +223,10 @@
appInfo.resolveMethod(toType(invokeReceiver, appInfo), method).getSingleTarget());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
if (resolutionResult.isVirtualTarget()) {
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView, appInfo);
+ LookupResult lookupResult =
+ resolutionResult.lookupVirtualDispatchTargets(
+ appView.definitionForProgramType(buildType(Main.class, appView.dexItemFactory())),
+ appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<DexEncodedMethod> targets = lookupResult.asLookupResultSuccess().getMethodTargets();
Set<DexType> targetHolders =
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java
index 3fcc33d..27da1c4 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodAsOverrideWithLambdaTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -57,7 +58,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "bar", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java
index bdd5dd3..c8df559 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultMethodLambdaTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -55,7 +56,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "bar", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java
index 266cb48..9136188 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DefaultWithoutTopTest.java
@@ -19,6 +19,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -60,7 +61,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
@@ -102,7 +105,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java
new file mode 100644
index 0000000..da61d6a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/DuplicateImportsTest.java
@@ -0,0 +1,118 @@
+// Copyright (c) 2020, 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.resolution.interfacetargets;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NeverMerge;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.LookupResult;
+import com.android.tools.r8.graph.ResolutionResult;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.google.common.collect.ImmutableSet;
+import java.io.IOException;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** This test is testing visiting direct subtypes and finding the right targets. */
+@RunWith(Parameterized.class)
+public class DuplicateImportsTest extends TestBase {
+
+ private static final String[] EXPECTED = new String[] {"J.foo"};
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ public DuplicateImportsTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testResolution() throws Exception {
+ assumeTrue(parameters.useRuntimeAsNoneRuntime());
+ AppView<AppInfoWithLiveness> appView =
+ computeAppViewWithLiveness(
+ buildClasses(I.class, J.class, A.class, Main.class).build(), Main.class);
+ AppInfoWithLiveness appInfo = appView.appInfo();
+ DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
+ ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
+ assertTrue(lookupResult.isLookupResultSuccess());
+ Set<String> targets =
+ lookupResult.asLookupResultSuccess().getMethodTargets().stream()
+ .map(DexEncodedMethod::qualifiedName)
+ .collect(Collectors.toSet());
+ ImmutableSet<String> expected = ImmutableSet.of(J.class.getTypeName() + ".foo");
+ assertEquals(expected, targets);
+ }
+
+ @Test
+ public void testRuntime() throws IOException, CompilationFailedException, ExecutionException {
+ testForRuntime(parameters)
+ .addInnerClasses(DuplicateImportsTest.class)
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines(EXPECTED);
+ }
+
+ @Test
+ public void testR8() throws IOException, CompilationFailedException, ExecutionException {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(DuplicateImportsTest.class)
+ .enableInliningAnnotations()
+ .enableMergeAnnotations()
+ .enableNeverClassInliningAnnotations()
+ .addKeepMainRule(Main.class)
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines(EXPECTED);
+ }
+
+ @NeverMerge
+ public interface I {
+ void foo();
+ }
+
+ @NeverMerge
+ public interface J extends I {
+
+ @Override
+ @NeverInline
+ default void foo() {
+ System.out.println("J.foo");
+ }
+ }
+
+ @NeverClassInline
+ public static class A implements I, J {}
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ ((I) new A()).foo();
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceClInitTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceClInitTest.java
index 2614319..016347b 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceClInitTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceClInitTest.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.transformers.ClassTransformer;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -58,9 +59,14 @@
Main.class);
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "<clinit>", appInfo.dexItemFactory());
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
Assert.assertThrows(
AssertionError.class,
- () -> appInfo.resolveMethod(method.holder, method).lookupVirtualDispatchTargets(appView));
+ () ->
+ appInfo
+ .resolveMethod(method.holder, method)
+ .lookupVirtualDispatchTargets(context, appView));
}
private Matcher<String> getExpected() {
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java
index 1ca966b..0ba0226 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/InvokeInterfaceWithStaticTargetTest.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.DescriptorUtils;
@@ -49,9 +50,14 @@
Main.class);
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "bar", appInfo.dexItemFactory());
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
Assert.assertThrows(
AssertionError.class,
- () -> appInfo.resolveMethod(method.holder, method).lookupVirtualDispatchTargets(appView));
+ () ->
+ appInfo
+ .resolveMethod(method.holder, method)
+ .lookupVirtualDispatchTargets(context, appView));
}
@Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java
index 251fa37..eeca9fe 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/LambdaMultipleInterfacesTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(J.class, "bar", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
@@ -84,7 +87,6 @@
.enableNeverClassInliningAnnotations()
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
- .compile()
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(EXPECTED);
}
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java
index eff0088..64c81fa 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/MultipleImplementsTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java
index 9552212..a21d3e1 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SimpleInterfaceInvokeTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -57,7 +58,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java
index 41d4879..80caa62 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubInterfaceOverridesTest.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java
index 84236e5..713d80e 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeMissingOverridesTest.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -55,7 +56,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java
index a952bb3..ba468e0 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacetargets/SubTypeOverridesTest.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -55,7 +56,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethodOnInterface(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java
index f465727..234d847 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryTest.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.resolution.packageprivate.a.A;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "bar", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java
index 35791e7..535b011 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateReentryWithNarrowingTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.resolution.packageprivate.PackagePrivateReentryTest.C;
@@ -60,7 +61,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "bar", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java
index c2d041c..19c9f12 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/PackagePrivateWithDefaultMethodTest.java
@@ -19,6 +19,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.resolution.packageprivate.a.Abstract;
@@ -71,7 +72,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java b/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java
index 28c8c2f..006d3b3 100644
--- a/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/packageprivate/WidenAccessOutsidePackageTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.resolution.packageprivate;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationFailedException;
@@ -17,6 +16,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.resolution.packageprivate.a.A;
@@ -57,8 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "bar", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
- assertTrue(lookupResult.isLookupResultSuccess());
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
.map(DexEncodedMethod::qualifiedName)
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java
index 9538dec..88c7b9e 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/AbstractInMiddleTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java
index 4133fbe..22f6e65 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceSubTypeTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java
index 264ddb0..3c30267 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultInterfaceMethodInSubInterfaceTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java
index ff58047..dccf199 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/DefaultWithoutTopTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -59,7 +60,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java
index 055c113..7d32527 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/InvokeVirtualToInterfaceDefinitionTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -55,7 +56,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(A.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()
diff --git a/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java b/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java
index 570527c..3afeb68 100644
--- a/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/virtualtargets/TargetInDefaultMethodTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupResult;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -56,7 +57,9 @@
AppInfoWithLiveness appInfo = appView.appInfo();
DexMethod method = buildNullaryVoidMethod(I.class, "foo", appInfo.dexItemFactory());
ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
- LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(appView);
+ DexProgramClass context =
+ appView.definitionForProgramType(buildType(Main.class, appInfo.dexItemFactory()));
+ LookupResult lookupResult = resolutionResult.lookupVirtualDispatchTargets(context, appView);
assertTrue(lookupResult.isLookupResultSuccess());
Set<String> targets =
lookupResult.asLookupResultSuccess().getMethodTargets().stream()