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"; + } }