Make build properties available to DumpInputFlags for filtering

Bug: b/236449152
Change-Id: Icb779cba32f1de7fe091c6e2036b89ad50a03a56
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index c5f80d7..5c6f166 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.StringResource;
+import com.android.tools.r8.dump.DumpOptions;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.graph.ApplicationReaderMap;
@@ -182,12 +183,13 @@
   }
 
   private void dumpApplication(DumpInputFlags dumpInputFlags) {
-    if (dumpInputFlags.isNoDump()) {
+    DumpOptions dumpOptions = options.dumpOptions;
+    if (dumpOptions == null || !dumpInputFlags.shouldDump(dumpOptions)) {
       return;
     }
     Path dumpOutput = dumpInputFlags.getDumpPath();
     timing.begin("ApplicationReader.dump");
-    inputApp.dump(dumpOutput, options.dumpOptions, options.reporter, options.dexItemFactory());
+    inputApp.dump(dumpOutput, dumpOptions, options.reporter, options.dexItemFactory());
     timing.end();
     Diagnostic message = new StringDiagnostic("Dumped compilation inputs to: " + dumpOutput);
     if (dumpInputFlags.shouldFailCompilation()) {
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 da85b0e..55d4411 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -14,8 +14,10 @@
 import com.android.tools.r8.utils.ThreadUtils;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 
 @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@@ -109,34 +111,45 @@
     this.dumpInputToFile = dumpInputToFile;
   }
 
-  public String dumpOptions() {
+  public String getBuildPropertiesFileContent() {
     StringBuilder builder = new StringBuilder();
-    addDumpEntry(builder, TOOL_KEY, tool.name());
+    getBuildProperties()
+        .forEach((key, value) -> builder.append(key).append("=").append(value).append("\n"));
+    return builder.toString();
+  }
+
+  private Map<String, String> getBuildProperties() {
+    Map<String, String> buildProperties = new LinkedHashMap<>();
+    addDumpEntry(buildProperties, TOOL_KEY, tool.name());
     // We keep the following values for backward compatibility.
     addDumpEntry(
-        builder,
+        buildProperties,
         MODE_KEY,
         compilationMode == CompilationMode.DEBUG ? DEBUG_MODE_VALUE : RELEASE_MODE_VALUE);
-    addDumpEntry(builder, MIN_API_KEY, minApi);
-    addDumpEntry(builder, OPTIMIZE_MULTIDEX_FOR_LINEAR_ALLOC_KEY, optimizeMultidexForLinearAlloc);
+    addDumpEntry(buildProperties, MIN_API_KEY, minApi);
+    addDumpEntry(
+        buildProperties, OPTIMIZE_MULTIDEX_FOR_LINEAR_ALLOC_KEY, optimizeMultidexForLinearAlloc);
     if (threadCount != ThreadUtils.NOT_SPECIFIED) {
-      addDumpEntry(builder, THREAD_COUNT_KEY, threadCount);
+      addDumpEntry(buildProperties, THREAD_COUNT_KEY, threadCount);
     }
-    addDumpEntry(builder, DESUGAR_STATE_KEY, desugarState);
-    addDumpEntry(builder, ENABLE_MISSING_LIBRARY_API_MODELING, enableMissingLibraryApiModeling);
+    addDumpEntry(buildProperties, DESUGAR_STATE_KEY, desugarState);
+    addDumpEntry(
+        buildProperties, ENABLE_MISSING_LIBRARY_API_MODELING, enableMissingLibraryApiModeling);
     if (isAndroidPlatformBuild) {
-      addDumpEntry(builder, ANDROID_PLATFORM_BUILD, isAndroidPlatformBuild);
+      addDumpEntry(buildProperties, ANDROID_PLATFORM_BUILD, isAndroidPlatformBuild);
     }
-    addOptionalDumpEntry(builder, INTERMEDIATE_KEY, intermediate);
-    addOptionalDumpEntry(builder, INCLUDE_DATA_RESOURCES_KEY, includeDataResources);
-    addOptionalDumpEntry(builder, TREE_SHAKING_KEY, treeShaking);
-    addOptionalDumpEntry(builder, MINIFICATION_KEY, minification);
-    addOptionalDumpEntry(builder, FORCE_PROGUARD_COMPATIBILITY_KEY, forceProguardCompatibility);
+    addOptionalDumpEntry(buildProperties, INTERMEDIATE_KEY, intermediate);
+    addOptionalDumpEntry(buildProperties, INCLUDE_DATA_RESOURCES_KEY, includeDataResources);
+    addOptionalDumpEntry(buildProperties, TREE_SHAKING_KEY, treeShaking);
+    addOptionalDumpEntry(buildProperties, MINIFICATION_KEY, minification);
+    addOptionalDumpEntry(
+        buildProperties, FORCE_PROGUARD_COMPATIBILITY_KEY, forceProguardCompatibility);
     ArrayList<String> sortedKeys = new ArrayList<>(systemProperties.keySet());
     sortedKeys.sort(String::compareTo);
     sortedKeys.forEach(
-        key -> addDumpEntry(builder, SYSTEM_PROPERTY_PREFIX + key, systemProperties.get(key)));
-    return builder.toString();
+        key ->
+            addDumpEntry(buildProperties, SYSTEM_PROPERTY_PREFIX + key, systemProperties.get(key)));
+    return buildProperties;
   }
 
   public static void parse(String content, DumpOptions.Builder builder) {
@@ -219,12 +232,13 @@
     return minApi;
   }
 
-  private void addOptionalDumpEntry(StringBuilder builder, String key, Optional<?> optionalValue) {
-    optionalValue.ifPresent(bool -> addDumpEntry(builder, key, bool));
+  private void addOptionalDumpEntry(
+      Map<String, String> buildProperties, String key, Optional<?> optionalValue) {
+    optionalValue.ifPresent(bool -> addDumpEntry(buildProperties, key, bool));
   }
 
-  private void addDumpEntry(StringBuilder builder, String key, Object value) {
-    builder.append(key).append("=").append(value).append("\n");
+  private void addDumpEntry(Map<String, String> buildProperties, String key, Object value) {
+    buildProperties.put(key, Objects.toString(value));
   }
 
   private boolean hasDesugaredLibraryConfiguration() {
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index a013ba6..fbf344b 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -467,9 +467,6 @@
   }
 
   public void dump(Path output, DumpOptions options, Reporter reporter, DexItemFactory factory) {
-    if (options == null) {
-      return;
-    }
     int nextDexIndex = 0;
     OpenOption[] openOptions =
         new OpenOption[] {StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING};
@@ -477,7 +474,10 @@
       writeToZipStream(
           out, dumpVersionFileName, Version.getVersionString().getBytes(), ZipEntry.DEFLATED);
       writeToZipStream(
-          out, dumpBuildPropertiesFileName, options.dumpOptions().getBytes(), ZipEntry.DEFLATED);
+          out,
+          dumpBuildPropertiesFileName,
+          options.getBuildPropertiesFileContent().getBytes(),
+          ZipEntry.DEFLATED);
       if (options.getDesugaredLibraryJsonSource() != null) {
         writeToZipStream(
             out,
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 905ba91..8414589 100644
--- a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
+++ b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
+import com.android.tools.r8.dump.DumpOptions;
 import com.android.tools.r8.errors.Unreachable;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -34,8 +35,8 @@
       }
 
       @Override
-      public boolean isNoDump() {
-        return true;
+      public boolean shouldDump(DumpOptions options) {
+        return false;
       }
 
       @Override
@@ -54,6 +55,13 @@
       }
 
       @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,6 +77,13 @@
       }
 
       @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;
       }
@@ -77,9 +92,7 @@
 
   public abstract Path getDumpPath();
 
-  public boolean isNoDump() {
-    return false;
-  }
+  public abstract boolean shouldDump(DumpOptions options);
 
   public abstract boolean shouldFailCompilation();
 }