Replace outputs to stdout/err by Diagnostics
This is not all of them, but it's a start.
BUG=67007655
Change-Id: Ib3fa5fa1eea4b0f8d2e780e54b63b24183d5f6ac
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 6190cbd..296507f 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -41,7 +41,7 @@
new ApplicationReader(app, options, timing).read(executor).toDirect();
AppInfoWithSubtyping appInfo = new AppInfoWithSubtyping(application);
RootSet mainDexRootSet =
- new RootSetBuilder(application, appInfo, options.mainDexKeepRules).run(executor);
+ new RootSetBuilder(application, appInfo, options.mainDexKeepRules, options).run(executor);
Set<DexType> mainDexBaseClasses = new Enqueuer(appInfo).traceMainDex(mainDexRootSet, timing);
Set<DexType> mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, application).run();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 899a194..940e110 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -216,8 +216,10 @@
"Shrinking can't be performed because some library classes are missing.");
}
}
- rootSet = new RootSetBuilder(application, appInfo, options.proguardConfiguration.getRules())
- .run(executorService);
+ rootSet =
+ new RootSetBuilder(
+ application, appInfo, options.proguardConfiguration.getRules(), options)
+ .run(executorService);
Enqueuer enqueuer = new Enqueuer(appInfo);
enqueuer.addExtension(new ProtoLiteExtension(appInfo));
appInfo = enqueuer.traceApplication(rootSet, timing);
@@ -282,7 +284,8 @@
Enqueuer enqueuer = new Enqueuer(appInfo);
// Lets find classes which may have code executed before secondary dex files installation.
RootSet mainDexRootSet =
- new RootSetBuilder(application, appInfo, options.mainDexKeepRules).run(executorService);
+ new RootSetBuilder(application, appInfo, options.mainDexKeepRules, options)
+ .run(executorService);
Set<DexType> mainDexBaseClasses = enqueuer.traceMainDex(mainDexRootSet, timing);
// Calculate the automatic main dex list according to legacy multidex constraints.
@@ -316,7 +319,7 @@
// Only perform discard-checking if tree-shaking is turned on.
if (options.useTreeShaking && !rootSet.checkDiscarded.isEmpty()
&& options.useDiscardedChecker) {
- new DiscardedChecker(rootSet, application).run();
+ new DiscardedChecker(rootSet, application, options).run();
}
timing.begin("Minification");
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 4405ef4..cfc1495 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -38,6 +38,7 @@
import com.android.tools.r8.utils.CfgPrinter;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.Timing;
import com.google.common.collect.ArrayListMultimap;
@@ -494,7 +495,8 @@
BiConsumer<IRCode, DexEncodedMethod> outlineHandler)
throws ApiLevelException {
if (options.verbose) {
- System.out.println("Processing: " + method.toSourceString());
+ options.diagnosticsHandler.info(
+ new StringDiagnostic("Processing: " + method.toSourceString()));
}
if (Log.ENABLED) {
Log.debug(getClass(), "Original code for %s:\n%s",
diff --git a/src/main/java/com/android/tools/r8/shaking/DiscardedChecker.java b/src/main/java/com/android/tools/r8/shaking/DiscardedChecker.java
index e675525..8a5c183 100644
--- a/src/main/java/com/android/tools/r8/shaking/DiscardedChecker.java
+++ b/src/main/java/com/android/tools/r8/shaking/DiscardedChecker.java
@@ -8,6 +8,8 @@
import com.android.tools.r8.graph.DexItem;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringDiagnostic;
import java.util.Set;
public class DiscardedChecker {
@@ -15,10 +17,12 @@
private final Set<DexItem> checkDiscarded;
private final DexApplication application;
private boolean fail = false;
+ private InternalOptions options;
- public DiscardedChecker(RootSet rootSet, DexApplication application) {
+ public DiscardedChecker(RootSet rootSet, DexApplication application, InternalOptions options) {
this.checkDiscarded = rootSet.checkDiscarded;
this.application = application;
+ this.options = options;
}
public void run() {
@@ -34,7 +38,8 @@
private void checkItem(DexItem item) {
if (checkDiscarded.contains(item)) {
- System.err.println("Item " + item.toSourceString() + " was not discarded.");
+ options.diagnosticsHandler.info(
+ new StringDiagnostic("Item " + item.toSourceString() + " was not discarded."));
fail = true;
}
}
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index d4ff512..6ab4a0aa 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -19,7 +19,9 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.logging.Log;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.MethodSignatureEquivalence;
+import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.base.Equivalence.Wrapper;
import com.google.common.collect.Sets;
@@ -56,12 +58,14 @@
new IdentityHashMap<>();
private final Map<DexItem, ProguardMemberRule> noSideEffects = new IdentityHashMap<>();
private final Map<DexItem, ProguardMemberRule> assumedValues = new IdentityHashMap<>();
+ private final InternalOptions options;
public RootSetBuilder(DexApplication application, AppInfo appInfo,
- List<ProguardConfigurationRule> rules) {
+ List<ProguardConfigurationRule> rules, InternalOptions options) {
this.application = application.asDirect();
this.appInfo = appInfo;
this.rules = rules;
+ this.options = options;
}
private boolean anySuperTypeMatches(DexType type, ProguardTypeMatcher name,
@@ -141,13 +145,15 @@
// Warn if users got it wrong, but only warn once.
if (extendsExpected && !rule.getInheritanceIsExtends()) {
if (rulesThatUseExtendsOrImplementsWrong.add(rule)) {
- System.err.println(
- "The rule `" + rule + "` uses implements but actually matches extends.");
+ options.diagnosticsHandler.warning(
+ new StringDiagnostic(
+ "The rule `" + rule + "` uses implements but actually matches extends."));
}
} else if (implementsExpected && rule.getInheritanceIsExtends()) {
if (rulesThatUseExtendsOrImplementsWrong.add(rule)) {
- System.err.println(
- "The rule `" + rule + "` uses extends but actually matches implements.");
+ options.diagnosticsHandler.warning(
+ new StringDiagnostic(
+ "The rule `" + rule + "` uses extends but actually matches implements."));
}
}
}
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index f3b712f..947abe3 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringDiagnostic;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Collection;
@@ -41,10 +42,12 @@
public DexApplication run() {
application.timing.begin("Pruning application...");
if (options.debugKeepRules && !options.skipMinification) {
- System.out.println(
- "NOTE: Debugging keep rules on a minified build might yield broken builds, as\n"
- + " minification also depends on the used keep rules. We recommend using\n"
- + " --skip-minification.");
+
+ options.diagnosticsHandler.info(
+ new StringDiagnostic(
+ "Debugging keep rules on a minified build might yield broken builds, as "
+ + "minification also depends on the used keep rules. We recommend using "
+ + "--skip-minification."));
}
DexApplication result;
try {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index a72d356..5c4909a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -136,27 +136,31 @@
boolean printed = false;
boolean printOutdatedToolchain = false;
if (warningInvalidParameterAnnotations != null) {
- System.out.println("Warning: " + warningInvalidParameterAnnotations);
+ diagnosticsHandler.warning(
+ new StringDiagnostic(warningInvalidParameterAnnotations));
printed = true;
}
if (warningInvalidDebugInfoCount > 0) {
- System.out.println("Warning: stripped invalid locals information from "
+ diagnosticsHandler.warning(
+ new StringDiagnostic("Stripped invalid locals information from "
+ warningInvalidDebugInfoCount
- + (warningInvalidDebugInfoCount == 1 ? " method." : " methods."));
+ + (warningInvalidDebugInfoCount == 1 ? " method." : " methods.")));
printed = true;
printOutdatedToolchain = true;
}
if (warningMissingEnclosingMember) {
- System.out.println(
- "Warning: InnerClass annotations are missing corresponding EnclosingMember annotations."
- + " Such InnerClass annotations are ignored.");
+ diagnosticsHandler.warning(
+ new StringDiagnostic(
+ "InnerClass annotations are missing corresponding EnclosingMember annotations."
+ + " Such InnerClass annotations are ignored."));
printed = true;
printOutdatedToolchain = true;
}
if (printOutdatedToolchain) {
- System.out.println(
- "Some warnings are typically a sign of using an outdated Java toolchain."
- + " To fix, recompile the source with an updated toolchain.");
+ diagnosticsHandler.warning(
+ new StringDiagnostic(
+ "Some warnings are typically a sign of using an outdated Java toolchain."
+ + " To fix, recompile the source with an updated toolchain."));
}
return printed;
}
diff --git a/src/test/java/com/android/tools/r8/naming/NamingTestBase.java b/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
index 8818bbb..f049102 100644
--- a/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/NamingTestBase.java
@@ -70,7 +70,7 @@
ClassAndMemberPublicizer.run(program);
}
- RootSet rootSet = new RootSetBuilder(program, appInfo, configuration.getRules())
+ RootSet rootSet = new RootSetBuilder(program, appInfo, configuration.getRules(), options)
.run(ThreadUtils.getExecutorService(options));
Enqueuer enqueuer = new Enqueuer(appInfo);
appInfo = enqueuer.traceApplication(rootSet, timing);