Account for multiple holders for direct method calls

Bug: b/234833465
Change-Id: I9fe61fadd2d878c75f630017e39b8eb5297adbb6
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 4b98b5f..0cbbfed 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -48,6 +48,7 @@
 import com.android.tools.r8.tracereferences.internal.TracedFieldImpl;
 import com.android.tools.r8.tracereferences.internal.TracedMethodImpl;
 import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.BooleanBox;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
@@ -300,9 +301,20 @@
         MethodLookupResult lookupResult = graphLens().lookupInvokeDirect(method, getContext());
         assert lookupResult.getType().isDirect();
         DexMethod rewrittenMethod = lookupResult.getReference();
-        DexClass holder = appView.definitionFor(rewrittenMethod.getHolderType());
-        handleRewrittenMethodReference(
-            rewrittenMethod, rewrittenMethod.lookupMemberOnClass(holder));
+        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);
+        }
       }
 
       @Override