Account for non-rebound constructor calls in trace reference
Bug: b/274904746
Change-Id: I97e5e2d4e169262a67cf466ba355ffd8abd823e2
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index b430854..8715d7d 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -278,19 +278,26 @@
MethodLookupResult lookupResult = graphLens().lookupInvokeDirect(method, getContext());
assert lookupResult.getType().isDirect();
DexMethod rewrittenMethod = lookupResult.getReference();
- BooleanBox seenMethod = new BooleanBox();
- appView
- .contextIndependentDefinitionForWithResolutionResult(rewrittenMethod.getHolderType())
- .forEachClassResolutionResult(
- holder -> {
- DexClassAndMethod target = rewrittenMethod.lookupMemberOnClass(holder);
- if (target != null) {
- handleRewrittenMethodReference(rewrittenMethod, target);
- seenMethod.set();
- }
- });
- if (seenMethod.isFalse()) {
- handleRewrittenMethodReference(rewrittenMethod, (DexClassAndMethod) null);
+ if (getContext().getHolder().originatesFromDexResource()) {
+ handleRewrittenMethodResolution(
+ rewrittenMethod,
+ appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod),
+ SingleResolutionResult::getResolutionPair);
+ } else {
+ BooleanBox seenMethod = new BooleanBox();
+ appView
+ .contextIndependentDefinitionForWithResolutionResult(rewrittenMethod.getHolderType())
+ .forEachClassResolutionResult(
+ holder -> {
+ DexClassAndMethod target = rewrittenMethod.lookupMemberOnClass(holder);
+ if (target != null) {
+ handleRewrittenMethodReference(rewrittenMethod, target);
+ seenMethod.set();
+ }
+ });
+ if (seenMethod.isFalse()) {
+ handleRewrittenMethodReference(rewrittenMethod, (DexClassAndMethod) null);
+ }
}
}
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceReferenceNonReboundConstructorCallTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceReferenceNonReboundConstructorCallTest.java
index 06e3858..2332d17 100644
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceReferenceNonReboundConstructorCallTest.java
+++ b/src/test/java/com/android/tools/r8/tracereferences/TraceReferenceNonReboundConstructorCallTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.tracereferences;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
import com.android.tools.r8.DiagnosticsChecker;
import com.android.tools.r8.DiagnosticsHandler;
@@ -88,10 +87,8 @@
ImmutableSet<MethodReference> expectedFoundMethods =
ImmutableSet.of(MethodReferenceUtils.instanceConstructor(SuperClass.class));
ImmutableSet<MethodReference> expectedMissingMethods = ImmutableSet.of();
- // TODO(b/274904746): Should be equals.
- assertNotEquals(expectedFoundMethods, consumer.foundMethods);
- // TODO(b/274904746): Should be equals.
- assertNotEquals(expectedMissingMethods, consumer.missingMethods);
+ assertEquals(expectedFoundMethods, consumer.foundMethods);
+ assertEquals(expectedMissingMethods, consumer.missingMethods);
}
private MissingReferencesConsumer runTest(Path sourceFile) throws Throwable {