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