Change desugar configuration from boolean to enum

Bug: 147139686
Bug: 147472279
Bug: 147485959
Change-Id: I246c0f3f25afad1e6c09ae2e696af13041e1c6c0
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index fd2ecb3..5f65f6a 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.Reporter;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -35,7 +36,7 @@
   private final StringConsumer mainDexListConsumer;
   private final int minApiLevel;
   private final Reporter reporter;
-  private final boolean enableDesugaring;
+  private final DesugarState desugarState;
   private final boolean includeClassesChecksum;
   private final boolean optimizeMultidexForLinearAlloc;
   private final BiPredicate<String, Long> dexClassChecksumFilter;
@@ -48,7 +49,7 @@
     mode = null;
     minApiLevel = 0;
     reporter = new Reporter();
-    enableDesugaring = true;
+    desugarState = DesugarState.ON;
     includeClassesChecksum = false;
     optimizeMultidexForLinearAlloc = false;
     dexClassChecksumFilter = (name, checksum) -> true;
@@ -62,7 +63,7 @@
       StringConsumer mainDexListConsumer,
       int minApiLevel,
       Reporter reporter,
-      boolean enableDesugaring,
+      DesugarState desugarState,
       boolean optimizeMultidexForLinearAlloc,
       boolean includeClassesChecksum,
       BiPredicate<String, Long> dexClassChecksumFilter,
@@ -75,7 +76,7 @@
     this.mainDexListConsumer = mainDexListConsumer;
     this.minApiLevel = minApiLevel;
     this.reporter = reporter;
-    this.enableDesugaring = enableDesugaring;
+    this.desugarState = desugarState;
     this.optimizeMultidexForLinearAlloc = optimizeMultidexForLinearAlloc;
     this.includeClassesChecksum = includeClassesChecksum;
     this.dexClassChecksumFilter = dexClassChecksumFilter;
@@ -113,7 +114,11 @@
 
   /** Get the use-desugaring state. True if enabled, false otherwise. */
   public boolean getEnableDesugaring() {
-    return enableDesugaring;
+    return desugarState == DesugarState.ON;
+  }
+
+  DesugarState getDesugarState() {
+    return desugarState;
   }
 
   /** True if the output dex files has checksum information encoded in it. False otherwise. */
@@ -161,7 +166,7 @@
 
     private CompilationMode mode;
     private int minApiLevel = 0;
-    private boolean disableDesugaring = false;
+    private DesugarState desugarState = DesugarState.ON;
     private List<StringResource> desugaredLibraryConfigurationResources = new ArrayList<>();
     private boolean includeClassesChecksum = false;
     private boolean lookupLibraryBeforeProgram = true;
@@ -411,7 +416,7 @@
 
     @Deprecated
     public B setEnableDesugaring(boolean enableDesugaring) {
-      this.disableDesugaring = !enableDesugaring;
+      this.desugarState = enableDesugaring ? DesugarState.ON : DesugarState.OFF;
       return self();
     }
 
@@ -427,13 +432,17 @@
      * <p>Note that even for API 27, desugaring is still required for closures support on ART.
      */
     public B setDisableDesugaring(boolean disableDesugaring) {
-      this.disableDesugaring = disableDesugaring;
+      this.desugarState = disableDesugaring ? DesugarState.OFF : DesugarState.ON;
       return self();
     }
 
     /** Is desugaring forcefully disabled. */
     public boolean getDisableDesugaring() {
-      return disableDesugaring;
+      return desugarState == DesugarState.OFF;
+    }
+
+    DesugarState getDesugaringState() {
+      return desugarState;
     }
 
     @Deprecated
diff --git a/src/main/java/com/android/tools/r8/CompatDxHelper.java b/src/main/java/com/android/tools/r8/CompatDxHelper.java
index a84bab5..fb186f4 100644
--- a/src/main/java/com/android/tools/r8/CompatDxHelper.java
+++ b/src/main/java/com/android/tools/r8/CompatDxHelper.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 
 public class CompatDxHelper {
   public static void run(D8Command command, Boolean minimalMainDex)
@@ -13,7 +14,7 @@
     AndroidApp app = command.getInputApp();
     InternalOptions options = command.getInternalOptions();
     // DX does not desugar.
-    options.enableDesugaring = false;
+    options.desugarState = DesugarState.OFF;
     // DX allows --multi-dex without specifying a main dex list for legacy devices.
     // That is broken, but for CompatDX we do the same to not break existing builds
     // that are trying to transition.
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index b76e6a7..467570f 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AssertionConfigurationWithDefault;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
 import java.nio.file.Path;
@@ -213,7 +214,7 @@
           getMainDexListConsumer(),
           getMinApiLevel(),
           getReporter(),
-          !getDisableDesugaring(),
+          getDesugaringState(),
           intermediate,
           isOptimizeMultidexForLinearAlloc(),
           getIncludeClassesChecksum(),
@@ -281,7 +282,7 @@
       StringConsumer mainDexListConsumer,
       int minApiLevel,
       Reporter diagnosticsHandler,
-      boolean enableDesugaring,
+      DesugarState enableDesugaring,
       boolean intermediate,
       boolean optimizeMultidexForLinearAlloc,
       boolean encodeChecksum,
@@ -354,7 +355,7 @@
 
     // TODO(b/137168535) Disable non-null tracking for now.
     internal.enableNonNullTracking = false;
-    internal.enableDesugaring = getEnableDesugaring();
+    internal.desugarState = getDesugarState();
     internal.encodeChecksums = getIncludeClassesChecksum();
     internal.dexClassChecksumFilter = getDexClassChecksumFilter();
     internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index 1ed8cac..2509e12 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
@@ -71,7 +72,7 @@
       Boolean minimalMainDex,
       Map<String, Integer> inputOrdering)
       throws IOException {
-    options.enableDesugaring = false;
+    options.desugarState = DesugarState.OFF;
     options.enableMainDexListCheck = false;
     options.minimalMainDex = minimalMainDex;
     assert !options.isMinifying();
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index 2dee6ef..7ec9143 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.utils.FeatureClassMapping;
 import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
@@ -58,7 +59,7 @@
       ExecutorService executor)
       throws IOException {
     InternalOptions options = command.getInternalOptions();
-    options.enableDesugaring = false;
+    options.desugarState = DesugarState.OFF;
     options.enableMainDexListCheck = false;
     options.ignoreMainDexMissingClasses = true;
     options.minimalMainDex = false;
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index d190d6c..9db1c33 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AssertionConfigurationWithDefault;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
@@ -90,7 +91,7 @@
         mainDexListConsumer,
         minApiLevel,
         diagnosticsHandler,
-        true,
+        DesugarState.ON,
         false,
         false,
         (name, checksum) -> true,
@@ -166,7 +167,7 @@
 
     // TODO(b/137168535) Disable non-null tracking for now.
     internal.enableNonNullTracking = false;
-    assert internal.enableDesugaring;
+    assert internal.desugarState == DesugarState.ON;
     assert internal.enableInheritanceClassInDexDistributor;
     internal.enableInheritanceClassInDexDistributor = false;
 
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 187e095..4051f9c 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -25,6 +25,7 @@
 import com.android.tools.r8.utils.ExceptionDiagnostic;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
@@ -530,8 +531,10 @@
 
       assert getProgramConsumer() != null;
 
-      boolean desugaring =
-          (getProgramConsumer() instanceof ClassFileConsumer) ? false : !getDisableDesugaring();
+      DesugarState desugaring =
+          (getProgramConsumer() instanceof ClassFileConsumer)
+              ? DesugarState.OFF
+              : getDesugaringState();
 
       FeatureSplitConfiguration featureSplitConfiguration =
           !featureSplits.isEmpty() ? new FeatureSplitConfiguration(featureSplits, reporter) : null;
@@ -703,7 +706,7 @@
       CompilationMode mode,
       int minApiLevel,
       Reporter reporter,
-      boolean enableDesugaring,
+      DesugarState enableDesugaring,
       boolean enableTreeShaking,
       boolean enableMinification,
       boolean disableVerticalClassMerging,
@@ -792,7 +795,7 @@
     internal.debug = getMode() == CompilationMode.DEBUG;
     internal.programConsumer = getProgramConsumer();
     internal.minApiLevel = getMinApiLevel();
-    internal.enableDesugaring = getEnableDesugaring();
+    internal.desugarState = getDesugarState();
     assert internal.isShrinking() == getEnableTreeShaking();
     assert internal.isMinifying() == getEnableMinification();
     // In current implementation we only enable lambda merger if the tree
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 477925a..b40b925 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -90,6 +90,7 @@
 import com.android.tools.r8.utils.CfgPrinter;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.android.tools.r8.utils.ThreadUtils;
@@ -244,17 +245,18 @@
       this.methodOptimizationInfoCollector = null;
       return;
     }
-    this.lambdaRewriter = options.enableDesugaring ? new LambdaRewriter(appView) : null;
+    this.lambdaRewriter =
+        options.desugarState == DesugarState.ON ? new LambdaRewriter(appView) : null;
     this.interfaceMethodRewriter =
         options.isInterfaceMethodDesugaringEnabled()
             ? new InterfaceMethodRewriter(appView, this)
             : null;
     this.twrCloseResourceRewriter =
-        (options.enableDesugaring && enableTwrCloseResourceDesugaring())
+        ((options.desugarState == DesugarState.ON) && enableTwrCloseResourceDesugaring())
             ? new TwrCloseResourceRewriter(appView, this)
             : null;
     this.backportedMethodRewriter =
-        options.enableDesugaring
+        options.desugarState == DesugarState.ON
             ? new BackportedMethodRewriter(appView, this)
             : null;
     this.covariantReturnTypeAnnotationTransformer =
@@ -1290,7 +1292,7 @@
     deadCodeRemover.run(code);
     assert code.isConsistentSSA();
 
-    if (options.enableDesugaring && enableTryWithResourcesDesugaring()) {
+    if (options.desugarState == DesugarState.ON && enableTryWithResourcesDesugaring()) {
       codeRewriter.rewriteThrowableAddAndGetSuppressed(code);
     }
     if (backportedMethodRewriter != null) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 9ed931c..c233df4 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -74,6 +74,11 @@
     ON
   }
 
+  public enum DesugarState {
+    OFF,
+    ON
+  }
+
   public static final int SUPPORTED_CF_MAJOR_VERSION = Opcodes.V11;
   public static final int SUPPORTED_DEX_VERSION =
       AndroidApiLevel.LATEST.getDexVersion().getIntValue();
@@ -398,7 +403,7 @@
   // Flag to turn on/off lambda class merging in R8.
   public boolean enableLambdaMerging = false;
   // Flag to turn on/off desugaring in D8/R8.
-  public boolean enableDesugaring = true;
+  public DesugarState desugarState = DesugarState.ON;
   // Flag to turn on/off JDK11+ nest-access control
   public boolean enableNestBasedAccessDesugaring = true;
   // Flag to turn on/off reduction of nest to improve class merging optimizations.
@@ -1135,7 +1140,7 @@
     if (!hasConsumer()) {
       return false;
     }
-    return enableDesugaring
+    return desugarState == DesugarState.ON
         && interfaceMethodDesugaring == OffOrAuto.Auto
         && (!canUseDefaultAndStaticInterfaceMethods() || enableCfInterfaceMethodDesugaring);
   }
diff --git a/src/test/java/com/android/tools/r8/BaseCompilerCommandTest.java b/src/test/java/com/android/tools/r8/BaseCompilerCommandTest.java
index bc9ec14..21c3272 100644
--- a/src/test/java/com/android/tools/r8/BaseCompilerCommandTest.java
+++ b/src/test/java/com/android/tools/r8/BaseCompilerCommandTest.java
@@ -3,14 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 
 // Utilities common to all compiler command tests.
 public class BaseCompilerCommandTest {
 
   public static void assertDesugaringDisabled(BaseCompilerCommand command) {
-    assertFalse(command.getEnableDesugaring());
-    assertFalse(command.getInternalOptions().enableDesugaring);
+    assertEquals(DesugarState.OFF, command.getDesugarState());
+    assertEquals(DesugarState.OFF, command.getInternalOptions().desugarState);
   }
 
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithUnderscoreThisTestRunner.java b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithUnderscoreThisTestRunner.java
index feda70f..8769dc2 100644
--- a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithUnderscoreThisTestRunner.java
+++ b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithUnderscoreThisTestRunner.java
@@ -19,6 +19,7 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.Collections;
@@ -118,7 +119,7 @@
             .addOptionsModification(
                 internalOptions -> {
                   if (parameters.isCfRuntime()) {
-                    internalOptions.enableDesugaring = true;
+                    internalOptions.desugarState = DesugarState.ON;
                     internalOptions.enableCfInterfaceMethodDesugaring = true;
                   }
                 });