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();