Add a 'none' level for --map-diagnostics.

This allows the command line to silence diagnostics.

Fixes: b/258143347
Change-Id: I00d94ce2c401ce783d4400c4eff64362d6a6edc3
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java b/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java
index 65351f8..1ba0b22 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java
@@ -215,11 +215,14 @@
     if (arg.equals("info")) {
       return DiagnosticsLevel.INFO;
     }
+    if (arg.equals("none")) {
+      return DiagnosticsLevel.NONE;
+    }
     errorHandler.accept(
         new StringDiagnostic(
             "Invalid diagnostics level '"
                 + arg
-                + "'. Valid levels are 'error', 'warning' and 'info'.",
+                + "'. Valid levels are 'error', 'warning', 'info' and 'none'.",
             origin));
 
     return null;
diff --git a/src/main/java/com/android/tools/r8/DiagnosticsLevel.java b/src/main/java/com/android/tools/r8/DiagnosticsLevel.java
index 9f9d26a..a022b0d 100644
--- a/src/main/java/com/android/tools/r8/DiagnosticsLevel.java
+++ b/src/main/java/com/android/tools/r8/DiagnosticsLevel.java
@@ -8,5 +8,6 @@
 public enum DiagnosticsLevel {
   ERROR,
   WARNING,
-  INFO
+  INFO,
+  NONE
 }
diff --git a/src/main/java/com/android/tools/r8/utils/Reporter.java b/src/main/java/com/android/tools/r8/utils/Reporter.java
index 65103ac..d2aa075 100644
--- a/src/main/java/com/android/tools/r8/utils/Reporter.java
+++ b/src/main/java/com/android/tools/r8/utils/Reporter.java
@@ -81,6 +81,8 @@
         abort = new AbortException(diagnostic);
         clientHandler.error(diagnostic);
         break;
+      case NONE:
+        break;
       default:
         throw new Unreachable();
     }
diff --git a/src/test/java/com/android/tools/r8/checkdiscarded/CheckDiscardModifyDiagnosticsLevelTest.java b/src/test/java/com/android/tools/r8/checkdiscarded/CheckDiscardModifyDiagnosticsLevelTest.java
index 568c66f..faa47f1 100644
--- a/src/test/java/com/android/tools/r8/checkdiscarded/CheckDiscardModifyDiagnosticsLevelTest.java
+++ b/src/test/java/com/android/tools/r8/checkdiscarded/CheckDiscardModifyDiagnosticsLevelTest.java
@@ -101,7 +101,10 @@
                       .assertErrorsMatch(errorMatchers())
                       .assertWarningsMatch(warningMatchers())
                       .assertInfosMatch(infoMatchers()));
-      assertTrue(mappedLevel == DiagnosticsLevel.INFO || mappedLevel == DiagnosticsLevel.WARNING);
+      assertTrue(
+          mappedLevel == DiagnosticsLevel.INFO
+              || mappedLevel == DiagnosticsLevel.WARNING
+              || mappedLevel == DiagnosticsLevel.NONE);
     } catch (CompilationFailedException e) {
       assertEquals(mappedLevel, DiagnosticsLevel.ERROR);
     }
diff --git a/src/test/java/com/android/tools/r8/diagnostics/ModifyDiagnosticsLevelTest.java b/src/test/java/com/android/tools/r8/diagnostics/ModifyDiagnosticsLevelTest.java
index 9f20b7d..239a0f6 100644
--- a/src/test/java/com/android/tools/r8/diagnostics/ModifyDiagnosticsLevelTest.java
+++ b/src/test/java/com/android/tools/r8/diagnostics/ModifyDiagnosticsLevelTest.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DiagnosticsLevel;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.diagnostic.internal.MissingDefinitionsDiagnosticImpl;
@@ -84,6 +85,24 @@
     }
   }
 
+  @Test
+  public void testWarningToNone() throws CompilationFailedException {
+    testForR8(Backend.DEX)
+        .addProgramClasses(TestClass.class)
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules("-ignorewarnings")
+        .setDiagnosticsLevelModifier(
+            (level, diagnostic) -> {
+              if (level == DiagnosticsLevel.WARNING
+                  && diagnostic instanceof MissingDefinitionsDiagnosticImpl
+                  && diagnostic.getDiagnosticMessage().startsWith(MISSING_CLASS_MESSAGE_PREFIX)) {
+                return DiagnosticsLevel.NONE;
+              }
+              return level;
+            })
+        .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages);
+  }
+
   static class TestClass implements I {
 
     public static void main(String[] args) {