Automatically (not explicitly) control Proguard-related default options

This CL re-applies 30ebba3 which has been reverted in 12bcf4f because of
these failures: http://storage.googleapis.com/r8-test-results/c0ff09e6-bac6-4ded-b776-b5b15342d83b/test/index.html

Certain options (minification/shrinking/keeprules/attrs) have different
defaults with and without a Proguard config file.
Originally it has been decided automatically, based on the presence of
Proguard options.

This has been changed to explicit decision in 5e8f1ba because of complications
from handling a ProguardConsumer. It has been suggested to restore the automatic
choice but the first attempt 30ebba3 broke some tests.

This CL restores the original, automatic choice.

Bug:
Change-Id: I7e0e7b96354e376829cd548b9a76e1efcdfbcf63
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 7eff6fa..3cecbe2 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -214,7 +214,7 @@
 
       ProguardConfiguration.Builder configurationBuilder;
       if (proguardConfigs.isEmpty()) {
-        configurationBuilder = ProguardConfiguration.builderInitializedWithDefaults(factory);
+        configurationBuilder = ProguardConfiguration.builder(factory);
       } else {
         ProguardConfigurationParser parser =
             new ProguardConfigurationParser(factory, getDiagnosticsHandler());
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 dc800a3..5fa3d72 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -19,13 +19,13 @@
 
     private final List<FilteredClassPath> injars = new ArrayList<>();
     private final List<FilteredClassPath> libraryjars = new ArrayList<>();
-    private PackageObfuscationMode packageObfuscationMode;
-    private String packagePrefix;
+    private PackageObfuscationMode packageObfuscationMode = PackageObfuscationMode.NONE;
+    private String packagePrefix = "";
     private boolean allowAccessModification;
     private boolean ignoreWarnings;
-    private boolean optimizing;
-    private boolean obfuscating;
-    private boolean shrinking;
+    private boolean optimizing = true;
+    private boolean obfuscating = true;
+    private boolean shrinking = true;
     private boolean printUsage;
     private Path printUsageFile;
     private boolean printMapping;
@@ -34,7 +34,7 @@
     private boolean verbose;
     private String renameSourceFileAttribute;
     private final List<String> keepAttributePatterns = new ArrayList<>();
-    private ProguardClassNameList dontWarnPatterns;
+    private ProguardClassNameList dontWarnPatterns = ProguardClassNameList.emptyList();
     protected final List<ProguardConfigurationRule> rules = new ArrayList<>();
     private final DexItemFactory dexItemFactory;
     private boolean printSeeds;
@@ -48,36 +48,6 @@
 
     private Builder(DexItemFactory dexItemFactory) {
       this.dexItemFactory = dexItemFactory;
-      resetProguardDefaults();
-    }
-
-    public void resetProguardDefaults() {
-      injars.clear();
-      libraryjars.clear();
-      packageObfuscationMode = PackageObfuscationMode.NONE;
-      packagePrefix = "";
-      allowAccessModification = false;
-      ignoreWarnings = false;
-      optimizing = true;
-      obfuscating = true;
-      shrinking = true;
-      printUsage = false;
-      printUsageFile = null;
-      printMapping = false;
-      printMappingFile = null;
-      applyMappingFile = null;
-      verbose = false;
-      renameSourceFileAttribute = null;
-      keepAttributePatterns.clear();
-      dontWarnPatterns = ProguardClassNameList.emptyList();
-      rules.clear();
-      printSeeds = false;
-      seedFile = null;
-      obfuscationDictionary = null;
-      classObfuscationDictionary = null;
-      packageObfuscationDictionary = null;
-      useUniqueClassMemberNames = false;
-      keepParameterNames = false;
     }
 
     public void addInjars(List<FilteredClassPath> injars) {
@@ -207,6 +177,14 @@
     }
 
     public ProguardConfiguration build() throws CompilationException {
+      if (rules.isEmpty()) {
+        setObfuscating(false);
+        setShrinking(false);
+        addRule(ProguardKeepRule.defaultKeepAllRule());
+        if (keepAttributePatterns.isEmpty()) {
+          addKeepAttributePatterns(KeepAttributeOptions.KEEP_ALL);
+        }
+      }
       return new ProguardConfiguration(
           dexItemFactory,
           injars,
@@ -334,15 +312,6 @@
     return new Builder(dexItemFactory);
   }
 
-  public static Builder builderInitializedWithDefaults(DexItemFactory dexItemFactory) {
-    Builder builder = new Builder(dexItemFactory);
-    builder.setObfuscating(false);
-    builder.setShrinking(false);
-    builder.addKeepAttributePatterns(KeepAttributeOptions.KEEP_ALL);
-    builder.addRule(ProguardKeepRule.defaultKeepAllRule());
-    return builder;
-  }
-
   public DexItemFactory getDexItemFactory() {
     return dexItemFactory;
   }
@@ -453,7 +422,7 @@
 
   public static ProguardConfiguration defaultConfiguration(DexItemFactory dexItemFactory) {
     try {
-      return builderInitializedWithDefaults(dexItemFactory).build();
+      return builder(dexItemFactory).build();
     } catch(CompilationException e) {
       // Building a builder initialized with defaults will not throw CompilationException because
       // DictionaryReader is called with empty lists.
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index c4af25c..6306f91 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -91,11 +91,9 @@
     checkAnnotationContent(INPUT_PATH, result);
   }
 
-  /**
-   * Check that when dontshrink and dontobfuscate is used the annotation is transmitted.
-   */
+  /** Check that when dontshrink and dontobfuscate is used the annotation is transmitted. */
   @Test
-  public void testSourceDebugExtensionWithShriking1()
+  public void testSourceDebugExtensionWithShrinking1()
       throws IOException, CompilationException, ExecutionException {
     Path outputPath = tmpOutputDir.newFolder().toPath();
     AndroidApp result = compileWithR8(INPUT_PATH, outputPath, DONT_SHRINK_DONT_OBFUSCATE_CONFIG);
@@ -125,7 +123,7 @@
   }
 
   /**
-   * Check that the annotation is removed when shriking is enabled and that there is not
+   * Check that the annotation is removed when shrinking is enabled and that there is not
    * keepattributes option.
    */
   @Test
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
index 427c253..029e083 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
@@ -21,8 +21,6 @@
     setUp(
         null,
         pg -> {
-          pg.resetProguardDefaults();
-          pg.addRule(ProguardKeepRule.defaultKeepAllRule());
           pg.setRenameSourceFileAttribute(TEST_FILE);
           pg.addKeepAttributePatterns(ImmutableList.of("SourceFile", "LineNumberTable"));
         });
diff --git a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
index 2054b22..6dda185 100644
--- a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
@@ -229,7 +229,7 @@
     R8Command command = parse("@" + argsFile.toString());
     assertEquals(CompilationMode.DEBUG, command.getMode());
     assertFalse(command.useMinification());
-    assertTrue(command.useTreeShaking());
+    assertFalse(command.useTreeShaking()); // We have no keep rules (proguard config file is empty).
     assertEquals(1, ToolHelper.getApp(command).getDexProgramResources().size());
   }