Add TraceReferencesCheckConsumer to public API
This also removes the implicit addition of TraceReferencesCheckConsumer when using the command API.
Change-Id: Ica6a2a4ebd28fd53f9b53d51dc07e3cdef684ebb
diff --git a/src/main/java/com/android/tools/r8/tracereferences/internal/TraceReferencesCheckConsumer.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCheckConsumer.java
similarity index 90%
rename from src/main/java/com/android/tools/r8/tracereferences/internal/TraceReferencesCheckConsumer.java
rename to src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCheckConsumer.java
index 649efde..6912b15 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/internal/TraceReferencesCheckConsumer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCheckConsumer.java
@@ -2,10 +2,12 @@
// 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.internal;
+package com.android.tools.r8.tracereferences;
import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.Keep;
import com.android.tools.r8.diagnostic.DefinitionContext;
+import com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic;
import com.android.tools.r8.diagnostic.internal.DefinitionContextUtils;
import com.android.tools.r8.diagnostic.internal.MissingClassInfoImpl;
import com.android.tools.r8.diagnostic.internal.MissingDefinitionsDiagnosticImpl;
@@ -15,15 +17,18 @@
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.PackageReference;
-import com.android.tools.r8.tracereferences.TraceReferencesConsumer;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
- * Collects the set of missing definitions and reports a {@link
- * com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic}, if any missing definitions were
- * found.
+ * A {@link TraceReferencesConsumer.ForwardingConsumer}, which forwards all callbacks to the wrapped
+ * {@link TraceReferencesConsumer}.
+ *
+ * <p>This consumer collects the set of missing definitions and reports a {@link
+ * com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic} as an error, if any missing
+ * definitions were found.
*/
+@Keep
public class TraceReferencesCheckConsumer extends TraceReferencesConsumer.ForwardingConsumer {
private final Map<ClassReference, Map<Object, DefinitionContext>> missingClassesContexts =
@@ -33,10 +38,6 @@
private final Map<MethodReference, Map<Object, DefinitionContext>> missingMethodsContexts =
new ConcurrentHashMap<>();
- public TraceReferencesCheckConsumer() {
- this(TraceReferencesConsumer.emptyConsumer());
- }
-
public TraceReferencesCheckConsumer(TraceReferencesConsumer consumer) {
super(consumer);
}
@@ -97,9 +98,18 @@
@Override
public void finished(DiagnosticsHandler handler) {
super.finished(handler);
- if (isEmpty()) {
- return;
+ if (!isEmpty()) {
+ handler.error(buildDiagnostic());
}
+ }
+
+ private boolean isEmpty() {
+ return missingClassesContexts.isEmpty()
+ && missingFieldsContexts.isEmpty()
+ && missingMethodsContexts.isEmpty();
+ }
+
+ private MissingDefinitionsDiagnostic buildDiagnostic() {
MissingDefinitionsDiagnosticImpl.Builder diagnosticBuilder =
MissingDefinitionsDiagnosticImpl.builder();
missingClassesContexts.forEach(
@@ -123,12 +133,6 @@
.setMethod(reference)
.addReferencedFromContexts(referencedFrom.values())
.build()));
- handler.error(diagnosticBuilder.build());
- }
-
- private boolean isEmpty() {
- return missingClassesContexts.isEmpty()
- && missingFieldsContexts.isEmpty()
- && missingMethodsContexts.isEmpty();
+ return diagnosticBuilder.build();
}
}
diff --git a/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommand.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommand.java
index 82915ee..1c98765 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommand.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommand.java
@@ -20,7 +20,6 @@
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.tracereferences.internal.TraceReferencesCheckConsumer;
import com.android.tools.r8.utils.ArchiveResourceProvider;
import com.android.tools.r8.utils.Box;
import com.android.tools.r8.utils.ExceptionDiagnostic;
@@ -331,7 +330,7 @@
}
public Builder setConsumer(TraceReferencesConsumer consumer) {
- this.consumer = new TraceReferencesCheckConsumer(consumer);
+ this.consumer = consumer;
return this;
}
diff --git a/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommandParser.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommandParser.java
index 96956b0..c3c8e30 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommandParser.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesCommandParser.java
@@ -186,17 +186,19 @@
switch (command) {
case CHECK:
- builder.setConsumer(TraceReferencesConsumer.emptyConsumer());
+ builder.setConsumer(
+ new TraceReferencesCheckConsumer(TraceReferencesConsumer.emptyConsumer()));
break;
case KEEP_RULES:
builder.setConsumer(
- TraceReferencesKeepRules.builder()
- .setAllowObfuscation(allowObfuscation)
- .setOutputConsumer(
- output != null
- ? new FileConsumer(output)
- : new WriterConsumer(null, new PrintWriter(System.out)))
- .build());
+ new TraceReferencesCheckConsumer(
+ TraceReferencesKeepRules.builder()
+ .setAllowObfuscation(allowObfuscation)
+ .setOutputConsumer(
+ output != null
+ ? new FileConsumer(output)
+ : new WriterConsumer(null, new PrintWriter(System.out)))
+ .build()));
break;
default:
throw new Unreachable();
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesCommandTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesCommandTest.java
index fac4e79..d905d4c 100644
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesCommandTest.java
+++ b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesCommandTest.java
@@ -241,7 +241,7 @@
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addTargetFiles(targetJar)
.addSourceFiles(sourceJar)
- .setConsumer(consumer)
+ .setConsumer(new TraceReferencesCheckConsumer(consumer))
.build());
assertEquals(expected, stringConsumer.get());
if (diagnosticsCheckerConsumer != null) {
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesDiagnosticTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesDiagnosticTest.java
index a0436a9..c12e681 100644
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesDiagnosticTest.java
+++ b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesDiagnosticTest.java
@@ -74,7 +74,8 @@
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addSourceFiles(sourceJar)
.addTargetFiles(targetJar)
- .setConsumer(TraceReferencesConsumer.emptyConsumer())
+ .setConsumer(
+ new TraceReferencesCheckConsumer(TraceReferencesConsumer.emptyConsumer()))
.build());
fail("Unexpected success");
} catch (CompilationFailedException e) {
@@ -165,7 +166,8 @@
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addSourceFiles(sourceJar)
.addTargetFiles(targetJar)
- .setConsumer(TraceReferencesConsumer.emptyConsumer())
+ .setConsumer(
+ new TraceReferencesCheckConsumer(TraceReferencesConsumer.emptyConsumer()))
.build());
fail("Unexpected success");
} catch (CompilationFailedException e) {
@@ -235,7 +237,8 @@
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addSourceFiles(sourceJar)
.addTargetFiles(targetJar)
- .setConsumer(TraceReferencesConsumer.emptyConsumer())
+ .setConsumer(
+ new TraceReferencesCheckConsumer(TraceReferencesConsumer.emptyConsumer()))
.build());
fail("Unexpected success");
} catch (CompilationFailedException e) {
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java
index 61f5dab..b1e75c2 100644
--- a/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java
+++ b/src/test/java/com/android/tools/r8/tracereferences/TraceReferencesMissingReferencesInDexTest.java
@@ -76,7 +76,7 @@
TraceReferencesCommand.builder(diagnosticsChecker)
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addSourceFiles(sourceDex)
- .setConsumer(consumer)
+ .setConsumer(new TraceReferencesCheckConsumer(consumer))
.build());
fail("Expected compilation to fail");
} catch (CompilationFailedException e) {
@@ -113,7 +113,7 @@
TraceReferencesCommand.builder(diagnosticsChecker)
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addSourceFiles(sourceDex)
- .setConsumer(consumer)
+ .setConsumer(new TraceReferencesCheckConsumer(consumer))
.build());
fail("Expected compilation to fail");
} catch (CompilationFailedException e) {