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