Add support for -dontnote

Invocations of R8 where -dontnote was present in the Proguard
configuration would always emit "Ignoring option: -dontnote".

We now parse -dontnote, so the warning is gone. However as there is
currently no "notes" in R8 it is basically a no-op.

Bug: 78441086
Change-Id: Id4a536cf0762b027be83fa7385cb51239836e7f7
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index 48ea17d..dd82dfd 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -42,6 +42,7 @@
     private String renameSourceFileAttribute;
     private final List<String> keepAttributePatterns = new ArrayList<>();
     private final ProguardClassFilter.Builder dontWarnPatterns = ProguardClassFilter.builder();
+    private final ProguardClassFilter.Builder dontNotePatterns = ProguardClassFilter.builder();
     protected final Set<ProguardConfigurationRule> rules = Sets.newLinkedHashSet();
     private final DexItemFactory dexItemFactory;
     private boolean printSeeds;
@@ -174,6 +175,10 @@
       dontWarnPatterns.addPattern(pattern);
     }
 
+    public void addDontNotePattern(ProguardClassNameList pattern) {
+      dontNotePatterns.addPattern(pattern);
+    }
+
     public void setSeedFile(Path seedFile) {
       this.seedFile = seedFile;
     }
@@ -271,6 +276,7 @@
           renameSourceFileAttribute,
           ProguardKeepAttributes.fromPatterns(keepAttributePatterns),
           dontWarnPatterns.build(),
+          dontNotePatterns.build(),
           rules,
           printSeeds,
           seedFile,
@@ -339,6 +345,7 @@
   private final String renameSourceFileAttribute;
   private final ProguardKeepAttributes keepAttributes;
   private final ProguardClassFilter dontWarnPatterns;
+  private final ProguardClassFilter dontNotePatterns;
   protected final ImmutableList<ProguardConfigurationRule> rules;
   private final boolean printSeeds;
   private final Path seedFile;
@@ -376,6 +383,7 @@
       String renameSourceFileAttribute,
       ProguardKeepAttributes keepAttributes,
       ProguardClassFilter dontWarnPatterns,
+      ProguardClassFilter dontNotePatterns,
       Set<ProguardConfigurationRule> rules,
       boolean printSeeds,
       Path seedFile,
@@ -411,6 +419,7 @@
     this.renameSourceFileAttribute = renameSourceFileAttribute;
     this.keepAttributes = keepAttributes;
     this.dontWarnPatterns = dontWarnPatterns;
+    this.dontNotePatterns = dontNotePatterns;
     this.rules = ImmutableList.copyOf(rules);
     this.printSeeds = printSeeds;
     this.seedFile = seedFile;
@@ -526,6 +535,10 @@
     return dontWarnPatterns;
   }
 
+  public ProguardClassFilter getDontNotePatterns() {
+    return dontNotePatterns;
+  }
+
   public ImmutableList<ProguardConfigurationRule> getRules() {
     return rules;
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index dd7bb60..38aa903 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -34,6 +34,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Consumer;
 import java.util.function.Predicate;
 
 public class ProguardConfigurationParser {
@@ -45,7 +46,6 @@
   private final Reporter reporter;
 
   private static final List<String> IGNORED_SINGLE_ARG_OPTIONS = ImmutableList.of(
-      "dontnote",
       "protomapping",
       "target");
 
@@ -216,12 +216,7 @@
         ProguardCheckDiscardRule rule = parseCheckDiscardRule();
         configurationBuilder.addRule(rule);
       } else if (acceptString("keepdirectories")) {
-        skipWhitespace();
-        if (isOptionalArgumentGiven()) {
-          configurationBuilder.addKeepDirectories(parsePathFilter());
-        } else {
-          configurationBuilder.addKeepDirectories(ProguardPathList.emptyList());
-        }
+        parsePathFilter(configurationBuilder::addKeepDirectories);
       } else if (acceptString("keep")) {
         ProguardKeepRule rule = parseKeepRule();
         configurationBuilder.addRule(rule);
@@ -253,13 +248,9 @@
       } else if (acceptString("ignorewarnings")) {
         configurationBuilder.setIgnoreWarnings(true);
       } else if (acceptString("dontwarn")) {
-        skipWhitespace();
-        if (isOptionalArgumentGiven()) {
-          configurationBuilder.addDontWarnPattern(parseClassNames());
-        } else {
-          configurationBuilder.addDontWarnPattern(
-              ProguardClassNameList.singletonList(ProguardTypeMatcher.defaultAllMatcher()));
-        }
+        parseClassFilter(configurationBuilder::addDontWarnPattern);
+      } else if (acceptString("dontnote")) {
+        parseClassFilter(configurationBuilder::addDontNotePattern);
       } else if (acceptString("repackageclasses")) {
         if (configurationBuilder.getPackageObfuscationMode() == PackageObfuscationMode.FLATTEN) {
           warnOverridingOptions("repackageclasses", "flattenpackagehierarchy", optionStart);
@@ -343,27 +334,11 @@
       } else if (acceptString("useuniqueclassmembernames")) {
         configurationBuilder.setUseUniqueClassMemberNames(true);
       } else if (acceptString("adaptclassstrings")) {
-        skipWhitespace();
-        if (isOptionalArgumentGiven()) {
-          configurationBuilder.addAdaptClassStringsPattern(parseClassNames());
-        } else {
-          configurationBuilder.addAdaptClassStringsPattern(
-              ProguardClassNameList.singletonList(ProguardTypeMatcher.defaultAllMatcher()));
-        }
+        parseClassFilter(configurationBuilder::addAdaptClassStringsPattern);
       } else if (acceptString("adaptresourcefilenames")) {
-        skipWhitespace();
-        if (isOptionalArgumentGiven()) {
-          configurationBuilder.addAdaptResourceFilenames(parsePathFilter());
-        } else {
-          configurationBuilder.addAdaptResourceFilenames(ProguardPathList.emptyList());
-        }
+        parsePathFilter(configurationBuilder::addAdaptResourceFilenames);
       } else if (acceptString("adaptresourcefilecontents")) {
-        skipWhitespace();
-        if (isOptionalArgumentGiven()) {
-          configurationBuilder.addAdaptResourceFilecontents(parsePathFilter());
-        } else {
-          configurationBuilder.addAdaptResourceFilecontents(ProguardPathList.emptyList());
-        }
+        parsePathFilter(configurationBuilder::addAdaptResourceFilecontents);
       } else if (acceptString("identifiernamestring")) {
         configurationBuilder.addRule(parseIdentifierNameStringRule());
       } else if (acceptString("if")) {
@@ -1282,6 +1257,17 @@
       }
     }
 
+    private void parseClassFilter(Consumer<ProguardClassNameList> consumer)
+        throws ProguardRuleParserException {
+      skipWhitespace();
+      if (isOptionalArgumentGiven()) {
+        consumer.accept(parseClassNames());
+      } else {
+        consumer.accept(
+            ProguardClassNameList.singletonList(ProguardTypeMatcher.defaultAllMatcher()));
+      }
+    }
+
     private ProguardClassNameList parseClassNames() throws ProguardRuleParserException {
       ProguardClassNameList.Builder builder = ProguardClassNameList.builder();
       skipWhitespace();
@@ -1315,6 +1301,16 @@
       return character != ',' && !Character.isWhitespace(character);
     }
 
+    private void parsePathFilter(Consumer<ProguardPathList> consumer)
+        throws ProguardRuleParserException {
+      skipWhitespace();
+      if (isOptionalArgumentGiven()) {
+        consumer.accept(parsePathFilter());
+      } else {
+        consumer.accept(ProguardPathList.emptyList());
+      }
+    }
+
     private ProguardPathList parsePathFilter() throws ProguardRuleParserException {
       ProguardPathList.Builder builder = ProguardPathList.builder();
       skipWhitespace();
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index 9e9f80e..da4d57f 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -44,6 +44,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -252,75 +253,87 @@
     assertEquals(0x03, matches);
   }
 
-  @Test
-  public void testDontWarn() throws Exception {
+  private void testDontXXX(String xxx, Function<ProguardConfiguration, ProguardClassFilter> pattern)
+      throws Exception {
     DexItemFactory dexItemFactory = new DexItemFactory();
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, reporter);
-    String dontwarn = "-dontwarn !foobar,*bar";
-    parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarn)));
+    String configuration = "-dont" + xxx + " !foobar,*bar";
+    parser.parse(createConfigurationForTesting(ImmutableList.of(configuration)));
     verifyParserEndsCleanly();
     ProguardConfiguration config = parser.getConfig();
-    assertFalse(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobaz;")));
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobar;")));
-    assertFalse(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lfoobar;")));
+    assertFalse(pattern.apply(config).matches(dexItemFactory.createType("Lboobaz;")));
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lboobar;")));
+    assertFalse(pattern.apply(config).matches(dexItemFactory.createType("Lfoobar;")));
   }
 
   @Test
-  public void testDontWarnMultiple() throws Exception {
+  public void testDontXXX() throws Exception {
+    testDontXXX("warn", ProguardConfiguration::getDontWarnPatterns);
+    testDontXXX("note", ProguardConfiguration::getDontNotePatterns);
+  }
+
+  private void testDontXXXMultiple(
+      String xxx, Function<ProguardConfiguration, ProguardClassFilter> pattern) throws Exception {
     DexItemFactory dexItemFactory = new DexItemFactory();
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, reporter);
-    List<String> configuration1 = ImmutableList.of("-dontwarn foo.**, bar.**");
-    List<String> configuration2 = ImmutableList.of("-dontwarn foo.**", "-dontwarn bar.**");
+    List<String> configuration1 = ImmutableList.of("-dont" + xxx + " foo.**, bar.**");
+    List<String> configuration2 = ImmutableList.of("-dont" + xxx + " foo.**", "-dontwarn bar.**");
     for (List<String> configuration : ImmutableList.of(configuration1, configuration2)) {
       parser.parse(createConfigurationForTesting(configuration));
       verifyParserEndsCleanly();
       ProguardConfiguration config = parser.getConfig();
-      assertTrue(
-          config.getDontWarnPatterns().matches(dexItemFactory.createType("Lfoo/Bar;")));
-      assertTrue(
-          config.getDontWarnPatterns().matches(dexItemFactory.createType("Lfoo/bar7Bar;")));
-      assertTrue(
-          config.getDontWarnPatterns().matches(dexItemFactory.createType("Lbar/Foo;")));
+      assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lfoo/Bar;")));
+      assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lfoo/bar7Bar;")));
+      assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lbar/Foo;")));
     }
   }
 
   @Test
-  public void testDontWarnAllExplicitly() throws Exception {
+  public void testDontWarnMultiple() throws Exception {
+    testDontXXXMultiple("warn", ProguardConfiguration::getDontWarnPatterns);
+    testDontXXXMultiple("note", ProguardConfiguration::getDontNotePatterns);
+  }
+
+  private void testDontXXXAllExplicitly(
+      String xxx, Function<ProguardConfiguration, ProguardClassFilter> pattern) throws Exception {
     DexItemFactory dexItemFactory = new DexItemFactory();
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, reporter);
-    String dontwarnAll = "-dontwarn *";
+    String dontwarnAll = "-dont" + xxx + " *";
     parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarnAll)));
     verifyParserEndsCleanly();
     ProguardConfiguration config = parser.getConfig();
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobaz;")));
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobar;")));
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lfoobar;")));
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lboobaz;")));
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lboobar;")));
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lfoobar;")));
+  }
+
+  @Test
+  public void testDontWarnAllExplicitly() throws Exception {
+    testDontXXXAllExplicitly("warn", ProguardConfiguration::getDontWarnPatterns);
+    testDontXXXAllExplicitly("note", ProguardConfiguration::getDontNotePatterns);
+  }
+
+  private void testDontXXXAllImplicitly(
+      String xxx, Function<ProguardConfiguration, ProguardClassFilter> pattern) throws Exception {
+    DexItemFactory dexItemFactory = new DexItemFactory();
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(dexItemFactory, reporter);
+    String dontwarnAll = "-dont" + xxx;
+    String otherOption = "-keep class *";
+    parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarnAll, otherOption)));
+    ProguardConfiguration config = parser.getConfig();
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lboobaz;")));
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lboobar;")));
+    assertTrue(pattern.apply(config).matches(dexItemFactory.createType("Lfoobar;")));
   }
 
   @Test
   public void testDontWarnAllImplicitly() throws Exception {
-    DexItemFactory dexItemFactory = new DexItemFactory();
-    ProguardConfigurationParser parser =
-        new ProguardConfigurationParser(dexItemFactory, reporter);
-    String dontwarnAll = "-dontwarn";
-    String otherOption = "-keep class *";
-    parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarnAll, otherOption)));
-    ProguardConfiguration config = parser.getConfig();
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobaz;")));
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobar;")));
-    assertTrue(
-        config.getDontWarnPatterns().matches(dexItemFactory.createType("Lfoobar;")));
+    testDontXXXAllImplicitly("warn", ProguardConfiguration::getDontWarnPatterns);
+    testDontXXXAllImplicitly("note", ProguardConfiguration::getDontNotePatterns);
   }
 
   @Test