Merge commit '688b2c24f7630758c232801c9cff51d2f78886a6' into dev-release
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 238f3ee..ef9b604 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -52,10 +52,10 @@
"java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
"java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
"java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic",
- "java.util.function.": "j$.util.function.",
"java.util.stream.": "j$.util.stream."
},
"maintain_prefix": [
+ "java.util.function.",
"java.io.UncheckedIOException"
],
"emulate_interface": {
@@ -266,6 +266,7 @@
"-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { private void readObject(java.io.ObjectInputStream); private void writeObject(java.io.ObjectOutputStream); private void readObjectNoData(); private static final java.io.ObjectStreamField[] serialPersistentFields; private static final long serialVersionUID;}",
"-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$CounterCell { long value; }",
"-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); public static final !synthetic <fields>; }",
+ "-keeppackagenames java.**",
"-keeppackagenames j$.**",
"-keepclassmembers class j$.util.IntSummaryStatistics { long count; long sum; int min; int max; }",
"-keepclassmembers class j$.util.LongSummaryStatistics { long count; long sum; long min; long max; }",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_minimal.json b/src/library_desugar/jdk11/desugar_jdk_libs_minimal.json
index 73fa330..8064ed0 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_minimal.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_minimal.json
@@ -17,6 +17,7 @@
"library_flags": [],
"shrinker_config": [
"-keeppackagenames java.**",
+ "-keeppackagenames j$.**",
"-keepattributes Signature",
"-keepattributes EnclosingMethod",
"-keepattributes InnerClasses"
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
index 03ca930..4f0ec65 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -60,6 +60,48 @@
"java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
"java.nio.file.": "j$.nio.file."
},
+ "dont_rewrite_prefix": [
+ "java.nio.file.AccessDeniedException",
+ "java.nio.file.AtomicMoveNotSupportedException",
+ "java.nio.file.ClosedDirectoryStreamException",
+ "java.nio.file.ClosedFileSystemException",
+ "java.nio.file.ClosedWatchServiceException",
+ "java.nio.file.DirectoryIteratorException",
+ "java.nio.file.DirectoryNotEmptyException",
+ "java.nio.file.FileAlreadyExistsException",
+ "java.nio.file.FileSystemAlreadyExistsException",
+ "java.nio.file.FileSystemException",
+ "java.nio.file.FileSystemLoopException",
+ "java.nio.file.FileSystemNotFoundException",
+ "java.nio.file.InvalidPathException",
+ "java.nio.file.NoSuchFileException",
+ "java.nio.file.NotDirectoryException",
+ "java.nio.file.NotLinkException",
+ "java.nio.file.ProviderMismatchException",
+ "java.nio.file.ProviderNotFoundException",
+ "java.nio.file.ReadOnlyFileSystemException"
+ ],
+ "maintain_prefix": [
+ "java.nio.file.AccessDeniedException",
+ "java.nio.file.AtomicMoveNotSupportedException",
+ "java.nio.file.ClosedDirectoryStreamException",
+ "java.nio.file.ClosedFileSystemException",
+ "java.nio.file.ClosedWatchServiceException",
+ "java.nio.file.DirectoryIteratorException",
+ "java.nio.file.DirectoryNotEmptyException",
+ "java.nio.file.FileAlreadyExistsException",
+ "java.nio.file.FileSystemAlreadyExistsException",
+ "java.nio.file.FileSystemException",
+ "java.nio.file.FileSystemLoopException",
+ "java.nio.file.FileSystemNotFoundException",
+ "java.nio.file.InvalidPathException",
+ "java.nio.file.NoSuchFileException",
+ "java.nio.file.NotDirectoryException",
+ "java.nio.file.NotLinkException",
+ "java.nio.file.ProviderMismatchException",
+ "java.nio.file.ProviderNotFoundException",
+ "java.nio.file.ReadOnlyFileSystemException"
+ ],
"retarget_method_with_emulated_dispatch": {
"java.nio.file.Path java.io.File#toPath()": "java.io.DesugarFile"
},
@@ -131,13 +173,13 @@
"java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
"java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
"java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic",
- "java.util.function.": "j$.util.function.",
"java.util.stream.": "j$.util.stream."
},
"dont_rewrite_prefix": [
"java.nio.channels.FileChannel$MapMode"
],
"maintain_prefix": [
+ "java.util.function.",
"java.io.UncheckedIOException"
],
"emulate_interface": {
@@ -411,6 +453,7 @@
"-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { private void readObject(java.io.ObjectInputStream); private void writeObject(java.io.ObjectOutputStream); private void readObjectNoData(); private static final java.io.ObjectStreamField[] serialPersistentFields; private static final long serialVersionUID;}",
"-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$CounterCell { long value; }",
"-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); public static final !synthetic <fields>; }",
+ "-keeppackagenames java.**",
"-keeppackagenames j$.**",
"-keepclassmembers class j$.util.IntSummaryStatistics { long count; long sum; int min; int max; }",
"-keepclassmembers class j$.util.LongSummaryStatistics { long count; long sum; long min; long max; }",
diff --git a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
index 967453b..3d4c3b2 100644
--- a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
+++ b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
@@ -471,8 +471,12 @@
}
public static DexInstruction getLastExecutableInstruction(DexCode code) {
+ return getLastExecutableInstruction(code.instructions);
+ }
+
+ public static DexInstruction getLastExecutableInstruction(DexInstruction[] instructions) {
DexInstruction lastInstruction = null;
- for (DexInstruction instruction : code.instructions) {
+ for (DexInstruction instruction : instructions) {
if (!instruction.isPayload()) {
lastInstruction = instruction;
}
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 50a91d9..aef2eeb 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -9,6 +9,7 @@
import static com.android.tools.r8.utils.EncodedValueUtils.parseUnsigned;
import com.android.tools.r8.ProgramResource.Kind;
+import com.android.tools.r8.debuginfo.DebugRepresentation;
import com.android.tools.r8.dex.code.DexInstruction;
import com.android.tools.r8.dex.code.DexInstructionFactory;
import com.android.tools.r8.errors.CompilationError;
@@ -133,6 +134,13 @@
// Mapping from offset to dex item;
private Int2ReferenceMap<Object> offsetMap = new Int2ReferenceOpenHashMap<>();
+ // Mapping from offset to cached debug info that is not pc2pc based.
+ // This is a secondary map that is used for each debug info item that structurally looks like
+ // a pc2pc encoding but which is referenced from methods that don't fit within the encoding.
+ // This can happen because the two overlap in representation.
+ private Int2ReferenceMap<EventBasedDebugInfo> nonPcBasedDebugInfo =
+ new Int2ReferenceOpenHashMap<>();
+
// Factory to canonicalize certain dexitems.
private final DexItemFactory dexItemFactory;
@@ -520,13 +528,36 @@
annotationSetAt(classAnnotationsOff), fields, methods, parameters);
}
- private DexDebugInfo debugInfoAt(int offset) {
- return (DexDebugInfo) cacheAt(offset, this::parseDebugInfo);
+ private DexDebugInfo debugInfoAt(int offset, DexInstruction[] instructions) {
+ DexDebugInfo debugInfo = (DexDebugInfo) cacheAt(offset, this::parseDebugInfoAllowPc2PcEncoding);
+ // If the debug information matches a pc2pc encoding check that the instructions are within
+ // the max-pc bound of this method. If not, the info is not an actual pc encoding. Re-read the
+ // info as a normal event based encoding (and cache it to preserve sharing).
+ if (debugInfo != null && debugInfo.isPcBasedInfo()) {
+ PcBasedDebugInfo pcBasedInfo = debugInfo.asPcBasedInfo();
+ int maxPc = pcBasedInfo.getMaxPc();
+ DexInstruction last = DebugRepresentation.getLastExecutableInstruction(instructions);
+ if (last.getOffset() > maxPc) {
+ return nonPcBasedDebugInfo.computeIfAbsent(
+ offset, this::parseDebugInfoDisallowPc2PcEncoding);
+ }
+ }
+ return debugInfo;
}
- private DexDebugInfo parseDebugInfo() {
+ private DexDebugInfo parseDebugInfoAllowPc2PcEncoding() {
+ return parseDebugInfo(true);
+ }
+
+ private EventBasedDebugInfo parseDebugInfoDisallowPc2PcEncoding(int offset) {
+ dexReader.position(offset);
+ EventBasedDebugInfo debugInfo = parseDebugInfo(false).asEventBasedInfo();
+ return debugInfo;
+ }
+
+ private DexDebugInfo parseDebugInfo(boolean allowPc2PcEncoding) {
int start = dexReader.getUleb128();
- boolean isPcBasedDebugInfo = start == 0;
+ boolean isPcBasedDebugInfo = allowPc2PcEncoding && start == PcBasedDebugInfo.START_LINE;
int parametersSize = dexReader.getUleb128();
DexString[] parameters = new DexString[parametersSize];
for (int i = 0; i < parametersSize; i++) {
@@ -1004,13 +1035,15 @@
}
}
}
- // Store and restore offset information around reading debug info.
- int saved = dexReader.position();
- DexDebugInfo debugInfo = debugInfoAt(debugInfoOff);
- dexReader.position(saved);
DexInstructionFactory factory = new DexInstructionFactory();
DexInstruction[] instructions =
factory.readSequenceFrom(ShortBuffer.wrap(code), 0, code.length, indexedItems);
+
+ // Store and restore offset information around reading debug info.
+ int saved = dexReader.position();
+ DexDebugInfo debugInfo = debugInfoAt(debugInfoOff, instructions);
+ dexReader.position(saved);
+
return new DexCode(registerSize, insSize, outsSize, instructions, tries, handlers, debugInfo);
}
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 839545d..cb15cb2 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.debuginfo.DebugRepresentation;
import com.android.tools.r8.errors.DexFileOverflowDiagnostic;
import com.android.tools.r8.errors.InternalCompilerError;
-import com.android.tools.r8.experimental.startup.StartupClass;
import com.android.tools.r8.experimental.startup.StartupOrder;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -47,7 +46,6 @@
import com.android.tools.r8.utils.Timing;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.google.common.collect.Sets;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMaps;
@@ -947,17 +945,7 @@
}
StartupOrder startupOrder = appView.appInfoWithClassHierarchy().getStartupOrder();
SyntheticItems syntheticItems = appView.getSyntheticItems();
- return clazz -> {
- if (syntheticItems.isSyntheticClass(clazz)) {
- return Iterables.any(
- syntheticItems.getSynthesizingContextTypes(clazz.getType()),
- startupOrder::containsSyntheticClassesSynthesizedFrom);
- } else {
- StartupClass<DexType> startupClass =
- StartupClass.<DexType>builder().setReference(clazz.getType()).build();
- return startupOrder.contains(startupClass);
- }
- };
+ return clazz -> startupOrder.contains(clazz.getType(), syntheticItems);
}
public List<DexProgramClass> getStartupClasses() {
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 a604608..da85b0e 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -6,7 +6,6 @@
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.dex.Marker.Tool;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
import com.android.tools.r8.features.FeatureSplitConfiguration;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
import com.android.tools.r8.shaking.ProguardConfiguration;
@@ -243,11 +242,6 @@
return featureSplitConfiguration;
}
- public StartupConfiguration getStartupConfiguration() {
- // The startup configuration is not included in dumps.
- return null;
- }
-
public String getParsedProguardConfiguration() {
return proguardConfiguration == null ? null : proguardConfiguration.getParsedConfiguration();
}
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
index 00f0db2..3566ad1 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
@@ -17,12 +17,7 @@
EmptyStartupOrder() {}
@Override
- public boolean contains(StartupClass<DexType> startupClass) {
- return false;
- }
-
- @Override
- public boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType) {
+ public boolean contains(DexType type, SyntheticItems syntheticItems) {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
index 1b8eab9..673e0de 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.LazyBox;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Collection;
@@ -26,23 +27,42 @@
private final LinkedHashSet<StartupClass<DexType>> startupClasses;
+ // Redundant sets to allow efficient querying without boxing.
+ private final Set<DexType> nonSyntheticStartupClasses = Sets.newIdentityHashSet();
+ private final Set<DexType> syntheticStartupClasses = Sets.newIdentityHashSet();
+
NonEmptyStartupOrder(LinkedHashSet<StartupClass<DexType>> startupClasses) {
assert !startupClasses.isEmpty();
this.startupClasses = startupClasses;
+ for (StartupClass<DexType> startupClass : startupClasses) {
+ if (startupClass.isSynthetic()) {
+ syntheticStartupClasses.add(startupClass.getReference());
+ } else {
+ nonSyntheticStartupClasses.add(startupClass.getReference());
+ }
+ }
}
@Override
- public boolean contains(StartupClass<DexType> startupClass) {
- return startupClasses.contains(startupClass);
+ public boolean contains(DexType type, SyntheticItems syntheticItems) {
+ return syntheticItems.isSyntheticClass(type)
+ ? containsSyntheticClass(type, syntheticItems)
+ : containsNonSyntheticClass(type);
}
- @Override
- public boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType) {
- return contains(
- StartupClass.<DexType>builder()
- .setReference(synthesizingContextType)
- .setSynthetic()
- .build());
+ private boolean containsNonSyntheticClass(DexType type) {
+ return nonSyntheticStartupClasses.contains(type);
+ }
+
+ private boolean containsSyntheticClass(DexType type, SyntheticItems syntheticItems) {
+ assert syntheticItems.isSyntheticClass(type);
+ return Iterables.any(
+ syntheticItems.getSynthesizingContextTypes(type),
+ this::containsSyntheticClassesSynthesizedFrom);
+ }
+
+ private boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType) {
+ return syntheticStartupClasses.contains(synthesizingContextType);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
index 78126fd..5d67d8c 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
@@ -33,9 +33,7 @@
return new EmptyStartupOrder();
}
- public abstract boolean contains(StartupClass<DexType> startupClass);
-
- public abstract boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType);
+ public abstract boolean contains(DexType type, SyntheticItems syntheticItems);
public abstract Collection<StartupClass<DexType>> getClasses();
diff --git a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
index b721f6f..2113b52 100644
--- a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
+++ b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
@@ -8,8 +8,6 @@
import com.android.tools.r8.ProgramResource;
import com.android.tools.r8.ProgramResourceProvider;
import com.android.tools.r8.ResourceException;
-import com.android.tools.r8.experimental.startup.StartupClass;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
import com.android.tools.r8.experimental.startup.StartupOrder;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
@@ -31,21 +29,18 @@
public class ClassToFeatureSplitMap {
- private final FeatureSplit baseStartup;
private final Map<DexType, FeatureSplit> classToFeatureSplitMap;
private final Map<FeatureSplit, String> representativeStringsForFeatureSplit;
private ClassToFeatureSplitMap(
- FeatureSplit baseStartup,
Map<DexType, FeatureSplit> classToFeatureSplitMap,
Map<FeatureSplit, String> representativeStringsForFeatureSplit) {
- this.baseStartup = baseStartup;
this.classToFeatureSplitMap = classToFeatureSplitMap;
this.representativeStringsForFeatureSplit = representativeStringsForFeatureSplit;
}
public static ClassToFeatureSplitMap createEmptyClassToFeatureSplitMap() {
- return new ClassToFeatureSplitMap(FeatureSplit.BASE, new IdentityHashMap<>(), null);
+ return new ClassToFeatureSplitMap(new IdentityHashMap<>(), null);
}
public static ClassToFeatureSplitMap createInitialClassToFeatureSplitMap(
@@ -53,73 +48,42 @@
return createInitialClassToFeatureSplitMap(
options.dexItemFactory(),
options.featureSplitConfiguration,
- options.getStartupOptions().getStartupConfiguration(),
options.reporter);
}
public static ClassToFeatureSplitMap createInitialClassToFeatureSplitMap(
DexItemFactory dexItemFactory,
FeatureSplitConfiguration featureSplitConfiguration,
- StartupConfiguration startupConfiguration,
Reporter reporter) {
- if (featureSplitConfiguration == null && startupConfiguration == null) {
+ if (featureSplitConfiguration == null) {
return createEmptyClassToFeatureSplitMap();
}
Map<DexType, FeatureSplit> classToFeatureSplitMap = new IdentityHashMap<>();
Map<FeatureSplit, String> representativeStringsForFeatureSplit = new IdentityHashMap<>();
- if (featureSplitConfiguration != null) {
- for (FeatureSplit featureSplit : featureSplitConfiguration.getFeatureSplits()) {
- String representativeType = null;
- for (ProgramResourceProvider programResourceProvider :
- featureSplit.getProgramResourceProviders()) {
- try {
- for (ProgramResource programResource : programResourceProvider.getProgramResources()) {
- for (String classDescriptor : programResource.getClassDescriptors()) {
- DexType type = dexItemFactory.createType(classDescriptor);
- classToFeatureSplitMap.put(type, featureSplit);
- if (representativeType == null
- || classDescriptor.compareTo(representativeType) > 0) {
- representativeType = classDescriptor;
- }
+ for (FeatureSplit featureSplit : featureSplitConfiguration.getFeatureSplits()) {
+ String representativeType = null;
+ for (ProgramResourceProvider programResourceProvider :
+ featureSplit.getProgramResourceProviders()) {
+ try {
+ for (ProgramResource programResource : programResourceProvider.getProgramResources()) {
+ for (String classDescriptor : programResource.getClassDescriptors()) {
+ DexType type = dexItemFactory.createType(classDescriptor);
+ classToFeatureSplitMap.put(type, featureSplit);
+ if (representativeType == null || classDescriptor.compareTo(representativeType) > 0) {
+ representativeType = classDescriptor;
}
}
- } catch (ResourceException e) {
- throw reporter.fatalError(e.getMessage());
}
- }
- if (representativeType != null) {
- representativeStringsForFeatureSplit.put(featureSplit, representativeType);
+ } catch (ResourceException e) {
+ throw reporter.fatalError(e.getMessage());
}
}
- }
-
- FeatureSplit baseStartup;
- if (startupConfiguration != null && startupConfiguration.hasStartupClasses()) {
- StartupClass<DexType> representativeStartupClass = null;
- for (StartupClass<DexType> startupClass : startupConfiguration.getStartupClasses()) {
- if (startupClass.isSynthetic()
- || classToFeatureSplitMap.containsKey(startupClass.getReference())) {
- continue;
- }
- classToFeatureSplitMap.put(startupClass.getReference(), FeatureSplit.BASE_STARTUP);
- if (representativeStartupClass == null
- || startupClass
- .getReference()
- .getDescriptor()
- .compareTo(representativeStartupClass.getReference().getDescriptor())
- > 0) {
- representativeStartupClass = startupClass;
- }
+ if (representativeType != null) {
+ representativeStringsForFeatureSplit.put(featureSplit, representativeType);
}
- baseStartup = FeatureSplit.BASE_STARTUP;
- representativeStringsForFeatureSplit.put(
- baseStartup, representativeStartupClass.getReference().toDescriptorString());
- } else {
- baseStartup = FeatureSplit.BASE;
}
- return new ClassToFeatureSplitMap(
- baseStartup, classToFeatureSplitMap, representativeStringsForFeatureSplit);
+ return new ClassToFeatureSplitMap(classToFeatureSplitMap, representativeStringsForFeatureSplit);
}
public int compareFeatureSplits(FeatureSplit featureSplitA, FeatureSplit featureSplitB) {
@@ -140,14 +104,6 @@
.compareTo(representativeStringsForFeatureSplit.get(featureSplitB));
}
- /**
- * Returns the base startup if there are any startup classes given on input. Otherwise returns
- * base.
- */
- public FeatureSplit getBaseStartup() {
- return baseStartup;
- }
-
public Map<FeatureSplit, Set<DexProgramClass>> getFeatureSplitClasses(
Set<DexProgramClass> classes, AppView<? extends AppInfoWithClassHierarchy> appView) {
return getFeatureSplitClasses(
@@ -184,23 +140,32 @@
public FeatureSplit getFeatureSplit(
DexType type, StartupOrder startupOrder, SyntheticItems syntheticItems) {
- FeatureSplit feature = classToFeatureSplitMap.get(type);
- if (feature != null) {
- assert !syntheticItems.isSyntheticClass(type);
- return feature;
+ if (syntheticItems == null) {
+ // Called from AndroidApp.dumpProgramResources().
+ assert startupOrder.isEmpty();
+ return classToFeatureSplitMap.getOrDefault(type, FeatureSplit.BASE);
}
- if (syntheticItems != null) {
- feature = syntheticItems.getContextualFeatureSplit(type, this);
- if (feature != null && !feature.isBase()) {
- return feature;
+ FeatureSplit feature;
+ boolean isSynthetic = syntheticItems.isSyntheticClass(type);
+ if (isSynthetic) {
+ assert !classToFeatureSplitMap.containsKey(type);
+ if (syntheticItems.isSyntheticOfKind(type, k -> k.ENUM_UNBOXING_SHARED_UTILITY_CLASS)) {
+ // Use the startup base if there is one, such that we don't merge non-startup classes with
+ // the shared utility class in case it is used during startup. The use of base startup
+ // allows for merging startup classes with the shared utility class, however, which could be
+ // bad for startup if the shared utility class is not used during startup.
+ return startupOrder.isEmpty() ? FeatureSplit.BASE : FeatureSplit.BASE_STARTUP;
}
- for (DexType context : syntheticItems.getSynthesizingContextTypes(type)) {
- if (startupOrder.containsSyntheticClassesSynthesizedFrom(context)) {
- return FeatureSplit.BASE_STARTUP;
- }
- }
+ feature = syntheticItems.getContextualFeatureSplitOrDefault(type, FeatureSplit.BASE);
+ } else {
+ feature = classToFeatureSplitMap.getOrDefault(type, FeatureSplit.BASE);
}
- return FeatureSplit.BASE;
+ if (feature.isBase()) {
+ return startupOrder.contains(type, syntheticItems)
+ ? FeatureSplit.BASE_STARTUP
+ : FeatureSplit.BASE;
+ }
+ return feature;
}
// Note, this predicate may be misleading as the map does not include synthetics.
@@ -299,7 +264,7 @@
assert existing == null || existing == featureSplit;
});
return new ClassToFeatureSplitMap(
- baseStartup, rewrittenClassToFeatureSplitMap, representativeStringsForFeatureSplit);
+ rewrittenClassToFeatureSplitMap, representativeStringsForFeatureSplit);
}
public ClassToFeatureSplitMap withoutPrunedItems(PrunedItems prunedItems) {
@@ -311,7 +276,7 @@
}
});
return new ClassToFeatureSplitMap(
- baseStartup, rewrittenClassToFeatureSplitMap, representativeStringsForFeatureSplit);
+ rewrittenClassToFeatureSplitMap, representativeStringsForFeatureSplit);
}
// Static helpers to avoid verbose predicates.
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
index 8469b4e..0300502 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
@@ -85,7 +85,7 @@
}
public static class PcBasedDebugInfo extends DexDebugInfo implements DexDebugInfoForWriting {
- private static final int START_LINE = 0;
+ public static final int START_LINE = 1;
private final int parameterCount;
private final int maxPc;
@@ -302,9 +302,15 @@
assert DebugRepresentation.verifyLastExecutableInstructionWithinBound(
code, pcBasedDebugInfo.maxPc);
// Generate a line event at each throwing instruction.
- List<DexDebugEvent> events = new ArrayList<>(code.instructions.length);
+ DexInstruction[] instructions = code.instructions;
+ return forceConvertToEventBasedDebugInfo(pcBasedDebugInfo, instructions, factory);
+ }
+
+ public static EventBasedDebugInfo forceConvertToEventBasedDebugInfo(
+ PcBasedDebugInfo pcBasedDebugInfo, DexInstruction[] instructions, DexItemFactory factory) {
+ List<DexDebugEvent> events = new ArrayList<>(instructions.length);
int delta = 0;
- for (DexInstruction instruction : code.instructions) {
+ for (DexInstruction instruction : instructions) {
if (instruction.canThrow()) {
DexDebugEventBuilder.addDefaultEventWithAdvancePcIfNecessary(delta, delta, events, factory);
delta = 0;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
index af2f6f8..473cfda 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
@@ -125,6 +125,12 @@
return;
}
builder.maintainType(type);
+ // We cannot rely on the synthetic classes being on the same package anyway since the runtime
+ // may use a class from the Android framework which is considered in a different package even
+ // if the package name is identical.
+ // This is required since the Android framework also generates external synthetics for lambdas
+ // that are publicly visible.
+ builder.rewriteDerivedTypeOnly(type, convertJavaNameToDesugaredLibrary(type));
usedPrefix.add(prefix);
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 2c2f503..08d9d27 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -433,18 +433,16 @@
return committed.containsSyntheticInput(clazz.getType());
}
- public FeatureSplit getContextualFeatureSplit(
- DexType type, ClassToFeatureSplitMap classToFeatureSplitMap) {
+ public FeatureSplit getContextualFeatureSplitOrDefault(DexType type, FeatureSplit defaultValue) {
+ assert isSyntheticClass(type);
if (isSyntheticOfKind(type, kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS)) {
- // Use the startup base if there is one, such that we don't merge non-startup classes with the
- // shared utility class in case it is used during startup. The use of base startup allows for
- // merging startup classes with the shared utility class, however, which could be bad for
- // startup if the shared utility class is not used during startup.
- return classToFeatureSplitMap.getBaseStartup();
+ return FeatureSplit.BASE;
}
List<SynthesizingContext> contexts = getSynthesizingContexts(type);
if (contexts.isEmpty()) {
- return null;
+ assert false
+ : "Expected synthetic to have at least one synthesizing context: " + type.getTypeName();
+ return defaultValue;
}
assert verifyAllHaveSameFeature(contexts, SynthesizingContext::getFeatureSplit);
return contexts.get(0).getFeatureSplit();
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index 4b98b5f..0cbbfed 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -48,6 +48,7 @@
import com.android.tools.r8.tracereferences.internal.TracedFieldImpl;
import com.android.tools.r8.tracereferences.internal.TracedMethodImpl;
import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.BooleanBox;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
import java.io.IOException;
@@ -300,9 +301,20 @@
MethodLookupResult lookupResult = graphLens().lookupInvokeDirect(method, getContext());
assert lookupResult.getType().isDirect();
DexMethod rewrittenMethod = lookupResult.getReference();
- DexClass holder = appView.definitionFor(rewrittenMethod.getHolderType());
- handleRewrittenMethodReference(
- rewrittenMethod, rewrittenMethod.lookupMemberOnClass(holder));
+ BooleanBox seenMethod = new BooleanBox();
+ appView
+ .contextIndependentDefinitionForWithResolutionResult(rewrittenMethod.getHolderType())
+ .forEachClassResolutionResult(
+ holder -> {
+ DexClassAndMethod target = rewrittenMethod.lookupMemberOnClass(holder);
+ if (target != null) {
+ handleRewrittenMethodReference(rewrittenMethod, target);
+ seenMethod.set();
+ }
+ });
+ if (seenMethod.isFalse()) {
+ handleRewrittenMethodReference(rewrittenMethod, (DexClassAndMethod) null);
+ }
}
@Override
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 40c5a67..8060f36 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -34,7 +34,6 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
import com.android.tools.r8.experimental.startup.StartupOrder;
import com.android.tools.r8.features.ClassToFeatureSplitMap;
import com.android.tools.r8.features.FeatureSplitConfiguration;
@@ -530,7 +529,6 @@
dumpProgramResources(
dumpProgramFileName,
options.getFeatureSplitConfiguration(),
- options.getStartupConfiguration(),
nextDexIndex,
out,
reporter,
@@ -584,7 +582,6 @@
private int dumpProgramResources(
String archiveName,
FeatureSplitConfiguration featureSplitConfiguration,
- StartupConfiguration startupConfiguration,
int nextDexIndex,
ZipOutputStream out,
Reporter reporter,
@@ -599,7 +596,7 @@
try {
ClassToFeatureSplitMap classToFeatureSplitMap =
ClassToFeatureSplitMap.createInitialClassToFeatureSplitMap(
- dexItemFactory, featureSplitConfiguration, startupConfiguration, reporter);
+ dexItemFactory, featureSplitConfiguration, reporter);
if (featureSplitConfiguration != null) {
for (FeatureSplit featureSplit : featureSplitConfiguration.getFeatureSplits()) {
ByteArrayOutputStream archiveByteStream = new ByteArrayOutputStream();
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 660a5fd..74b7b06 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -365,6 +365,8 @@
* items to be installed.
*/
void updateDebugInfoInCodeObjects();
+
+ int getPcEncoding(int pc);
}
private static class Pc2PcMappingSupport implements PcBasedDebugInfoRecorder {
@@ -405,8 +407,10 @@
singleLineCodesToClear = allowDiscardingSourceFile ? new ArrayList<>() : null;
}
- private int getLastInstructionOffset(DexCode code) {
- return DebugRepresentation.getLastExecutableInstruction(code).getOffset();
+ @Override
+ public int getPcEncoding(int pc) {
+ assert pc >= 0;
+ return pc + 1;
}
private boolean cantAddToClearSet(ProgramMethod method) {
@@ -458,6 +462,12 @@
private static class NativePcSupport implements PcBasedDebugInfoRecorder {
+ @Override
+ public int getPcEncoding(int pc) {
+ assert pc >= 0;
+ return pc;
+ }
+
private void clearDebugInfo(ProgramMethod method) {
// Always strip the info in full as the runtime will emit the PC directly.
method.getDefinition().getCode().asDexCode().setDebugInfo(null);
@@ -1238,6 +1248,7 @@
singleOriginalLine.set(false);
}
remapAndAddForPc(
+ debugInfoProvider,
lastPosition.getFirst(),
getCurrentPc(),
lastPosition.getSecond(),
@@ -1271,6 +1282,7 @@
int lastInstructionPc = DebugRepresentation.getLastExecutableInstruction(dexCode).getOffset();
if (lastPosition.getSecond() != null) {
remapAndAddForPc(
+ debugInfoProvider,
lastPosition.getFirst(),
lastInstructionPc + 1,
lastPosition.getSecond(),
@@ -1350,6 +1362,7 @@
}
private static void remapAndAddForPc(
+ PcBasedDebugInfoRecorder debugInfoProvider,
int startPc,
int endPc,
Position position,
@@ -1364,7 +1377,7 @@
oldPosition.getMethod(),
oldPosition.getLine(),
oldPosition.getCallerPosition(),
- currentPc,
+ debugInfoProvider.getPcEncoding(currentPc),
// Outline info is placed exactly on the positions that relate to it so we should
// only emit it for the first entry.
firstEntry && oldPosition.isOutline(),
diff --git a/src/test/java/com/android/tools/r8/benchmarks/desugaredlib/L8Benchmark.java b/src/test/java/com/android/tools/r8/benchmarks/desugaredlib/L8Benchmark.java
index 147d601..46f8916 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/desugaredlib/L8Benchmark.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/desugaredlib/L8Benchmark.java
@@ -64,6 +64,7 @@
ImmutableSet.of(undesugarJdkLib),
Paths.get("src/library_desugar/jdk11/desugar_jdk_libs.json"),
ImmutableSet.of(androidJar.getRoot(environment).resolve("android.jar")),
+ LibraryDesugaringSpecification.JDK11_DESCRIPTOR,
"");
runner(environment.getConfig())
.setWarmupIterations(1)
diff --git a/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java b/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
index 08b55f8..08e6c5f 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
@@ -159,11 +159,16 @@
return line(DEFAULT_SOURCE_FILE, method, line);
}
+ private int getPcEncoding(int pc) {
+ return isCompileWithPcAsLineNumberSupport() && !customSourceFile ? pc : (pc + 1);
+ }
+
// A residual line that is either null debug info or pc2pc mapping.
private StackTraceLine residualPcOrNoLine(String method, int pc) {
// If compiling with custom source file the debug info must be non-null and have a pc mapping.
+ // Add one as pc2pc encoding shifts lines by one.
if (customSourceFile) {
- return line(CUSTOM_SOURCE_FILE, method, pc);
+ return line(CUSTOM_SOURCE_FILE, method, getPcEncoding(pc));
}
// If debug info is null, then on native pc support VMs it will print "unknown" and pc.
if (isRuntimeWithPcAsLineNumberSupport()) {
@@ -211,11 +216,13 @@
// TODO(b/232212653): Normal line-opt will cause a single-line mapping. Retrace should not
// optimize that to mean it represents a single possible line. (<noline> should not match 1:x).
- StackTraceLine barLine = parameters.isCfRuntime() ? inputLine("bar", 100) : inputLine("bar", 0);
+ StackTraceLine barLine =
+ parameters.isCfRuntime() ? inputLine("bar", 100) : inputLine("bar", getPcEncoding(0));
// TODO(b/232212653): The retracing in CF where the line table is preserved is incorrect.
// same issue as for bar.
- StackTraceLine bazLine = parameters.isCfRuntime() ? inputLine("baz", 100) : inputLine("baz", 0);
+ StackTraceLine bazLine =
+ parameters.isCfRuntime() ? inputLine("baz", 100) : inputLine("baz", getPcEncoding(0));
return StackTrace.builder()
.add(fooLine)
@@ -236,13 +243,12 @@
.add(residualLine("main", 101)) // TODO(b/232212653) Why is this 101?
.build();
}
-
return StackTrace.builder()
// Foo has only <noline> on input and so it is allowed to compile it to a null debug-info.
.add(residualPcOrNoLine("foo", 1))
- .add(residualLine("bar", 0))
- .add(residualLine("baz", 0))
- .add(residualLine("main", 6))
+ .add(residualLine("bar", getPcEncoding(0)))
+ .add(residualLine("baz", getPcEncoding(0)))
+ .add(residualLine("main", getPcEncoding(6)))
.build();
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
index 4681e27..6b61085 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
@@ -68,7 +68,7 @@
}
private void assertResultCorrect(String stdOut) {
- if (requiresEmulatedInterfaceCoreLibDesugaring(parameters)
+ if (libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)
&& !compilationSpecification.isL8Shrink()) {
// When shrinking the class names are not printed correctly anymore due to minification.
// Expected output is emulated interfaces expected output.
@@ -81,8 +81,7 @@
return;
}
MethodSubject direct = inspector.clazz(Executor.class).uniqueMethodWithName("directTypes");
- System.out.println(direct);
- if (requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
assertTrue(
direct
.streamInstructions()
@@ -97,7 +96,7 @@
}
MethodSubject inherited =
inspector.clazz(Executor.class).uniqueMethodWithName("inheritedTypes");
- if (!requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
assertTrue(
inherited.streamInstructions().noneMatch(instr -> instr.toString().contains("$-EL")));
return;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
index 8f725ba..16021f7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import com.android.tools.r8.SingleTestRunResult;
@@ -61,7 +60,7 @@
.addKeepMainRule(TestClass.class)
.run(parameters.getRuntime(), TestClass.class)
.assertSuccess();
- if (requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ if (libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
run.assertSuccessWithOutput(expectedOutputDesugaredLib);
} else {
run.assertSuccessWithOutput(expectedOutput);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
index 02e844e..7ba2614 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
@@ -75,7 +75,7 @@
}
private void checkRewrittenSignature(CodeInspector inspector) {
- if (!requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
return;
}
ClassSubject javaTimeBox = inspector.clazz(JavaTimeDateBox.class);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
index 716e073..d17c851 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -61,9 +61,7 @@
@Test
public void testDesugaredLibraryContent() throws Exception {
- Assume.assumeTrue(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasAnyDesugaring(parameters));
testForL8(parameters.getApiLevel())
.apply(libraryDesugaringSpecification::configureL8TestBuilder)
.compile()
@@ -72,9 +70,7 @@
@Test
public void testDesugaredLibraryContentWithCoreLambdaStubsAsProgram() throws Exception {
- Assume.assumeTrue(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasAnyDesugaring(parameters));
ArrayList<Path> coreLambdaStubs = new ArrayList<>();
coreLambdaStubs.add(ToolHelper.getCoreLambdaStubs());
testForL8(parameters.getApiLevel())
@@ -86,9 +82,7 @@
@Test
public void testDesugaredLibraryContentWithCoreLambdaStubsAsLibrary() throws Exception {
- Assume.assumeTrue(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasAnyDesugaring(parameters));
testForL8(parameters.getApiLevel())
.apply(libraryDesugaringSpecification::configureL8TestBuilder)
.addLibraryFiles(ToolHelper.getCoreLambdaStubs())
@@ -122,7 +116,9 @@
return;
}
assertThat(inspector.clazz("j$.util.Optional"), isPresent());
- assertThat(inspector.clazz("j$.util.function.Function"), isPresent());
+ if (libraryDesugaringSpecification.hasJDollarFunction(parameters)) {
+ assertThat(inspector.clazz("j$.util.function.Function"), isPresent());
+ }
if (parameters.getApiLevel().isLessThan(AndroidApiLevel.K)) {
inspector.forAllClasses(clazz -> clazz.forAllMethods(this::assertNoSupressedInvocations));
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java
index 810f1d0..8245517 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -61,9 +60,7 @@
Set<String> contextsRoundOne = ConcurrentHashMap.newKeySet();
Set<String> contextsRoundTwo = ConcurrentHashMap.newKeySet();
Path determinismLogDir = temp.newFolder().toPath();
- Assume.assumeTrue(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasAnyDesugaring(parameters));
Path libDexFile1 =
testForL8(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
index 4a9b0a0..6200ec5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
@@ -54,9 +53,7 @@
@Test
public void testDumpToDirectory() throws Exception {
- Assume.assumeTrue(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasAnyDesugaring(parameters));
Path dumpDir = temp.newFolder().toPath();
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramClasses(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryInvalidTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryInvalidTest.java
index d31aa91..6a169bf 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryInvalidTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryInvalidTest.java
@@ -39,13 +39,15 @@
"JDK8_INVALID_LIB",
DESUGARED_JDK_8_LIB_JAR,
"desugar_jdk_libs.json",
- AndroidApiLevel.L);
+ AndroidApiLevel.L,
+ LibraryDesugaringSpecification.JDK8_DESCRIPTOR);
LibraryDesugaringSpecification jdk11InvalidLib =
new LibraryDesugaringSpecification(
"JDK11_INVALID_LIB",
ToolHelper.getUndesugaredJdk11LibJarForTesting(),
"jdk11/desugar_jdk_libs.json",
- AndroidApiLevel.L);
+ AndroidApiLevel.L,
+ LibraryDesugaringSpecification.JDK11_DESCRIPTOR);
return buildParameters(
getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(),
ImmutableList.of(jdk8InvalidLib, jdk11InvalidLib),
@@ -63,9 +65,7 @@
@Test
public void testInvalidLibrary() throws IOException {
- Assume.assumeTrue(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), !libraryDesugaringSpecification.toString().contains("JDK8")));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasAnyDesugaring(parameters));
DesugaredLibraryTestBuilder<?> testBuilder =
testForDesugaredLibrary(
parameters, libraryDesugaringSpecification, compilationSpecification)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
index 1f4d9c1..71026ba 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
@@ -7,7 +7,6 @@
import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.containsString;
@@ -76,8 +75,7 @@
.addProgramClasses(TestRunner.class)
.compileWithExpectedDiagnostics(
diagnostics -> {
- if (requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) {
+ if (libraryDesugaringSpecification.hasAnyDesugaring(parameters)) {
diagnostics.assertNoInfos();
diagnostics.assertAllWarningsMatch(
diagnosticMessage(
@@ -158,8 +156,7 @@
.setMinApi(parameters.getApiLevel())
.compileWithExpectedDiagnostics(
diagnostics -> {
- if (requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) {
+ if (libraryDesugaringSpecification.hasAnyDesugaring(parameters)) {
diagnostics.assertOnlyErrors();
diagnostics.assertErrorsMatch(
diagnosticType(DesugaredLibraryMismatchDiagnostic.class));
@@ -196,8 +193,7 @@
.setMinApi(parameters.getApiLevel())
.compileWithExpectedDiagnostics(
diagnostics -> {
- if (requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) {
+ if (libraryDesugaringSpecification.hasAnyDesugaring(parameters)) {
diagnostics.assertOnlyErrors();
diagnostics.assertErrorsMatch(
diagnosticType(DesugaredLibraryMismatchDiagnostic.class));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index 4c05352..4f1b017 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -45,20 +45,6 @@
throw new Error("Unsupported conversion parameters");
}
- protected boolean requiresEmulatedInterfaceCoreLibDesugaring(TestParameters parameters) {
- return parameters.getApiLevel().isLessThan(apiLevelWithDefaultInterfaceMethodsSupport());
- }
-
- protected boolean requiresTimeDesugaring(TestParameters parameters, boolean isJDK11) {
- return parameters.getApiLevel().getLevel()
- < (isJDK11 ? AndroidApiLevel.S.getLevel() : AndroidApiLevel.O.getLevel());
- }
-
- protected boolean requiresAnyCoreLibDesugaring(AndroidApiLevel apiLevel, boolean isJDK11) {
- return apiLevel.getLevel()
- <= (isJDK11 ? AndroidApiLevel.R.getLevel() : AndroidApiLevel.N_MR1.getLevel());
- }
-
protected DesugaredLibraryTestBuilder<?> testForDesugaredLibrary(
TestParameters parameters,
LibraryDesugaringSpecification libraryDesugaringSpecification,
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
index 2505e7f..c4af0ff 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.hamcrest.core.StringContains.containsString;
@@ -56,7 +55,7 @@
.addKeepMainRule(Main.class)
.run(parameters.getRuntime(), Main.class);
if (compilationSpecification.isL8Shrink()
- && requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ && libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
run.assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodException"));
} else {
run.assertSuccessWithOutput(EXPECTED);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
index 6c1f23f..4466e5d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.hamcrest.core.StringContains.containsString;
@@ -55,7 +54,7 @@
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
.run(parameters.getRuntime(), Main.class);
- if (!requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ if (!libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
runResult.assertFailureWithErrorThatMatches(
containsString("java.lang.ClassNotFoundException: j$.time.LocalDate"));
} else {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
index 70554a0..542c71e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
@@ -54,10 +54,13 @@
.compile()
.inspectKeepRules(
keepRule -> {
- if (requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
+ String prefix = libraryDesugaringSpecification.functionPrefix(parameters);
assertTrue(
keepRule.stream()
- .anyMatch(kr -> kr.contains("-keep class j$.util.function.Consumer")));
+ .anyMatch(
+ kr ->
+ kr.contains("-keep class " + prefix + ".util.function.Consumer")));
// TODO(b/158635415): Don't generate keep rules targeting items outside desugared
// library.
assertTrue(keepRule.stream().anyMatch(kr -> kr.contains("-keep class java.util")));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
index f744809..9a5ac53 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -75,7 +74,7 @@
}
private boolean expectsEmptyDesugaredLibrary(AndroidApiLevel apiLevel) {
- return !requiresAnyCoreLibDesugaring(apiLevel, libraryDesugaringSpecification != JDK8);
+ return !libraryDesugaringSpecification.hasAnyDesugaring(apiLevel);
}
@Test
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
index 1ca61c5..2a185ea 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
@@ -59,7 +59,7 @@
@Test
public void testEmulatedInterface() throws Exception {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
CodeInspector inspector =
testForL8(parameters.getApiLevel())
.apply(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
index 42ee197..6799d90 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
@@ -87,10 +87,13 @@
return;
}
// Ensure count, toArray and forEach are kept.
+ String prefix = libraryDesugaringSpecification.functionPrefix(parameters);
assertTrue(
keepRules.contains(
"-keep class j$.lang.Iterable$-EL {\n"
- + " void forEach(java.lang.Iterable, j$.util.function.Consumer);"));
+ + " void forEach(java.lang.Iterable, "
+ + prefix
+ + ".util.function.Consumer);"));
assertTrue(
keepRules.contains(
"-keep class j$.util.stream.Stream {\n"
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java
index 12ff1ae..791a6b3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java
@@ -32,7 +32,7 @@
public class FunctionOnlyTest extends DesugaredLibraryTestBase {
private static final String EXPECTED_RESULT =
- StringUtils.lines(" true true true", "2", "false", "3", "true", "5", "42.0");
+ StringUtils.lines(" true true true", "2", "false", "3", "true", "5", "42.0", "last");
private final TestParameters parameters;
private final CompilationSpecification compilationSpecification;
@@ -56,7 +56,7 @@
}
@Test
- public void testFunction() throws Exception {
+ public void testFunction() throws Throwable {
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(getClass())
.addKeepMainRule(Executor.class)
@@ -84,6 +84,7 @@
System.out.println(doublePredicate.test(2.0));
System.out.println(FunctionClass.extractInt(() -> 5));
System.out.println(FunctionClass.getDoubleSupplier().get());
+ System.out.println(Function.identity().apply("last"));
}
static class Object1 {}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
index 605854a..9f0f613 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
@@ -33,7 +33,6 @@
private final TestParameters parameters;
private final LibraryDesugaringSpecification libraryDesugaringSpecification;
private final CompilationSpecification compilationSpecification;
- private final boolean canUseDefaultAndStaticInterfaceMethods;
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
@@ -50,10 +49,6 @@
this.parameters = parameters;
this.libraryDesugaringSpecification = libraryDesugaringSpecification;
this.compilationSpecification = compilationSpecification;
- this.canUseDefaultAndStaticInterfaceMethods =
- parameters
- .getApiLevel()
- .isGreaterThanOrEqualTo(apiLevelWithDefaultInterfaceMethodsSupport());
}
@Test
@@ -70,12 +65,12 @@
private void assertInterface(CodeInspector inspector) {
ClassSubject clazz = inspector.clazz(MyIterator.class);
assertEquals(
- canUseDefaultAndStaticInterfaceMethods ? 0 : 1,
+ libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters) ? 1 : 0,
clazz.getDexProgramClass().getInterfaces().stream()
.filter(name -> name.toString().equals("j$.util.Iterator"))
.count());
assertEquals(
- canUseDefaultAndStaticInterfaceMethods ? 1 : 2,
+ libraryDesugaringSpecification.hasJDollarFunction(parameters) ? 2 : 1,
clazz.getDexProgramClass().allMethodsSorted().stream()
.filter(m -> m.getReference().getName().toString().equals("forEachRemaining"))
.count());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
index dd036e2..7d4a771 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static junit.framework.TestCase.assertTrue;
@@ -152,7 +151,7 @@
@Test
public void testJ$ExtensionDesugaring() throws Throwable {
Assume.assumeFalse(parameters.isCfRuntime());
- Assume.assumeTrue(requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasTimeDesugaring(parameters));
String stdErr =
testForDesugaredLibrary(
parameters, libraryDesugaringSpecification, compilationSpecification)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index 4b7a485..8d8f669 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.CoreMatchers.not;
@@ -98,7 +97,7 @@
Set<String> expectedCatchGuards;
Set<String> expectedCheckCastType;
String expectedInstanceOfTypes;
- if (!requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ if (!libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
expectedInvokeHolders =
SetUtils.newHashSet("java.time.Clock", "java.time.LocalDate", "java.time.ZoneId");
if (!isR8) {
@@ -151,7 +150,7 @@
.isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
&& isR8) {
String holder =
- requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)
+ libraryDesugaringSpecification.hasTimeDesugaring(parameters)
? "j$.time.temporal.TemporalAccessor"
: "java.time.temporal.TemporalAccessor";
assertThat(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
index d14b845..2f146bb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
@@ -57,13 +57,17 @@
}
private void checkRewrittenArguments(CodeInspector inspector) {
- if (!requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
return;
}
ClassSubject classSubject = inspector.clazz(TestClass.class);
assertThat(classSubject, isPresent());
+ String function =
+ libraryDesugaringSpecification.hasJDollarFunction(parameters)
+ ? "j$.util.function.Function"
+ : "java.util.function.Function";
assertEquals(
- "j$.util.function.Function",
+ function,
classSubject
.uniqueMethodWithName("applyFunction")
.getMethod()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
index 7c98967..23a13b6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
@@ -58,7 +58,7 @@
}
private void checkRewrittenInvokes(CodeInspector inspector) {
- if (!requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
return;
}
ClassSubject classSubject = inspector.clazz(TestClass.class);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java
index 0b048b4..fe5364c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java
@@ -56,7 +56,7 @@
}
private void assertExpectedKeepRules(List<String> keepRuleList) {
- if (!requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
return;
}
StringBuilder keepRules = new StringBuilder();
@@ -68,7 +68,7 @@
}
private String getResult() {
- return requiresEmulatedInterfaceCoreLibDesugaring(parameters)
+ return libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)
? "class j$.util.concurrent.ConcurrentHashMap"
: "class java.util.concurrent.ConcurrentHashMap";
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
index ca676d3..be8001a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
@@ -11,7 +11,6 @@
import static com.android.tools.r8.MarkerMatcher.markerIsDesugared;
import static com.android.tools.r8.MarkerMatcher.markerMinApi;
import static com.android.tools.r8.MarkerMatcher.markerTool;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.not;
@@ -135,8 +134,7 @@
markerTool(Tool.D8),
markerIsDesugared(),
markerHasDesugaredLibraryIdentifier(
- requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)));
+ libraryDesugaringSpecification.hasAnyDesugaring(parameters)));
assertMarkersMatch(
ExtractMarker.extractMarkerFromDexFile(app), ImmutableList.of(libraryMatcher, d8Matcher));
}
@@ -222,8 +220,7 @@
}
private boolean someLibraryDesugaringRequired() {
- return requiresAnyCoreLibDesugaring(
- parameters.getApiLevel(), libraryDesugaringSpecification != JDK8);
+ return libraryDesugaringSpecification.hasAnyDesugaring(parameters);
}
@Test
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java
index 943c7a9..0fbcc8c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import com.android.tools.r8.TestParameters;
@@ -57,7 +56,7 @@
return EXPECTED_JAVA_8_OUTPUT;
}
assert parameters.isDexRuntime();
- if (requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ if (libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
return EXPECTED_JAVA_8_OUTPUT;
}
return EXPECTED_JAVA_9_OUTPUT;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
index 9e8583f..0462bc2 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
@@ -116,14 +116,17 @@
Assume.assumeTrue(parameters.getApiLevel().getLevel() < AndroidApiLevel.N.getLevel());
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(getClass())
- .run(parameters.getRuntime(), TestClass.class)
+ .run(
+ parameters.getRuntime(),
+ TestClass.class,
+ libraryDesugaringSpecification.functionPrefix(parameters))
.assertSuccessWithOutputLines("Hello, world!");
}
static class TestClass {
public static void main(String[] args) throws Exception {
- Class.forName("j$.util.function.Function");
+ Class.forName(args[0] + ".util.function.Function");
System.out.println("Hello, world!");
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
index 5ddc567..a3f36be 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
@@ -52,7 +52,7 @@
@Test
public void testNoDesugaredLibraryDexFile() throws Throwable {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(getClass())
.addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
index f5717d8..66438e9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
@@ -72,13 +72,18 @@
public static List<Object[]> data() {
LibraryDesugaringSpecification jdk8MaxCompileSdk =
new LibraryDesugaringSpecification(
- "JDK8_MAX", DESUGARED_JDK_8_LIB_JAR, "desugar_jdk_libs.json", AndroidApiLevel.LATEST);
+ "JDK8_MAX",
+ DESUGARED_JDK_8_LIB_JAR,
+ "desugar_jdk_libs.json",
+ AndroidApiLevel.LATEST,
+ LibraryDesugaringSpecification.JDK8_DESCRIPTOR);
LibraryDesugaringSpecification jdk11MaxCompileSdk =
new LibraryDesugaringSpecification(
"JDK11_MAX",
ToolHelper.getUndesugaredJdk11LibJarForTesting(),
"jdk11/desugar_jdk_libs.json",
- AndroidApiLevel.LATEST);
+ AndroidApiLevel.LATEST,
+ LibraryDesugaringSpecification.JDK11_DESCRIPTOR);
return buildParameters(
getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(),
ImmutableList.of(JDK8, JDK11, jdk8MaxCompileSdk, jdk11MaxCompileSdk),
@@ -188,6 +193,10 @@
parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
boolean invokeJDollarUtilObjectsWithSupplier =
libraryDesugarJavaUtilObjects && parameters.getApiLevel().isLessThan(AndroidApiLevel.N);
+ String supplier =
+ libraryDesugaringSpecification.hasJDollarFunction(parameters)
+ ? "j$.util.function.Supplier"
+ : "java.util.function.Supplier";
assertThat(
testClass.uniqueMethodWithName("objectsCompare"),
@@ -244,14 +253,12 @@
testClass.uniqueMethodWithName("objectsRequireNonNullWithSupplier"),
onlyIf(
invokeJavaUtilObjectsWithSupplier,
- invokesObjectsRequireNonNullWithSupplier(
- "java.util.Objects", "java.util.function.Supplier")));
+ invokesObjectsRequireNonNullWithSupplier("java.util.Objects", supplier)));
assertThat(
testClass.uniqueMethodWithName("objectsRequireNonNullWithSupplier"),
onlyIf(
invokeJDollarUtilObjectsWithSupplier,
- invokesObjectsRequireNonNullWithSupplier(
- "j$.util.Objects", "j$.util.function.Supplier")));
+ invokesObjectsRequireNonNullWithSupplier("j$.util.Objects", supplier)));
assertThat(
testClass.uniqueMethodWithName("objectsToString"),
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
index 18ccc4e..13074ce 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
@@ -55,8 +55,8 @@
.addKeepMainRule(Executor.class)
.run(parameters.getRuntime(), Executor.class)
.applyIf(
- parameters.isDexRuntime()
- && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N),
+ !libraryDesugaringSpecification.hasJDollarFunction(parameters)
+ || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N),
r -> r.assertSuccessWithOutput(EXPECTED_RESULT),
r -> {
if (compilationSpecification.isProgramShrink()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
index 492964e..566b0a0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
@@ -56,6 +56,7 @@
ToolHelper.getCoreLambdaStubs()),
JDK8.getSpecification(),
ImmutableSet.of(ToolHelper.getAndroidJar(AndroidApiLevel.O)),
+ LibraryDesugaringSpecification.JDK8_DESCRIPTOR,
"");
LibraryDesugaringSpecification jdk11CoreLambdaStubs =
new LibraryDesugaringSpecification(
@@ -66,6 +67,7 @@
ToolHelper.getCoreLambdaStubs()),
JDK11.getSpecification(),
ImmutableSet.of(ToolHelper.getAndroidJar(AndroidApiLevel.R)),
+ LibraryDesugaringSpecification.JDK11_DESCRIPTOR,
"");
return buildParameters(
getTestParameters().withDexRuntimes().withAllApiLevels().build(),
@@ -175,13 +177,15 @@
}
private void assertGeneratedKeepRulesAreCorrect(String keepRules) {
+
+ String prefix = libraryDesugaringSpecification.functionPrefix(parameters);
String expectedResult =
StringUtils.lines(
"-keep class j$.util.Collection$-EL {",
" j$.util.stream.Stream stream(java.util.Collection);",
"}",
"-keep class j$.util.Comparator$-CC {",
- " java.util.Comparator comparingInt(j$.util.function.ToIntFunction);",
+ " java.util.Comparator comparingInt(" + prefix + ".util.function.ToIntFunction);",
"}",
"-keep class j$.util.DesugarArrays {",
" j$.util.Spliterator spliterator(java.lang.Object[]);",
@@ -196,7 +200,7 @@
" j$.util.Spliterator spliterator(java.util.Set);",
"}",
"-keep class j$.util.Spliterator",
- "-keep class j$.util.function.ToIntFunction { *; }",
+ "-keep class " + prefix + ".util.function.ToIntFunction { *; }",
"-keep class j$.util.stream.IntStream$-CC {",
" j$.util.stream.IntStream range(int, int);",
"}",
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
index 3cdfedb..78a082c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
@@ -48,7 +48,7 @@
@Test
public void testSimpleStream() throws Throwable {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(getClass())
.addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
index 7b45541..3839d19 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
@@ -64,7 +64,7 @@
@Test
public void testSpliterator() throws Throwable {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(getClass())
.compile()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
index 0a65d49..2478d19 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
@@ -54,6 +54,11 @@
private void assertDuplicatedAPI(CodeInspector i) {
List<FoundMethodSubject> virtualMethods = i.clazz(Impl.class).virtualMethods();
+ if (!libraryDesugaringSpecification.hasJDollarFunction(parameters)) {
+ // No need to duplicate the API with maintain prefix.
+ assertEquals(1, virtualMethods.size());
+ return;
+ }
assertEquals(2, virtualMethods.size());
assertTrue(anyVirtualMethodFirstParameterMatches(virtualMethods, "j$.util.function.Consumer"));
assertTrue(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
index c12c86d..112fd70 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
@@ -86,7 +86,10 @@
.inspect(this::assertWrapperMethodsPresent)
.run(parameters.getRuntime(), Executor.class)
.assertSuccessWithOutput(
- supportAllCallbacksFromLibrary ? EXPECTED_RESULT : FAILING_EXPECTED_RESULT);
+ (supportAllCallbacksFromLibrary
+ || !libraryDesugaringSpecification.hasJDollarFunction(parameters))
+ ? EXPECTED_RESULT
+ : FAILING_EXPECTED_RESULT);
}
private void assertDoubleForEach(CodeInspector inspector) {
@@ -103,7 +106,10 @@
.collect(toSingle());
assertEquals(
"Missing duplicated forEach",
- supportAllCallbacksFromLibrary ? 2 : 1,
+ supportAllCallbacksFromLibrary
+ && libraryDesugaringSpecification.hasJDollarFunction(parameters)
+ ? 2
+ : 1,
IterableUtils.size(
myCollection
.getDexProgramClass()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
index 69b83bf..42fbe70 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
@@ -58,14 +57,14 @@
c.getOriginalName().contains(".util.")
|| c.getOriginalName().contains(".time."))
.collect(Collectors.toList());
- if (requiresEmulatedInterfaceCoreLibDesugaring(parameters)) {
+ if (libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
assertEquals(5, conversionsClasses.size());
assertTrue(inspector.clazz("j$.util.OptionalConversions").isPresent());
assertTrue(inspector.clazz("j$.time.TimeConversions").isPresent());
assertTrue(inspector.clazz("j$.util.LongSummaryStatisticsConversions").isPresent());
assertTrue(inspector.clazz("j$.util.IntSummaryStatisticsConversions").isPresent());
assertTrue(inspector.clazz("j$.util.DoubleSummaryStatisticsConversions").isPresent());
- } else if (requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ } else if (libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
assertEquals(1, conversionsClasses.size());
assertTrue(inspector.clazz("j$.time.TimeConversions").isPresent());
} else {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
index 91850cf..59a6a1b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
@@ -80,10 +80,10 @@
private void assertDupMethod(CodeInspector inspector) {
ClassSubject clazz = inspector.clazz("j$.util.concurrent.ConcurrentHashMap");
+ boolean duplicate =
+ supportCallbacks && libraryDesugaringSpecification.hasJDollarFunction(parameters);
int numForEachMethods =
- libraryDesugaringSpecification == JDK8
- ? supportCallbacks ? 2 : 1
- : supportCallbacks ? 4 : 3;
+ libraryDesugaringSpecification == JDK8 ? duplicate ? 2 : 1 : duplicate ? 4 : 3;
assertEquals(
numForEachMethods,
clazz.virtualMethods().stream().filter(m -> m.getOriginalName().equals("forEach")).count());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
index 3e547fa..7c34edc 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
@@ -67,7 +67,7 @@
private void assertDupMethod(CodeInspector i) {
assertEquals(
- 2,
+ libraryDesugaringSpecification.hasJDollarFunction(parameters) ? 2 : 1,
i.clazz(MyMap.class).virtualMethods().stream()
.filter(m -> m.getOriginalName().equals("forEach"))
.count());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java
index 1353145..77b7738 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperEqualityTest.java
@@ -71,7 +71,10 @@
.addKeepMainRule(Executor.class)
.compile()
.run(parameters.getRuntime(), Executor.class)
- .assertSuccessWithOutput(DESUGARED_LIBRARY_EXPECTED_RESULT);
+ .assertSuccessWithOutput(
+ libraryDesugaringSpecification.hasJDollarFunction(parameters)
+ ? DESUGARED_LIBRARY_EXPECTED_RESULT
+ : EXPECTED_RESULT);
}
@Test
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java
index f66418a..e7421fe 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java
@@ -48,7 +48,7 @@
@Test
public void testGsonAllMaps() throws Exception {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramClassesAndInnerClasses(AllMapsTestClass.class)
.addProgramFiles(GSON_2_8_1_JAR)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java
index 09f6bcf..716e3da 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java
@@ -49,7 +49,7 @@
@Test
public void testEnum() throws Exception {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(GsonEnumTest.class)
.addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java
index 5c033ce..d42473c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java
@@ -45,7 +45,7 @@
@Test
public void testGson() throws Exception {
- Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramClassesAndInnerClasses(OptionalTestClass.class)
.addProgramFiles(GSON_2_8_1_JAR)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
index 7d09ee0..ddeddc0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
@@ -94,7 +94,8 @@
ATOMIC_COMPILED_TESTS_FOLDER.resolve(ATOMIC_REFERENCE_TEST + CLASS_EXTENSION))
.addProgramFiles(testNGSupportProgramFiles())
.applyIf(
- libraryDesugaringSpecification != JDK11_PATH, b -> b.addProgramFiles(getPathsFiles()))
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
+ b -> b.addProgramFiles(getPathsFiles()))
.compile()
.withArt6Plus64BitsLib()
.run(parameters.getRuntime(), "TestNGMainRunner", verbosity, ATOMIC_REFERENCE_TEST)
@@ -110,7 +111,8 @@
getAllFilesWithSuffixInDirectory(ATOMIC_COMPILED_TESTS_FOLDER, CLASS_EXTENSION))
.addProgramFiles(testNGSupportProgramFiles())
.applyIf(
- libraryDesugaringSpecification != JDK11_PATH, b -> b.addProgramFiles(getPathsFiles()))
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
+ b -> b.addProgramFiles(getPathsFiles()))
.compile()
.withArt6Plus64BitsLib()
.run(parameters.getRuntime(), "TestNGMainRunner", verbosity, ATOMIC_UPDATERS)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
index a3641d6..f4b8b17 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
@@ -119,7 +119,8 @@
.addProgramFiles(CONCURRENT_COMPILED_TESTS_FILES)
.addProgramFiles(testNGSupportProgramFiles())
.applyIf(
- libraryDesugaringSpecification != JDK11_PATH, b -> b.addProgramFiles(getPathsFiles()))
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
+ b -> b.addProgramFiles(getPathsFiles()))
.compile()
.withArt6Plus64BitsLib()
.run(parameters.getRuntime(), "TestNGMainRunner", verbosity, "ConcurrentModification")
@@ -168,7 +169,7 @@
.addProgramFiles(concurrentHashTestToCompile())
.addProgramFiles(testNGSupportProgramFiles())
.applyIf(
- libraryDesugaringSpecification != JDK11_PATH,
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
b -> b.addProgramFiles(getPathsFiles()))
.compile()
.withArt6Plus64BitsLib();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
index 94b9162..ad2644b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
@@ -307,7 +307,7 @@
parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramFiles(filesToCompile)
.applyIf(
- libraryDesugaringSpecification != JDK11_PATH_JAVA_BASE_EXT,
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
b -> b.addProgramFiles(getPathsFiles()))
.addProgramFiles(getSafeVarArgsFile())
.addProgramFiles(testNGSupportProgramFiles())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
index 6249cf1..7a2760a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
@@ -73,7 +73,12 @@
Set<Path> libFiles = new HashSet<>(template.getLibraryFiles());
libFiles.add(EXTENSION_PATH);
return new LibraryDesugaringSpecification(
- name, desugaredJDKLibFiles, template.getSpecification(), libFiles, getTestNGKeepRules());
+ name,
+ desugaredJDKLibFiles,
+ template.getSpecification(),
+ libFiles,
+ template.getDescriptor(),
+ getTestNGKeepRules());
}
private static synchronized void ensureJavaBaseExtensionsCompiled() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
index ee4cad8..3e0dc37 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
@@ -219,7 +219,7 @@
.addProgramFiles(JDK_11_TIME_TEST_COMPILED_FILES)
.addProgramFiles(testNGSupportProgramFiles())
.applyIf(
- libraryDesugaringSpecification != JDK11_PATH,
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
b -> b.addProgramFiles(getPathsFiles()))
.compile()
.withArt6Plus64BitsLib();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
index 3458390..8c572cf 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
@@ -7,7 +7,6 @@
import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
import static com.android.tools.r8.KotlinTestBase.getCompileMemoizer;
import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
@@ -103,7 +102,7 @@
.compile()
.inspect(
i -> {
- if (requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) {
+ if (libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
inspectRewrittenMetadata(i);
}
})
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java
index 9567481..c1224a8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java
@@ -139,7 +139,7 @@
.addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
.applyIf(
parameters.getApiLevel().getLevel() < AndroidApiLevel.O.getLevel()
- && libraryDesugaringSpecification != JDK11_PATH,
+ && !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
b -> b.addProgramFiles(pathBackport))
.addOptionsModification(
options -> {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
index edff04e..539ad9a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
@@ -9,6 +9,7 @@
import static com.android.tools.r8.ToolHelper.getUndesugaredJdk11LibJarForTesting;
import com.android.tools.r8.L8TestBuilder;
+import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
@@ -20,28 +21,87 @@
public class LibraryDesugaringSpecification {
+ public static Descriptor JDK8_DESCRIPTOR = new Descriptor(24, 26, -1, 26, 24);
+ public static Descriptor JDK11_DESCRIPTOR = new Descriptor(24, 30, -1, 30, -1);
+ public static Descriptor EMPTY_DESCRIPTOR_24 = new Descriptor(-1, -1, -1, 24, -1);
+ public static Descriptor JDK11_PATH_DESCRIPTOR = new Descriptor(24, 30, 26, 32, -1);
+ public static Descriptor JDK11_LEGACY_DESCRIPTOR = new Descriptor(24, 10000, -1, 10000, 24);
+
+ private static class Descriptor {
+ // Above this level emulated interface are not *entirely* desugared.
+ private final int emulatedInterfaceDesugaring;
+ // Above this level java.time is not *entirely* desugared.
+ private final int timeDesugaring;
+ // Above this level java.nio.file is not *entirely* desugared.
+ private final int nioFileDesugaring;
+ // Above this level no desugaring is required.
+ private final int anyDesugaring;
+ // Above this level java.function is used, below j$.function is used.
+ private final int jDollarFunction;
+
+ private Descriptor(
+ int emulatedInterfaceDesugaring,
+ int timeDesugaring,
+ int nioFileDesugaring,
+ int anyDesugaring,
+ int jDollarFunction) {
+ this.emulatedInterfaceDesugaring = emulatedInterfaceDesugaring;
+ this.timeDesugaring = timeDesugaring;
+ this.nioFileDesugaring = nioFileDesugaring;
+ this.anyDesugaring = anyDesugaring;
+ this.jDollarFunction = jDollarFunction;
+ }
+
+ public int getEmulatedInterfaceDesugaring() {
+ return emulatedInterfaceDesugaring;
+ }
+
+ public int getTimeDesugaring() {
+ return timeDesugaring;
+ }
+
+ public int getNioFileDesugaring() {
+ return nioFileDesugaring;
+ }
+
+ public int getAnyDesugaring() {
+ return anyDesugaring;
+ }
+
+ public int getJDollarFunction() {
+ return jDollarFunction;
+ }
+ }
+
// Main head specifications.
public static LibraryDesugaringSpecification JDK8 =
new LibraryDesugaringSpecification(
- "JDK8", DESUGARED_JDK_8_LIB_JAR, "desugar_jdk_libs.json", AndroidApiLevel.P);
+ "JDK8",
+ DESUGARED_JDK_8_LIB_JAR,
+ "desugar_jdk_libs.json",
+ AndroidApiLevel.P,
+ JDK8_DESCRIPTOR);
public static LibraryDesugaringSpecification JDK11 =
new LibraryDesugaringSpecification(
"JDK11",
getUndesugaredJdk11LibJarForTesting(),
"jdk11/desugar_jdk_libs.json",
- AndroidApiLevel.R);
+ AndroidApiLevel.R,
+ JDK11_DESCRIPTOR);
public static LibraryDesugaringSpecification JDK11_MINIMAL =
new LibraryDesugaringSpecification(
"JDK11_MINIMAL",
getUndesugaredJdk11LibJarForTesting(),
"jdk11/desugar_jdk_libs_minimal.json",
- AndroidApiLevel.R);
+ AndroidApiLevel.R,
+ EMPTY_DESCRIPTOR_24);
public static LibraryDesugaringSpecification JDK11_PATH =
new LibraryDesugaringSpecification(
"JDK11_PATH",
getUndesugaredJdk11LibJarForTesting(),
"jdk11/desugar_jdk_libs_path.json",
- AndroidApiLevel.R);
+ AndroidApiLevel.R,
+ JDK11_PATH_DESCRIPTOR);
// Legacy specifications.
public static LibraryDesugaringSpecification JDK11_PATH_ALTERNATIVE_3 =
@@ -49,20 +109,23 @@
"JDK11_PATH_ALTERNATIVE_3",
getUndesugaredJdk11LibJarForTesting(),
"jdk11/desugar_jdk_libs_path_alternative_3.json",
- AndroidApiLevel.R);
+ AndroidApiLevel.R,
+ JDK11_PATH_DESCRIPTOR);
public static LibraryDesugaringSpecification JDK11_CHM_ONLY =
new LibraryDesugaringSpecification(
"JDK11_CHM_ONLY",
getUndesugaredJdk11LibJarForTesting(),
"jdk11/chm_only_desugar_jdk_libs.json",
- AndroidApiLevel.R);
+ AndroidApiLevel.R,
+ EMPTY_DESCRIPTOR_24);
public static LibraryDesugaringSpecification JDK11_LEGACY =
new LibraryDesugaringSpecification(
"JDK11_LEGACY",
// The legacy specification is not using the undesugared JAR.
DESUGARED_JDK_11_LIB_JAR,
"jdk11/desugar_jdk_libs_legacy.json",
- AndroidApiLevel.R);
+ AndroidApiLevel.R,
+ JDK11_LEGACY_DESCRIPTOR);
public static final LibraryDesugaringSpecification RELEASED_1_0_9 =
new LibraryDesugaringSpecification("1.0.9", AndroidApiLevel.P);
public static final LibraryDesugaringSpecification RELEASED_1_0_10 =
@@ -78,15 +141,21 @@
private final Set<Path> desugarJdkLibs;
private final Path specification;
private final Set<Path> libraryFiles;
+ private final Descriptor descriptor;
private final String extraKeepRules;
public LibraryDesugaringSpecification(
- String name, Path desugarJdkLibs, String specificationPath, AndroidApiLevel androidJarLevel) {
+ String name,
+ Path desugarJdkLibs,
+ String specificationPath,
+ AndroidApiLevel androidJarLevel,
+ Descriptor descriptor) {
this(
name,
ImmutableSet.of(desugarJdkLibs, ToolHelper.DESUGAR_LIB_CONVERSIONS),
Paths.get("src/library_desugar/" + specificationPath),
ImmutableSet.of(ToolHelper.getAndroidJar(androidJarLevel)),
+ descriptor,
"");
}
@@ -96,11 +165,13 @@
Set<Path> desugarJdkLibs,
Path specification,
Set<Path> libraryFiles,
+ Descriptor descriptor,
String extraKeepRules) {
this.name = name;
this.desugarJdkLibs = desugarJdkLibs;
this.specification = specification;
this.libraryFiles = libraryFiles;
+ this.descriptor = descriptor;
this.extraKeepRules = extraKeepRules;
}
@@ -112,6 +183,7 @@
Paths.get(DESUGARED_LIB_RELEASES_DIR, version, "desugar_jdk_libs_configuration.jar")),
Paths.get(DESUGARED_LIB_RELEASES_DIR, version, "desugar.json"),
ImmutableSet.of(ToolHelper.getAndroidJar(androidJarLevel)),
+ JDK8_DESCRIPTOR,
"");
}
@@ -132,6 +204,10 @@
return libraryFiles;
}
+ public Descriptor getDescriptor() {
+ return descriptor;
+ }
+
public String getExtraKeepRules() {
return extraKeepRules;
}
@@ -165,4 +241,32 @@
public static List<LibraryDesugaringSpecification> getJdk8Jdk11() {
return ImmutableList.of(JDK8, JDK11);
}
+
+ public boolean hasEmulatedInterfaceDesugaring(TestParameters parameters) {
+ return parameters.getApiLevel().getLevel() < descriptor.getEmulatedInterfaceDesugaring();
+ }
+
+ public boolean hasTimeDesugaring(TestParameters parameters) {
+ return parameters.getApiLevel().getLevel() < descriptor.getTimeDesugaring();
+ }
+
+ public boolean hasNioFileDesugaring(TestParameters parameters) {
+ return parameters.getApiLevel().getLevel() < descriptor.getNioFileDesugaring();
+ }
+
+ public boolean hasAnyDesugaring(TestParameters parameters) {
+ return hasAnyDesugaring(parameters.getApiLevel());
+ }
+
+ public boolean hasAnyDesugaring(AndroidApiLevel apiLevel) {
+ return apiLevel.getLevel() < descriptor.getAnyDesugaring();
+ }
+
+ public boolean hasJDollarFunction(TestParameters parameters) {
+ return parameters.getApiLevel().getLevel() < descriptor.getJDollarFunction();
+ }
+
+ public String functionPrefix(TestParameters parameters) {
+ return hasJDollarFunction(parameters) ? "j$" : "java";
+ }
}