Use Diagnostics for Proguard configuration warnings

Bug: 67579535
Change-Id: Ief4767ccee144e7cfcd4b900b813f5112c3c66f4
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index dd15f32..5caa704 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.shaking.ProguardConfigurationSourceStrings;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
@@ -101,7 +102,8 @@
       if (this.mainDexRules.isEmpty()) {
         mainDexKeepRules = ImmutableList.of();
       } else {
-        ProguardConfigurationParser parser = new ProguardConfigurationParser(factory);
+        ProguardConfigurationParser parser =
+            new ProguardConfigurationParser(factory, new DefaultDiagnosticsHandler());
         try {
           parser.parse(mainDexRules);
           mainDexKeepRules = parser.getConfig().getRules();
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 502dd3c..29f2ce1 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -195,7 +195,8 @@
       if (this.mainDexRules.isEmpty()) {
         mainDexKeepRules = ImmutableList.of();
       } else {
-        ProguardConfigurationParser parser = new ProguardConfigurationParser(factory);
+        ProguardConfigurationParser parser =
+            new ProguardConfigurationParser(factory, getDiagnosticsHandler());
         try {
           parser.parse(mainDexRules);
           mainDexKeepRules = parser.getConfig().getRules();
@@ -207,7 +208,8 @@
       if (proguardConfigs.isEmpty()) {
         configuration = ProguardConfiguration.defaultConfiguration(factory);
       } else {
-        ProguardConfigurationParser parser = new ProguardConfigurationParser(factory);
+        ProguardConfigurationParser parser =
+            new ProguardConfigurationParser(factory, getDiagnosticsHandler());
         try {
           parser.parse(proguardConfigs);
         } catch (ProguardRuleParserException e) {
diff --git a/src/main/java/com/android/tools/r8/ReadKeepFile.java b/src/main/java/com/android/tools/r8/ReadKeepFile.java
index 355d42c..86ef5a4 100644
--- a/src/main/java/com/android/tools/r8/ReadKeepFile.java
+++ b/src/main/java/com/android/tools/r8/ReadKeepFile.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
+import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
 import java.nio.file.Paths;
@@ -23,7 +24,8 @@
     try {
       System.out.println("  - reading " + fileName);
       timing.begin("Reading " + fileName);
-      new ProguardConfigurationParser(new DexItemFactory()).parse(Paths.get(fileName));
+      new ProguardConfigurationParser(new DexItemFactory(), new DefaultDiagnosticsHandler())
+          .parse(Paths.get(fileName));
       timing.end();
     } catch (IOException e) {
       System.err.print("Failed to parse Proguard keep file: " + e.getMessage());
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 a6e5703..c2686f3 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.shaking;
 
 import com.android.tools.r8.CompilationException;
+import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.DexAccessFlags;
 import com.android.tools.r8.graph.DexField;
@@ -17,6 +18,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
 import com.android.tools.r8.utils.LongInterval;
+import com.android.tools.r8.utils.StringDiagnostic;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.io.File;
@@ -36,6 +38,8 @@
 
   private final DexItemFactory dexItemFactory;
 
+  private final DiagnosticsHandler diagnosticsHandler;
+
   private static final List<String> ignoredSingleArgOptions = ImmutableList
       .of("protomapping",
           "target");
@@ -68,9 +72,11 @@
   private static final List<String> unsupportedFlagOptions = ImmutableList
       .of("skipnonpubliclibraryclasses");
 
-  public ProguardConfigurationParser(DexItemFactory dexItemFactory) {
+  public ProguardConfigurationParser(
+      DexItemFactory dexItemFactory, DiagnosticsHandler diagnosticsHandler) {
     this.dexItemFactory = dexItemFactory;
     configurationBuilder = ProguardConfiguration.builder(dexItemFactory);
+    this.diagnosticsHandler = diagnosticsHandler;
   }
 
   public ProguardConfiguration.Builder getConfigurationBuilder() {
@@ -101,7 +107,7 @@
   public void parse(List<ProguardConfigurationSource> sources)
       throws ProguardRuleParserException, IOException {
     for (ProguardConfigurationSource source : sources) {
-      new ProguardFileParser(source).parse();
+      new ProguardFileParser(source, diagnosticsHandler).parse();
     }
   }
 
@@ -111,7 +117,8 @@
     private int position = 0;
     private Path baseDirectory;
 
-    ProguardFileParser(ProguardConfigurationSource source) throws IOException {
+    ProguardFileParser(ProguardConfigurationSource source, DiagnosticsHandler diagnosticsHandler)
+        throws IOException {
       contents = source.get();
       baseDirectory = source.getBaseDirectory();
       name = source.getName();
@@ -123,7 +130,8 @@
       } while (parseOption());
     }
 
-    private boolean parseOption() throws ProguardRuleParserException {
+    private boolean parseOption()
+        throws ProguardRuleParserException {
       if (eof()) {
         return false;
       }
@@ -281,17 +289,19 @@
     }
 
     private void warnIgnoringOptions(String optionName) {
-      System.out.println("WARNING: Ignoring option: -" + optionName);
+      diagnosticsHandler.warning(new StringDiagnostic("Ignoring option: -" + optionName));
     }
 
     private void warnOverridingOptions(String optionName, String victim) {
-      System.out.println("WARNING: option -" + optionName + " overrides -" + victim);
+      diagnosticsHandler.warning(
+          new StringDiagnostic("Option -" + optionName + " overrides -" + victim));
     }
 
     private void parseInclude() throws ProguardRuleParserException {
       Path included = parseFileName();
       try {
-        new ProguardFileParser(new ProguardConfigurationSourceFile(included)).parse();
+        new ProguardFileParser(new ProguardConfigurationSourceFile(included), diagnosticsHandler)
+            .parse();
       } catch (FileNotFoundException | NoSuchFileException e) {
         throw parseError("Included file '" + included.toString() + "' not found", e);
       } catch (IOException e) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index a5d0322..6b95fa1 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -20,6 +20,7 @@
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -590,7 +591,8 @@
     if (configPaths.isEmpty()) {
       return ProguardConfiguration.defaultConfiguration(factory);
     }
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(factory);
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(factory, new DefaultDiagnosticsHandler());
     for (Path configPath : configPaths) {
       parser.parse(configPath);
     }
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 fe0b6f6..c6779a9 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -10,10 +10,12 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.DexAccessFlags;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions.KeepAttributeOptions;
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
@@ -104,19 +106,21 @@
   private static final String TARGET =
       VALID_PROGUARD_DIR + "target.flags";
 
+  private static final DiagnosticsHandler diagnosticsHandler = new DefaultDiagnosticsHandler();
+
   @Test
   public void parse() throws Exception {
     ProguardConfigurationParser parser;
 
     // Parse from file.
-    parser = new ProguardConfigurationParser(new DexItemFactory());
+    parser = new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PROGUARD_SPEC_FILE));
     List<ProguardConfigurationRule> rules = parser.getConfig().getRules();
     assertEquals(24, rules.size());
     assertEquals(1, rules.get(0).getMemberRules().size());
 
     // Parse from strings.
-    parser = new ProguardConfigurationParser(new DexItemFactory());
+    parser = new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     List<String> lines = FileUtils.readTextFile(Paths.get(PROGUARD_SPEC_FILE));
     parser.parse(new ProguardConfigurationSourceStrings(lines));
     rules = parser.getConfig().getRules();
@@ -126,7 +130,8 @@
 
   @Test
   public void parseMultipleNamePatterns() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(MULTIPLE_NAME_PATTERNS_FILE));
     List<ProguardConfigurationRule> rules = parser.getConfig().getRules();
     assertEquals(1, rules.size());
@@ -147,7 +152,8 @@
   @Test
   public void testDontWarn() throws Exception {
     DexItemFactory dexItemFactory = new DexItemFactory();
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(dexItemFactory);
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String dontwarn = "-dontwarn !foobar,*bar";
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(dontwarn)));
     ProguardConfiguration config = parser.getConfig();
@@ -162,7 +168,8 @@
   @Test
   public void testDontWarnAllExplicitly() throws Exception {
     DexItemFactory dexItemFactory = new DexItemFactory();
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(dexItemFactory);
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String dontwarnAll = "-dontwarn *";
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(dontwarnAll)));
     ProguardConfiguration config = parser.getConfig();
@@ -177,7 +184,8 @@
   @Test
   public void testDontWarnAllImplicitly() throws Exception {
     DexItemFactory dexItemFactory = new DexItemFactory();
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(dexItemFactory);
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String dontwarnAll = "-dontwarn";
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(dontwarnAll)));
     ProguardConfiguration config = parser.getConfig();
@@ -191,7 +199,8 @@
 
   @Test
   public void parseAccessFlags() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(ACCESS_FLAGS_FILE));
     List<ProguardConfigurationRule> rules = parser.getConfig().getRules();
     assertEquals(1, rules.size());
@@ -229,7 +238,8 @@
 
   @Test
   public void parseWhyAreYouKeeping() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(WHY_ARE_YOU_KEEPING_FILE));
     List<ProguardConfigurationRule> rules = parser.getConfig().getRules();
     assertEquals(1, rules.size());
@@ -242,7 +252,8 @@
 
   @Test
   public void parseAssumeNoSideEffects() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(ASSUME_NO_SIDE_EFFECTS));
     List<ProguardConfigurationRule> assumeNoSideEffects = parser.getConfig().getRules();
     assertEquals(1, assumeNoSideEffects.size());
@@ -253,7 +264,8 @@
 
   @Test
   public void parseAssumeNoSideEffectsWithReturnValue() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(ASSUME_NO_SIDE_EFFECTS_WITH_RETURN_VALUE));
     List<ProguardConfigurationRule> assumeNoSideEffects = parser.getConfig().getRules();
     assertEquals(1, assumeNoSideEffects.size());
@@ -292,7 +304,8 @@
 
   @Test
   public void parseAssumeValuesWithReturnValue() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(ASSUME_VALUES_WITH_RETURN_VALUE));
     List<ProguardConfigurationRule> assumeValues = parser.getConfig().getRules();
     assertEquals(1, assumeValues.size());
@@ -331,7 +344,8 @@
 
   @Test
   public void testIdentifierNameString() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     String config1 =
         "-identifiernamestring class a.b.c.*GeneratedClass {\n"
         + "  static java.lang.String CONTAINING_TYPE_*;\n"
@@ -375,7 +389,8 @@
 
   @Test
   public void parseDontobfuscate() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(DONT_OBFUSCATE));
     ProguardConfiguration config = parser.getConfig();
     assertFalse(config.isObfuscating());
@@ -383,7 +398,8 @@
 
   @Test
   public void parseRepackageClassesEmpty() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PACKAGE_OBFUSCATION_1));
     ProguardConfiguration config = parser.getConfig();
     assertEquals(PackageObfuscationMode.REPACKAGE, config.getPackageObfuscationMode());
@@ -393,7 +409,8 @@
 
   @Test
   public void parseRepackageClassesNonEmpty() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PACKAGE_OBFUSCATION_2));
     ProguardConfiguration config = parser.getConfig();
     assertEquals(PackageObfuscationMode.REPACKAGE, config.getPackageObfuscationMode());
@@ -403,7 +420,8 @@
 
   @Test
   public void parseFlattenPackageHierarchyEmpty() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PACKAGE_OBFUSCATION_3));
     ProguardConfiguration config = parser.getConfig();
     assertEquals(PackageObfuscationMode.FLATTEN, config.getPackageObfuscationMode());
@@ -413,7 +431,8 @@
 
   @Test
   public void parseFlattenPackageHierarchyNonEmpty() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PACKAGE_OBFUSCATION_4));
     ProguardConfiguration config = parser.getConfig();
     assertEquals(PackageObfuscationMode.FLATTEN, config.getPackageObfuscationMode());
@@ -424,7 +443,8 @@
   @Test
   public void flattenPackageHierarchyCannotOverrideRepackageClasses()
       throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PACKAGE_OBFUSCATION_5));
     ProguardConfiguration config = parser.getConfig();
     assertEquals(PackageObfuscationMode.REPACKAGE, config.getPackageObfuscationMode());
@@ -435,7 +455,8 @@
   @Test
   public void repackageClassesOverridesFlattenPackageHierarchy()
       throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PACKAGE_OBFUSCATION_6));
     ProguardConfiguration config = parser.getConfig();
     assertEquals(PackageObfuscationMode.REPACKAGE, config.getPackageObfuscationMode());
@@ -445,7 +466,8 @@
 
   @Test
   public void parseApplyMapping() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(APPLY_MAPPING));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.hasApplyMappingFile());
@@ -454,7 +476,8 @@
   @Test
   public void parseApplyMappingWithoutFile() throws Exception {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       parser.parse(Paths.get(APPLY_MAPPING_WITHOUT_FILE));
       fail("Expect to fail due to the lack of file name.");
     } catch (ProguardRuleParserException e) {
@@ -464,13 +487,15 @@
 
   @Test
   public void parseIncluding() throws Exception {
-    new ProguardConfigurationParser(new DexItemFactory()).parse(Paths.get(INCLUDING));
+    new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler)
+        .parse(Paths.get(INCLUDING));
   }
 
   @Test
   public void parseInvalidIncluding1() throws IOException {
     try {
-      new ProguardConfigurationParser(new DexItemFactory()).parse(Paths.get(INVALID_INCLUDING_1));
+      new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler)
+          .parse(Paths.get(INVALID_INCLUDING_1));
       fail();
     } catch (ProguardRuleParserException e) {
       assertTrue(e.getMessage().contains("6")); // line
@@ -482,7 +507,8 @@
   @Test
   public void parseInvalidIncluding2() throws IOException {
     try {
-      new ProguardConfigurationParser(new DexItemFactory()).parse(Paths.get(INVALID_INCLUDING_2));
+      new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler)
+          .parse(Paths.get(INVALID_INCLUDING_2));
       fail();
     } catch (ProguardRuleParserException e) {
       String message = e.getMessage();
@@ -494,7 +520,8 @@
 
   @Test
   public void parseLibraryJars() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     if (!ToolHelper.isLinux() && !ToolHelper.isMac()) {
       parser.parse(Paths.get(LIBRARY_JARS_WIN));
     } else {
@@ -506,7 +533,8 @@
   @Test
   public void parseInvalidFilePattern() throws IOException {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       parser.parse(new ProguardConfigurationSourceStrings(
           Collections.singletonList("-injars abc.jar(*.zip;*.class)")));
     } catch (ProguardRuleParserException e) {
@@ -517,7 +545,8 @@
 
   @Test
   public void parseSeeds() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(SEEDS));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.isPrintSeeds());
@@ -526,7 +555,8 @@
 
   @Test
   public void parseSeeds2() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(SEEDS_2));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.isPrintSeeds());
@@ -535,7 +565,8 @@
 
   @Test
   public void parseVerbose() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(VERBOSE));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.isVerbose());
@@ -543,13 +574,15 @@
 
   @Test
   public void parseKeepdirectories() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(KEEPDIRECTORIES));
   }
 
   @Test
   public void parseDontshrink() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(DONT_SHRINK));
     ProguardConfiguration config = parser.getConfig();
     assertFalse(config.isShrinking());
@@ -557,39 +590,45 @@
 
   @Test
   public void parseDontSkipNonPublicLibraryClasses() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(DONT_SKIP_NON_PUBLIC_LIBRARY_CLASSES));
   }
 
   @Test
   public void parseDontskipnonpubliclibraryclassmembers() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(DONT_SKIP_NON_PUBLIC_LIBRARY_CLASS_MEMBERS));
   }
 
   @Test
   public void parseOverloadAggressively() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(OVERLOAD_AGGRESIVELY));
   }
 
   @Test
   public void parseDontOptimize() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(DONT_OPTIMIZE));
     ProguardConfiguration config = parser.getConfig();
   }
 
   @Test
   public void parseDontOptimizeOverridesPasses() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(DONT_OPTIMIZE_OVERRIDES_PASSES));
     ProguardConfiguration config = parser.getConfig();
   }
 
   @Test
   public void parseOptimizationPasses() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(OPTIMIZATION_PASSES));
     ProguardConfiguration config = parser.getConfig();
   }
@@ -597,7 +636,8 @@
   @Test
   public void parseOptimizationPassesError() throws Exception {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       parser.parse(Paths.get(OPTIMIZATION_PASSES_WITHOUT_N));
       fail();
     } catch (ProguardRuleParserException e) {
@@ -608,7 +648,8 @@
   @Test
   public void parseSkipNonPublicLibraryClasses() throws IOException {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       parser.parse(Paths.get(SKIP_NON_PUBLIC_LIBRARY_CLASSES));
       fail();
     } catch (ProguardRuleParserException e) {
@@ -618,13 +659,15 @@
 
   @Test
   public void parseAndskipSingleArgument() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PARSE_AND_SKIP_SINGLE_ARGUMENT));
   }
 
   @Test
   public void parsePrintUsage() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PRINT_USAGE));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.isPrintUsage());
@@ -633,7 +676,8 @@
 
   @Test
   public void parsePrintUsageToFile() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(PRINT_USAGE_TO_FILE));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.isPrintUsage());
@@ -642,14 +686,16 @@
 
   @Test
   public void parseTarget() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(Paths.get(TARGET));
   }
 
   @Test
   public void parseInvalidKeepClassOption() throws Exception {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       Path proguardConfig = writeTextToTempFile(
           "-keepclassx public class * {  ",
           "  native <methods>;           ",
@@ -664,7 +710,8 @@
 
   @Test
   public void parseCustomFlags() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     // Custom Proguard flags -runtype and -laststageoutput are ignored.
     Path proguardConfig = writeTextToTempFile(
         "-runtype FINAL                    ",
@@ -675,7 +722,8 @@
 
   @Test
   public void testRenameSourceFileAttribute() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     String config1 = "-renamesourcefileattribute PG\n";
     String config2 = "-keepattributes SourceFile,SourceDir\n";
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(config1, config2)));
@@ -687,7 +735,8 @@
 
   @Test
   public void testRenameSourceFileAttributeEmpty() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     String config1 = "-renamesourcefileattribute\n";
     String config2 = "-keepattributes SourceFile\n";
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(config1, config2)));
@@ -697,7 +746,8 @@
   }
 
   private void testKeepattributes(List<String> expected, String config) throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(config)));
     assertEquals(expected, parser.getConfig().getKeepAttributesPatterns());
   }
@@ -721,7 +771,8 @@
   @Test
   public void parseInvalidKeepattributes() throws Exception {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of("-keepattributes xxx,")));
       fail();
     } catch (ProguardRuleParserException e) {
@@ -731,7 +782,8 @@
 
   @Test
   public void parseUseUniqueClassMemberNames() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
         "-useuniqueclassmembernames"
     )));
@@ -742,7 +794,8 @@
   @Test
   public void parseKeepParameterNames() throws Exception {
     try {
-      ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+      ProguardConfigurationParser parser =
+          new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
       parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
           "-keepparameternames"
       )));
@@ -756,7 +809,8 @@
 
   @Test
   public void parseKeepParameterNamesWithoutMinification() throws Exception {
-    ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory());
+    ProguardConfigurationParser parser =
+        new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
         "-keepparameternames",
         "-dontobfuscate"
@@ -764,7 +818,7 @@
     ProguardConfiguration config = parser.getConfig();
     assertTrue(config.isKeepParameterNames());
 
-    parser = new ProguardConfigurationParser(new DexItemFactory());
+    parser = new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
         "-keepparameternames"
     )));