Map level of R8 version diagnostic to NONE in R8 partial

This also removes quiet from InternalOptions which is no longer used.

Fixes: b/389618550
Change-Id: Icfaad0abd5d9ac298860539a4f961678fb72e029
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 6f99720..bea277e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.dex.Marker;
+import com.android.tools.r8.diagnostic.R8VersionDiagnostic;
 import com.android.tools.r8.errors.CheckDiscardDiagnostic;
 import com.android.tools.r8.experimental.graphinfo.GraphConsumer;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -115,7 +116,6 @@
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.ResourceShrinkerUtils;
 import com.android.tools.r8.utils.SelfRetraceTest;
-import com.android.tools.r8.utils.StringDiagnostic;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
@@ -268,13 +268,8 @@
   void runInternal(AndroidApp inputApp, ExecutorService executorService) throws IOException {
     timing.begin("Run prelude");
     assert options.programConsumer != null;
-    if (options.quiet) {
-      System.setOut(new PrintStream(ByteStreams.nullOutputStream()));
-    }
-    if (this.getClass().desiredAssertionStatus() && !options.quiet) {
-      options.reporter.info(
-          new StringDiagnostic(
-              "Running R8 version " + Version.LABEL + " with assertions enabled."));
+    if (getClass().desiredAssertionStatus()) {
+      options.reporter.info(new R8VersionDiagnostic());
     }
     // Synthetic assertion to check that testing assertions works and can be enabled.
     assert forTesting(options, () -> !options.testing.testEnableTestAssertions);
diff --git a/src/main/java/com/android/tools/r8/R8Partial.java b/src/main/java/com/android/tools/r8/R8Partial.java
index ded44df..3d52ede 100644
--- a/src/main/java/com/android/tools/r8/R8Partial.java
+++ b/src/main/java/com/android/tools/r8/R8Partial.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.DexIndexedConsumer.ForwardingConsumer;
 import com.android.tools.r8.StringConsumer.FileConsumer;
 import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.diagnostic.R8VersionDiagnostic;
 import com.android.tools.r8.dump.CompilerDump;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -28,6 +29,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.ExceptionUtils;
+import com.android.tools.r8.utils.ForwardingDiagnosticsHandler;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
@@ -204,8 +206,20 @@
     // Compile R8 input with R8 using the keep rules from trace references.
     Path r8Output = resolveTmp("r8-output.zip");
     R8PartialDataResourceConsumer r8DataResourcesConsumer = new R8PartialDataResourceConsumer();
+    DiagnosticsHandler r8DiagnosticsHandler =
+        new ForwardingDiagnosticsHandler(options.reporter) {
+
+          @Override
+          public DiagnosticsLevel modifyDiagnosticsLevel(
+              DiagnosticsLevel level, Diagnostic diagnostic) {
+            if (diagnostic instanceof R8VersionDiagnostic) {
+              return DiagnosticsLevel.NONE;
+            }
+            return super.modifyDiagnosticsLevel(level, diagnostic);
+          }
+        };
     R8Command.Builder r8Builder =
-        R8Command.builder(options.reporter)
+        R8Command.builder(r8DiagnosticsHandler)
             .addProguardConfigurationFiles(traceReferencesResult.getOutputPath())
             .enableLegacyFullModeForKeepRules(true)
             .setProgramConsumer(
@@ -229,7 +243,6 @@
     InternalOptions r8Options = r8Command.getInternalOptions();
     options.partialCompilationConfiguration.r8OptionsConsumer.accept(r8Options);
     r8Options.mapConsumer = options.mapConsumer;
-    r8Options.quiet = true; // Don't write the R8 version.
     if (options.androidResourceProvider != null) {
       r8Options.androidResourceProvider = options.androidResourceProvider;
       r8Options.androidResourceConsumer = options.androidResourceConsumer;
diff --git a/src/main/java/com/android/tools/r8/diagnostic/R8VersionDiagnostic.java b/src/main/java/com/android/tools/r8/diagnostic/R8VersionDiagnostic.java
new file mode 100644
index 0000000..1f7d3f3
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/diagnostic/R8VersionDiagnostic.java
@@ -0,0 +1,29 @@
+// Copyright (c) 2025, 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.diagnostic;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.Version;
+import com.android.tools.r8.keepanno.annotations.KeepForApi;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+@KeepForApi
+public class R8VersionDiagnostic implements Diagnostic {
+
+  @Override
+  public Origin getOrigin() {
+    return Origin.unknown();
+  }
+
+  @Override
+  public Position getPosition() {
+    return Position.UNKNOWN;
+  }
+
+  @Override
+  public String getDiagnosticMessage() {
+    return "Running R8 version " + Version.LABEL + " with assertions enabled.";
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/ForwardingDiagnosticsHandler.java b/src/main/java/com/android/tools/r8/utils/ForwardingDiagnosticsHandler.java
new file mode 100644
index 0000000..04658a5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/ForwardingDiagnosticsHandler.java
@@ -0,0 +1,37 @@
+// Copyright (c) 2025, 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.utils;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.DiagnosticsLevel;
+
+public class ForwardingDiagnosticsHandler implements DiagnosticsHandler {
+
+  private final DiagnosticsHandler diagnosticsHandler;
+
+  public ForwardingDiagnosticsHandler(DiagnosticsHandler diagnosticsHandler) {
+    this.diagnosticsHandler = diagnosticsHandler;
+  }
+
+  @Override
+  public void error(Diagnostic error) {
+    diagnosticsHandler.error(error);
+  }
+
+  @Override
+  public void warning(Diagnostic warning) {
+    diagnosticsHandler.warning(warning);
+  }
+
+  @Override
+  public void info(Diagnostic info) {
+    diagnosticsHandler.info(info);
+  }
+
+  @Override
+  public DiagnosticsLevel modifyDiagnosticsLevel(DiagnosticsLevel level, Diagnostic diagnostic) {
+    return diagnosticsHandler.modifyDiagnosticsLevel(level, diagnostic);
+  }
+}