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"
     )));
