Add a single canonical empty DesugaredLibrarySpecification

This refactors HumanDesugaredLibrarySpecification.empty() and MachineDesugaredLibrarySpecification.empty() into a single DesugaredLibrarySpecification.empty() that returns a canonical instance.

This allows easily checking if the specification has been set or not, by checking if `specification != DesugaredLibrarySpecification.empty()`.

Change-Id: Icaa4ee1e05b5452c574e6d48df2a40be8d41cf84
diff --git a/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java b/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
index eea737a..3805298 100644
--- a/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
+++ b/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -262,7 +261,7 @@
 
     DesugaredLibrarySpecification getDesugaredLibraryConfiguration(DexItemFactory factory) {
       if (desugaredLibrarySpecificationResources.isEmpty()) {
-        return HumanDesugaredLibrarySpecification.empty();
+        return DesugaredLibrarySpecification.empty();
       }
       if (desugaredLibrarySpecificationResources.size() > 1) {
         reporter.fatalError("Only one desugared library configuration is supported.");
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index 6975b83..21c2b1a 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.inspector.Inspector;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.profile.art.ArtProfileConsumer;
@@ -682,7 +681,7 @@
     DesugaredLibrarySpecification getDesugaredLibraryConfiguration(
         DexItemFactory factory, boolean libraryCompilation) {
       if (desugaredLibrarySpecificationResources.isEmpty()) {
-        return HumanDesugaredLibrarySpecification.empty();
+        return DesugaredLibrarySpecification.empty();
       }
       if (desugaredLibrarySpecificationResources.size() > 1) {
         throw new CompilationError("Only one desugared library configuration is supported.");
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
index e0af2eb..67f1460 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibrarySpecification.java
@@ -14,6 +14,10 @@
 
 public interface DesugaredLibrarySpecification {
 
+  static MachineDesugaredLibrarySpecification empty() {
+    return EmptyDesugaredLibrarySpecification.getInstance();
+  }
+
   default boolean isHuman() {
     return false;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/EmptyDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/EmptyDesugaredLibrarySpecification.java
new file mode 100644
index 0000000..5a8037f
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/EmptyDesugaredLibrarySpecification.java
@@ -0,0 +1,29 @@
+// Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.desugar.desugaredlibrary;
+
+import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineTopLevelFlags;
+
+class EmptyDesugaredLibrarySpecification extends MachineDesugaredLibrarySpecification {
+
+  private static final EmptyDesugaredLibrarySpecification INSTANCE =
+      new EmptyDesugaredLibrarySpecification();
+
+  private EmptyDesugaredLibrarySpecification() {
+    super(false, MachineTopLevelFlags.empty(), MachineRewritingFlags.builder().build());
+  }
+
+  /** Intentionally package-private, prefer {@link DesugaredLibrarySpecification#empty()}. */
+  static EmptyDesugaredLibrarySpecification getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isSupported(DexReference reference) {
+    return false;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
index f5b54e0..7cdbaf9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/LibraryDesugaringOptions.java
@@ -16,7 +16,7 @@
 
   // Contains flags describing library desugaring.
   private MachineDesugaredLibrarySpecification machineDesugaredLibrarySpecification =
-      MachineDesugaredLibrarySpecification.empty();
+      DesugaredLibrarySpecification.empty();
   private String synthesizedClassPrefix = "";
   private volatile DesugaredLibraryTypeRewriter typeRewriter;
 
@@ -76,7 +76,7 @@
 
   public void resetDesugaredLibrarySpecificationForTesting() {
     loadMachineDesugaredLibrarySpecification = null;
-    machineDesugaredLibrarySpecification = MachineDesugaredLibrarySpecification.empty();
+    machineDesugaredLibrarySpecification = DesugaredLibrarySpecification.empty();
     typeRewriter = null;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
index fcd5d0a..7f42cf0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
@@ -27,11 +27,6 @@
     this.rewritingFlags = rewritingFlags;
   }
 
-  public static HumanDesugaredLibrarySpecification empty() {
-    return new HumanDesugaredLibrarySpecification(
-        HumanTopLevelFlags.empty(), HumanRewritingFlags.empty(), false);
-  }
-
   @Override
   public boolean isEmpty() {
     return rewritingFlags.isEmpty();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
index 5d6e15c..cccf483 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Reporter;
@@ -53,7 +52,7 @@
 
   private DesugaredLibrarySpecification readDesugaredLibrarySpecification() {
     if (desugaredLibrarySpecificationResource == null) {
-      return MachineDesugaredLibrarySpecification.empty();
+      return DesugaredLibrarySpecification.empty();
     }
     return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
         desugaredLibrarySpecificationResource,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
index d7eb3d3..629cc8f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
@@ -480,7 +480,7 @@
   private MachineDesugaredLibrarySpecification getMachineSpecification(
       AndroidApiLevel api, StringResource specification) throws IOException {
     if (specification == null) {
-      return MachineDesugaredLibrarySpecification.empty();
+      return DesugaredLibrarySpecification.empty();
     }
     DesugaredLibrarySpecification librarySpecification =
         DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 51253df..27bbc17 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -34,16 +34,6 @@
 
   private int leadingVersionNumberCache = -1;
 
-  public static MachineDesugaredLibrarySpecification empty() {
-    return new MachineDesugaredLibrarySpecification(
-        false, MachineTopLevelFlags.empty(), MachineRewritingFlags.builder().build()) {
-      @Override
-      public boolean isSupported(DexReference reference) {
-        return false;
-      }
-    };
-  }
-
   public static MachineDesugaredLibrarySpecification withOnlyRewriteTypeForTesting(
       Map<DexType, DexType> rewriteTypeForTesting) {
     MachineRewritingFlags.Builder builder = MachineRewritingFlags.builder();