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;
- }
- }
-}