Support dumping for specific builds

Bug: b/236449152
Change-Id: Id0738e2736aa495e69b7b6812d6bc5245128e122
diff --git a/src/main/java/com/android/tools/r8/dump/DumpOptions.java b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
index 55d4411..1d55987 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -118,7 +118,7 @@
     return builder.toString();
   }
 
-  private Map<String, String> getBuildProperties() {
+  public Map<String, String> getBuildProperties() {
     Map<String, String> buildProperties = new LinkedHashMap<>();
     addDumpEntry(buildProperties, TOOL_KEY, tool.name());
     // We keep the following values for backward compatibility.
diff --git a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
index 8414589..368974b 100644
--- a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
+++ b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
@@ -7,6 +7,9 @@
 import com.android.tools.r8.errors.Unreachable;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
 
 public abstract class DumpInputFlags {
 
@@ -47,7 +50,7 @@
   }
 
   public static DumpInputFlags dumpToFile(Path file) {
-    return new DumpInputFlags() {
+    return new DumpInputToFileOrDirectoryFlags() {
 
       @Override
       public Path getDumpPath() {
@@ -55,13 +58,6 @@
       }
 
       @Override
-      public boolean shouldDump(DumpOptions options) {
-        // TODO(b/236449152): Add support for dumping only with specific build properties (e.g.,
-        //  'tool=R8').
-        return true;
-      }
-
-      @Override
       public boolean shouldFailCompilation() {
         return true;
       }
@@ -69,7 +65,7 @@
   }
 
   public static DumpInputFlags dumpToDirectory(Path directory) {
-    return new DumpInputFlags() {
+    return new DumpInputToFileOrDirectoryFlags() {
 
       @Override
       public Path getDumpPath() {
@@ -77,13 +73,6 @@
       }
 
       @Override
-      public boolean shouldDump(DumpOptions options) {
-        // TODO(b/236449152): Add support for dumping only with specific build properties (e.g.,
-        //  'tool=R8').
-        return true;
-      }
-
-      @Override
       public boolean shouldFailCompilation() {
         return false;
       }
@@ -95,4 +84,20 @@
   public abstract boolean shouldDump(DumpOptions options);
 
   public abstract boolean shouldFailCompilation();
+
+  abstract static class DumpInputToFileOrDirectoryFlags extends DumpInputFlags {
+
+    @Override
+    public boolean shouldDump(DumpOptions options) {
+      Map<String, String> buildProperties = options.getBuildProperties();
+      for (Entry<String, String> entry : buildProperties.entrySet()) {
+        String valueRegExp =
+            System.getProperty("com.android.tools.r8.dump.filter.buildproperty." + entry.getKey());
+        if (valueRegExp != null && !Pattern.matches(valueRegExp, entry.getValue())) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
index 9fca511..52aafa3 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
@@ -5,6 +5,7 @@
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -14,6 +15,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.DumpInputFlags;
 import com.android.tools.r8.utils.ZipUtils;
@@ -80,6 +82,30 @@
   }
 
   @Test
+  public void testDumpToFileSystemPropertyWhenMinifying() throws Exception {
+    for (boolean minification : BooleanUtils.values()) {
+      Path dump = temp.newFolder().toPath().resolve("dump.zip");
+      try {
+        testForExternalR8(parameters.getBackend(), parameters.getRuntime())
+            .addJvmFlag("-Dcom.android.tools.r8.dumpinputtofile=" + dump)
+            .addJvmFlag("-Dcom.android.tools.r8.dump.filter.buildproperty.minification=^true$")
+            .addProgramClasses(TestClass.class)
+            .applyIf(!minification, builder -> builder.addKeepRules("-dontobfuscate"))
+            .compile();
+        // Without minification there should be no dump, and thus compilation should succeed.
+        assertFalse(minification);
+      } catch (AssertionError e) {
+        assertTrue(minification);
+      }
+      if (minification) {
+        verifyDump(dump, false, true);
+      } else {
+        assertFalse(Files.exists(dump));
+      }
+    }
+  }
+
+  @Test
   public void testDumpToFileCLI() throws Exception {
     Path dump = temp.newFolder().toPath().resolve("dump.zip");
     try {