Revert "Use definition for with multiple results in trace references"

This reverts commit f7eb85c4f901a5f882d0b3f96328f83ae8e22d7e.

Reason for revert: Failing archive

Change-Id: Iad3995893acc1b8c1c4b86f8ee24293365b9c02a
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index 024bc4b..f32be7e 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -1011,6 +1011,7 @@
   /** Intentionally drops {@param context} since this is only needed in D8. */
   @Override
   public FieldResolutionResult resolveFieldOn(DexType type, DexField field, ProgramMethod context) {
+    assert checkIfObsolete();
     return resolveFieldOn(type, field);
   }
 
@@ -1026,12 +1027,6 @@
     return new FieldResolution(this).resolveFieldOn(clazz, field);
   }
 
-  // public FieldResolutionResult resolveField(
-  //     DexField field, Function<DexType, ClassResolutionResult> definitionFor) {
-  //   assert checkIfObsolete();
-  //   return resolveFieldOn(field.holder, field, definitionFor);
-  // }
-
   private static class MaximallySpecificMethodsBuilder {
 
     // The set of actual maximally specific methods.
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
index e39a11b..c5d89b3 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
@@ -63,10 +63,6 @@
     return false;
   }
 
-  public boolean hasSuccessfulResolutionResult() {
-    return false;
-  }
-
   public SingleFieldResolutionResult<?> asSingleFieldResolutionResult() {
     return null;
   }
@@ -109,7 +105,6 @@
     return false;
   }
 
-
   public final void forEachFieldResolutionResult(Consumer<FieldResolutionResult> resultConsumer) {
     visitFieldResolutionResults(resultConsumer, resultConsumer, resultConsumer);
   }
@@ -221,11 +216,6 @@
     public SingleFieldResolutionResult<T> asSuccessfulMemberResolutionResult() {
       return this;
     }
-
-    @Override
-    public boolean hasSuccessfulResolutionResult() {
-      return true;
-    }
   }
 
   public static class SingleProgramFieldResolutionResult
@@ -408,11 +398,6 @@
       libraryResolutionResults.forEach(libraryResultConsumer);
       failedOrUnknownResolutionResults.forEach(failedResolutionConsumer);
     }
-
-    @Override
-    public boolean hasSuccessfulResolutionResult() {
-      return hasProgramOrClasspathResult() || !libraryResolutionResults.isEmpty();
-    }
   }
 
   public static class MultipleProgramWithLibraryFieldResolutionResult
diff --git a/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
index de88740..e911b47 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
@@ -68,7 +68,7 @@
       forEachDescriptor(provider, targetDescriptors::remove);
     }
     InternalOptions options = new InternalOptions();
-    options.loadAllClassDefinitions = true;
+    options.lookupLibraryBeforeProgram = true;
     Tracer tracer = new Tracer(targetDescriptors, builder.build(), command.getReporter(), options);
     tracer.run(command.getConsumer());
   }
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 97b2621..4650eb7 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexClass;
@@ -26,7 +25,6 @@
 import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.DexValue;
 import com.android.tools.r8.graph.DexValue.DexValueArray;
-import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.GraphLens.FieldLookupResult;
 import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
@@ -161,10 +159,9 @@
 
     private void addClassType(DexType type, DefinitionContext referencedFrom) {
       assert type.isClassType();
-      ClassResolutionResult result =
-          appView.contextIndependentDefinitionForWithResolutionResult(type);
-      if (result.hasClassResolutionResult()) {
-        result.forEachClassResolutionResult(clazz -> addClass(clazz, referencedFrom));
+      DexClass clazz = appView.definitionFor(type);
+      if (clazz != null) {
+        addClass(clazz, referencedFrom);
       } else {
         TracedClassImpl tracedClass = new TracedClassImpl(type, referencedFrom);
         collectMissingClass(tracedClass);
@@ -440,27 +437,21 @@
         addType(field.getHolderType(), referencedFrom);
         addType(field.getType(), referencedFrom);
 
-        FieldResolutionResult resolutionResult = appInfo().resolveField(field);
-        resolutionResult.forEachFieldResolutionResult(
-            singleResolutionResult -> {
-              if (!singleResolutionResult.isSingleFieldResolutionResult()) {
-                return;
-              }
-              DexClassAndField resolvedField = singleResolutionResult.getResolutionPair();
-              if (isTargetType(resolvedField.getHolderType())) {
-                if (resolvedField.getHolderType() != field.getHolderType()) {
-                  addClass(resolvedField.getHolder(), referencedFrom);
-                }
-                TracedFieldImpl tracedField = new TracedFieldImpl(resolvedField, referencedFrom);
-                consumer.acceptField(tracedField, diagnostics);
-                if (resolvedField.getAccessFlags().isVisibilityDependingOnPackage()) {
-                  consumer.acceptPackage(
-                      Reference.packageFromString(resolvedField.getHolderType().getPackageName()),
-                      diagnostics);
-                }
-              }
-            });
-        if (!resolutionResult.hasSuccessfulResolutionResult()) {
+        DexClassAndField resolvedField = appInfo().resolveField(field).getResolutionPair();
+        if (resolvedField != null) {
+          if (isTargetType(resolvedField.getHolderType())) {
+            if (resolvedField.getHolderType() != field.getHolderType()) {
+              addClass(resolvedField.getHolder(), referencedFrom);
+            }
+            TracedFieldImpl tracedField = new TracedFieldImpl(resolvedField, referencedFrom);
+            consumer.acceptField(tracedField, diagnostics);
+            if (resolvedField.getAccessFlags().isVisibilityDependingOnPackage()) {
+              consumer.acceptPackage(
+                  Reference.packageFromString(resolvedField.getHolderType().getPackageName()),
+                  diagnostics);
+            }
+          }
+        } else {
           TracedFieldImpl tracedField = new TracedFieldImpl(field, referencedFrom);
           collectMissingField(tracedField);
           consumer.acceptField(tracedField, diagnostics);
@@ -485,28 +476,20 @@
         LambdaDescriptor descriptor = LambdaDescriptor.tryInfer(callSite, appInfo(), getContext());
         if (descriptor != null) {
           for (DexType interfaceType : descriptor.interfaces) {
-            ClassResolutionResult classResolutionResult =
-                appView.contextIndependentDefinitionForWithResolutionResult(interfaceType);
-            if (classResolutionResult.hasClassResolutionResult()) {
-              classResolutionResult.forEachClassResolutionResult(
-                  interfaceDefinition -> {
-                    DexEncodedMethod mainMethod =
-                        interfaceDefinition.lookupMethod(descriptor.getMainMethod());
-                    if (mainMethod != null) {
-                      registerInvokeInterface(mainMethod.getReference());
-                    }
-                    for (DexProto bridgeProto : descriptor.bridges) {
-                      DexEncodedMethod bridgeMethod =
-                          interfaceDefinition.lookupMethod(bridgeProto, descriptor.name);
-                      if (bridgeMethod != null) {
-                        registerInvokeInterface(bridgeMethod.getReference());
-                      }
-                    }
-                  });
-            } else {
-              TracedClassImpl tracedClass = new TracedClassImpl(interfaceType, referencedFrom);
-              collectMissingClass(tracedClass);
-              consumer.acceptType(tracedClass, diagnostics);
+            DexClass interfaceDefinition = appView.definitionFor(interfaceType);
+            if (interfaceDefinition != null) {
+              DexEncodedMethod mainMethod =
+                  interfaceDefinition.lookupMethod(descriptor.getMainMethod());
+              if (mainMethod != null) {
+                registerInvokeInterface(mainMethod.getReference());
+              }
+              for (DexProto bridgeProto : descriptor.bridges) {
+                DexEncodedMethod bridgeMethod =
+                    interfaceDefinition.lookupMethod(bridgeProto, descriptor.name);
+                if (bridgeMethod != null) {
+                  registerInvokeInterface(bridgeMethod.getReference());
+                }
+              }
             }
           }
         }
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java
deleted file mode 100644
index 4b77aec..0000000
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2022, 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.tracereferences;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.references.FieldReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.transformers.ClassFileTransformer.FieldPredicate;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
-import com.google.common.collect.ImmutableSet;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class TraceFieldResolutionWithLibraryAndProgramClassTest extends TestBase {
-
-  @Parameter() public TestParameters parameters;
-
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
-  }
-
-  static class SeenReferencesConsumer implements TraceReferencesConsumer {
-
-    private final Set<FieldReference> seenFields = new HashSet<>();
-    private final Set<FieldReference> seenMissingFields = new HashSet<>();
-
-    @Override
-    public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {}
-
-    @Override
-    public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {
-      if (tracedField.isMissingDefinition()) {
-        seenMissingFields.add(tracedField.getReference());
-      } else {
-        seenFields.add(tracedField.getReference());
-      }
-    }
-
-    @Override
-    public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {}
-  }
-
-  @Test
-  public void testInvalidResolution() throws Exception {
-    Path dir = temp.newFolder().toPath();
-    Path libJar =
-        ZipBuilder.builder(dir.resolve("lib.jar"))
-            .addFilesRelative(
-                ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(A.class))
-            .addBytes(
-                DescriptorUtils.getPathFromJavaType(B.class),
-                transformer(B.class).removeFields(FieldPredicate.all()).transform())
-            .build();
-    Path targetJar =
-        ZipBuilder.builder(dir.resolve("target.jar"))
-            .addBytes(
-                DescriptorUtils.getPathFromJavaType(A.class),
-                transformer(A.class).removeFields(FieldPredicate.all()).transform())
-            .addFilesRelative(
-                ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(B.class))
-            .build();
-    Path sourceJar =
-        ZipBuilder.builder(dir.resolve("source.jar"))
-            .addFilesRelative(
-                ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(Main.class))
-            .build();
-    SeenReferencesConsumer consumer = new SeenReferencesConsumer();
-    TraceReferences.run(
-        TraceReferencesCommand.builder()
-            .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
-            .addLibraryFiles(libJar)
-            .addTargetFiles(targetJar)
-            .addSourceFiles(sourceJar)
-            .setConsumer(consumer)
-            .build());
-    ImmutableSet<FieldReference> expectedSet =
-        ImmutableSet.of(
-            Reference.field(
-                Reference.classFromClass(A.class), "foo", Reference.primitiveFromDescriptor("I")),
-            Reference.field(
-                Reference.classFromClass(B.class), "bar", Reference.primitiveFromDescriptor("I")));
-    assertEquals(Collections.emptySet(), consumer.seenMissingFields);
-    assertEquals(expectedSet, consumer.seenFields);
-  }
-
-  // A is added to both library and program, but the program one is missing the field foo.
-  public static class A {
-
-    public static int foo = 42;
-  }
-
-  // B is added to both library and program, but the library one is missing the field bar.
-  public static class B {
-
-    public static int bar = 42;
-  }
-
-  public static class Main {
-
-    public static void main(String[] args) {
-      int value = A.foo + B.bar;
-    }
-  }
-}