Merge commit 'd037b0e217014e1ea7091105cd4751ef7c37c7f1' into dev-release
diff --git a/.gitignore b/.gitignore
index 470dd43..d1bacd1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,8 +41,6 @@
third_party/android_jar/lib.tar.gz
third_party/android_jar/api-versions.tar.gz
third_party/android_jar/api-versions
-third_party/android_jar/api-database.tar.gz
-third_party/android_jar/api-database
third_party/android_sdk
third_party/android_sdk.tar.gz
third_party/bazel
diff --git a/build.gradle b/build.gradle
index 0812f9b..007fe58 100644
--- a/build.gradle
+++ b/build.gradle
@@ -247,7 +247,6 @@
implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
- implementation files('third_party/android_jar/api-database/api-database.jar')
main11Implementation "net.sf.jopt-simple:jopt-simple:$joptSimpleVersion"
main11Implementation "com.google.code.gson:gson:$gsonVersion"
@@ -267,7 +266,6 @@
main11Implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
main11Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
main11Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
- main11Implementation files('third_party/android_jar/api-database/api-database.jar')
examplesTestNGRunnerCompile group: 'org.testng', name: 'testng', version: testngVersion
testCompile sourceSets.examples.output
@@ -331,7 +329,6 @@
"android_jar/lib-v31",
"android_jar/lib-v32",
"android_jar/api-versions",
- "android_jar/api-database",
"api-outlining/simple-app-dump",
"binary_compatibility_tests/compiler_api_tests",
"core-lambda-stubs",
diff --git a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
index ad27516..565ffd9 100644
--- a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
@@ -3,7 +3,7 @@
"group_id" : "com.tools.android",
"artifact_id" : "chm_only_desugar_jdk_libs",
"version": "1.0.12",
- "required_compilation_api_level": 26,
+ "required_compilation_api_level": 31,
"synthesized_library_classes_package_prefix": "j$.",
"support_all_callbacks_from_library": false,
"common_flags": [
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 241f740..0744c8f 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -3,7 +3,7 @@
"group_id" : "com.tools.android",
"artifact_id" : "desugar_jdk_libs",
"version": "2.0.0",
- "required_compilation_api_level": 26,
+ "required_compilation_api_level": 31,
"synthesized_library_classes_package_prefix": "j$.",
"support_all_callbacks_from_library": true,
"common_flags": [
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
index fca8af4..863111d 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -3,7 +3,7 @@
"group_id" : "com.tools.android",
"artifact_id" : "desugar_jdk_libs_alternative_3",
"version": "2.0.0",
- "required_compilation_api_level": 26,
+ "required_compilation_api_level": 31,
"synthesized_library_classes_package_prefix": "j$.",
"support_all_callbacks_from_library": false,
"common_flags": [
@@ -78,7 +78,8 @@
"java.net.URLDecoder": "j$.net.URLDecoder",
"java.net.URLEncoder": "j$.net.URLEncoder",
"java.lang.Desugar": "j$.lang.Desugar",
- "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner"
+ "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner",
+ "sun.security.action.": "j$.sun.security.action."
}
},
{
@@ -95,7 +96,6 @@
"java.io.DesugarFile" : "j$.io.DesugarFile",
"java.util.Desugar": "j$.util.Desugar",
"sun.misc.Desugar": "j$.sun.misc.Desugar",
- "sun.security.action.": "j$.sun.security.action.",
"jdk.internal.": "j$.jdk.internal.",
"java.nio.Desugar": "j$.nio.Desugar",
"java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel",
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1483137..72c0cbb 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -69,7 +69,6 @@
import com.android.tools.r8.naming.ProguardMapMinifier;
import com.android.tools.r8.naming.ProguardMapSupplier;
import com.android.tools.r8.naming.RecordRewritingNamingLens;
-import com.android.tools.r8.naming.SourceFileRewriter;
import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
import com.android.tools.r8.optimize.ClassAndMemberPublicizer;
import com.android.tools.r8.optimize.MemberRebindingAnalysis;
@@ -796,11 +795,6 @@
LineNumberOptimizer.run(appView, getDirectApp(appView), inputApp, namingLens);
timing.end();
- // Overwrite SourceFile if specified. This step should be done after IR conversion.
- timing.begin("Rename SourceFile");
- new SourceFileRewriter(appView).run();
- timing.end();
-
// If a method filter is present don't produce output since the application is likely partial.
if (options.hasMethodsFilter()) {
System.out.println("Finished compilation with method filter: ");
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 4923f93..cec2d83 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.inspector.Inspector;
import com.android.tools.r8.inspector.internal.InspectorImpl;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
+import com.android.tools.r8.naming.SourceFileRewriter;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.shaking.ProguardConfiguration;
@@ -868,9 +869,6 @@
internal.enableVerticalClassMerging = false;
}
- internal.mapIdProvider = getMapIdProvider();
- internal.sourceFileProvider = getSourceFileProvider();
-
// Amend the proguard-map consumer with options from the proguard configuration.
internal.proguardMapConsumer =
wrapStringConsumer(
@@ -940,6 +938,13 @@
internal.synthesizedClassPrefix = synthesizedClassPrefix;
internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
+ // Set up the map and source file providers.
+ // Note that minify/optimize settings must be set on internal options before doing this.
+ internal.mapIdProvider = getMapIdProvider();
+ internal.sourceFileProvider =
+ SourceFileRewriter.computeSourceFileProvider(
+ getSourceFileProvider(), proguardConfiguration, internal);
+
if (!DETERMINISTIC_DEBUGGING) {
assert internal.threadCount == ThreadUtils.NOT_SPECIFIED;
internal.threadCount = getThreadCount();
diff --git a/src/main/java/com/android/tools/r8/SourceFileProvider.java b/src/main/java/com/android/tools/r8/SourceFileProvider.java
index 95e127c..a0a58cc 100644
--- a/src/main/java/com/android/tools/r8/SourceFileProvider.java
+++ b/src/main/java/com/android/tools/r8/SourceFileProvider.java
@@ -20,4 +20,17 @@
* @param environment An environment of values available for use when defining the source file.
*/
String get(SourceFileEnvironment environment);
+
+ /**
+ * Allow producing outputs that might not always include the source file in stack traces.
+ *
+ * <p>Note that this does not affect the ability to retrace a stack trace. It is indented to
+ * ensure that the non-original/residual source file attribute will be printed in all stack traces
+ * on the supported VMs.
+ *
+ * @return True if the compiler may discard source file information (default false).
+ */
+ default boolean allowDiscardingSourceFile() {
+ return false;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelObjectDatabaseImpl.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelObjectDatabaseImpl.java
deleted file mode 100644
index e48b221..0000000
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelObjectDatabaseImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.androidapi;
-
-import com.android.tools.r8.apimodel.AndroidApiDatabaseBuilder;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.FieldReference;
-import com.android.tools.r8.references.MethodReference;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.Box;
-import com.android.tools.r8.utils.TraversalContinuation;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiFunction;
-
-public class AndroidApiLevelObjectDatabaseImpl implements AndroidApiLevelDatabase {
-
- private final Map<DexType, AndroidApiClass> predefinedApiTypeLookup;
-
- private final AndroidApiClass SENTINEL =
- new AndroidApiClass(null) {
-
- @Override
- public AndroidApiLevel getApiLevel() {
- return null;
- }
-
- @Override
- public int getMemberCount() {
- return 0;
- }
-
- @Override
- protected TraversalContinuation visitFields(
- BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor,
- ClassReference holder,
- int minApiClass) {
- return null;
- }
-
- @Override
- protected TraversalContinuation visitMethods(
- BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor,
- ClassReference holder,
- int minApiClass) {
- return null;
- }
- };
-
- public AndroidApiLevelObjectDatabaseImpl(
- List<AndroidApiForHashingClass> predefinedApiTypeLookupForHashing) {
- Map<DexType, AndroidApiClass> predefinedMap = new HashMap<>();
- for (AndroidApiForHashingClass androidApiClass : predefinedApiTypeLookupForHashing) {
- predefinedMap.put(
- androidApiClass.getType(),
- new AndroidApiClass(androidApiClass.getType().asClassReference()) {
- @Override
- public AndroidApiLevel getApiLevel() {
- return androidApiClass.getApiLevel();
- }
-
- @Override
- public int getMemberCount() {
- return 0;
- }
-
- @Override
- protected TraversalContinuation visitFields(
- BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor,
- ClassReference holder,
- int minApiClass) {
- Box<TraversalContinuation> continuationBox =
- new Box<>(TraversalContinuation.CONTINUE);
- androidApiClass.visitFieldsWithApiLevels(
- (field, apiLevel) -> {
- if (continuationBox.get().shouldContinue()) {
- continuationBox.set(visitor.apply(field.asFieldReference(), apiLevel));
- }
- });
- return continuationBox.get();
- }
-
- @Override
- protected TraversalContinuation visitMethods(
- BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor,
- ClassReference holder,
- int minApiClass) {
- Box<TraversalContinuation> continuationBox =
- new Box<>(TraversalContinuation.CONTINUE);
- androidApiClass.visitMethodsWithApiLevels(
- (method, apiLevel) -> {
- if (continuationBox.get().shouldContinue()) {
- continuationBox.set(visitor.apply(method.asMethodReference(), apiLevel));
- }
- });
- return continuationBox.get();
- }
- });
- }
- this.predefinedApiTypeLookup = predefinedMap;
- }
-
- @Override
- public AndroidApiLevel getTypeApiLevel(DexType type) {
- return lookupDefinedApiLevel(type);
- }
-
- @Override
- public AndroidApiLevel getMethodApiLevel(DexMethod method) {
- return lookupDefinedApiLevel(method);
- }
-
- @Override
- public AndroidApiLevel getFieldApiLevel(DexField field) {
- return lookupDefinedApiLevel(field);
- }
-
- private AndroidApiLevel lookupDefinedApiLevel(DexReference reference) {
- AndroidApiClass foundClass =
- predefinedApiTypeLookup.getOrDefault(reference.getContextType(), SENTINEL);
- if (foundClass == null) {
- return AndroidApiLevel.UNKNOWN;
- }
- AndroidApiClass androidApiClass;
- if (foundClass == SENTINEL) {
- androidApiClass =
- AndroidApiDatabaseBuilder.buildClass(reference.getContextType().asClassReference());
- if (androidApiClass == null) {
- predefinedApiTypeLookup.put(reference.getContextType(), null);
- return AndroidApiLevel.UNKNOWN;
- }
- } else {
- androidApiClass = foundClass;
- }
- return reference.apply(
- type -> androidApiClass.getApiLevel(),
- field -> {
- FieldReference fieldReference = field.asFieldReference();
- Box<AndroidApiLevel> apiLevelBox = new Box<>(AndroidApiLevel.UNKNOWN);
- androidApiClass.visitFields(
- (fieldRef, apiLevel) -> {
- if (fieldReference.equals(fieldRef)) {
- apiLevelBox.set(apiLevel);
- return TraversalContinuation.BREAK;
- }
- return TraversalContinuation.CONTINUE;
- });
- return apiLevelBox.get();
- },
- method -> {
- MethodReference methodReference = method.asMethodReference();
- Box<AndroidApiLevel> apiLevelBox = new Box<>(AndroidApiLevel.UNKNOWN);
- androidApiClass.visitMethods(
- (methodRef, apiLevel) -> {
- if (methodReference.equals(methodRef)) {
- apiLevelBox.set(apiLevel);
- return TraversalContinuation.BREAK;
- }
- return TraversalContinuation.CONTINUE;
- });
- return apiLevelBox.get();
- });
- }
-}
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
index f4049a0..2eed210 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -26,15 +26,9 @@
private AndroidApiReferenceLevelCache(
AppView<?> appView, List<AndroidApiForHashingClass> predefinedApiTypeLookupForHashing) {
this.appView = appView;
- // TODO(b/199934316): When the implementation has been decided on, remove the others.
- if (appView.options().apiModelingOptions().useHashingDatabase) {
- androidApiLevelDatabase =
- new AndroidApiLevelHashingDatabaseImpl(
- appView.dexItemFactory(), predefinedApiTypeLookupForHashing);
- } else {
- androidApiLevelDatabase =
- new AndroidApiLevelObjectDatabaseImpl(predefinedApiTypeLookupForHashing);
- }
+ androidApiLevelDatabase =
+ new AndroidApiLevelHashingDatabaseImpl(
+ appView.dexItemFactory(), predefinedApiTypeLookupForHashing);
desugaredLibraryConfiguration = appView.options().desugaredLibraryConfiguration;
}
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 10e78f3..8209749 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -348,8 +348,8 @@
private void rewriteSourceFile(DexProgramClass clazz, SourceFileEnvironment environment) {
assert options.sourceFileProvider != null;
- clazz.setSourceFile(
- options.itemFactory.createString(options.sourceFileProvider.get(environment)));
+ String sourceFile = options.sourceFileProvider.get(environment);
+ clazz.setSourceFile(sourceFile == null ? null : options.itemFactory.createString(sourceFile));
}
private void writeVirtualFile(VirtualFile virtualFile, Timing timing) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 5cfbeeb..56a302d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -299,15 +299,21 @@
return null;
}
- public DexEncodedField toTypeSubstitutedField(DexField field) {
- return toTypeSubstitutedField(field, ConsumerUtils.emptyConsumer());
+ public DexEncodedField toTypeSubstitutedField(AppView<?> appView, DexField field) {
+ return toTypeSubstitutedField(appView, field, ConsumerUtils.emptyConsumer());
}
- public DexEncodedField toTypeSubstitutedField(DexField field, Consumer<Builder> consumer) {
+ public DexEncodedField toTypeSubstitutedField(
+ AppView<?> appView, DexField field, Consumer<Builder> consumer) {
if (this.getReference() == field) {
return this;
}
- return builder(this).setField(field).apply(consumer).build();
+ return builder(this)
+ .setField(field)
+ .disableAndroidApiLevelCheckIf(
+ !appView.options().apiModelingOptions().enableApiCallerIdentification)
+ .apply(consumer)
+ .build();
}
public boolean validateDexValue(DexItemFactory factory) {
@@ -359,7 +365,7 @@
private FieldAccessFlags accessFlags;
private FieldTypeSignature genericSignature = FieldTypeSignature.noSignature();
private DexValue staticValue = null;
- private AndroidApiLevel apiLevel = AndroidApiLevel.UNKNOWN;
+ private AndroidApiLevel apiLevel = AndroidApiLevel.NOT_SET;
private FieldOptimizationInfo optimizationInfo = DefaultFieldOptimizationInfo.getInstance();
private boolean deprecated;
private final boolean d8R8Synthesized;
@@ -453,7 +459,13 @@
}
public Builder disableAndroidApiLevelCheck() {
- checkAndroidApiLevel = false;
+ return disableAndroidApiLevelCheckIf(true);
+ }
+
+ public Builder disableAndroidApiLevelCheckIf(boolean shouldDisable) {
+ if (shouldDisable) {
+ checkAndroidApiLevel = false;
+ }
return this;
}
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
index e889a40..33f6e4d 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
@@ -7,10 +7,13 @@
import com.android.tools.r8.graph.analysis.EnqueuerAnalysis;
import com.android.tools.r8.shaking.Enqueuer.EnqueuerDefinitionSupplier;
import com.android.tools.r8.shaking.EnqueuerWorklist;
+import com.google.common.collect.Sets;
+import java.util.Set;
public class GenericSignatureEnqueuerAnalysis extends EnqueuerAnalysis {
private final EnqueuerDefinitionSupplier enqueuerDefinitionSupplier;
+ private final Set<DexReference> processedSignatures = Sets.newIdentityHashSet();
public GenericSignatureEnqueuerAnalysis(EnqueuerDefinitionSupplier enqueuerDefinitionSupplier) {
this.enqueuerDefinitionSupplier = enqueuerDefinitionSupplier;
@@ -18,20 +21,45 @@
@Override
public void processNewlyLiveClass(DexProgramClass clazz, EnqueuerWorklist worklist) {
- new GenericSignatureTypeVisitor(clazz, enqueuerDefinitionSupplier::definitionFor)
- .visitClassSignature(clazz.getClassSignature());
+ processSignature(clazz, clazz.getContext());
+ }
+
+ @Override
+ public void notifyMarkFieldAsReachable(ProgramField field) {
+ processSignature(field, field.getContext());
}
@Override
public void processNewlyLiveField(ProgramField field, ProgramDefinition context) {
- new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
- .visitFieldTypeSignature(field.getDefinition().getGenericSignature());
+ processSignature(field, context);
+ }
+
+ @Override
+ public void notifyMarkMethodAsTargeted(ProgramMethod method) {
+ processSignature(method, method.getContext());
}
@Override
public void processNewlyLiveMethod(ProgramMethod method, ProgramDefinition context) {
- new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
- .visitMethodSignature(method.getDefinition().getGenericSignature());
+ processSignature(method, context);
}
+ private void processSignature(ProgramDefinition signatureHolder, ProgramDefinition context) {
+ if (!processedSignatures.add(signatureHolder.getReference())) {
+ return;
+ }
+ GenericSignatureTypeVisitor genericSignatureTypeVisitor =
+ new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor);
+ if (signatureHolder.isClass()) {
+ genericSignatureTypeVisitor.visitClassSignature(
+ signatureHolder.asClass().getClassSignature());
+ } else if (signatureHolder.isMethod()) {
+ genericSignatureTypeVisitor.visitMethodSignature(
+ signatureHolder.asMethod().getDefinition().getGenericSignature());
+ } else {
+ assert signatureHolder.isField();
+ genericSignatureTypeVisitor.visitFieldTypeSignature(
+ signatureHolder.asField().getDefinition().getGenericSignature());
+ }
+ }
}
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index f3670f3..16427bf 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -179,7 +179,7 @@
DexField fieldReference = field.getReference();
DexField newFieldReference = fixupFieldReference(fieldReference);
if (newFieldReference != fieldReference) {
- return recordFieldChange(field, field.toTypeSubstitutedField(newFieldReference));
+ return recordFieldChange(field, field.toTypeSubstitutedField(appView, newFieldReference));
}
return field;
}
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java b/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
new file mode 100644
index 0000000..7c17e4c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
@@ -0,0 +1,89 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.analysis;
+
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.shaking.Enqueuer;
+import com.android.tools.r8.shaking.KeepInfo.Joiner;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.InternalOptions;
+
+/**
+ * Workaround for situations where an interface in the framework has been changed into a class. When
+ * compiling against a recent android.jar, virtual invokes to such classes may resolve to interface
+ * methods on older API levels, which can lead to verification errors (see b/206891715).
+ *
+ * <p>To mitigate this issue, we pin methods that have virtual invokes to such classes. This ensures
+ * that we don't move these virtual invokes elsewhere (e.g., due to inlining or class merging),
+ * which would otherwise lead to verification errors in other classes.
+ */
+// TODO(b/206891715): This only mitigates the issue. The user may still need to manually outline
+// virtual invokes to classes that was once an interface. To avoid this in general (including D8)
+// the compiler should outline the problematic invokes.
+public class InvokeVirtualToInterfaceVerifyErrorWorkaround implements EnqueuerInvokeAnalysis {
+
+ private final DexType androidHardwareCamera2CameraDeviceType;
+ private final Enqueuer enqueuer;
+ private final InternalOptions options;
+
+ public InvokeVirtualToInterfaceVerifyErrorWorkaround(
+ AppView<? extends AppInfoWithClassHierarchy> appView, Enqueuer enqueuer) {
+ this.androidHardwareCamera2CameraDeviceType =
+ appView.dexItemFactory().createType("Landroid/hardware/camera2/CameraDevice;");
+ this.enqueuer = enqueuer;
+ this.options = appView.options();
+ }
+
+ public static void register(
+ AppView<? extends AppInfoWithClassHierarchy> appView, Enqueuer enqueuer) {
+ if (!isNoop(appView)) {
+ enqueuer.registerInvokeAnalysis(
+ new InvokeVirtualToInterfaceVerifyErrorWorkaround(appView, enqueuer));
+ }
+ }
+
+ private static boolean isNoop(AppView<? extends AppInfoWithClassHierarchy> appView) {
+ return appView.options().getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L);
+ }
+
+ @Override
+ public void traceInvokeVirtual(DexMethod invokedMethod, ProgramMethod context) {
+ if (isInterfaceInSomeApiLevel(invokedMethod.getHolderType())) {
+ enqueuer.getKeepInfo().joinMethod(context, Joiner::disallowOptimization);
+ }
+ }
+
+ private boolean isInterfaceInSomeApiLevel(DexType type) {
+ // CameraDevice was added as a class in API 21 (L), but was defined as an interface in the
+ // framework before then.
+ return type == androidHardwareCamera2CameraDeviceType
+ && (options.isGeneratingClassFiles()
+ || options.getMinApiLevel().isLessThan(AndroidApiLevel.L));
+ }
+
+ @Override
+ public void traceInvokeDirect(DexMethod invokedMethod, ProgramMethod context) {
+ // Intentionally empty.
+ }
+
+ @Override
+ public void traceInvokeInterface(DexMethod invokedMethod, ProgramMethod context) {
+ // Intentionally empty.
+ }
+
+ @Override
+ public void traceInvokeStatic(DexMethod invokedMethod, ProgramMethod context) {
+ // Intentionally empty.
+ }
+
+ @Override
+ public void traceInvokeSuper(DexMethod invokedMethod, ProgramMethod context) {
+ // Intentionally empty.
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
index 21f8a5c..a8b8d30 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
@@ -151,6 +151,7 @@
if (needsRelaxedType(targetField, sourceFields)) {
newField =
targetField.toTypeSubstitutedField(
+ appView,
targetField
.getReference()
.withType(appView.dexItemFactory().objectType, appView.dexItemFactory()));
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
index f94d407..5fcbc0d 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
@@ -15,6 +15,7 @@
public class ClassStaticFieldsMerger {
+ private final AppView<?> appView;
private final DexItemFactory dexItemFactory;
private final MergeGroup group;
private final Builder lensBuilder;
@@ -23,6 +24,7 @@
public ClassStaticFieldsMerger(
AppView<?> appView, HorizontalClassMergerGraphLens.Builder lensBuilder, MergeGroup group) {
+ this.appView = appView;
this.dexItemFactory = appView.dexItemFactory();
this.group = group;
this.lensBuilder = lensBuilder;
@@ -50,7 +52,7 @@
field.getName().toString(),
this::isFresh);
- field = field.toTypeSubstitutedField(newFieldReference);
+ field = field.toTypeSubstitutedField(appView, newFieldReference);
targetFields.put(newFieldReference, field);
lensBuilder.recordNewFieldSignature(oldFieldReference, newFieldReference);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
index 7a74a2b..4a3f2ff 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
@@ -430,7 +430,7 @@
if (newFieldReference != oldFieldReference) {
lensBuilder.fixupField(oldFieldReference, newFieldReference);
- newFields[i] = oldField.toTypeSubstitutedField(newFieldReference);
+ newFields[i] = oldField.toTypeSubstitutedField(appView, newFieldReference);
} else {
newFields[i] = oldField;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index d2a73ed..e392248 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -468,6 +468,7 @@
return field
.getDefinition()
.toTypeSubstitutedField(
+ appView,
newFieldSignature,
builder ->
builder
@@ -621,6 +622,7 @@
lensBuilder.move(field, newField);
DexEncodedField newEncodedField =
encodedField.toTypeSubstitutedField(
+ appView,
newField,
builder ->
builder.setAbstractValue(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index 9397cc6..62176cb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -832,7 +832,7 @@
DexEncodedField field = oldFields.get(i);
DexField newField = mapCandidateField(field.getReference(), candidateClass.type, hostType);
if (newField != field.getReference()) {
- newFields[i] = field.toTypeSubstitutedField(newField);
+ newFields[i] = field.toTypeSubstitutedField(appView, newField);
fieldMapping.put(field.getReference(), newField);
} else {
newFields[i] = field;
@@ -844,7 +844,7 @@
DexEncodedField field = extraFields.get(i);
DexField newField = mapCandidateField(field.getReference(), candidateClass.type, hostType);
if (newField != field.getReference()) {
- newFields[numOfHostStaticFields + i] = field.toTypeSubstitutedField(newField);
+ newFields[numOfHostStaticFields + i] = field.toTypeSubstitutedField(appView, newField);
fieldMapping.put(field.getReference(), newField);
} else {
newFields[numOfHostStaticFields + i] = field;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
index c8cb4d6..b9e4f84 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -73,12 +73,6 @@
break;
}
}
- if (backing == null) {
- appView
- .options()
- .reporter
- .info(KotlinMetadataDiagnostic.lambdaBackingNotFound(clazz.type, function.getName()));
- }
return function.rewrite(visitorProvider.get()::visitFunction, backing, appView, namingLens);
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
index 6c4c963..83947d7 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
@@ -73,17 +73,4 @@
+ StringUtils.LINE_SEPARATOR
+ StringUtils.stacktraceAsString(t));
}
-
- static KotlinMetadataDiagnostic lambdaBackingNotFound(DexType type, String functionName) {
- return new KotlinMetadataDiagnostic(
- Origin.unknown(),
- Position.UNKNOWN,
- "The lambda function "
- + functionName
- + " could no longer be found in "
- + type.toSourceString()
- + " . The method is most likely pruned and would require a specific keep rule to keep"
- + " alive. As a result, the metadata information regarding the lambda structure has"
- + " been discarded.");
- }
}
diff --git a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
index 13d7fc6..baa2951 100644
--- a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
@@ -5,70 +5,72 @@
import com.android.tools.r8.SourceFileEnvironment;
import com.android.tools.r8.SourceFileProvider;
-import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.shaking.ProguardConfiguration;
+import com.android.tools.r8.utils.InternalOptions;
/** Computes the source file provider based on the proguard configuration if none is set. */
public class SourceFileRewriter {
- private final AppView<?> appView;
-
- public SourceFileRewriter(AppView<?> appView) {
- this.appView = appView;
+ public static SourceFileProvider computeSourceFileProvider(
+ SourceFileProvider provider, ProguardConfiguration configuration, InternalOptions options) {
+ if (provider != null) {
+ return provider;
+ }
+ if (!configuration.getKeepAttributes().sourceFile) {
+ return rewriteToDefaultSourceFile(options.dexItemFactory());
+ }
+ if (options.forceProguardCompatibility) {
+ return computeCompatProvider(options);
+ }
+ return computeNonCompatProvider(options);
}
- public void run() {
- if (appView.options().sourceFileProvider != null) {
- return;
- }
- appView.options().sourceFileProvider = computeSourceFileProvider();
- }
-
- public SourceFileProvider computeSourceFileProvider() {
- if (!appView.options().getProguardConfiguration().getKeepAttributes().sourceFile) {
- return rewriteToDefaultSourceFile();
- }
- if (appView.options().forceProguardCompatibility) {
- return computeCompatProvider();
- }
- return computeNonCompatProvider();
- }
-
- private SourceFileProvider computeCompatProvider() {
+ private static SourceFileProvider computeCompatProvider(InternalOptions options) {
// Compatibility mode will only apply -renamesourcefileattribute when minifying names.
- if (appView.options().isMinifying()) {
- String renaming = getRenameSourceFileAttribute();
+ if (options.isMinifying()) {
+ String renaming = getRenameSourceFileAttribute(options);
if (renaming != null) {
- return rewriteTo(renaming);
+ return rewriteTo(renaming, isDefault(renaming, options));
}
}
return null;
}
- private SourceFileProvider computeNonCompatProvider() {
- String renaming = getRenameSourceFileAttribute();
+ private static SourceFileProvider computeNonCompatProvider(InternalOptions options) {
+ String renaming = getRenameSourceFileAttribute(options);
if (renaming != null) {
- return rewriteTo(renaming);
+ return rewriteTo(renaming, isDefault(renaming, options));
}
- if (appView.options().isMinifying() || appView.options().isOptimizing()) {
- return rewriteToDefaultSourceFile();
+ if (options.isMinifying() || options.isOptimizing()) {
+ return rewriteToDefaultSourceFile(options.dexItemFactory());
}
return null;
}
- private String getRenameSourceFileAttribute() {
- return appView.options().getProguardConfiguration().getRenameSourceFileAttribute();
+ private static String getRenameSourceFileAttribute(InternalOptions options) {
+ return options.getProguardConfiguration().getRenameSourceFileAttribute();
}
- private SourceFileProvider rewriteToDefaultSourceFile() {
- return rewriteTo(appView.dexItemFactory().defaultSourceFileAttributeString);
+ public static boolean isDefault(String sourceFile, InternalOptions options) {
+ return options.dexItemFactory().defaultSourceFileAttributeString.equals(sourceFile);
}
- private SourceFileProvider rewriteTo(String renaming) {
+ private static SourceFileProvider rewriteToDefaultSourceFile(DexItemFactory factory) {
+ return rewriteTo(factory.defaultSourceFileAttributeString, true);
+ }
+
+ private static SourceFileProvider rewriteTo(String renaming, boolean allowDiscard) {
return new SourceFileProvider() {
@Override
public String get(SourceFileEnvironment environment) {
return renaming;
}
+
+ @Override
+ public boolean allowDiscardingSourceFile() {
+ return allowDiscard;
+ }
};
}
}
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index fc81e6c..fdd1b9f 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -84,6 +84,7 @@
import com.android.tools.r8.graph.analysis.EnqueuerExceptionGuardAnalysis;
import com.android.tools.r8.graph.analysis.EnqueuerInstanceOfAnalysis;
import com.android.tools.r8.graph.analysis.EnqueuerInvokeAnalysis;
+import com.android.tools.r8.graph.analysis.InvokeVirtualToInterfaceVerifyErrorWorkaround;
import com.android.tools.r8.ir.analysis.proto.ProtoEnqueuerUseRegistry;
import com.android.tools.r8.ir.analysis.proto.schema.ProtoEnqueuerExtension;
import com.android.tools.r8.ir.code.ArrayPut;
@@ -234,11 +235,11 @@
private final boolean forceProguardCompatibility;
private final Mode mode;
- private Set<EnqueuerAnalysis> analyses = Sets.newIdentityHashSet();
- private Set<EnqueuerInvokeAnalysis> invokeAnalyses = Sets.newIdentityHashSet();
- private Set<EnqueuerInstanceOfAnalysis> instanceOfAnalyses = Sets.newIdentityHashSet();
- private Set<EnqueuerExceptionGuardAnalysis> exceptionGuardAnalyses = Sets.newIdentityHashSet();
- private Set<EnqueuerCheckCastAnalysis> checkCastAnalyses = Sets.newIdentityHashSet();
+ private Set<EnqueuerAnalysis> analyses = new LinkedHashSet<>();
+ private Set<EnqueuerInvokeAnalysis> invokeAnalyses = new LinkedHashSet<>();
+ private Set<EnqueuerInstanceOfAnalysis> instanceOfAnalyses = new LinkedHashSet<>();
+ private Set<EnqueuerExceptionGuardAnalysis> exceptionGuardAnalyses = new LinkedHashSet<>();
+ private Set<EnqueuerCheckCastAnalysis> checkCastAnalyses = new LinkedHashSet<>();
// Don't hold a direct pointer to app info (use appView).
private AppInfoWithClassHierarchy appInfo;
@@ -479,6 +480,7 @@
: null;
if (mode.isInitialOrFinalTreeShaking()) {
+ InvokeVirtualToInterfaceVerifyErrorWorkaround.register(appView, this);
if (options.protoShrinking().enableGeneratedMessageLiteShrinking) {
registerAnalysis(new ProtoEnqueuerExtension(appView));
}
@@ -536,7 +538,7 @@
return this;
}
- private Enqueuer registerInvokeAnalysis(EnqueuerInvokeAnalysis analysis) {
+ public Enqueuer registerInvokeAnalysis(EnqueuerInvokeAnalysis analysis) {
invokeAnalyses.add(analysis);
return this;
}
@@ -681,6 +683,10 @@
return clazz;
}
+ public MutableKeepInfoCollection getKeepInfo() {
+ return keepInfo;
+ }
+
public KeepClassInfo getKeepInfo(DexProgramClass clazz) {
return keepInfo.getClassInfo(clazz);
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java b/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java
index c9ab49b..de70c89 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java
@@ -28,7 +28,7 @@
INTERFACE {
@Override
public boolean matches(DexClass clazz) {
- return clazz.accessFlags.isInterface() && !clazz.accessFlags.isAnnotation();
+ return clazz.accessFlags.isInterface();
}
},
UNSPECIFIED {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 99da4fb..f86a251 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -79,7 +79,8 @@
"convert_proto_enum_to_string");
private static final List<String> IGNORED_CLASS_DESCRIPTOR_OPTIONS =
- ImmutableList.of("isclassnamestring", "whyarenotsimple", "convertchecknotnull");
+ ImmutableList.of(
+ "isclassnamestring", "whyarenotsimple", "convertchecknotnull", "checkenumunboxed");
private static final List<String> IGNORED_RETURN_VALUE_ATTRIBUTES = ImmutableList.of("_NONNULL_");
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 6d90250..4f116de 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1673,7 +1673,7 @@
} while (!availableFieldSignatures.test(newSignature));
}
- return field.toTypeSubstitutedField(newSignature);
+ return field.toTypeSubstitutedField(appView, newSignature);
}
private void makeStatic(DexEncodedMethod method) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index fca35a8..727f9c9 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1472,7 +1472,6 @@
public boolean enableApiCallerIdentification = true;
public boolean checkAllApiReferencesAreSet = true;
- public boolean useHashingDatabase = true;
public void visitMockedApiLevelsForReferences(
DexItemFactory factory, Consumer<AndroidApiForHashingClass> consumer) {
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 e0ecef3..2e9c933 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -362,6 +362,10 @@
}
}
+ boolean canStripDebugInfo =
+ appView.options().sourceFileProvider != null
+ && appView.options().sourceFileProvider.allowDiscardingSourceFile();
+
if (isSyntheticClass) {
onDemandClassNamingBuilder
.get()
@@ -413,7 +417,9 @@
List<MappedPosition> mappedPositions;
Code code = method.getCode();
boolean canUseDexPc =
- appView.options().canUseDexPcAsDebugInformation() && methods.size() == 1;
+ canStripDebugInfo
+ && appView.options().canUseDexPcAsDebugInformation()
+ && methods.size() == 1;
if (code != null) {
if (code.isDexCode() && doesContainPositions(code.asDexCode())) {
if (canUseDexPc) {
@@ -582,7 +588,8 @@
}
i = j;
}
- if (method.getCode().isDexCode()
+ if (canStripDebugInfo
+ && method.getCode().isDexCode()
&& method.getCode().asDexCode().getDebugInfo()
== DexDebugInfoForSingleLineMethod.getInstance()) {
method.getCode().asDexCode().setDebugInfo(null);
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/java/com/android/tools/r8/KotlinTestBase.java
index 539fe56..8dd8a44 100644
--- a/src/test/java/com/android/tools/r8/KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/KotlinTestBase.java
@@ -81,6 +81,10 @@
}
}
+ public static Path getKotlinResourcesFolder() {
+ return Paths.get(ToolHelper.TESTS_DIR, RSRC);
+ }
+
protected Path getJavaJarFile(String folder) {
return Paths.get(ToolHelper.TESTS_BUILD_DIR, RSRC,
targetVersion.getFolderName(), folder + ".java" + FileUtils.JAR_EXTENSION);
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java
index cd0036b..072da5a 100644
--- a/src/test/java/com/android/tools/r8/L8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -8,7 +8,6 @@
import static junit.framework.TestCase.assertTrue;
import com.android.tools.r8.TestBase.Backend;
-import com.android.tools.r8.desugar.desugaredlibrary.jdk11.DesugaredLibraryJDK11Undesugarer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -39,7 +38,7 @@
private List<Path> additionalProgramFiles = new ArrayList<>();
private List<byte[]> additionalProgramClassFileData = new ArrayList<>();
private Consumer<InternalOptions> optionsModifier = ConsumerUtils.emptyConsumer();
- private Path desugarJDKLibs = DesugaredLibraryJDK11Undesugarer.undesugaredJar();
+ private Path desugarJDKLibs = ToolHelper.getDesugarJDKLibs();
private Path desugarJDKLibsConfiguration = null;
private StringResource desugaredLibraryConfiguration =
StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting());
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 52b4ac9..53886e2 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.TestRuntime.CfRuntime;
import com.android.tools.r8.ToolHelper.DexVm.Kind;
+import com.android.tools.r8.desugar.desugaredlibrary.jdk11.DesugaredLibraryJDK11Undesugarer;
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
@@ -181,6 +182,10 @@
Paths.get(LIBS_DIR, "library_desugar_conversions.zip");
public static Path getDesugarJDKLibs() {
+ return DesugaredLibraryJDK11Undesugarer.undesugaredJar();
+ }
+
+ public static Path getDesugarJDKLibsBazelGeneratedFile() {
return Paths.get(
System.getProperty(
"desugar_jdk_libs", "third_party/openjdk/desugar_jdk_libs/desugar_jdk_libs.jar"));
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseBuilderTemplate.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseBuilderTemplate.java
deleted file mode 100644
index 4b21f6e..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseBuilderTemplate.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import com.android.tools.r8.androidapi.AndroidApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.utils.DescriptorUtils;
-import java.util.function.Consumer;
-
-/** This is a template for generating the AndroidApiDatabaseBuilder. */
-public class AndroidApiDatabaseBuilderTemplate /* AndroidApiDatabaseBuilder */ {
-
- public static void visitApiClasses(Consumer<String> classDescriptorConsumer) {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- placeHolderForVisitApiClasses();
- }
-
- public static AndroidApiClass buildClass(ClassReference classReference) {
- String descriptor = classReference.getDescriptor();
- String packageName = DescriptorUtils.getPackageNameFromDescriptor(descriptor);
- String simpleClassName = DescriptorUtils.getSimpleClassNameFromDescriptor(descriptor);
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- placeHolderForBuildClass();
- return null;
- }
-
- private static void placeHolderForVisitApiClasses() {}
-
- private static void placeHolderForBuildClass() {}
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseClassTemplate.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseClassTemplate.java
deleted file mode 100644
index 1a8b7e3..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseClassTemplate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import com.android.tools.r8.androidapi.AndroidApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.FieldReference;
-import com.android.tools.r8.references.MethodReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.TraversalContinuation;
-import java.util.function.BiFunction;
-
-/** This is a template for generating AndroidApiDatabaseClass extending AndroidApiClass */
-public class AndroidApiDatabaseClassTemplate extends AndroidApiClass {
-
- protected AndroidApiDatabaseClassTemplate() {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- super(Reference.classFromDescriptor(placeHolderForInit()));
- }
-
- @Override
- public AndroidApiLevel getApiLevel() {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- return placeHolderForGetApiLevel();
- }
-
- @Override
- public int getMemberCount() {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- return placeHolderForGetMemberCount();
- }
-
- @Override
- public TraversalContinuation visitFields(
- BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor,
- ClassReference holder,
- int minApi) {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- placeHolderForVisitFields();
- return TraversalContinuation.CONTINUE;
- }
-
- @Override
- public TraversalContinuation visitMethods(
- BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor,
- ClassReference holder,
- int minApi) {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- placeHolderForVisitMethods();
- return TraversalContinuation.CONTINUE;
- }
-
- private static String placeHolderForInit() {
- return null;
- }
-
- private static AndroidApiLevel placeHolderForGetApiLevel() {
- return null;
- }
-
- private static int placeHolderForGetMemberCount() {
- return 0;
- }
-
- private static void placeHolderForVisitFields() {}
-
- private static void placeHolderForVisitMethods() {}
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabasePackageTemplate.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabasePackageTemplate.java
deleted file mode 100644
index 3919d11..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabasePackageTemplate.java
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import com.android.tools.r8.androidapi.AndroidApiClass;
-
-/** This is a template for generating the AndroidApiDatabasePackage. */
-public class AndroidApiDatabasePackageTemplate {
-
- public static AndroidApiClass buildClass(String className) {
- // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
- placeHolder();
- return null;
- }
-
- private static void placeHolder() {}
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGenerator.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGenerator.java
deleted file mode 100644
index c8b6c24..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGenerator.java
+++ /dev/null
@@ -1,593 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import static com.android.tools.r8.utils.FunctionUtils.ignoreArgument;
-import static org.objectweb.asm.Opcodes.AASTORE;
-import static org.objectweb.asm.Opcodes.ACONST_NULL;
-import static org.objectweb.asm.Opcodes.ALOAD;
-import static org.objectweb.asm.Opcodes.ANEWARRAY;
-import static org.objectweb.asm.Opcodes.ARETURN;
-import static org.objectweb.asm.Opcodes.DUP;
-import static org.objectweb.asm.Opcodes.F_SAME1;
-import static org.objectweb.asm.Opcodes.IFEQ;
-import static org.objectweb.asm.Opcodes.ILOAD;
-import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
-import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
-import static org.objectweb.asm.Opcodes.INVOKESTATIC;
-import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
-import static org.objectweb.asm.Opcodes.NEW;
-import static org.objectweb.asm.Opcodes.POP;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.apimodel.AndroidApiVersionsXmlParser.ParsedApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.references.TypeReference;
-import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
-import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.IntBox;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
-
-public class AndroidApiObjectDatabaseBuilderGenerator extends TestBase {
-
- public static String generatedMainDescriptor() {
- return descriptor(AndroidApiDatabaseBuilderTemplate.class).replace("Template", "");
- }
-
- public static ClassReference ANDROID_API_LEVEL =
- Reference.classFromBinaryName("com/android/tools/r8/utils/AndroidApiLevel");
- public static ClassReference ANDROID_API_CLASS =
- Reference.classFromBinaryName("com/android/tools/r8/androidapi/AndroidApiClass");
- public static ClassReference TRAVERSAL_CONTINUATION =
- Reference.classFromBinaryName("com/android/tools/r8/utils/TraversalContinuation");
-
- /**
- * Generate the classes needed for looking up api level of references in the android.jar.
- *
- * <p>For each api class we generate a from AndroidApiDatabaseClassTemplate, extending
- * AndroidApiClass, such that all members can be traversed. Looking up the class reference
- * directly in one method will generate to much code and would probably be inefficient so we first
- * do a case on the package and then do a check on the simple name.
- *
- * <p>We therefore create a class file for each package, based on
- * AndroidApiDatabasePackageTemplate, that will do the dispatch to create a new
- * AndroidApiDatabaseClass for class in the package.
- *
- * <p>We then have a single entry-point, AndroidApiDatabaseBuilder, based on
- * AndroidApiDatabaseBuilderTemplate, that will do the dispatch to AndroidApiDatabasePackage based
- * on the package name.
- */
- public static void generate(List<ParsedApiClass> apiClasses, BiConsumer<String, byte[]> consumer)
- throws Exception {
- Map<String, List<ParsedApiClass>> packageToClassesMap = new HashMap<>();
- List<String> packages =
- apiClasses.stream()
- .map(
- apiClass -> {
- String packageName =
- DescriptorUtils.getPackageNameFromDescriptor(
- apiClass.getClassReference().getDescriptor());
- packageToClassesMap
- .computeIfAbsent(packageName, ignoreArgument(ArrayList::new))
- .add(apiClass);
- return packageName;
- })
- .sorted()
- .distinct()
- .collect(Collectors.toList());
-
- for (ParsedApiClass apiClass : apiClasses) {
- String apiClassDescriptor = getApiClassReference(apiClass).getDescriptor();
- consumer.accept(
- apiClassDescriptor,
- transformer(AndroidApiDatabaseClassTemplate.class)
- .setClassDescriptor(apiClassDescriptor)
- .addMethodTransformer(getInitTransformer(apiClass))
- .addMethodTransformer(getApiLevelTransformer(apiClass))
- .addMethodTransformer(getGetMemberCountTransformer(apiClass))
- .addMethodTransformer(getVisitFieldsTransformer(apiClass))
- .addMethodTransformer(getVisitMethodsTransformer(apiClass))
- .removeMethods(MethodPredicate.onName("placeHolderForInit"))
- .removeMethods(MethodPredicate.onName("placeHolderForGetApiLevel"))
- .removeMethods(MethodPredicate.onName("placeHolderForGetMemberCount"))
- .removeMethods(MethodPredicate.onName("placeHolderForVisitFields"))
- .removeMethods(MethodPredicate.onName("placeHolderForVisitMethods"))
- .setSourceFile(
- DescriptorUtils.getSimpleClassNameFromDescriptor(apiClassDescriptor) + ".java")
- .computeMaxs()
- .transform(ClassWriter.COMPUTE_MAXS));
- }
-
- for (String pkg : packages) {
- consumer.accept(
- getPackageBuilderDescriptor(pkg),
- transformer(AndroidApiDatabasePackageTemplate.class)
- .setClassDescriptor(getPackageBuilderDescriptor(pkg))
- .addMethodTransformer(getBuildClassTransformer(packageToClassesMap.get(pkg)))
- .removeMethods(MethodPredicate.onName("placeHolder"))
- .computeMaxs()
- .transform(ClassWriter.COMPUTE_MAXS));
- }
-
- consumer.accept(
- generatedMainDescriptor(),
- transformer(AndroidApiDatabaseBuilderTemplate.class)
- .setClassDescriptor(generatedMainDescriptor())
- .addMethodTransformer(getVisitApiClassesTransformer(apiClasses))
- .addMethodTransformer(getBuildPackageTransformer(packages))
- .removeMethods(MethodPredicate.onName("placeHolderForVisitApiClasses"))
- .removeMethods(MethodPredicate.onName("placeHolderForBuildClass"))
- .computeMaxs()
- .transform(ClassWriter.COMPUTE_MAXS));
- }
-
- private static String getPackageBuilderDescriptor(String pkg) {
- return DescriptorUtils.javaTypeToDescriptor(
- AndroidApiDatabasePackageTemplate.class
- .getTypeName()
- .replace("Template", "ForPackage_" + pkg.replace(".", "_")));
- }
-
- private static ClassReference getApiClassReference(ParsedApiClass apiClass) {
- return fromTemplate(apiClass.getClassReference());
- }
-
- private static ClassReference fromTemplate(ClassReference classReference) {
- String descriptor =
- DescriptorUtils.javaTypeToDescriptor(
- AndroidApiDatabaseClassTemplate.class
- .getTypeName()
- .replace("Template", "ForClass_" + classReference.getTypeName().replace(".", "_")));
- return Reference.classFromDescriptor(descriptor);
- }
-
- // The transformer below changes AndroidApiDatabaseClassTemplate.<init> from:
- // super(Reference.classFromDescriptor(placeHolderForInit()));
- // into
- // super(Reference.classFromDescriptor("<class-descriptor>"));
- private static MethodTransformer getInitTransformer(ParsedApiClass apiClass) {
- return replaceCode(
- "placeHolderForInit",
- transformer -> {
- transformer.visitLdcInsn(apiClass.getClassReference().getDescriptor());
- });
- }
-
- // The transformer below changes AndroidApiDatabaseClassTemplate.getApiLevel from:
- // return placeHolderForGetApiLevel();
- // into
- // return AndroidApiLevel.getAndroidApiLevel(<apiLevel>);
- private static MethodTransformer getApiLevelTransformer(ParsedApiClass apiClass) {
- return replaceCode(
- "placeHolderForGetApiLevel",
- transformer -> {
- transformer.visitLdcInsn(apiClass.getApiLevel().getLevel());
- transformer.visitMethodInsn(
- INVOKESTATIC,
- ANDROID_API_LEVEL.getBinaryName(),
- "getAndroidApiLevel",
- "(I)" + ANDROID_API_LEVEL.getDescriptor(),
- false);
- });
- }
-
- // The transformer below changes AndroidApiDatabaseClassTemplate.getMemberCount from:
- // return placeHolderForGetMemberCount();
- // into
- // return <memberCount>;
- private static MethodTransformer getGetMemberCountTransformer(ParsedApiClass apiClass) {
- return replaceCode(
- "placeHolderForGetMemberCount",
- transformer -> transformer.visitLdcInsn(apiClass.getTotalMemberCount()));
- }
-
- // The transformer below changes AndroidApiDatabaseClassTemplate.visitFields from:
- // placeHolder();
- // return TraversalContinuation.CONTINUE;
- // into
- // TraversalContinuation s1 = visitField(visitor, holder, minApiClass, apiLevel1, "field1",
- // "descriptor1")
- // if (s1.shouldBreak()) {
- // return s1;
- // }
- // TraversalContinuation s2 = visitField(visitor, holder, minApiClass, apiLevel2, "field2",
- // // "descriptor2")
- // if (s2.shouldBreak()) {
- // return s2;
- // }
- // ...
- // AndroidApiClassForClass_class_name1() super1 = new AndroidApiClassForClass_class_name1();
- // TraversalContinuation sN = super1.visitFields(
- // visitor, holder, max(minApiClass, minApiForLink));
- // ...
- // return TraversalContinuation.CONTINUE;
- private static MethodTransformer getVisitFieldsTransformer(ParsedApiClass apiClass) {
- IntBox lineNumberBox = new IntBox(0);
- return replaceCode(
- "placeHolderForVisitFields",
- transformer -> {
- apiClass.visitFieldReferences(
- (apiLevel, references) -> {
- references.forEach(
- reference -> {
- Label labelStart = new Label();
- transformer.visitLabel(labelStart);
- transformer.visitLineNumber(lineNumberBox.getAndIncrement(), labelStart);
- transformer.visitVarInsn(ALOAD, 0);
- transformer.visitVarInsn(ALOAD, 1);
- transformer.visitVarInsn(ALOAD, 2);
- transformer.visitVarInsn(ILOAD, 3);
- transformer.visitLdcInsn(apiLevel.getLevel());
- transformer.visitLdcInsn(reference.getFieldName());
- transformer.visitLdcInsn(reference.getFieldType().getDescriptor());
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- ANDROID_API_CLASS.getBinaryName(),
- "visitField",
- "(Ljava/util/function/BiFunction;"
- + descriptor(ClassReference.class)
- + "I"
- + "I"
- + "Ljava/lang/String;"
- + "Ljava/lang/String;)"
- + TRAVERSAL_CONTINUATION.getDescriptor(),
- false);
- // Note that instead of storing the result here, we dup it on the stack.
- transformer.visitInsn(DUP);
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- TRAVERSAL_CONTINUATION.getBinaryName(),
- "shouldBreak",
- "()Z",
- false);
- Label label = new Label();
- transformer.visitJumpInsn(IFEQ, label);
- transformer.visitInsn(ARETURN);
- transformer.visitLabel(label);
- transformer.visitFrame(
- F_SAME1,
- 0,
- new Object[] {},
- 1,
- new Object[] {TRAVERSAL_CONTINUATION.getBinaryName()});
- // The pop here is needed to remove the dupped value in the case we do not
- // return.
- transformer.visitInsn(POP);
- });
- });
- if (!apiClass.isInterface()) {
- apiClass.visitSuperType(
- (superType, apiLevel) -> {
- addMembersForParent(
- transformer,
- superType,
- "visitFields",
- apiLevel,
- lineNumberBox.getAndIncrement());
- });
- }
- // No need to visit fields on interfaces since they have to be static and should not be
- // called on a super instance.
- });
- }
-
- // The transformer below changes AndroidApiDatabaseClassTemplate.visitMethods from:
- // placeHolderForVisitMethods();
- // return TraversalContinuation.CONTINUE;
- // into
- // TraversalContinuation s1 = visitMethod(visitor, holder, minApiClass, apiLevel1,
- // "method1", new String[] { "param11", ... , "param1X" }, null/return1)
- // if (s1.shouldBreak()) {
- // return s1;
- // }
- // TraversalContinuation s1 = visitMethod(visitor, holder, minApiClass, apiLevel2,
- // "method2", new String[] { "param21", ... , "param2X" }, null/return2)
- // if (s2.shouldBreak()) {
- // return s2;
- // }
- // ...
- // AndroidApiClassForClass_class_name1() super1 = new AndroidApiClassForClass_class_name1();
- // TraversalContinuation sN = super1.visitMethods(
- // visitor, holder, max(minApiClass, minApiForLink));
- // ...
- // return TraversalContinuation.CONTINUE;
- private static MethodTransformer getVisitMethodsTransformer(ParsedApiClass apiClass) {
- IntBox lineNumberBox = new IntBox(0);
- return replaceCode(
- "placeHolderForVisitMethods",
- transformer -> {
- apiClass.visitMethodReferences(
- (apiLevel, references) -> {
- references.forEach(
- reference -> {
- Label labelStart = new Label();
- transformer.visitLabel(labelStart);
- transformer.visitLineNumber(lineNumberBox.getAndIncrement(), labelStart);
- transformer.visitVarInsn(ALOAD, 0);
- transformer.visitVarInsn(ALOAD, 1);
- transformer.visitVarInsn(ALOAD, 2);
- transformer.visitVarInsn(ILOAD, 3);
- transformer.visitLdcInsn(apiLevel.getLevel());
- transformer.visitLdcInsn(reference.getMethodName());
- List<TypeReference> formalTypes = reference.getFormalTypes();
- transformer.visitLdcInsn(formalTypes.size());
- transformer.visitTypeInsn(ANEWARRAY, binaryName(String.class));
- for (int i = 0; i < formalTypes.size(); i++) {
- transformer.visitInsn(DUP);
- transformer.visitLdcInsn(i);
- transformer.visitLdcInsn(formalTypes.get(i).getDescriptor());
- transformer.visitInsn(AASTORE);
- }
- if (reference.getReturnType() != null) {
- transformer.visitLdcInsn(reference.getReturnType().getDescriptor());
- } else {
- transformer.visitInsn(ACONST_NULL);
- }
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- ANDROID_API_CLASS.getBinaryName(),
- "visitMethod",
- "(Ljava/util/function/BiFunction;"
- + descriptor(ClassReference.class)
- + "I"
- + "I"
- + "Ljava/lang/String;"
- + "[Ljava/lang/String;"
- + "Ljava/lang/String;)"
- + TRAVERSAL_CONTINUATION.getDescriptor(),
- false);
- // Note that instead of storing the result here, we dup it on the stack.
- transformer.visitInsn(DUP);
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- TRAVERSAL_CONTINUATION.getBinaryName(),
- "shouldBreak",
- "()Z",
- false);
- Label label = new Label();
- transformer.visitJumpInsn(IFEQ, label);
- transformer.visitInsn(ARETURN);
- transformer.visitLabel(label);
- transformer.visitFrame(
- F_SAME1,
- 0,
- new Object[] {},
- 1,
- new Object[] {TRAVERSAL_CONTINUATION.getBinaryName()});
- // The pop here is needed to remove the dupped value in the case we do not
- // return.
- transformer.visitInsn(POP);
- });
- });
- if (!apiClass.isInterface()) {
- // Visit super types before interfaces emulating a poor man's resolutions.
- apiClass.visitSuperType(
- (superType, apiLevel) -> {
- addMembersForParent(
- transformer,
- superType,
- "visitMethods",
- apiLevel,
- lineNumberBox.getAndIncrement());
- });
- }
- apiClass.visitInterface(
- (classReference, apiLevel) -> {
- addMembersForParent(
- transformer,
- classReference,
- "visitMethods",
- apiLevel,
- lineNumberBox.getAndIncrement());
- });
- });
- }
-
- private static void addMembersForParent(
- MethodTransformer transformer,
- ClassReference classReference,
- String methodName,
- AndroidApiLevel minApiLevel,
- int lineNumber) {
- String binaryName = fromTemplate(classReference).getBinaryName();
- Label labelStart = new Label();
- transformer.visitLabel(labelStart);
- transformer.visitLineNumber(lineNumber, labelStart);
- transformer.visitTypeInsn(NEW, binaryName);
- transformer.visitInsn(DUP);
- transformer.visitMethodInsn(INVOKESPECIAL, binaryName, "<init>", "()V", false);
- transformer.visitVarInsn(ALOAD, 1);
- transformer.visitVarInsn(ALOAD, 2);
- // Compute the max api level compared to what is passed in.
- transformer.visitLdcInsn(minApiLevel.getLevel());
- transformer.visitVarInsn(ILOAD, 3);
- transformer.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "max", "(II)I", false);
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- binaryName,
- methodName,
- "(Ljava/util/function/BiFunction;"
- + descriptor(ClassReference.class)
- + "I)"
- + TRAVERSAL_CONTINUATION.getDescriptor(),
- false);
- // Note that instead of storing the result here, we dup it on the stack.
- transformer.visitInsn(DUP);
- transformer.visitMethodInsn(
- INVOKEVIRTUAL, TRAVERSAL_CONTINUATION.getBinaryName(), "shouldBreak", "()Z", false);
- Label label = new Label();
- transformer.visitJumpInsn(IFEQ, label);
- transformer.visitInsn(ARETURN);
- transformer.visitLabel(label);
- transformer.visitFrame(
- F_SAME1, 0, new Object[] {}, 1, new Object[] {TRAVERSAL_CONTINUATION.getBinaryName()});
- // The pop here is needed to remove the dupped value in the case we do not return.
- transformer.visitInsn(POP);
- }
-
- // The transformer below changes AndroidApiDatabasePackageTemplate.buildClass from:
- // placeHolder();
- // return null;
- // into
- // if ("<simple_class1>".equals(className)) {
- // return new AndroidApiClassForClass_class_name1();
- // }
- // if ("<simple_class2>".equals(className)) {
- // return new AndroidApiClassForClass_class_name2();
- // }
- // ...
- // return null;
- private static MethodTransformer getBuildClassTransformer(List<ParsedApiClass> classesForPackage)
- throws NoSuchMethodException {
- Method equals = Object.class.getMethod("equals", Object.class);
- return replaceCode(
- "placeHolder",
- transformer -> {
- classesForPackage.forEach(
- apiClass -> {
- transformer.visitLdcInsn(
- DescriptorUtils.getSimpleClassNameFromDescriptor(
- apiClass.getClassReference().getDescriptor()));
- transformer.visitVarInsn(ALOAD, 0);
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- binaryName(String.class),
- equals.getName(),
- methodDescriptor(equals),
- false);
- Label label = new Label();
- transformer.visitJumpInsn(IFEQ, label);
- String binaryName = getApiClassReference(apiClass).getBinaryName();
- transformer.visitTypeInsn(NEW, binaryName);
- transformer.visitInsn(DUP);
- transformer.visitMethodInsn(INVOKESPECIAL, binaryName, "<init>", "()V", false);
- transformer.visitInsn(ARETURN);
- transformer.visitLabel(label);
- transformer.visitFrame(Opcodes.F_SAME, 0, new Object[] {}, 0, new Object[0]);
- });
- });
- }
-
- // The transformer below changes AndroidApiDatabaseBuilderTemplate.buildClass from:
- // String descriptor = classReference.getDescriptor();
- // String packageName = DescriptorUtils.getPackageNameFromDescriptor(descriptor);
- // String simpleClassName = DescriptorUtils.getSimpleClassNameFromDescriptor(descriptor);
- // placeHolderForBuildClass();
- // return null;
- // into
- // String descriptor = classReference.getDescriptor();
- // String packageName = DescriptorUtils.getPackageNameFromDescriptor(descriptor);
- // String simpleClassName = DescriptorUtils.getSimpleClassNameFromDescriptor(descriptor);
- // if ("<package_name1>".equals(packageName)) {
- // return AndroidApiClassForPackage_package_name1(simpleClassName);
- // }
- // if ("<package_name2>".equals(simpleClassName)) {
- // return AndroidApiClassForPackage_package_name2(simpleClassName);
- // }
- // ...
- // return null;
- private static MethodTransformer getBuildPackageTransformer(List<String> packages)
- throws NoSuchMethodException {
- Method equals = String.class.getMethod("equals", Object.class);
- Method buildClass =
- AndroidApiDatabasePackageTemplate.class.getMethod("buildClass", String.class);
- return replaceCode(
- "placeHolderForBuildClass",
- transformer -> {
- packages.forEach(
- pkg -> {
- transformer.visitLdcInsn(pkg);
- transformer.visitVarInsn(ALOAD, 2);
- transformer.visitMethodInsn(
- INVOKEVIRTUAL,
- binaryName(String.class),
- equals.getName(),
- methodDescriptor(equals),
- false);
- Label label = new Label();
- transformer.visitJumpInsn(IFEQ, label);
- transformer.visitVarInsn(ALOAD, 3);
- transformer.visitMethodInsn(
- INVOKESTATIC,
- DescriptorUtils.getBinaryNameFromDescriptor(getPackageBuilderDescriptor(pkg)),
- buildClass.getName(),
- methodDescriptor(buildClass),
- false);
- transformer.visitInsn(ARETURN);
- transformer.visitLabel(label);
- transformer.visitFrame(
- Opcodes.F_FULL,
- 4,
- new Object[] {
- binaryName(ClassReference.class),
- binaryName(String.class),
- binaryName(String.class),
- binaryName(String.class)
- },
- 0,
- new Object[0]);
- });
- });
- }
-
- // The transformer below changes AndroidApiDatabaseBuilderTemplate.buildClass from:
- // placeHolderForVisitApiClasses();
- // into
- // classDescriptorConsumer.accept("<descriptor_class_1>");
- // classDescriptorConsumer.accept("<descriptor_class_2>");
- // ...
- // return null;
- private static MethodTransformer getVisitApiClassesTransformer(List<ParsedApiClass> apiClasses) {
- return replaceCode(
- "placeHolderForVisitApiClasses",
- transformer -> {
- apiClasses.forEach(
- apiClass -> {
- transformer.visitVarInsn(ALOAD, 0);
- transformer.visitLdcInsn(apiClass.getClassReference().getDescriptor());
- transformer.visitMethodInsn(
- INVOKEINTERFACE,
- binaryName(Consumer.class),
- "accept",
- "(Ljava/lang/Object;)V",
- true);
- });
- });
- }
-
- private static MethodTransformer replaceCode(
- String placeholderName, Consumer<MethodTransformer> consumer) {
- return new MethodTransformer() {
-
- @Override
- public void visitMaxs(int maxStack, int maxLocals) {
- super.visitMaxs(-1, maxLocals);
- }
-
- @Override
- public void visitMethodInsn(
- int opcode, String owner, String name, String descriptor, boolean isInterface) {
- if (name.equals(placeholderName)) {
- consumer.accept(this);
- } else {
- super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
- }
- }
- };
- }
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGeneratorTest.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGeneratorTest.java
deleted file mode 100644
index 40b57c5..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGeneratorTest.java
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import static com.android.tools.r8.apimodel.AndroidApiObjectDatabaseBuilderGenerator.generatedMainDescriptor;
-import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.JvmTestBuilder;
-import com.android.tools.r8.JvmTestRunResult;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.TestState;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.apimodel.AndroidApiVersionsXmlParser.ParsedApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.BooleanBox;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.IntBox;
-import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.TraversalContinuation;
-import com.android.tools.r8.utils.ZipUtils;
-import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.function.BiFunction;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class AndroidApiObjectDatabaseBuilderGeneratorTest extends TestBase {
-
- protected final TestParameters parameters;
- private static final Path API_VERSIONS_XML =
- Paths.get(ToolHelper.THIRD_PARTY_DIR, "android_jar", "api-versions", "api-versions.xml");
- private static final Path API_DATABASE_JAR =
- Paths.get(ToolHelper.THIRD_PARTY_DIR, "android_jar", "api-database", "api-database.jar");
- private static final AndroidApiLevel API_LEVEL = AndroidApiLevel.S;
-
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withNoneRuntime().build();
- }
-
- public AndroidApiObjectDatabaseBuilderGeneratorTest(TestParameters parameters) {
- this.parameters = parameters;
- }
-
- private static Path generateJar() throws Exception {
- return generateJar(
- AndroidApiVersionsXmlParser.getParsedApiClasses(API_VERSIONS_XML.toFile(), API_LEVEL));
- }
-
- private static Path generateJar(List<ParsedApiClass> apiClasses) throws Exception {
- TemporaryFolder temp = new TemporaryFolder();
- temp.create();
- ZipBuilder builder = ZipBuilder.builder(temp.newFile("out.jar").toPath());
- AndroidApiObjectDatabaseBuilderGenerator.generate(
- apiClasses,
- (descriptor, content) -> {
- try {
- String binaryName = DescriptorUtils.getBinaryNameFromDescriptor(descriptor) + ".class";
- builder.addBytes(binaryName, content);
- } catch (IOException exception) {
- throw new RuntimeException(exception);
- }
- });
- return builder.build();
- }
-
- @Test
- public void testCanParseApiVersionsXml() throws Exception {
- // This tests makes a rudimentary check on the number of classes, fields and methods in
- // api-versions.xml to ensure that the runtime tests do not vacuously succeed.
- List<ParsedApiClass> parsedApiClasses =
- AndroidApiVersionsXmlParser.getParsedApiClasses(API_VERSIONS_XML.toFile(), API_LEVEL);
- IntBox numberOfFields = new IntBox(0);
- IntBox numberOfMethods = new IntBox(0);
- parsedApiClasses.forEach(
- apiClass -> {
- apiClass.visitFieldReferences(
- ((apiLevel, fieldReferences) -> {
- fieldReferences.forEach(field -> numberOfFields.increment());
- }));
- apiClass.visitMethodReferences(
- ((apiLevel, methodReferences) -> {
- methodReferences.forEach(field -> numberOfMethods.increment());
- }));
- });
- // These numbers will change when updating api-versions.xml
- assertEquals(5037, parsedApiClasses.size());
- assertEquals(26362, numberOfFields.get());
- assertEquals(40416, numberOfMethods.get());
- }
-
- @Test
- public void testDatabaseGenerationUpToDate() throws Exception {
- TestBase.filesAreEqual(generateJar(), API_DATABASE_JAR);
- }
-
- /**
- * Main entry point for building a database over references in framework to the api level they
- * were introduced. Running main will generate a new jar and run tests on it to ensure it is
- * compatible with R8 sources and works as expected.
- *
- * <p>The generated jar depends on r8NoManifestWithoutDeps.
- *
- * <p>If the generated jar passes tests it will be moved to third_party/android_jar/api-database/
- * and override the current file in there.
- */
- public static void main(String[] args) throws Exception {
- List<ParsedApiClass> parsedApiClasses =
- AndroidApiVersionsXmlParser.getParsedApiClasses(API_VERSIONS_XML.toFile(), API_LEVEL);
- Path generatedJar = generateJar(parsedApiClasses);
- validateJar(generatedJar, parsedApiClasses);
- Files.move(generatedJar, API_DATABASE_JAR, REPLACE_EXISTING);
- }
-
- private static void validateJar(Path generated, List<ParsedApiClass> apiClasses) {
- List<BiFunction<Path, List<ParsedApiClass>, Boolean>> tests =
- ImmutableList.of(
- AndroidApiObjectDatabaseBuilderGeneratorTest::testGeneratedOutputForVisitClasses,
- AndroidApiObjectDatabaseBuilderGeneratorTest::testBuildClassesContinue,
- AndroidApiObjectDatabaseBuilderGeneratorTest::testBuildClassesBreak,
- AndroidApiObjectDatabaseBuilderGeneratorTest::testNoPlaceHolder);
- tests.forEach(
- test -> {
- try {
- if (!test.apply(generated, apiClasses)) {
- throw new RuntimeException("Generated jar did not pass tests");
- }
- } catch (Exception e) {
- throw new RuntimeException("Generated jar did not pass tests", e);
- }
- });
- }
-
- private static boolean testGeneratedOutputForVisitClasses(
- Path generated, List<ParsedApiClass> parsedApiClasses) {
- String expectedOutput =
- StringUtils.lines(
- ListUtils.map(
- parsedApiClasses, apiClass -> apiClass.getClassReference().getDescriptor()));
- return runTest(generated, TestGeneratedMainVisitClasses.class)
- .getStdOut()
- .equals(expectedOutput);
- }
-
- private static boolean testBuildClassesContinue(
- Path generated, List<ParsedApiClass> parsedApiClasses) {
- return runTest(generated, TestBuildClassesContinue.class)
- .getStdOut()
- .equals(getExpected(parsedApiClasses, false));
- }
-
- private static boolean testBuildClassesBreak(
- Path generated, List<ParsedApiClass> parsedApiClasses) {
- return runTest(generated, TestBuildClassesBreak.class)
- .getStdOut()
- .equals(getExpected(parsedApiClasses, true));
- }
-
- private static boolean testNoPlaceHolder(Path generated, List<ParsedApiClass> parsedApiClasses) {
- try {
- CodeInspector inspector = new CodeInspector(generated);
- inspector
- .allClasses()
- .forEach(
- clazz -> {
- clazz.forAllMethods(
- methods -> {
- if (methods.getFinalName().startsWith("placeHolder")) {
- throw new RuntimeException("Found placeHolder method in generated jar");
- }
- });
- });
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
- return true;
- }
-
- private static JvmTestRunResult runTest(Path generated, Class<?> testClass) {
- try {
- TemporaryFolder temporaryFolder = new TemporaryFolder();
- temporaryFolder.create();
- return JvmTestBuilder.create(new TestState(temporaryFolder))
- .addProgramClassFileData(
- transformer(testClass)
- .replaceClassDescriptorInMethodInstructions(
- descriptor(AndroidApiDatabaseBuilderTemplate.class),
- generatedMainDescriptor())
- .transform())
- .addLibraryFiles(
- generated,
- ToolHelper.R8_WITHOUT_DEPS_JAR,
- getDepsWithoutGeneratedApiModelClasses(),
- ToolHelper.getJava8RuntimeJar())
- .run(TestRuntime.getSystemRuntime(), testClass)
- .apply(
- result -> {
- if (result.getExitCode() != 0) {
- throw new RuntimeException(result.getStdErr());
- }
- });
- } catch (IOException | ExecutionException | CompilationFailedException ex) {
- throw new RuntimeException(ex);
- }
- }
-
- private static Path getDepsWithoutGeneratedApiModelClasses() throws IOException {
- Path tempDeps = Files.createTempDirectory("temp_deps");
- ZipUtils.unzip(
- ToolHelper.DEPS.toString(),
- tempDeps.toFile(),
- entry -> !entry.getName().startsWith("com/android/tools/r8/apimodel/"));
- Path modifiedDeps = Files.createTempFile("modified_deps", ".jar");
- ZipUtils.zip(modifiedDeps, tempDeps);
- return modifiedDeps;
- }
-
- private static String getExpected(List<ParsedApiClass> parsedApiClasses, boolean abort) {
- Map<ClassReference, ParsedApiClass> parsedApiClassMap = new HashMap<>(parsedApiClasses.size());
- parsedApiClasses.forEach(
- parsedClass -> parsedApiClassMap.put(parsedClass.getClassReference(), parsedClass));
- List<String> expected = new ArrayList<>();
- parsedApiClasses.forEach(
- apiClass -> {
- expected.add("CLASS: " + apiClass.getClassReference().getDescriptor());
- expected.add(apiClass.getApiLevel().getName());
- expected.add(apiClass.getTotalMemberCount() + "");
- visitApiClass(expected, parsedApiClassMap, apiClass, apiClass.getApiLevel(), true, abort);
- visitApiClass(
- expected, parsedApiClassMap, apiClass, apiClass.getApiLevel(), false, abort);
- });
- return StringUtils.lines(expected);
- }
-
- private static boolean visitApiClass(
- List<String> expected,
- Map<ClassReference, ParsedApiClass> parsedApiClassMap,
- ParsedApiClass apiClass,
- AndroidApiLevel apiLevel,
- boolean visitFields,
- boolean abort) {
- BooleanBox added = new BooleanBox(false);
- if (visitFields) {
- added.set(visitFields(expected, apiClass, apiLevel, abort));
- } else {
- added.set(visitMethods(expected, apiClass, apiLevel, abort));
- }
- if (added.isTrue() && abort) {
- return true;
- }
- // Go through super type methods if not interface.
- if (!apiClass.isInterface()) {
- apiClass.visitSuperType(
- (classReference, linkApiLevel) -> {
- if (added.isTrue() && abort) {
- return;
- }
- ParsedApiClass superApiClass = parsedApiClassMap.get(classReference);
- assert superApiClass != null;
- added.set(
- visitApiClass(
- expected,
- parsedApiClassMap,
- superApiClass,
- linkApiLevel.max(apiLevel),
- visitFields,
- abort));
- });
- }
- if (!visitFields) {
- apiClass.visitInterface(
- (classReference, linkApiLevel) -> {
- if (added.isTrue() && abort) {
- return;
- }
- ParsedApiClass ifaceApiClass = parsedApiClassMap.get(classReference);
- assert ifaceApiClass != null;
- added.set(
- visitApiClass(
- expected,
- parsedApiClassMap,
- ifaceApiClass,
- linkApiLevel.max(apiLevel),
- visitFields,
- abort));
- });
- }
- return added.get();
- }
-
- private static boolean visitFields(
- List<String> expected, ParsedApiClass apiClass, AndroidApiLevel minApiLevel, boolean abort) {
- BooleanBox added = new BooleanBox(false);
- apiClass.visitFieldReferences(
- (apiLevel, fieldReferences) -> {
- fieldReferences.forEach(
- fieldReference -> {
- if (added.isTrue() && abort) {
- return;
- }
- added.set();
- expected.add(fieldReference.getFieldType().getDescriptor());
- expected.add(fieldReference.getFieldName());
- expected.add(apiLevel.max(minApiLevel).getName());
- });
- });
- return added.get();
- }
-
- private static boolean visitMethods(
- List<String> expected, ParsedApiClass apiClass, AndroidApiLevel minApiLevel, boolean abort) {
- BooleanBox added = new BooleanBox(false);
- apiClass.visitMethodReferences(
- (apiLevel, methodReferences) -> {
- methodReferences.forEach(
- methodReference -> {
- if (added.isTrue() && abort) {
- return;
- }
- added.set();
- expected.add(methodReference.getMethodDescriptor());
- expected.add(methodReference.getMethodName());
- expected.add(apiLevel.max(minApiLevel).getName());
- });
- });
- return added.get();
- }
-
- public static class TestGeneratedMainVisitClasses {
-
- public static void main(String[] args) {
- AndroidApiDatabaseBuilderTemplate.visitApiClasses(System.out::println);
- }
- }
-
- public static class TestBuildClassesContinue {
-
- public static void main(String[] args) {
- AndroidApiDatabaseBuilderTemplate.visitApiClasses(
- descriptor -> {
- com.android.tools.r8.androidapi.AndroidApiClass apiClass =
- AndroidApiDatabaseBuilderTemplate.buildClass(
- Reference.classFromDescriptor(descriptor));
- if (apiClass != null) {
- System.out.println("CLASS: " + descriptor);
- System.out.println(apiClass.getApiLevel().getName());
- System.out.println(apiClass.getMemberCount());
- apiClass.visitFields(
- (reference, apiLevel) -> {
- System.out.println(reference.getFieldType().getDescriptor());
- System.out.println(reference.getFieldName());
- System.out.println(apiLevel.getName());
- return TraversalContinuation.CONTINUE;
- });
- apiClass.visitMethods(
- (reference, apiLevel) -> {
- System.out.println(reference.getMethodDescriptor());
- System.out.println(reference.getMethodName());
- System.out.println(apiLevel.getName());
- return TraversalContinuation.CONTINUE;
- });
- }
- });
- }
- }
-
- public static class TestBuildClassesBreak {
-
- public static void main(String[] args) {
- AndroidApiDatabaseBuilderTemplate.visitApiClasses(
- descriptor -> {
- com.android.tools.r8.androidapi.AndroidApiClass apiClass =
- AndroidApiDatabaseBuilderTemplate.buildClass(
- Reference.classFromDescriptor(descriptor));
- if (apiClass != null) {
- System.out.println("CLASS: " + descriptor);
- System.out.println(apiClass.getApiLevel().getName());
- System.out.println(apiClass.getMemberCount());
- apiClass.visitFields(
- (reference, apiLevel) -> {
- System.out.println(reference.getFieldType().getDescriptor());
- System.out.println(reference.getFieldName());
- System.out.println(apiLevel.getName());
- return TraversalContinuation.BREAK;
- });
- apiClass.visitMethods(
- (reference, apiLevel) -> {
- System.out.println(reference.getMethodDescriptor());
- System.out.println(reference.getMethodName());
- System.out.println(apiLevel.getName());
- return TraversalContinuation.BREAK;
- });
- }
- });
- }
- }
-}
diff --git a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
deleted file mode 100644
index ef9112c..0000000
--- a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.debug;
-
-import static org.junit.Assume.assumeTrue;
-
-import com.android.tools.r8.R8TestCompileResult;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersBuilder;
-import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.Command;
-import com.android.tools.r8.naming.ClassNameMapper.MissingFileAction;
-import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
-import com.google.common.collect.ImmutableList;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/** Tests source file and line numbers on inlined methods. */
-@RunWith(Parameterized.class)
-public class DebugInfoWhenInliningTest extends DebugTestBase {
-
- private static final String CLASS_NAME = "Inlining1";
- private static final String SOURCE_FILE = "SourceFile";
-
- private DebugTestConfig makeConfig(
- LineNumberOptimization lineNumberOptimization, boolean writeProguardMap) throws Exception {
- R8TestCompileResult result =
- testForR8(parameters.getBackend())
- .addProgramFiles(DEBUGGEE_JAR)
- .addKeepMainRule(CLASS_NAME)
- .noMinification()
- .addKeepAttributeSourceFile()
- .addKeepAttributeLineNumberTable()
- .setMinApi(parameters.getApiLevel())
- .addOptionsModification(
- options -> {
- options.lineNumberOptimization = lineNumberOptimization;
- options.testing.forceJumboStringProcessing = forceJumboStringProcessing;
- // TODO(b/117848700): Can we make these tests neutral to inlining threshold?
- // Also CF needs improvements here.
- options.inlinerOptions().simpleInliningInstructionLimit =
- parameters.isCfRuntime() ? 5 : 4;
- })
- .compile();
- DebugTestConfig config = result.debugConfig();
- if (writeProguardMap) {
- config.setProguardMap(result.writeProguardMap(), MissingFileAction.MISSING_FILE_IS_EMPTY_MAP);
- }
- return config;
- }
-
- private final TestParameters parameters;
- private final boolean forceJumboStringProcessing;
-
- @Parameters(name = "{0}, force-jumbo: {1}")
- public static List<Object[]> data() {
- return buildParameters(
- TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build(),
- BooleanUtils.values());
- }
-
- public DebugInfoWhenInliningTest(TestParameters parameters, boolean forceJumboString) {
- assumeTrue(!parameters.isCfRuntime() || !forceJumboString);
- this.parameters = parameters;
- this.forceJumboStringProcessing = forceJumboString;
- }
-
- private void assumeMappingIsNotToPCs() {
- assumeTrue(
- "Ignoring test when the line number table is removed.",
- parameters.isCfRuntime()
- || parameters.getApiLevel().isLessThan(apiLevelWithPcAsLineNumberSupport()));
- }
-
- @Test
- public void testEachLineNotOptimized() throws Throwable {
- assumeMappingIsNotToPCs();
- // The reason why the not-optimized test contains half as many line numbers as the optimized
- // one:
- //
- // In the Java source (Inlining1) each call is duplicated. Since they end up on the same line
- // (innermost callee) the line numbers are actually 7, 7, 32, 32, ... but even if the positions
- // are emitted duplicated in the dex code, the debugger stops only when there's a change.
- int[] lineNumbers = {7, 32, 11, 7};
- testEachLine(makeConfig(LineNumberOptimization.OFF, false), lineNumbers);
- }
-
- @Test
- public void testEachLineNotOptimizedWithMap() throws Throwable {
- assumeMappingIsNotToPCs();
- // The reason why the not-optimized test contains half as many line numbers as the optimized
- // one:
- //
- // In the Java source (Inlining1) each call is duplicated. Since they end up on the same line
- // (innermost callee) the line numbers are actually 7, 7, 32, 32, ... but even if the positions
- // are emitted duplicated in the dex code, the debugger stops only when there's a change.
- int[] lineNumbers = {7, 32, 11, 7};
- testEachLine(makeConfig(LineNumberOptimization.OFF, true), lineNumbers);
- }
-
- @Test
- public void testEachLineOptimized() throws Throwable {
- assumeMappingIsNotToPCs();
- int[] lineNumbers = {1, 2, 3, 4, 5, 6, 7, 8};
- testEachLine(makeConfig(LineNumberOptimization.ON, false), lineNumbers);
- }
-
- @Test
- public void testEachLineOptimizedWithMap() throws Throwable {
- assumeMappingIsNotToPCs();
- int[] lineNumbers = {7, 7, 32, 32, 11, 11, 7, 7};
- List<List<SignatureAndLine>> inlineFramesList =
- ImmutableList.of(
- ImmutableList.of(
- new SignatureAndLine("void inlineThisFromSameFile()", 7),
- new SignatureAndLine("void main(java.lang.String[])", 19)),
- ImmutableList.of(
- new SignatureAndLine("void inlineThisFromSameFile()", 7),
- new SignatureAndLine("void main(java.lang.String[])", 20)),
- ImmutableList.of(
- new SignatureAndLine("void Inlining2.inlineThisFromAnotherFile()", 32),
- new SignatureAndLine("void main(java.lang.String[])", 21)),
- ImmutableList.of(
- new SignatureAndLine("void Inlining2.inlineThisFromAnotherFile()", 32),
- new SignatureAndLine("void main(java.lang.String[])", 22)),
- ImmutableList.of(
- new SignatureAndLine("void sameFileMultilevelInliningLevel2()", 11),
- new SignatureAndLine("void sameFileMultilevelInliningLevel1()", 15),
- new SignatureAndLine("void main(java.lang.String[])", 23)),
- ImmutableList.of(
- new SignatureAndLine("void sameFileMultilevelInliningLevel2()", 11),
- new SignatureAndLine("void sameFileMultilevelInliningLevel1()", 15),
- new SignatureAndLine("void main(java.lang.String[])", 24)),
- ImmutableList.of(
- new SignatureAndLine("void Inlining3.differentFileMultilevelInliningLevel2()", 7),
- new SignatureAndLine("void Inlining2.differentFileMultilevelInliningLevel1()", 36),
- new SignatureAndLine("void main(java.lang.String[])", 25)),
- ImmutableList.of(
- new SignatureAndLine("void Inlining3.differentFileMultilevelInliningLevel2()", 7),
- new SignatureAndLine("void Inlining2.differentFileMultilevelInliningLevel1()", 36),
- new SignatureAndLine("void main(java.lang.String[])", 26)));
- testEachLine(makeConfig(LineNumberOptimization.ON, true), lineNumbers, inlineFramesList);
- }
-
- private void testEachLine(DebugTestConfig config, int[] lineNumbers) throws Throwable {
- testEachLine(config, lineNumbers, null);
- }
-
- private void testEachLine(
- DebugTestConfig config, int[] lineNumbers, List<List<SignatureAndLine>> inlineFramesList)
- throws Throwable {
- final String mainSignature = "([Ljava/lang/String;)V";
-
- List<Command> commands = new ArrayList<Command>();
- commands.add(breakpoint(CLASS_NAME, "main", mainSignature));
- commands.add(run());
- boolean first = true;
- assert inlineFramesList == null || inlineFramesList.size() == lineNumbers.length;
- for (int idx = 0; idx < lineNumbers.length; ++idx) {
- if (first) {
- first = false;
- } else {
- commands.add(stepOver());
- }
- commands.add(checkMethod(CLASS_NAME, "main", mainSignature));
- commands.add(checkLine(SOURCE_FILE, lineNumbers[idx]));
- if (inlineFramesList != null) {
- commands.add(checkInlineFrames(inlineFramesList.get(idx)));
- }
- }
- commands.add(run());
- runDebugTest(config, CLASS_NAME, commands);
- }
-}
diff --git a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
index a91f006..30505ab 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
@@ -12,6 +12,8 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
+import com.android.tools.r8.SourceFileEnvironment;
+import com.android.tools.r8.SourceFileProvider;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -77,7 +79,22 @@
.applyIf(
apiLevelSupportsPcOutput(),
builder ->
- builder.addOptionsModification(options -> options.lineNumberOptimization = ON))
+ builder.addOptionsModification(
+ options -> {
+ options.sourceFileProvider =
+ new SourceFileProvider() {
+ @Override
+ public String get(SourceFileEnvironment environment) {
+ return null;
+ }
+
+ @Override
+ public boolean allowDiscardingSourceFile() {
+ return true;
+ }
+ };
+ options.lineNumberOptimization = ON;
+ }))
.run(parameters.getRuntime(), MAIN)
.inspectFailure(
inspector -> {
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
index e1b76d6..b683d7d 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
@@ -4,33 +4,23 @@
package com.android.tools.r8.debuginfo;
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersBuilder;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.debuginfo.InliningWithoutPositionsTestSourceDump.Location;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
-import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRangesOfName;
-import com.android.tools.r8.naming.Range;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Files;
-import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import org.junit.Assert;
-import org.junit.ClassRule;
+import org.hamcrest.CoreMatchers;
import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@@ -38,11 +28,10 @@
@RunWith(Parameterized.class)
public class InliningWithoutPositionsTestRunner extends TestBase {
- private static final String TEST_CLASS = "InliningWithoutPositionsTestSource";
+ private static final String TEST_SIMPLE_NAME = "InliningWithoutPositionsTestSource";
private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";
- private static final String MAIN_CLASS = TEST_PACKAGE + "." + TEST_CLASS;
-
- @ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+ private static final String TEST_FILE = TEST_SIMPLE_NAME + ".java";
+ private static final String TEST_CLASS = TEST_PACKAGE + "." + TEST_SIMPLE_NAME;
private final TestParameters parameters;
private final boolean mainPos;
@@ -56,16 +45,16 @@
List<Object[]> testCases = new ArrayList<>();
for (TestParameters parameters :
TestParametersBuilder.builder().withAllRuntimes().withApiLevel(AndroidApiLevel.B).build()) {
- for (int i = 0; i < 16; ++i) {
- for (Location throwLocation : Location.values()) {
- if (throwLocation != Location.MAIN) {
+ for (int i = 0; i < 16; ++i) {
+ for (Location throwLocation : Location.values()) {
+ if (throwLocation != Location.MAIN) {
testCases.add(
new Object[] {
parameters, (i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation
});
+ }
}
}
- }
}
return testCases;
}
@@ -87,118 +76,81 @@
@Test
public void testStackTrace() throws Exception {
- // See InliningWithoutPositionsTestSourceDump for the code compiled here.
- Path testClassDir = temp.newFolder().toPath();
- Path testClassPath = testClassDir.resolve(TEST_CLASS + ".class");
- Files.write(
- testClassPath,
- InliningWithoutPositionsTestSourceDump.dump(
- mainPos, foo1Pos, barPos, foo2Pos, throwLocation));
-
- R8TestRunResult result =
- testForR8(parameters.getBackend())
- .setMinApi(parameters.getApiLevel())
- .addProgramFiles(testClassPath)
- .setMode(CompilationMode.RELEASE)
- .addKeepMainRule(MAIN_CLASS)
- .noMinification()
- .addKeepAttributeSourceFile()
- .addKeepAttributeLineNumberTable()
- .addOptionsModification(
- options -> options.inlinerOptions().simpleInliningInstructionLimit = 40)
- .run(parameters.getRuntime(), MAIN_CLASS)
- .assertFailure();
-
- // Verify stack trace.
- // result.stderr looks like this:
- //
- // Exception in thread "main" java.lang.RuntimeException: <FOO1-exception>
- // at
- // com.android.tools.r8.debuginfo.InliningWithoutPositionsTestSource.main(InliningWithoutPositionsTestSource.java:1)
- String[] lines = result.getStdErr().split("\n");
-
- // The line containing 'java.lang.RuntimeException' should contain the expected message, which
- // is "LOCATIONCODE-exception>"
- int i = 0;
- boolean foundException = false;
- for (; i < lines.length && !foundException; ++i) {
- boolean hasExpectedException = lines[i].contains("<" + throwLocation + "-exception>");
- if (lines[i].contains("java.lang.RuntimeException")) {
- assertTrue(hasExpectedException);
- foundException = true;
- } else {
- assertFalse(hasExpectedException);
- }
- }
- assertTrue(foundException);
-
- // The next line, the stack trace, must always be the same, indicating 'main' and line = 1 or 2.
- Assert.assertTrue(i < lines.length);
- String line = lines[i].trim();
- assertTrue(line.startsWith("at " + TEST_PACKAGE + "." + TEST_CLASS + "." + "main"));
-
- // It must contain the '<source-file>:1' or ':2', if we're throwing at foo2.
- int expectedLineNumber = throwLocation == Location.FOO2 ? 2 : 1;
- String expectedFilePos = TEST_CLASS + ".java:" + expectedLineNumber;
- int idx = line.indexOf(expectedFilePos);
-
- // And the next character must be a non-digit or nothing.
- int idxAfter = idx + expectedFilePos.length();
- assertTrue(idxAfter == line.length() || !Character.isDigit(line.charAt(idxAfter)));
-
- // Reading the Proguard map. An example map (only the relevant part, 'main'):
- //
- // 1:1:void bar():0:0 -> main
- // 1:1:void foo(boolean):0 -> main
- // 1:1:void main(java.lang.String[]):0 -> main
- ClassNameMapper mapper = ClassNameMapper.mapperFromString(result.proguardMap());
- assertNotNull(mapper);
-
- ClassNamingForNameMapper classNaming = mapper.getClassNaming(TEST_PACKAGE + "." + TEST_CLASS);
- assertNotNull(classNaming);
-
- MappedRangesOfName rangesForMain = classNaming.mappedRangesByRenamedName.get("main");
- assertNotNull(rangesForMain);
-
- List<MappedRange> frames = rangesForMain.allRangesForLine(expectedLineNumber);
-
- switch (throwLocation) {
- case FOO1:
- assertEquals(2, frames.size());
- assertFrame(true, "foo", Location.FOO1, foo1Pos, frames.get(0));
- break;
- case BAR:
- assertEquals(3, frames.size());
- assertFrame(true, "bar", Location.BAR, barPos, frames.get(0));
- assertFrame(false, "foo", Location.FOO1, foo1Pos, frames.get(1));
- break;
- case FOO2:
- assertEquals(2, frames.size());
- // If there's no foo2Pos then we expect foo1 pos at this location.
- if (foo2Pos) {
- assertFrame(true, "foo", Location.FOO2, true, frames.get(0));
- } else {
- assertFrame(true, "foo", Location.FOO1, foo1Pos, frames.get(0));
- }
- break;
- default:
- Assert.fail();
- }
- assertFrame(false, "main", Location.MAIN, mainPos, frames.get(frames.size() - 1));
+ testForR8(parameters.getBackend())
+ .setMinApi(parameters.getApiLevel())
+ .addProgramClassFileData(
+ InliningWithoutPositionsTestSourceDump.dump(
+ mainPos, foo1Pos, barPos, foo2Pos, throwLocation))
+ .addKeepMainRule(TEST_CLASS)
+ .addKeepAttributeSourceFile()
+ .addKeepAttributeLineNumberTable()
+ .addOptionsModification(
+ options -> options.inlinerOptions().simpleInliningInstructionLimit = 40)
+ .run(parameters.getRuntime(), TEST_CLASS)
+ .assertFailure()
+ .inspectOriginalStackTrace(
+ rawStackTrace -> {
+ assertThat(
+ rawStackTrace.getExceptionLine(),
+ CoreMatchers.containsString("<" + throwLocation + "-exception>"));
+ assertTrue(rawStackTrace.size() > 1);
+ StackTraceLine line = rawStackTrace.get(0);
+ assertEquals(TEST_CLASS, line.className);
+ assertEquals("main", line.methodName);
+ // Expected line number could be PC based or increments.
+ // The test need not check what it is, just that all methods have been fully inlined.
+ assertEquals(2, rawStackTrace.size());
+ })
+ .inspectStackTrace(
+ retracedStackTrace -> {
+ assertThat(
+ retracedStackTrace.getExceptionLine(),
+ CoreMatchers.containsString("<" + throwLocation + "-exception>"));
+ switch (throwLocation) {
+ case FOO1:
+ assertThat(
+ retracedStackTrace,
+ StackTrace.isSame(
+ StackTrace.builder()
+ .add(line("foo", Location.FOO1, foo1Pos))
+ .add(line("main", Location.MAIN, mainPos))
+ .build()));
+ break;
+ case BAR:
+ assertThat(
+ retracedStackTrace,
+ StackTrace.isSame(
+ StackTrace.builder()
+ .add(line("bar", Location.BAR, barPos))
+ .add(line("foo", Location.FOO1, foo1Pos))
+ .add(line("main", Location.MAIN, mainPos))
+ .build()));
+ break;
+ case FOO2:
+ assertThat(
+ retracedStackTrace,
+ StackTrace.isSame(
+ StackTrace.builder()
+ .add(
+ line(
+ "foo",
+ foo2Pos ? Location.FOO2 : Location.FOO1,
+ foo2Pos || foo1Pos))
+ .add(line("main", Location.MAIN, mainPos))
+ .build()));
+ break;
+ default:
+ fail();
+ }
+ });
}
- private void assertFrame(
- boolean innermostFrame,
- String function,
- Location location,
- boolean hasPosition,
- MappedRange range) {
- assertEquals(function, range.signature.name);
- int expectedLineNumber = hasPosition ? location.line : 0;
- Range expectedOriginalRange =
- innermostFrame
- ? new Range(expectedLineNumber, expectedLineNumber)
- : new Range(expectedLineNumber);
- assertEquals(expectedOriginalRange, range.originalRange);
+ private StackTraceLine line(String methodName, Location location, boolean hasPosition) {
+ return StackTraceLine.builder()
+ .setClassName(TEST_CLASS)
+ .setFileName(TEST_FILE)
+ .setMethodName(methodName)
+ .setLineNumber(hasPosition ? location.line : 0)
+ .build();
}
}
diff --git a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
index dd9bcc7..64ed426 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
@@ -52,7 +52,7 @@
}
@Test
- public void testR8() throws Exception {
+ public void testDefaultSourceFile() throws Exception {
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
.setMinApi(parameters.getApiLevel())
@@ -74,6 +74,55 @@
});
}
+ @Test
+ public void testManuallySetDefaultSourceFile() throws Exception {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(Main.class)
+ .addKeepAttributeSourceFile()
+ .addKeepAttributeLineNumberTable()
+ .addKeepRules("-renamesourcefileattribute SourceFile")
+ .enableInliningAnnotations()
+ .run(parameters.getRuntime(), Main.class)
+ .assertFailureWithErrorThatThrows(NullPointerException.class)
+ .inspectStackTrace(
+ (stackTrace, inspector) -> {
+ assertThat(stackTrace, isSame(expectedStackTrace));
+ ClassSubject mainSubject = inspector.clazz(Main.class);
+ assertThat(mainSubject, isPresent());
+ assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+ assertThat(
+ mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+ notIf(hasLineNumberTable(), parameters.isDexRuntime()));
+ });
+ }
+
+ @Test
+ public void testNonDefaultSourceFile() throws Exception {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(Main.class)
+ .addKeepAttributeSourceFile()
+ .addKeepAttributeLineNumberTable()
+ .addKeepRules("-renamesourcefileattribute SomeBuildTaggedSourceFile")
+ .enableInliningAnnotations()
+ .run(parameters.getRuntime(), Main.class)
+ .assertFailureWithErrorThatThrows(NullPointerException.class)
+ .inspectStackTrace(
+ (stackTrace, inspector) -> {
+ assertThat(stackTrace, isSame(expectedStackTrace));
+ ClassSubject mainSubject = inspector.clazz(Main.class);
+ assertThat(mainSubject, isPresent());
+ assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+ assertThat(
+ mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+ // TODO(b/146565491): Update to allow dropping the table once supported by ART.
+ hasLineNumberTable());
+ });
+ }
+
public static class Main {
@NeverInline
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
index a922636..817268d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
@@ -5,7 +5,6 @@
import static org.junit.Assert.assertEquals;
-import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ProcessResult;
@@ -13,12 +12,13 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
-public class BackwardsCompatibleSpecificationTest extends TestBase {
+public class BackwardsCompatibleSpecificationTest extends DesugaredLibraryTestBase {
private static final List<String> RELEASES = ImmutableList.of("2.0.74");
@@ -42,6 +42,9 @@
@Test
public void test() throws Exception {
+ Assume.assumeFalse(
+ "When using JDK11 desugared library, we're not backward compatible to 2.0.74.",
+ isJDK11DesugaredLibrary());
ProcessResult result =
ToolHelper.runJava(
getReleaseJar(),
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
index fdca331..f1ac89f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
@@ -140,7 +140,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addOptionsModification(
options ->
options.desugaredLibraryConfiguration =
@@ -169,7 +169,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addOptionsModification(
options ->
options.desugaredLibraryConfiguration =
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
index 696de2e..6b4cf39 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
@@ -7,8 +7,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -48,7 +46,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ConcurrentHashMapSubclassTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -105,7 +103,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ConcurrentHashMapSubclassTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
index 10a127d..f2beac6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.util.ArrayList;
@@ -42,7 +40,7 @@
public void testCustomCollectionD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionForwardingTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -61,7 +59,7 @@
public void testCustomCollectionR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionForwardingTest.class)
.addKeepMainRule(Executor.class)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
index 10d91fa..371b114 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
@@ -7,8 +7,6 @@
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.util.Collection;
@@ -59,7 +57,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionInterfaceSuperTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -81,7 +79,7 @@
assumeTrue(parameters.isDexRuntime());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionInterfaceSuperTest.class)
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
index e917cd3..d770fdb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
@@ -9,8 +9,6 @@
import com.android.tools.r8.D8TestRunResult;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.nio.file.Path;
import java.util.ArrayList;
@@ -44,7 +42,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestRunResult d8TestRunResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionSuperCallsTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -107,7 +105,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
R8TestRunResult r8TestRunResult =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionSuperCallsTest.class)
.addKeepMainRule(Executor.class)
.setMinApi(parameters.getApiLevel())
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 d24f4dd..b3eb86b 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
@@ -10,8 +10,6 @@
import com.android.tools.r8.D8TestRunResult;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.InstructionSubject;
@@ -56,7 +54,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestRunResult d8TestRunResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -133,7 +131,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
R8TestRunResult r8TestRunResult =
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomCollectionTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
index a1c19eb..c4e379c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
@@ -8,9 +8,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -62,7 +60,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomMapHierarchyTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -124,7 +122,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(CustomMapHierarchyTest.class)
.addKeepMainRule(Main.class)
.addKeepAllClassesRuleWithAllowObfuscation()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
index a67f335..e836c76 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
@@ -13,8 +13,6 @@
import com.android.tools.r8.TestRunResult;
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.lang.reflect.Method;
@@ -79,7 +77,7 @@
.apply(this::checkResult);
} else {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(getClasses())
.addProgramClassFileData(getTransforms())
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
index 691ef4a..21abdb5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
@@ -13,8 +13,6 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.lang.reflect.Method;
@@ -80,7 +78,7 @@
.assertFailureWithErrorThatMatches(getExpectedError());
} else {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(CLASSES)
.addProgramClassFileData(getTransforms())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
index a23a6d8..14d4f62 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
@@ -12,7 +12,6 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
@@ -67,7 +66,7 @@
.assertSuccessWithOutput(EXPECTED);
} else {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addInnerClasses(DefaultMethodOverrideInLibraryTest.class)
.enableCoreLibraryDesugaring(
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 3e23d64..912e353 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
@@ -11,7 +11,6 @@
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -56,7 +55,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredGenericSignatureTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -120,7 +119,7 @@
Assume.assumeTrue(parameters.getRuntime().isDex());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredGenericSignatureTest.class)
.addKeepMainRule(Main.class)
.addKeepAllClassesRuleWithAllowObfuscation()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
index bcefe74..e2565d6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.L8Command;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
@@ -21,7 +20,7 @@
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
-public class DesugaredLibraryChecksumsTest extends TestBase {
+public class DesugaredLibraryChecksumsTest extends DesugaredLibraryTestBase {
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
@@ -38,7 +37,7 @@
L8.run(
L8Command.builder()
.setIncludeClassesChecksum(true)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
.setMode(CompilationMode.DEBUG)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
index c4c0c13..b7a9374 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.time.DayOfWeek;
import java.util.List;
@@ -37,7 +35,7 @@
public void testD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(getClass())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -55,7 +53,7 @@
public void testR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
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 f0f4e90..e353126 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
@@ -78,7 +78,7 @@
Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
L8Command.Builder l8Builder =
L8Command.builder(diagnosticsHandler)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
.addLibraryFiles(ToolHelper.getCoreLambdaStubs())
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 2cc0f87..91b87a0 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
@@ -13,7 +13,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.StringResource;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.errors.DesugaredLibraryMismatchDiagnostic;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
import com.android.tools.r8.origin.Origin;
@@ -59,7 +58,7 @@
// Combine DEX input without library desugaring with dexing with library desugaring.
try {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(libraryDex)
.addProgramClasses(TestRunner.class)
.setMinApi(apiLevel)
@@ -92,7 +91,7 @@
// Combine CF desugared input without library desugaring with dexing with library desugaring.
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(desugaredLibrary)
.addProgramClasses(TestRunner.class)
.setMinApi(apiLevel)
@@ -120,7 +119,7 @@
.writeToZip();
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(desugaredLibraryDex)
.addProgramClasses(TestRunner.class)
.setMinApi(apiLevel)
@@ -160,7 +159,7 @@
// DEX code with library desugaring.
Path libraryDex =
testForD8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Library.class)
.setMinApi(apiLevel)
.enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
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 4ab080f..67cce40 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
@@ -87,6 +87,12 @@
throw new Error("Unsupported conversion parameters");
}
+ protected Path getLibraryFile() {
+ return isJDK11DesugaredLibrary()
+ ? ToolHelper.getAndroidJar(AndroidApiLevel.S)
+ : ToolHelper.getAndroidJar(AndroidApiLevel.P);
+ }
+
protected boolean requiresEmulatedInterfaceCoreLibDesugaring(TestParameters parameters) {
return parameters.getApiLevel().isLessThan(apiLevelWithDefaultInterfaceMethodsSupport());
}
@@ -138,7 +144,7 @@
try {
return testForL8(apiLevel)
.addProgramFiles(additionalProgramFiles)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.applyIf(
release,
builder -> {
@@ -204,7 +210,7 @@
Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar");
L8Command.Builder l8Builder =
L8Command.builder()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
.setMode(CompilationMode.DEBUG)
@@ -243,7 +249,7 @@
desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar");
L8Command.Builder l8Builder =
L8Command.builder()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
.setMode(CompilationMode.DEBUG)
@@ -262,7 +268,7 @@
TraceReferences.run(
"--keep-rules",
"--lib",
- ToolHelper.getAndroidJar(AndroidApiLevel.P).toString(),
+ getLibraryFile().toString(),
"--target",
desugaredLibraryClassFile.toString(),
"--source",
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
index 04411fb..0c61a06 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
@@ -12,7 +12,6 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.nio.file.Path;
import java.util.Arrays;
@@ -53,7 +52,7 @@
Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
L8Command.Builder l8Builder =
L8Command.builder(diagnosticsHandler)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
.setMode(shrinkDesugaredLibrary ? CompilationMode.RELEASE : CompilationMode.DEBUG)
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 7a7ae9f..8e1ab72 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
@@ -9,7 +9,6 @@
import com.android.tools.r8.D8TestRunResult;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
@@ -44,7 +43,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestRunResult runResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -69,7 +68,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
R8TestRunResult runResult =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class)
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
index 15d312d..ebc0f68 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
@@ -9,9 +9,7 @@
import com.android.tools.r8.D8TestRunResult;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.util.List;
@@ -44,7 +42,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestRunResult runResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredLocalDateReflectionTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -69,7 +67,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
R8TestRunResult runResult =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredLocalDateReflectionTest.class)
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
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 bb2da3c..78d3317 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
@@ -9,7 +9,6 @@
import com.android.tools.r8.D8TestRunResult;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
@@ -45,7 +44,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestRunResult runResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -70,7 +69,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
R8TestRunResult runResult =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class)
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
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 057d37f..7e94671 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
@@ -9,7 +9,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration.PresentKeepRuleConsumer;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.Arrays;
import java.util.function.Consumer;
@@ -35,7 +34,7 @@
public void test() throws Exception {
KeepRuleConsumer keepRuleConsumer = new PresentKeepRuleConsumer();
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(TestClass.class)
.setMinApi(minApiLevel)
.addLibraryClasses(CustomLibClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
index 0737de9..89b293f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
@@ -10,8 +10,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.zone.ZoneOffsetTransition;
@@ -39,7 +37,7 @@
public void testDoubleUtility() throws Exception {
for (Class<?> executor : new Class<?>[] {ExecutorV1.class, ExecutorV2.class}) {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(executor)
.enableCoreLibraryDesugaring(
LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
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 1352a82..2411f70 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
@@ -14,12 +14,13 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.StringResource;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import java.util.zip.ZipFile;
import org.junit.Test;
@@ -30,18 +31,34 @@
@RunWith(Parameterized.class)
public class EmptyDesugaredLibrary extends DesugaredLibraryTestBase {
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withNoneRuntime().build();
+ private final AndroidApiLevel apiLevel;
+
+ @Parameters(name = "api: {0}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ range(AndroidApiLevel.K, AndroidApiLevel.ANDROID_PLATFORM),
+ getTestParameters().withNoneRuntime().build());
}
- public EmptyDesugaredLibrary(TestParameters parameters) {
+ private static List<AndroidApiLevel> range(
+ AndroidApiLevel fromIncluding, AndroidApiLevel toExcluding) {
+ ArrayList<AndroidApiLevel> result = new ArrayList<>();
+ for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
+ if (apiLevel.isGreaterThanOrEqualTo(fromIncluding) && apiLevel.isLessThan(toExcluding)) {
+ result.add(apiLevel);
+ }
+ }
+ return result;
+ }
+
+ public EmptyDesugaredLibrary(AndroidApiLevel apiLevel, TestParameters parameters) {
parameters.assertNoneRuntime();
+ this.apiLevel = apiLevel;
}
private L8Command.Builder prepareL8Builder(AndroidApiLevel minApiLevel) {
return L8Command.builder()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addDesugaredLibraryConfiguration(
StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
@@ -63,60 +80,42 @@
}
}
- private int firstEmptyLevel() {
- return isJDK11DesugaredLibrary()
- // Some desugarings are required on all API levels including UNKNOWN.
- ? AndroidApiLevel.NOT_SET.getLevel()
- : AndroidApiLevel.O.getLevel();
+ private boolean expectsEmptyDesugaredLibrary(AndroidApiLevel apiLevel) {
+ if (isJDK11DesugaredLibrary()) {
+ return false;
+ }
+ return apiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.O);
}
@Test
public void testEmptyDesugaredLibrary() throws Exception {
- for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
- if (apiLevel.getLevel() < AndroidApiLevel.K.getLevel()) {
- // No need to test all API levels.
- continue;
- }
- CountingProgramConsumer programConsumer = new CountingProgramConsumer();
- ToolHelper.runL8(prepareL8Builder(apiLevel).setProgramConsumer(programConsumer).build());
- assertEquals(apiLevel.getLevel() >= firstEmptyLevel() ? 0 : 1, programConsumer.count);
- }
+ CountingProgramConsumer programConsumer = new CountingProgramConsumer();
+ ToolHelper.runL8(prepareL8Builder(apiLevel).setProgramConsumer(programConsumer).build());
+ assertEquals(expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1, programConsumer.count);
}
@Test
public void testEmptyDesugaredLibraryDexZip() throws Exception {
- for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
- if (apiLevel.getLevel() < AndroidApiLevel.K.getLevel()) {
- // No need to test all API levels.
- continue;
- }
- Path desugaredLibraryZip = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
- ToolHelper.runL8(
- prepareL8Builder(apiLevel).setOutput(desugaredLibraryZip, OutputMode.DexIndexed).build());
- assertTrue(Files.exists(desugaredLibraryZip));
- assertEquals(
- apiLevel.getLevel() >= firstEmptyLevel() ? 0 : 1,
- new ZipFile(desugaredLibraryZip.toFile(), StandardCharsets.UTF_8).size());
- }
+ Path desugaredLibraryZip = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
+ ToolHelper.runL8(
+ prepareL8Builder(apiLevel).setOutput(desugaredLibraryZip, OutputMode.DexIndexed).build());
+ assertTrue(Files.exists(desugaredLibraryZip));
+ assertEquals(
+ expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1,
+ new ZipFile(desugaredLibraryZip.toFile(), StandardCharsets.UTF_8).size());
}
@Test
public void testEmptyDesugaredLibraryDexDirectory() throws Exception {
- for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
- if (apiLevel.getLevel() < AndroidApiLevel.K.getLevel()) {
- // No need to test all API levels.
- continue;
- }
- Path desugaredLibraryDirectory = temp.newFolder().toPath();
- ToolHelper.runL8(
- prepareL8Builder(apiLevel)
- .setOutput(desugaredLibraryDirectory, OutputMode.DexIndexed)
- .build());
- assertEquals(
- apiLevel.getLevel() >= firstEmptyLevel() ? 0 : 1,
- Files.walk(desugaredLibraryDirectory)
- .filter(path -> path.toString().endsWith(".dex"))
- .count());
- }
+ Path desugaredLibraryDirectory = temp.newFolder().toPath();
+ ToolHelper.runL8(
+ prepareL8Builder(apiLevel)
+ .setOutput(desugaredLibraryDirectory, OutputMode.DexIndexed)
+ .build());
+ assertEquals(
+ expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1,
+ Files.walk(desugaredLibraryDirectory)
+ .filter(path -> path.toString().endsWith(".dex"))
+ .count());
}
}
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 f7eecc8..88580f5 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
@@ -236,7 +236,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(BaseClass.class, RunInterface.class, SplitRunner.class)
.setMinApi(parameters.getApiLevel())
.addFeatureSplit(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
index ac48549..8a04ae3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
@@ -6,7 +6,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -59,7 +58,7 @@
public void testD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, MyFreezePeriod.class)
.addLibraryClasses(FreezePeriod.class)
@@ -80,7 +79,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
Path jar =
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, MyFreezePeriod.class)
.addLibraryClasses(FreezePeriod.class)
@@ -121,7 +120,7 @@
public void testR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Executor.class)
.addProgramClasses(Executor.class, MyFreezePeriod.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
index 75692a2..90a302f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
@@ -10,8 +10,6 @@
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.io.Serializable;
@@ -69,7 +67,7 @@
public void testInterfaces() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ImplementedInterfacesTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
index a99d29c..d3c8a4d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.time.Instant;
import java.time.ZoneOffset;
@@ -37,7 +35,7 @@
public void testInstantD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(InstantTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -55,7 +53,7 @@
public void testInstantR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(InstantTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
index 8ef34bb..760fc1c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.errors.InvalidLibrarySuperclassDiagnostic;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -67,7 +66,7 @@
public void testProgramSupertype() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(
Executor.class, SuperLibraryClass.class, LocalClass.class, LocalClassOverride.class)
@@ -89,7 +88,7 @@
Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, LocalClass.class, LocalClassOverride.class)
.addClasspathClasses(SuperLibraryClass.class)
@@ -116,7 +115,7 @@
Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, LocalClass.class, LocalClassOverride.class)
.addLibraryClasses(CustomLibraryClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
index 59a6b5b..e2cdf17 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
@@ -8,8 +8,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -108,7 +106,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(IterableTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
index 86ef0d5..daa7978 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
@@ -6,8 +6,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -83,7 +81,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(IterateTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
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 976f00e..3664076 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
@@ -12,7 +12,6 @@
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.LibraryDesugaringTestConfiguration.AbsentKeepRuleConsumer;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.DescriptorUtils;
@@ -63,7 +62,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(IteratorTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
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 5d0cea7..253763b 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
@@ -143,7 +143,7 @@
try {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(compiledClasses)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
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 f86dacf..0e9d632 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
@@ -15,7 +15,6 @@
import com.android.tools.r8.NoVerticalClassMerging;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -246,7 +245,7 @@
testForD8()
.addInnerClasses(JavaTimeTest.class)
.setMinApi(parameters.getApiLevel())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.enableLibraryDesugaring(
LibraryDesugaringTestConfiguration.builder()
.setMinApi(parameters.getApiLevel())
@@ -269,7 +268,7 @@
.addKeepMainRule(TestClass.class)
.enableNoVerticalClassMergingAnnotations()
.setMinApi(parameters.getApiLevel())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.enableLibraryDesugaring(
LibraryDesugaringTestConfiguration.builder()
.setMinApi(parameters.getApiLevel())
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 2e0481d..b8fd76f 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
@@ -11,8 +11,6 @@
import com.android.tools.r8.KeepConstantArguments;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -64,7 +62,7 @@
public void testJavaUtilFunctionD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(JavaUtilFunctionTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -84,7 +82,7 @@
public void testJavaUtilFunctionR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.enableInliningAnnotations()
.noMinification()
.addKeepMainRule(TestClass.class)
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 ccac378..e2271ae 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
@@ -13,7 +13,6 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -81,7 +80,7 @@
"42.42");
testForD8()
.addInnerClasses(JavaUtilOptionalTest.class)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
@@ -94,7 +93,7 @@
@Test
public void testJavaOptionalJava9() throws Exception {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR).resolve("backport" + JAR_EXTENSION))
.setMinApi(parameters.getApiLevel())
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 172d7f9..18989a3 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
@@ -8,8 +8,6 @@
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@@ -40,7 +38,7 @@
public void testD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(LibraryEmptySubclassInterfaceTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -67,7 +65,7 @@
public void testR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(LibraryEmptySubclassInterfaceTest.class)
.addKeepMainRule(Executor.class)
.noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
index d551a20..981edea 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
@@ -7,8 +7,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.Spliterator;
@@ -35,7 +33,7 @@
public void testLinkedHashSetOverrides() throws Exception {
String stdOut =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(LinkedHashSetTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index f84c38c..283900e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.GenerateLintFiles;
import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
@@ -32,7 +31,7 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class LintFilesTest extends TestBase {
+public class LintFilesTest extends DesugaredLibraryTestBase {
@Parameters(name = "{0}")
public static TestParametersCollection data() {
@@ -51,8 +50,9 @@
assertTrue(methods.contains("java/util/Optional"));
assertTrue(methods.contains("java/util/OptionalInt"));
- // ConcurrentHashMap is not fully supported.
- assertFalse(methods.contains("java/util/concurrent/ConcurrentHashMap"));
+ // ConcurrentHashMap is fully supported on JDK 11.
+ assertEquals(
+ isJDK11DesugaredLibrary(), methods.contains("java/util/concurrent/ConcurrentHashMap"));
// No parallel* methods pre L, and all stream methods supported from L.
assertEquals(
@@ -79,6 +79,11 @@
methods.contains(
"java/util/stream/IntStream#allMatch(Ljava/util/function/IntPredicate;)Z"));
+ if (isJDK11DesugaredLibrary()) {
+ // TODO(b/203382252): Investigate why the following assertions are not working on JDK 11.
+ return;
+ }
+
// Supported methods on ConcurrentHashMap.
assertTrue(
methods.contains(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
index a8462e1..d5300ad 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
@@ -52,7 +52,7 @@
() ->
testForD8()
.addProgramFiles(mergerInputPart1, mergerInputPart2)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.compileWithExpectedDiagnostics(
diagnostics -> {
diagnostics
@@ -69,7 +69,7 @@
D8Command command =
D8Command.builder()
.addProgramFiles(mergerInputPart1, mergerInputPart2)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setOutput(merged, OutputMode.DexIndexed)
.build();
try {
@@ -103,7 +103,7 @@
Path outputDex = temp.newFolder().toPath().resolve("merger-input-dex.zip");
L8.run(
L8Command.builder()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.getDesugarJDKLibs())
.addDesugaredLibraryConfiguration(
StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
@@ -117,7 +117,7 @@
Path outputDex = temp.newFolder().toPath().resolve("merger-input-split-dex.zip");
L8.run(
L8Command.builder()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES)
.addClasspathFiles(ToolHelper.getDesugarJDKLibs())
.addDesugaredLibraryConfiguration(
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 dd89992..05282d5 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
@@ -26,7 +26,6 @@
import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11DesugaredLibraryTestBase;
import com.android.tools.r8.dex.Marker;
import com.android.tools.r8.dex.Marker.Tool;
@@ -63,9 +62,8 @@
try {
compileResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(buildPart1DesugaredLibrary(), buildPart2NoDesugaredLibrary())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.setMinApi(parameters.getApiLevel())
.applyIf(
someLibraryDesugaringRequired(),
@@ -111,7 +109,7 @@
Path app =
testForD8()
.addProgramFiles(buildPart1DesugaredLibrary(), shrunkenLib)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.applyIf(
someLibraryDesugaringRequired(),
@@ -222,7 +220,7 @@
testForD8()
.addProgramFiles(buildPart1DesugaredLibrary())
.addProgramClasses(Part2.class)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.applyIf(
someLibraryDesugaringRequired(),
@@ -260,7 +258,7 @@
private Path buildPart1DesugaredLibrary() throws Exception {
return testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Part1.class)
.setMinApi(parameters.getApiLevel())
.applyIf(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java
index 697253b..6ab6b2f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java
@@ -7,8 +7,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import java.util.AbstractCollection;
import java.util.Collection;
@@ -46,7 +44,7 @@
return;
}
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(MinimalInterfaceSuperTest.class)
.addKeepMainRule(Main.class)
.setMinApi(parameters.getApiLevel())
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 df67d51..f5b2096 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
@@ -8,8 +8,6 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import java.time.Month;
import java.time.format.TextStyle;
@@ -60,7 +58,7 @@
return;
}
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(MonthTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
@@ -74,7 +72,7 @@
public void testMonthR8() throws Exception {
Assume.assumeTrue(parameters.isDexRuntime());
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(MonthTest.class)
.addKeepMainRule(MonthTest.Main.class)
.setMinApi(parameters.getApiLevel())
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 4bee0d3..fbb422a 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
@@ -12,9 +12,7 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import org.junit.Assume;
import org.junit.Test;
@@ -69,18 +67,19 @@
try {
testForD8()
.addInnerClasses(NeverMergeCoreLibDesugarClasses.class)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getRuntime())
.addProgramFiles(buildDesugaredLibrary(parameters.getApiLevel()))
- .compileWithExpectedDiagnostics(diagnostics -> {
- diagnostics.assertErrorsCount(1);
- String message = diagnostics.getErrors().get(0).getDiagnosticMessage();
- assertThat(
- message,
- containsString(
- "Merging dex file containing classes with prefix 'j$.' "
- + "with classes with any other prefixes is not allowed."));
- });
+ .compileWithExpectedDiagnostics(
+ diagnostics -> {
+ diagnostics.assertErrorsCount(1);
+ String message = diagnostics.getErrors().get(0).getDiagnosticMessage();
+ assertThat(
+ message,
+ containsString(
+ "Merging dex file containing classes with prefix 'j$.' "
+ + "with classes with any other prefixes is not allowed."));
+ });
} catch (CompilationFailedException e) {
// Expected compilation failed.
return;
@@ -94,7 +93,7 @@
Assume.assumeTrue(parameters.getApiLevel().getLevel() < 24);
testForD8()
.addInnerClasses(NeverMergeCoreLibDesugarClasses.class)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java
index c562357..87d0bbd 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java
@@ -12,8 +12,6 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import java.lang.reflect.Method;
import java.util.Collection;
@@ -72,7 +70,7 @@
.assertSuccessWithOutput(EXPECTED);
} else {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addInnerClasses(NoDefaultMethodOverrideInLibraryTest.class)
.enableCoreLibraryDesugaring(
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 4d99161..3c83b83 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
@@ -7,8 +7,6 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.util.ArrayList;
@@ -46,7 +44,7 @@
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(NoDesugaredLibraryDexFileTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -62,7 +60,7 @@
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(NoDesugaredLibraryDexFileTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
index 81457f6..298b653 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
@@ -7,8 +7,6 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.util.ArrayList;
@@ -45,7 +43,7 @@
public void testCustomCollectionD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(NoForwardingMethodsTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -64,7 +62,7 @@
public void testCustomCollectionR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(NoForwardingMethodsTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
index 8cd0cca..72c8729 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.List;
import java.util.PriorityQueue;
@@ -37,7 +35,7 @@
public void testPriorityQueueD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(PriorityQueueSubclassTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -55,7 +53,7 @@
public void testPriorityQueueR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(PriorityQueueSubclassTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(Executor.class)
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 089f18a..daf4da7 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
@@ -59,7 +59,7 @@
public void testD8() throws Exception {
assumeTrue(parameters.isDexRuntime());
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addLibraryClasses(LibraryClass.class)
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, ProgramInterface.class, ProgramClass.class)
@@ -78,7 +78,7 @@
public void testD8CfToCf() throws Exception {
Path jar =
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addLibraryClasses(LibraryClass.class)
.addProgramClasses(Executor.class, ProgramInterface.class, ProgramClass.class)
.setMinApi(parameters.getApiLevel())
@@ -116,7 +116,7 @@
@Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addLibraryClasses(LibraryClass.class)
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, ProgramInterface.class, ProgramClass.class)
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 ee66aab..20e5408 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
@@ -60,7 +60,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestCompileResult compileResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stream.jar"))
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -119,7 +119,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
R8TestRunResult runResult =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.minification(minifying)
.addKeepMainRule(TEST_CLASS)
.addProgramFiles(Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stream.jar"))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
index 8713609..44625b1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.LibraryDesugaringTestConfiguration.Configuration;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import java.time.Clock;
@@ -59,7 +58,7 @@
@Test
public void testD8() throws Exception {
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ReleasedVersionsSmokeTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
@@ -77,7 +76,7 @@
@Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ReleasedVersionsSmokeTest.class)
.addKeepMainRule(TestClass.class)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
index e1b302d..5780701 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.util.List;
@@ -47,7 +45,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(RequiredNonNullWithSupplierTest.class)
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
index 05fdd28..6b29a83 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
@@ -7,7 +7,6 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -41,7 +40,7 @@
testForL8(AndroidApiLevel.B, backend)
.noDefaultDesugarJDKLibs()
.addProgramClassFileData(dump())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
/*
Add this library desugaring configuration:
"library_flags": [
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
index e1592c0..61a1bf8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.nio.file.Path;
import java.time.Instant;
@@ -45,10 +43,10 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
Path desugaredTwice =
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(RetargetOverrideTest.class)
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
.setMinApi(parameters.getApiLevel())
@@ -103,7 +101,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String stdout =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(RetargetOverrideTest.class)
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
.setMinApi(parameters.getApiLevel())
@@ -128,7 +126,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String stdout =
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addKeepMainRule(Executor.class)
.addInnerClasses(RetargetOverrideTest.class)
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
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 60fb964..ffd4166 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
@@ -5,8 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.util.ArrayList;
@@ -40,7 +38,7 @@
public void testStreamD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(SimpleStreamTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -58,7 +56,7 @@
public void testStreamR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(SimpleStreamTest.class)
.setMinApi(parameters.getApiLevel())
.addKeepClassAndMembersRules(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 28387d4..1fc77de 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
@@ -8,8 +8,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.util.ArrayList;
@@ -52,7 +50,7 @@
public void testSpliterator() throws Exception {
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(SpliteratorTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
index 9c06716..f36ae99 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
@@ -7,8 +7,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -52,7 +50,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(StaticInterfaceMethodTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -112,7 +110,7 @@
Assume.assumeFalse(parameters.isCfRuntime());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addKeepMainRule(Executor.class)
.addInnerClasses(StaticInterfaceMethodTest.class)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
index feaa98a..025740b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -58,7 +57,7 @@
}
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(INPUT_JAR)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -79,7 +78,7 @@
Assume.assumeFalse(parameters.isCfRuntime());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(INPUT_JAR)
.addKeepMainRule(MAIN_CLASS)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
index 3a864c2..4da71b0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
@@ -7,7 +7,6 @@
import static org.hamcrest.core.StringContains.containsString;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -64,7 +63,7 @@
public void testAPIConversionDesugaringD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(APIConversionTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
new file mode 100644
index 0000000..10a563d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
@@ -0,0 +1,131 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.AccessMode;
+import java.nio.file.Path;
+import java.util.List;
+import org.junit.Assume;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class AccessModeConversionTest extends DesugaredLibraryTestBase {
+
+ private final TestParameters parameters;
+ private final boolean shrinkDesugaredLibrary;
+
+ private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O;
+ private static final String EXPECTED_RESULT = StringUtils.lines("WRITE", "WRITE");
+
+ private static Path CUSTOM_LIB;
+
+ @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getConversionParametersUpToExcluding(MIN_SUPPORTED), BooleanUtils.values());
+ }
+
+ public AccessModeConversionTest(TestParameters parameters, boolean shrinkDesugaredLibrary) {
+ this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+ this.parameters = parameters;
+ }
+
+ @BeforeClass
+ public static void compileCustomLib() throws Exception {
+ CUSTOM_LIB =
+ testForD8(getStaticTemp())
+ .addProgramClasses(CustomLibClass.class)
+ .setMinApi(MIN_SUPPORTED)
+ .compile()
+ .writeToZip();
+ }
+
+ private void configureDesugaredLibrary(InternalOptions options) {
+ options.desugaredLibraryConfiguration =
+ DesugaredLibraryConfiguration.builder(
+ options.itemFactory, options.reporter, Origin.unknown())
+ .putRewritePrefix("java.nio.file.AccessMode", "j$.nio.file.AccessMode")
+ .addWrapperConversion("java.nio.file.AccessMode")
+ .build();
+ }
+
+ @Test
+ public void testD8() throws Exception {
+ Assume.assumeTrue(false);
+ KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+ testForD8()
+ .addLibraryFiles(getLibraryFile())
+ .setMinApi(parameters.getApiLevel())
+ .addProgramClasses(Executor.class)
+ .addLibraryClasses(CustomLibClass.class)
+ .addOptionsModification(this::configureDesugaredLibrary)
+ .compile()
+ .addDesugaredCoreLibraryRunClassPath(
+ this::buildDesugaredLibrary,
+ parameters.getApiLevel(),
+ keepRuleConsumer.get(),
+ shrinkDesugaredLibrary)
+ .addRunClasspathFiles(CUSTOM_LIB)
+ .run(parameters.getRuntime(), Executor.class)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ Assume.assumeTrue(false);
+ KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+ testForR8(parameters.getBackend())
+ .addLibraryFiles(getLibraryFile())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(Executor.class)
+ .addProgramClasses(Executor.class)
+ .addLibraryClasses(CustomLibClass.class)
+ .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
+ .addOptionsModification(this::configureDesugaredLibrary)
+ .compile()
+ .addDesugaredCoreLibraryRunClassPath(
+ this::buildDesugaredLibrary,
+ parameters.getApiLevel(),
+ keepRuleConsumer.get(),
+ shrinkDesugaredLibrary)
+ .addRunClasspathFiles(CUSTOM_LIB)
+ .run(parameters.getRuntime(), Executor.class)
+ .assertSuccessWithOutput(EXPECTED_RESULT);
+ }
+
+ static class Executor {
+
+ public static void main(String[] args) {
+ System.out.println(CustomLibClass.get(AccessMode.READ));
+ System.out.println(CustomLibClass.get(new AccessMode[] {AccessMode.READ})[0]);
+ }
+ }
+
+ // This class will be put at compilation time as library and on the runtime class path.
+ // This class is convenient for easy testing. Each method plays the role of methods in the
+ // platform APIs for which argument/return values need conversion.
+ static class CustomLibClass {
+
+ public static AccessMode get(AccessMode mode) {
+ return AccessMode.WRITE;
+ }
+
+ public static AccessMode[] get(AccessMode[] modes) {
+ return new AccessMode[] {AccessMode.WRITE};
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java
index e301fd1..87720a2 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -65,7 +64,7 @@
public void testRewrittenAPICallsD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -85,7 +84,7 @@
public void testRewrittenAPICallsR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Executor.class)
.addProgramClasses(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java
index 143f18b..1c2cdf9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -73,7 +72,7 @@
public void testRewrittenAPICallsD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -95,7 +94,7 @@
public void testRewrittenAPICallsR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Executor.class)
.addProgramClasses(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java
index 3c0ad88..5503e13 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -58,7 +57,7 @@
public void testRewrittenAPICallsD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -78,7 +77,7 @@
public void testRewrittenAPICallsR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addKeepMainRule(Executor.class)
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 bf148dc..1e09850 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
@@ -9,7 +9,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration.AbsentKeepRuleConsumer;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -89,7 +88,7 @@
public void testCallBack() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Impl.class)
.addLibraryClasses(CustomLibClass.class)
@@ -111,7 +110,7 @@
// Use D8 to desugar with Java classfile output.
Path firstJar =
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Impl.class)
.addLibraryClasses(CustomLibClass.class)
@@ -131,7 +130,7 @@
// Use D8 to desugar with Java classfile output.
Path secondJar =
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addOptionsModification(
options -> options.desugarSpecificOptions().allowAllDesugaredInput = true)
.setMinApi(parameters.getApiLevel())
@@ -152,7 +151,7 @@
// Convert to DEX without desugaring and run.
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(firstJar)
.setMinApi(parameters.getApiLevel())
.disableDesugaring()
@@ -173,7 +172,7 @@
public void testCallBackR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addKeepMainRule(Impl.class)
.noMinification()
.setMinApi(parameters.getApiLevel())
@@ -192,7 +191,7 @@
public void testCallBackR8Minifying() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addKeepMainRule(Impl.class)
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Impl.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
index 37ed786..724886c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -53,7 +52,7 @@
public void testClockD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -74,7 +73,7 @@
public void testClockR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addKeepMainRule(Executor.class)
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java
index 7341aae..f04504a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
@@ -39,7 +38,7 @@
Path extra = buildClass(ExtraClass.class);
Path convClass = buildClass(APIConversionClass.class);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramFiles(extra, convClass)
.enableCoreLibraryDesugaring(
@@ -51,7 +50,7 @@
private Path buildClass(Class<?> cls) throws Exception {
return testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(cls)
.enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java
index 043e0ff..4002646 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
@@ -77,7 +76,7 @@
// NoSuchMethodError instead of NoClassDefFoundError on the wrapper.
Assume.assumeTrue(hasRequiredAPI());
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Executor.class, MyIntUnaryOperator.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
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 254ef6d..a205079 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
@@ -9,7 +9,6 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -80,7 +79,7 @@
public void testNoInterfaceMethodsD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(MyCollectionInterface.class, MyCollection.class, Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -144,7 +143,7 @@
public void testNoInterfaceMethodsR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(MyCollectionInterface.class, MyCollection.class, Executor.class)
.addKeepMainRule(Executor.class)
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 3fe90f3..a045372 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
@@ -45,7 +45,7 @@
Path desugaredLib = temp.newFolder().toPath().resolve("conversion_dex.zip");
L8Command.Builder l8Builder =
L8Command.builder(diagnosticsHandler)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
.addDesugaredLibraryConfiguration(
StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
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 86bd652..1fa4a7c 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
@@ -9,7 +9,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.DexRuntime;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -56,7 +55,7 @@
.writeToZip();
String stdOut =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(AndroidApiLevel.B)
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
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 38b7c3f..d9a57e9 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
@@ -7,7 +7,6 @@
import static junit.framework.TestCase.assertEquals;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -57,7 +56,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String stdOut =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class, MyMap.class)
.addLibraryClasses(CustomLibClass.class)
@@ -81,7 +80,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String stdOut =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Executor.class)
.addProgramClasses(Executor.class, MyMap.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
index 5800cf5..9cdb56e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
@@ -7,7 +7,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -65,7 +64,7 @@
public void testFunctionCompositionD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(
Executor.class, Executor.Object1.class, Executor.Object2.class, Executor.Object3.class)
@@ -88,7 +87,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
Path jar =
testForD8(Backend.CF)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(
Executor.class,
@@ -134,7 +133,7 @@
public void testFunctionCompositionR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Executor.class)
.addProgramClasses(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
index ba7f28d..4800500 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.D8TestCompileResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -61,7 +60,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestCompileResult compileResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -84,7 +83,7 @@
public void testFunctionR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java
index 4d5f8d1..762a86e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -69,7 +68,7 @@
public void testStatsD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -89,7 +88,7 @@
public void testStatsR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java
index 657115c..3224879 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -66,7 +65,7 @@
Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Executor.class, ParallelRandom.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -85,7 +84,7 @@
Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Executor.class, ParallelRandom.class)
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Executor.class)
@@ -105,7 +104,7 @@
Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addLibraryClasses(CustomLibClass.class)
.addProgramClasses(ExecutorB192351030.class, A.class, B.class, C.class)
.setMinApi(parameters.getApiLevel())
@@ -126,7 +125,7 @@
Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addLibraryClasses(CustomLibClass.class)
.addProgramClasses(ExecutorB192351030.class, A.class, B.class, C.class)
.setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
index b7c33c4..a669527 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -75,7 +74,7 @@
public void testBaselineR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(BaselineExecutor.class)
.addKeepMainRule(BaselineExecutor.class)
@@ -115,7 +114,7 @@
public void testTryCatchR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(TryCatchExecutor.class)
.addKeepMainRule(TryCatchExecutor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java
index ed2db6a..888400d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -54,7 +53,7 @@
public void testUnwrapD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addLibraryClasses(CustomLibClass.class)
@@ -74,7 +73,7 @@
public void testUnwrapR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.addProgramClasses(Executor.class)
.addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
index c4d2370..bda8534 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.LibraryDesugaringTestConfiguration;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
import com.android.tools.r8.testing.AndroidBuildVersion;
@@ -63,7 +62,7 @@
Path path1 = compileWithCoreLibraryDesugaring(MyArrays1.class);
Path path2 = compileWithCoreLibraryDesugaring(MyArrays2.class);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(TestClass.class)
.addAndroidBuildVersion()
.enableCoreLibraryDesugaring(
@@ -90,7 +89,7 @@
private Path compileWithCoreLibraryDesugaring(Class<?> clazz) throws Exception {
return testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassesAndInnerClasses(clazz)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
index 5c1e73d..9fad03e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
@@ -5,10 +5,8 @@
package com.android.tools.r8.desugar.desugaredlibrary.gson;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.io.File;
@@ -54,7 +52,7 @@
public void testMapSerializationD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ConcurrentHashMapFileSerializationTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -74,7 +72,7 @@
public void testMapSerializationR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ConcurrentHashMapFileSerializationTest.class)
.addKeepMainRule(Executor.class)
.noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
index fd1b30b..34c5fd8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
@@ -8,9 +8,7 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import dalvik.system.PathClassLoader;
import java.sql.SQLDataException;
@@ -53,7 +51,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String stdOut =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(GetGenericInterfaceTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -74,7 +72,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String stdOut =
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(GetGenericInterfaceTest.class)
.addKeepMainRule(Executor.class)
.noMinification()
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 a6a460d..3755fea 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
@@ -4,8 +4,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.gson;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.List;
import org.junit.Assume;
@@ -40,7 +38,7 @@
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassesAndInnerClasses(AllMapsTestClass.class)
.addProgramFiles(GSON_2_8_1_JAR)
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -60,7 +58,7 @@
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassesAndInnerClasses(AllMapsTestClass.class)
.addProgramFiles(GSON_2_8_1_JAR)
.addKeepMainRule(AllMapsTestClass.class)
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 584c3f3..515a99c 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
@@ -5,9 +5,7 @@
package com.android.tools.r8.desugar.desugaredlibrary.gson;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.lang.reflect.Field;
import java.time.chrono.IsoEra;
@@ -38,7 +36,7 @@
public void testCustomCollectionD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(GsonEnumTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -56,7 +54,7 @@
public void testCustomCollectionR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(GsonEnumTest.class)
.addKeepMainRule(Executor.class)
.noMinification()
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 39c6644..692e53f 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
@@ -4,8 +4,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.gson;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.List;
import org.junit.Assume;
@@ -34,7 +32,7 @@
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassesAndInnerClasses(OptionalTestClass.class)
.addProgramFiles(GSON_2_8_1_JAR)
.addOptionsModification(opt -> opt.ignoreMissingClasses = true)
@@ -55,7 +53,7 @@
Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassesAndInnerClasses(OptionalTestClass.class)
.addProgramFiles(GSON_2_8_1_JAR)
.addKeepMainRule(OptionalTestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java
index 01c1b44..a137caf 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java
@@ -5,10 +5,8 @@
package com.android.tools.r8.desugar.desugaredlibrary.gson;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.io.File;
@@ -52,7 +50,7 @@
public void testMapSerializationD8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(MyMapFileSerializationTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -72,7 +70,7 @@
public void testMapSerializationR8() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(MyMapFileSerializationTest.class)
.addKeepMainRule(Executor.class)
.noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java
index 434f2b8..52e6731 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java
@@ -5,10 +5,8 @@
package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.util.List;
@@ -47,7 +45,7 @@
parameters.getDexRuntimeVersion().isEqualTo(Version.V4_0_4));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ConcurrentHashMapJDK11Test.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -69,7 +67,7 @@
parameters.getDexRuntimeVersion().isEqualTo(Version.V4_0_4));
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(ConcurrentHashMapJDK11Test.class)
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
index bdda327..6e9d7ca 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
@@ -25,10 +25,17 @@
public class DesugaredLibraryJDK11Undesugarer extends DesugaredLibraryTestBase {
- private static Map<String, String> ownerMap =
- ImmutableMap.of(
- "java/io/DesugarBufferedReader", "java/io/BufferedReader",
- "java/io/DesugarInputStream", "java/io/InputStream");
+ private static final Map<String, String> ownerMap =
+ ImmutableMap.<String, String>builder()
+ .put("java/util/DesugarTimeZone", "java/util/TimeZone")
+ .put("java/lang/DesugarLong", "java/lang/Long")
+ .put("java/lang/DesugarInteger", "java/lang/Integer")
+ .put("java/lang/DesugarDouble", "java/lang/Double")
+ .put("java/util/DesugarArrays", "java/util/Arrays")
+ .put("java/lang/DesugarMath", "java/lang/Math")
+ .put("java/io/DesugarBufferedReader", "java/io/BufferedReader")
+ .put("java/io/DesugarInputStream", "java/io/InputStream")
+ .build();
public static void main(String[] args) throws Exception {
setUpDesugaredLibrary();
@@ -37,10 +44,17 @@
public static Path undesugaredJar() {
if (!isJDK11DesugaredLibrary()) {
- return ToolHelper.getDesugarJDKLibs();
+ return ToolHelper.getDesugarJDKLibsBazelGeneratedFile();
}
Path desugaredLibJDK11Undesugared = Paths.get("build/libs/desugar_jdk_libs_11_undesugared.jar");
if (Files.exists(desugaredLibJDK11Undesugared)) {
+ return desugaredLibJDK11Undesugared;
+ }
+ return generateUndesugaredJar(desugaredLibJDK11Undesugared);
+ }
+
+ private static synchronized Path generateUndesugaredJar(Path desugaredLibJDK11Undesugared) {
+ if (Files.exists(desugaredLibJDK11Undesugared)) {
return desugaredLibJDK11Undesugared;
}
OpenOption[] options =
@@ -49,7 +63,8 @@
new ZipOutputStream(
new BufferedOutputStream(
Files.newOutputStream(desugaredLibJDK11Undesugared, options)))) {
- new DesugaredLibraryJDK11Undesugarer().undesugar(ToolHelper.getDesugarJDKLibs(), out);
+ new DesugaredLibraryJDK11Undesugarer()
+ .undesugar(ToolHelper.getDesugarJDKLibsBazelGeneratedFile(), out);
} catch (IOException e) {
throw new RuntimeException(e);
}
@@ -82,25 +97,29 @@
public void visitMethodInsn(
int opcode, String owner, String name, String descriptor, boolean isInterface) {
if (opcode == Opcodes.INVOKESTATIC) {
- for (String ownerToRewrite : ownerMap.keySet()) {
- if (ownerToRewrite.equals(owner)) {
- super.visitMethodInsn(
- Opcodes.INVOKEVIRTUAL,
- ownerMap.get(owner),
- name,
- withoutFirstObjectArg(descriptor),
- isInterface);
- return;
+ if (ownerMap.containsKey(owner)) {
+ String nonDesugaredType = ownerMap.get(owner);
+ int firstTypeEnd = descriptor.indexOf(";");
+ int firstTypeStart = descriptor.indexOf("L");
+ String firstArg =
+ firstTypeEnd == -1
+ ? "NoFirstType"
+ : descriptor.substring(firstTypeStart + 1, firstTypeEnd);
+ int newOpcode;
+ String newDescriptor;
+ if (firstArg.equals(nonDesugaredType)) {
+ newOpcode = Opcodes.INVOKEVIRTUAL;
+ newDescriptor = "(" + descriptor.substring(firstTypeEnd + 1);
+ } else {
+ newOpcode = Opcodes.INVOKESTATIC;
+ newDescriptor = descriptor;
}
+ super.visitMethodInsn(newOpcode, nonDesugaredType, name, newDescriptor, isInterface);
+ return;
}
}
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
}
};
}
-
- private String withoutFirstObjectArg(String descriptor) {
- int i = descriptor.indexOf(";");
- return "(" + descriptor.substring(i + 1);
- }
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java
index 7f76531..d95f9c8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.transformers.MethodTransformer;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -51,7 +50,7 @@
&& parameters.getApiLevel().getLevel() < AndroidApiLevel.S.getLevel());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassFileData(getProgramClassFileData())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -74,7 +73,7 @@
&& parameters.getApiLevel().getLevel() < AndroidApiLevel.S.getLevel());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassFileData(getProgramClassFileData())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java
index 368d169..1b9581a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java
@@ -5,10 +5,8 @@
package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.ImmutableList;
@@ -49,7 +47,7 @@
Assume.assumeTrue(isJDK11DesugaredLibrary());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassFileData(getProgramClassFileData())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -68,7 +66,7 @@
Assume.assumeTrue(isJDK11DesugaredLibrary());
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForR8(Backend.DEX)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClassFileData(getProgramClassFileData())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(TestClass.class)
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 e1849dc..49dc57e 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
@@ -13,7 +13,6 @@
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -76,7 +75,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String verbosity = "2";
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(
ATOMIC_COMPILED_TESTS_FOLDER.resolve(ATOMIC_REFERENCE_TEST + CLASS_EXTENSION))
.addProgramFiles(testNGSupportProgramFiles())
@@ -100,7 +99,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
String verbosity = "2";
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(
getAllFilesWithSuffixInDirectory(ATOMIC_COMPILED_TESTS_FOLDER, CLASS_EXTENSION))
.addProgramFiles(testNGSupportProgramFiles())
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 9123915..2740c2f 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
@@ -14,7 +14,6 @@
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
@@ -110,7 +109,7 @@
.addProgramFiles(getPathsFiles())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.compile()
.withArt6Plus64BitsLib()
.addDesugaredCoreLibraryRunClassPath(
@@ -163,7 +162,7 @@
String verbosity = "2";
D8TestCompileResult d8TestCompileResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(concurrentHashTestToCompile())
.addProgramFiles(testNGSupportProgramFiles())
.addProgramFiles(getPathsFiles())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
index 355343d..606f253 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
@@ -263,7 +263,7 @@
.addProgramFiles(getSafeVarArgsFile())
.addProgramFiles(testNGSupportProgramFiles())
.addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
.allowStdoutMessages()
@@ -296,7 +296,7 @@
.addProgramFiles(getSafeVarArgsFile())
.addProgramFiles(testNGSupportProgramFiles())
.addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
.compile()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java
index a0a51c0..1928523 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java
@@ -201,7 +201,7 @@
String verbosity = "2";
D8TestCompileResult compileResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(getPathsFiles())
.addProgramFiles(JDK_11_TIME_TEST_COMPILED_FILES)
.addProgramFiles(Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"))
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 b0c3032..27e9882 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
@@ -29,7 +29,6 @@
import com.android.tools.r8.kotlin.KotlinMetadataWriter;
import com.android.tools.r8.kotlin.metadata.KotlinMetadataTestBase;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.FileUtils;
@@ -99,7 +98,7 @@
final File output = temp.newFile("output.zip");
final D8TestRunResult d8TestRunResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(compiledJars.getForConfiguration(kotlinParameters))
.addProgramFiles(kotlinc.getKotlinStdlibJar())
.addProgramFiles(kotlinc.getKotlinReflectJar())
@@ -129,7 +128,7 @@
boolean desugarLibrary = parameters.isDexRuntime() && requiresAnyCoreLibDesugaring(parameters);
final R8FullTestBuilder testBuilder =
testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramFiles(compiledJars.getForConfiguration(kotlinParameters))
.addProgramFiles(kotlinc.getKotlinStdlibJar())
.addProgramFiles(kotlinc.getKotlinReflectJar())
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 26561ec..c7cda9c 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
@@ -129,7 +129,7 @@
}
D8TestCompileResult compile =
d8TestBuilder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(
LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
index bdc2b91..0752227 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
@@ -5,9 +5,7 @@
package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.time.DayOfWeek;
@@ -41,7 +39,7 @@
public void testEnum() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(EnumSetUser.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
index 2b57223..7da38d7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
@@ -5,9 +5,7 @@
package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.time.ZoneId;
@@ -38,7 +36,7 @@
public void testField() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Executor.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
index f314581..fd81f26 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
@@ -5,9 +5,7 @@
package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.time.Clock;
@@ -40,7 +38,7 @@
public void testInheritance() throws Exception {
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addProgramClasses(Impl.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
index fa6a0c6..26ccf56 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
@@ -6,9 +6,7 @@
import com.android.tools.r8.D8TestRunResult;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.List;
import java.util.Map;
@@ -42,7 +40,7 @@
KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
D8TestRunResult d8TestRunResult =
testForD8()
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+ .addLibraryFiles(getLibraryFile())
.addInnerClasses(KeepRuleShrinkTest.class)
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java
index af6986a..6169da8 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java
@@ -15,8 +15,11 @@
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Collection;
import java.util.function.Consumer;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -40,12 +43,17 @@
public static Collection<Object[]> data() {
return buildParameters(
getTestParameters().withAllRuntimesAndApiLevels().build(),
- getKotlinTestParameters().withAllCompilersAndTargetVersions().build(),
+ getKotlinTestParameters()
+ .withCompiler(KotlinCompilerVersion.KOTLINC_1_3_72)
+ .withAllTargetVersions()
+ .build(),
BooleanUtils.values());
}
private final TestParameters parameters;
+ private static KotlinCompileMemoizer compiledJars;
+
public KotlinDuplicateAnnotationTest(
TestParameters parameters,
KotlinTestParameters kotlinParameters,
@@ -54,15 +62,17 @@
this.parameters = parameters;
}
- private static final KotlinCompileMemoizer compiledJars =
- getCompileMemoizer(getKotlinFilesInResource(FOLDER), FOLDER)
- .configure(kotlinCompilerTool -> kotlinCompilerTool.includeRuntime().noReflect());
+ @BeforeClass
+ public static void moveKotlinSourceFile() throws Exception {
+ Path sourceFile = getStaticTemp().newFolder().toPath().resolve("main.kt");
+ Files.copy(getKotlinResourcesFolder().resolve(FOLDER).resolve("main.txt"), sourceFile);
+ compiledJars =
+ getCompileMemoizer(sourceFile)
+ .configure(kotlinCompilerTool -> kotlinCompilerTool.includeRuntime().noReflect());
+ }
@Test
public void test_dex() {
- assumeTrue(
- "kotlinc > 1.3.72 will no longer compile kotlin files with duplicate annotations",
- kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72));
assumeTrue("test DEX", parameters.isDexRuntime());
try {
testForR8(parameters.getBackend())
@@ -81,9 +91,6 @@
@Test
public void test_cf() throws Exception {
- assumeTrue(
- "kotlinc > 1.3.72 will no longer compile kotlin files with duplicate annotations",
- kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72));
assumeTrue("test CF", parameters.isCfRuntime());
testForR8(parameters.getBackend())
.addProgramFiles(compiledJars.getForConfiguration(kotlinc, targetVersion))
diff --git a/src/test/java/com/android/tools/r8/kotlin/ProguardRulesBuilder.java b/src/test/java/com/android/tools/r8/kotlin/ProguardRulesBuilder.java
deleted file mode 100644
index 9c4d062..0000000
--- a/src/test/java/com/android/tools/r8/kotlin/ProguardRulesBuilder.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.kotlin;
-
-class ProguardRulesBuilder {
-
- private final StringBuilder sb = new StringBuilder();
-
- public ProguardRulesBuilder appendWithLineSeparator(String str) {
- sb.append(str).append(System.lineSeparator());
- return this;
- }
-
- public ProguardRulesBuilder dontObfuscate() {
- return appendWithLineSeparator("-dontobfuscate");
- }
-
- public ProguardRulesBuilder allowAccessModification() {
- return appendWithLineSeparator("-allowaccessmodification");
- }
-
- @Override
- public String toString() {
- return sb.toString();
- }
-}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
index 4472d60..aea2a25 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -227,7 +227,7 @@
StackTraceLine o = (StackTraceLine) other;
return className.equals(o.className)
&& methodName.equals(o.methodName)
- && fileName.equals(o.fileName)
+ && Objects.equals(fileName, o.fileName)
&& lineNumber == o.lineNumber;
}
return false;
@@ -255,6 +255,10 @@
return stackTraceLines.size() + 1;
}
+ public String getExceptionLine() {
+ return exceptionLine;
+ }
+
public StackTraceLine get(int index) {
return stackTraceLines.get(index);
}
@@ -317,9 +321,20 @@
}
public static StackTrace extractFromJvm(String stderr) {
- List<String> strings = StringUtils.splitLines(stderr);
+ List<String> lines = StringUtils.splitLines(stderr);
+ String exceptionLine = "";
+ int startLine = 0;
+ for (int i = 0; i < lines.size(); i++) {
+ if (lines.get(i).startsWith(TAB_AT_PREFIX)) {
+ if (i > 0) {
+ exceptionLine = lines.get(i - 1);
+ }
+ startLine = i;
+ break;
+ }
+ }
return new StackTrace(
- strings.isEmpty() ? "" : strings.get(0), internalExtractFromJvm(strings), stderr);
+ exceptionLine, internalExtractFromJvm(lines.subList(startLine, lines.size())), stderr);
}
public static StackTrace extractFromJvm(SingleTestRunResult result) {
diff --git a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
index 1eb52a1..012933d 100644
--- a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
@@ -34,16 +34,17 @@
@Parameters(name = "{0}")
public static Collection<Object[]> parameters() {
- return ImmutableList.copyOf(new Object[][]{
- {"-keep interface *", ImmutableList.of(Interface.class)},
- {"-keep class *", CLASSES_TO_INCLUDE},
- {"-keep enum *", ImmutableList.of(Enum.class)},
- {"-keep @interface *", ImmutableList.of(Annotation.class)},
- {"-keep !interface *", ImmutableList.of(Enum.class, Annotation.class, Class.class)},
- {"-keep !enum *", ImmutableList.of(Interface.class, Annotation.class, Class.class)},
- {"-keep !@interface *", ImmutableList.of(Interface.class, Enum.class, Class.class)},
- {"-keep !class *", ImmutableList.of()}
- });
+ return ImmutableList.copyOf(
+ new Object[][] {
+ {"-keep interface *", ImmutableList.of(Interface.class, Annotation.class)},
+ {"-keep class *", CLASSES_TO_INCLUDE},
+ {"-keep enum *", ImmutableList.of(Enum.class)},
+ {"-keep @interface *", ImmutableList.of(Annotation.class)},
+ {"-keep !interface *", ImmutableList.of(Enum.class, Class.class)},
+ {"-keep !enum *", ImmutableList.of(Interface.class, Annotation.class, Class.class)},
+ {"-keep !@interface *", ImmutableList.of(Interface.class, Enum.class, Class.class)},
+ {"-keep !class *", ImmutableList.of()}
+ });
}
public final String config;
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationClassKeepRuleTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationClassKeepRuleTest.java
new file mode 100644
index 0000000..38c2ec9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationClassKeepRuleTest.java
@@ -0,0 +1,114 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.shaking.annotations;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class AnnotationClassKeepRuleTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameter(1)
+ public ProguardVersion proguardVersion;
+
+ @Parameter(2)
+ public boolean testAnnotation;
+
+ @Parameters(name = "{0}, PG: {1}, use @interface: {2}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters().withCfRuntimes().build(),
+ ProguardVersion.values(),
+ BooleanUtils.values());
+ }
+
+ @Test
+ public void testR8Interface() throws Exception {
+ assumeTrue(proguardVersion == ProguardVersion.getLatest());
+ runTest(testForR8(parameters.getBackend())).inspect(this::inspect);
+ }
+
+ @Test
+ public void testPGInterface() throws Exception {
+ runTest(testForProguard(proguardVersion).addDontWarn(AnnotationClassKeepRuleTest.class))
+ .inspect(this::inspect);
+ }
+
+ @Test
+ public void testR8Annotation() throws Exception {
+ assumeTrue(proguardVersion == ProguardVersion.getLatest());
+ runTest(testForR8(parameters.getBackend())).inspect(this::inspect);
+ }
+
+ @Test
+ public void testPGAnnotation() throws Exception {
+ runTest(testForProguard(proguardVersion).addDontWarn(AnnotationClassKeepRuleTest.class))
+ .inspect(this::inspect);
+ }
+
+ private void inspect(CodeInspector inspector) {
+ assertThat(inspector.clazz(Foo.class), not(isPresent()));
+ assertThat(inspector.clazz(Bar.class), isPresent());
+ assertThat(inspector.clazz(Baz.class), notIf(isPresent(), testAnnotation));
+ }
+
+ private TestRunResult<?> runTest(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder)
+ throws Exception {
+ return testBuilder
+ .addInnerClasses(getClass())
+ .setMinApi(AndroidApiLevel.B)
+ .addKeepRules(
+ "-keep @ "
+ + typeName(Foo.class)
+ + " "
+ + (testAnnotation ? "@interface" : "interface")
+ + " *")
+ .addKeepMainRule(Main.class)
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("Hello World!");
+ }
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ System.out.println("Hello World!");
+ }
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.TYPE)
+ public @interface Foo {}
+
+ @Foo
+ public @interface Bar {}
+
+ @Foo
+ public interface Baz {}
+}
diff --git a/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java b/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
index 7a19f09..375f03f 100644
--- a/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
+++ b/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
@@ -19,13 +19,15 @@
import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
import com.android.tools.r8.transformers.MethodTransformer;
import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Set;
+import java.util.Collection;
+import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -74,16 +76,18 @@
private static final int COUNT = 1100;
- private static final Set<String> testClasses =
- ImmutableSet.of(
- binaryName(TestCheckCast.class),
- binaryName(TestInstanceOf.class),
- binaryName(TestTypeReference.class),
- binaryName(TestNewInstance.class),
- binaryName(TestStaticField.class),
- binaryName(TestStaticMethod.class),
- binaryName(TestInstanceField.class),
- binaryName(TestInstanceMethod.class));
+ private static final List<Class<?>> testClasses =
+ ImmutableList.of(
+ TestCheckCast.class,
+ TestInstanceOf.class,
+ TestTypeReference.class,
+ TestNewInstance.class,
+ TestStaticField.class,
+ TestStaticMethod.class,
+ TestInstanceField.class,
+ TestInstanceMethod.class);
+ private static final Collection<String> testClassBinaryNames =
+ ImmutableSet.copyOf(ListUtils.map(testClasses, TestBase::binaryName));
private static void buildJar(Path path) throws Exception {
ZipBuilder builder = ZipBuilder.builder(path);
@@ -94,14 +98,9 @@
String postFix = clazz.getSimpleName();
int classCounter = 0;
for (int i = 0; i < COUNT; i++) {
- addClass(builder, TestCheckCast.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestInstanceOf.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestTypeReference.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestNewInstance.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestStaticField.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestStaticMethod.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestInstanceField.class, clazz, postFix, i, classCounter++);
- addClass(builder, TestInstanceMethod.class, clazz, postFix, i, classCounter++);
+ for (Class<?> testClass : testClasses) {
+ addClass(builder, testClass, clazz, postFix, i, classCounter++);
+ }
}
if (clazz != MissingClass.class) {
for (int i = 0; i < classCounter; i++) {
@@ -134,7 +133,7 @@
String name,
String descriptor,
boolean isInterface) {
- if (!testClasses.contains(owner)) {
+ if (!testClassBinaryNames.contains(owner)) {
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
return;
}
diff --git a/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java b/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
new file mode 100644
index 0000000..3cc8749
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
@@ -0,0 +1,125 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.workaround;
+
+import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethodWithName;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class InvokeVirtualToInterfaceVerifyErrorWorkaroundTest extends TestBase {
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection parameters() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ @Test
+ public void test() throws Exception {
+ testForR8(parameters.getBackend())
+ .addProgramClasses(A.class)
+ .addProgramClassFileData(getProgramClassFileData())
+ .addKeepClassAndMembersRules(Main.class)
+ // CameraDevice is not present in rt.jar or android.jar when API<L.
+ .applyIf(
+ parameters.isCfRuntime() || parameters.getApiLevel().isLessThan(AndroidApiLevel.L),
+ testBuilder -> testBuilder.addDontWarn("android.hardware.camera2.CameraDevice"))
+ // CameraDeviceUser can only be merged with A when min API>=L.
+ .addHorizontallyMergedClassesInspector(
+ inspector ->
+ inspector
+ .applyIf(
+ parameters.isDexRuntime()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L),
+ i -> i.assertIsCompleteMergeGroup(A.class, CameraDeviceUser.class))
+ .assertNoOtherClassesMerged())
+ .setMinApi(parameters.getApiLevel())
+ .compile()
+ // CameraDeviceUser.m() can only be inlined when min API>=L.
+ .inspect(
+ inspector -> {
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L)) {
+ assertThat(inspector.clazz(CameraDeviceUser.class), isAbsent());
+ } else {
+ ClassSubject cameraDeviceUserClassSubject = inspector.clazz(CameraDeviceUser.class);
+ assertThat(cameraDeviceUserClassSubject, isPresent());
+
+ MethodSubject mMethodSubject =
+ cameraDeviceUserClassSubject.uniqueMethodWithName("m");
+ assertThat(mMethodSubject, isPresent());
+ assertThat(mMethodSubject, invokesMethodWithName("close"));
+ }
+ });
+ }
+
+ private static List<byte[]> getProgramClassFileData() throws IOException {
+ String oldDescriptor = DescriptorUtils.javaTypeToDescriptor(CameraDevice.class.getTypeName());
+ String newDescriptor = "Landroid/hardware/camera2/CameraDevice;";
+ return ImmutableList.of(
+ transformer(Main.class)
+ .replaceClassDescriptorInMembers(oldDescriptor, newDescriptor)
+ .replaceClassDescriptorInMethodInstructions(oldDescriptor, newDescriptor)
+ .transform(),
+ transformer(CameraDeviceUser.class)
+ .replaceClassDescriptorInMembers(oldDescriptor, newDescriptor)
+ .replaceClassDescriptorInMethodInstructions(oldDescriptor, newDescriptor)
+ .transform());
+ }
+
+ // The following classes are transformed to use android.hardware.camera2.CameraDevice.
+ static class Main {
+
+ public static void main(String[] args) {
+ int minApi = args.length;
+ if (minApi >= 21) {
+ new CameraDeviceUser().m(getCameraDevice());
+ } else {
+ System.out.println(new A());
+ }
+ }
+
+ // @Keep
+ static CameraDevice getCameraDevice() {
+ return null;
+ }
+ }
+
+ static class A {}
+
+ static class CameraDeviceUser {
+
+ public void m(CameraDevice cd) {
+ if (cd != null) {
+ cd.close();
+ }
+ }
+ }
+
+ abstract static class CameraDevice {
+
+ abstract void close();
+ }
+}
diff --git a/src/test/kotlinR8TestResources/duplicate_annotation/main.kt b/src/test/kotlinR8TestResources/duplicate_annotation/main.txt
similarity index 100%
rename from src/test/kotlinR8TestResources/duplicate_annotation/main.kt
rename to src/test/kotlinR8TestResources/duplicate_annotation/main.txt
diff --git a/third_party/android_jar/api-database.tar.gz.sha1 b/third_party/android_jar/api-database.tar.gz.sha1
deleted file mode 100644
index 2bbe555..0000000
--- a/third_party/android_jar/api-database.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-829d7f32a482c16a2008a8878c33c58637c21a56
\ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index 733e59b..91ad6b5 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -120,7 +120,7 @@
checkout_dir, 'bazel-bin', 'src', 'share', 'classes', 'java', 'libjava.jar')
else:
library_jar = os.path.join(
- checkout_dir, 'bazel-bin', 'jdk11', 'src', 'd8_java_base_selected.jar')
+ checkout_dir, 'bazel-bin', 'jdk11', 'src', 'd8_java_base_selected_with_addon.jar')
maven_zip = os.path.join(
checkout_dir,
'bazel-bin',