Merge commit '089989ec29b6fed9d55a7849d569b35e8d335d17' into dev-release
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index b0c751c..397f2c5 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -71,15 +71,53 @@
],
"library_flags": [
{
+ "api_level_below_or_equal": 10000,
+ "rewrite_prefix": {
+ "desugar.": "j$.desugar.",
+ "libcore.": "j$.libcore.",
+ "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"
+ }
+ },
+ {
+ "api_level_below_or_equal": 29,
+ "rewrite_prefix": {
+ "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
+ }
+ },
+ {
"api_level_below_or_equal": 25,
"rewrite_prefix": {
"j$.time.": "java.time.",
"java.time.": "j$.time.",
+ "java.io.DesugarFile" : "j$.io.DesugarFile",
"java.util.Desugar": "j$.util.Desugar",
"sun.misc.Desugar": "j$.sun.misc.Desugar",
- "jdk.internal.util.Preconditions": "j$.jdk.internal.util.Preconditions"
+ "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",
+ "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
+ "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
+ "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
+ "java.nio.file.": "j$.nio.file.",
+ "sun.nio.cs." : "j$.sun.nio.cs.",
+ "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
+ "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
+ "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
+ "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
+ "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
+ },
+ "backport": {
+ "java.lang.DesugarDouble": "java.lang.Double",
+ "java.lang.DesugarInteger": "java.lang.Integer",
+ "java.lang.DesugarLong": "java.lang.Long",
+ "java.lang.DesugarMath": "java.lang.Math"
},
"retarget_lib_member": {
+ "java.io.File#toPath": "java.io.DesugarFile",
"java.util.Date#toInstant": "java.util.DesugarDate",
"java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
"java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
@@ -96,17 +134,19 @@
{
"api_level_below_or_equal": 23,
"rewrite_prefix": {
+ "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
+ "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
"j$.util.Optional": "java.util.Optional",
"j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics",
"j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics",
"j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics",
+ "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
"java.util.stream.": "j$.util.stream.",
"java.util.function.": "j$.util.function.",
"java.util.Comparators": "j$.util.Comparators",
"java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
"java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
"java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
- "java.util.Objects": "j$.util.Objects",
"java.util.Optional": "j$.util.Optional",
"java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
"java.util.SortedSet$1": "j$.util.SortedSet$1",
@@ -151,6 +191,15 @@
"java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
"java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
}
+ },
+ {
+ "api_level_below_or_equal": 18,
+ "rewrite_prefix": {
+ "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
+ },
+ "retarget_lib_member": {
+ "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+ }
}
],
"program_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 66f3500..fca8af4 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -71,15 +71,53 @@
],
"library_flags": [
{
+ "api_level_below_or_equal": 10000,
+ "rewrite_prefix": {
+ "desugar.": "j$.desugar.",
+ "libcore.": "j$.libcore.",
+ "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"
+ }
+ },
+ {
+ "api_level_below_or_equal": 29,
+ "rewrite_prefix": {
+ "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
+ }
+ },
+ {
"api_level_below_or_equal": 25,
"rewrite_prefix": {
"j$.time.": "java.time.",
"java.time.": "j$.time.",
+ "java.io.DesugarFile" : "j$.io.DesugarFile",
"java.util.Desugar": "j$.util.Desugar",
"sun.misc.Desugar": "j$.sun.misc.Desugar",
- "jdk.internal.util.Preconditions": "j$.jdk.internal.util.Preconditions"
+ "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",
+ "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
+ "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
+ "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
+ "java.nio.file.": "j$.nio.file.",
+ "sun.nio.cs." : "j$.sun.nio.cs.",
+ "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
+ "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
+ "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
+ "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
+ "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
+ },
+ "backport": {
+ "java.lang.DesugarDouble": "java.lang.Double",
+ "java.lang.DesugarInteger": "java.lang.Integer",
+ "java.lang.DesugarLong": "java.lang.Long",
+ "java.lang.DesugarMath": "java.lang.Math"
},
"retarget_lib_member": {
+ "java.io.File#toPath": "java.io.DesugarFile",
"java.util.Date#toInstant": "java.util.DesugarDate",
"java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
"java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
@@ -96,10 +134,15 @@
{
"api_level_below_or_equal": 23,
"rewrite_prefix": {
+ "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
+ "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
+ "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
+ "java.io.UncheckedIOException": "j$.io.UncheckedIOException",
"j$.util.Optional": "java.util.Optional",
"j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics",
"j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics",
"j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics",
+ "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
"java.util.stream.": "j$.util.stream.",
"java.util.function.": "j$.util.function.",
"java.util.Comparators": "j$.util.Comparators",
@@ -120,9 +163,7 @@
"java.util.AbstractList": "j$.util.AbstractList",
"java.util.CollSer": "j$.util.CollSer",
"java.util.ImmutableCollections": "j$.util.ImmutableCollections",
- "java.util.KeyValueHolder": "j$.util.KeyValueHolder",
- "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
- "java.io.UncheckedIOException": "j$.io.UncheckedIOException"
+ "java.util.KeyValueHolder": "j$.util.KeyValueHolder"
},
"retarget_lib_member": {
"java.util.Arrays#stream": "java.util.DesugarArrays",
@@ -134,6 +175,7 @@
"java.util.Iterator#remove"
],
"emulate_interface": {
+ "java.lang.Iterable": "j$.lang.Iterable",
"java.util.Map$Entry": "j$.util.Map$Entry",
"java.util.Collection": "j$.util.Collection",
"java.util.Map": "j$.util.Map",
@@ -153,6 +195,15 @@
"java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
"java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
}
+ },
+ {
+ "api_level_below_or_equal": 18,
+ "rewrite_prefix": {
+ "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
+ },
+ "retarget_lib_member": {
+ "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+ }
}
],
"program_flags": [
@@ -222,6 +273,7 @@
"java.util.Iterator#remove"
],
"emulate_interface": {
+ "java.lang.Iterable": "j$.lang.Iterable",
"java.util.Map$Entry": "j$.util.Map$Entry",
"java.util.Collection": "j$.util.Collection",
"java.util.Map": "j$.util.Map",
@@ -248,7 +300,7 @@
"-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { int sizeCtl; int transferIndex; long baseCount; int cellsBusy; }",
"-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$CounterCell { long value; }",
"-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); public static final !synthetic <fields>; }",
- "-keeppackagenames j$",
+ "-keeppackagenames j$.**",
"-keepclassmembers class j$.util.IntSummaryStatistics { long count; long sum; int min; int max; }",
"-keepclassmembers class j$.util.LongSummaryStatistics { long count; long sum; long min; long max; }",
"-keepclassmembers class j$.util.DoubleSummaryStatistics { long count; double sum; double min; double max; }",
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 2013fb9..242064b 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -467,7 +467,7 @@
internal.enableMainDexListCheck = enableMainDexListCheck;
internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
internal.intermediate = intermediate;
- internal.readCompileTimeAnnotations = intermediate;
+ internal.retainCompileTimeAnnotations = intermediate;
internal.desugarGraphConsumer = desugarGraphConsumer;
internal.mainDexKeepRules = mainDexKeepRules;
internal.lineNumberOptimization = LineNumberOptimization.OFF;
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index 2512782..337fad7 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -224,6 +224,8 @@
internal.minimalMainDex = internal.debug;
internal.enableEnumValueOptimization = false;
internal.inlinerOptions().enableInlining = false;
+ assert internal.retainCompileTimeAnnotations;
+ internal.retainCompileTimeAnnotations = false;
return internal;
}
}
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 133ca25..c0fb797 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -166,7 +166,7 @@
assert !internal.minimalMainDex;
internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
assert !internal.intermediate;
- assert internal.readCompileTimeAnnotations;
+ assert internal.retainCompileTimeAnnotations;
internal.programConsumer = getProgramConsumer();
assert internal.programConsumer instanceof ClassFileConsumer;
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index e469f0a..07e0617 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
import com.android.tools.r8.graph.ApplicationReaderMap;
import com.android.tools.r8.graph.ClassKind;
+import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexApplicationReadFlags;
import com.android.tools.r8.graph.DexClass;
@@ -379,6 +380,20 @@
}
}
+ private boolean includeAnnotationClass(DexProgramClass clazz) {
+ if (!options.pruneNonVissibleAnnotationClasses) {
+ return true;
+ }
+ DexAnnotation retentionAnnotation =
+ clazz.annotations().getFirstMatching(itemFactory.retentionType);
+ // Default is CLASS retention, read if retained.
+ if (retentionAnnotation == null) {
+ return DexAnnotation.retainCompileTimeAnnotation(clazz.getType(), application.options);
+ }
+ // Otherwise only read runtime visible annotations.
+ return retentionAnnotation.annotation.toString().contains("RUNTIME");
+ }
+
private void readClassSources(
List<ProgramResource> classSources, Queue<DexProgramClass> classes) {
if (classSources.isEmpty()) {
@@ -386,7 +401,15 @@
}
hasReadProgramResourceFromCf = true;
JarClassFileReader<DexProgramClass> reader =
- new JarClassFileReader<>(application, classes::add, PROGRAM);
+ new JarClassFileReader<>(
+ application,
+ clazz -> {
+ if (clazz.isAnnotation() && !includeAnnotationClass(clazz)) {
+ return;
+ }
+ classes.add(clazz);
+ },
+ PROGRAM);
// Read classes in parallel.
for (ProgramResource input : classSources) {
futures.add(
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 1141602..6952bf7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -111,7 +111,7 @@
}
public static boolean retainCompileTimeAnnotation(DexType annotation, InternalOptions options) {
- if (options.readCompileTimeAnnotations) {
+ if (options.retainCompileTimeAnnotations) {
return true;
}
if (annotation == options.itemFactory.dalvikFastNativeAnnotation
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 0c78a72..b59c44f 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -175,9 +175,8 @@
private static boolean retainCompileTimeAnnotation(
String desc, JarApplicationReader application) {
- return application.options.readCompileTimeAnnotations
- || DexAnnotation.retainCompileTimeAnnotation(
- application.getTypeFromDescriptor(desc), application.options);
+ return DexAnnotation.retainCompileTimeAnnotation(
+ application.getTypeFromDescriptor(desc), application.options);
}
private static DexEncodedAnnotation createEncodedAnnotation(String desc,
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 98c8bd2..146e33f 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -78,6 +78,7 @@
&& !getAccessFlags().isNative()
&& !getAccessFlags().isPrivate()
&& !getAccessFlags().isStatic()
+ && !getDefinition().isInstanceInitializer()
&& !appView.appInfo().isFailedResolutionTarget(getReference());
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
index 2b6c9d4..460c350 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
@@ -287,9 +287,10 @@
private DexMethod computeReturnConversion(
DexMethod invokedMethod,
- DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
+ DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer,
+ ProgramMethod context) {
DexType returnType = invokedMethod.proto.returnType;
- if (wrapperSynthesizor.shouldConvert(returnType, invokedMethod)) {
+ if (wrapperSynthesizor.shouldConvert(returnType, invokedMethod, context)) {
DexType newReturnType = DesugaredLibraryAPIConverter.vivifiedTypeFor(returnType, appView);
return wrapperSynthesizor.ensureConversionMethod(
returnType, newReturnType, returnType, eventConsumer);
@@ -299,12 +300,13 @@
private DexMethod[] computeParameterConversions(
DexMethod invokedMethod,
- DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
+ DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer,
+ ProgramMethod context) {
DexMethod[] parameterConversions = new DexMethod[invokedMethod.getArity()];
DexType[] parameters = invokedMethod.proto.parameters.values;
for (int i = 0; i < parameters.length; i++) {
DexType argType = parameters[i];
- if (wrapperSynthesizor.shouldConvert(argType, invokedMethod)) {
+ if (wrapperSynthesizor.shouldConvert(argType, invokedMethod, context)) {
DexType argVivifiedType = vivifiedTypeFor(argType, appView);
parameterConversions[i] =
wrapperSynthesizor.ensureConversionMethod(
@@ -326,12 +328,12 @@
}
if (shouldOutlineAPIConversion(invoke, context)) {
DexMethod outlinedAPIConversion =
- createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer);
+ createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer, context);
return Collections.singletonList(
new CfInvoke(Opcodes.INVOKESTATIC, outlinedAPIConversion, false));
}
return rewriteLibraryInvokeToInlineAPIConversion(
- invoke, methodProcessingContext, localStackAllocator, eventConsumer);
+ invoke, methodProcessingContext, localStackAllocator, eventConsumer, context);
}
// If the option is set, we try to outline API conversions as much as possible to reduce the
@@ -354,11 +356,13 @@
CfInvoke invoke,
MethodProcessingContext methodProcessingContext,
LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer) {
+ CfInstructionDesugaringEventConsumer eventConsumer,
+ ProgramMethod context) {
DexMethod invokedMethod = invoke.getMethod();
- DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer);
- DexMethod[] parameterConversions = computeParameterConversions(invokedMethod, eventConsumer);
+ DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer, context);
+ DexMethod[] parameterConversions =
+ computeParameterConversions(invokedMethod, eventConsumer, context);
// If only the last 2 parameters require conversion, we do everything inlined.
// If other parameters require conversion, we outline the parameter conversion but keep the API
@@ -502,14 +506,16 @@
private DexMethod createOutlinedAPIConversion(
CfInvoke invoke,
MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringEventConsumer eventConsumer) {
+ CfInstructionDesugaringEventConsumer eventConsumer,
+ ProgramMethod context) {
DexMethod invokedMethod = invoke.getMethod();
DexProto newProto =
invoke.isInvokeStatic()
? invokedMethod.proto
: factory.prependTypeToProto(invokedMethod.getHolderType(), invokedMethod.getProto());
- DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer);
- DexMethod[] parameterConversions = computeParameterConversions(invokedMethod, eventConsumer);
+ DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer, context);
+ DexMethod[] parameterConversions =
+ computeParameterConversions(invokedMethod, eventConsumer, context);
ProgramMethod outline =
appView
.getSyntheticItems()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
index 4269366..6aed582 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldAccessFlags;
import com.android.tools.r8.graph.MethodAccessFlags;
+import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaring;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer;
@@ -32,6 +33,9 @@
import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterVivifiedWrapperCfCodeProvider;
import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperCfCodeProvider;
import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperConversionCfCodeProvider;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.MethodPosition;
+import com.android.tools.r8.position.Position;
import com.android.tools.r8.synthesis.SyntheticClassBuilder;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
@@ -109,13 +113,17 @@
}
public boolean shouldConvert(DexType type, DexMethod method) {
+ return shouldConvert(type, method, null);
+ }
+
+ public boolean shouldConvert(DexType type, DexMethod method, ProgramMethod context) {
if (!appView.rewritePrefix.hasRewrittenType(type, appView)) {
return false;
}
if (canConvert(type)) {
return true;
}
- reportInvalidInvoke(type, method);
+ reportInvalidInvoke(type, method, context);
return false;
}
@@ -173,8 +181,11 @@
|| canGenerateWrapper(type);
}
- private void reportInvalidInvoke(DexType type, DexMethod invokedMethod) {
+ private void reportInvalidInvoke(DexType type, DexMethod invokedMethod, ProgramMethod context) {
DexType desugaredType = appView.rewritePrefix.rewrittenType(type, appView);
+ Origin origin = context != null ? context.getOrigin() : Origin.unknown();
+ Position position =
+ context != null ? new MethodPosition(context.getMethodReference()) : Position.UNKNOWN;
StringDiagnostic diagnostic =
new StringDiagnostic(
"Invoke to "
@@ -183,7 +194,9 @@
+ invokedMethod.name
+ " may not work correctly at runtime (Cannot convert type "
+ desugaredType
- + ").");
+ + ").",
+ origin,
+ position);
if (appView.options().isDesugaredLibraryCompilation()) {
throw appView.options().reporter.fatalError(diagnostic);
} else {
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
index 23e9e26..b648635 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -76,7 +76,9 @@
}
DexType dexType = clazz.type;
if (isAnnotation(dexType) && isAnnotationWithEnum(dexType)) {
- addAnnotationsWithEnum(clazz);
+ if (isVisibleAnnotation(clazz)) {
+ addAnnotationsWithEnum(clazz);
+ }
continue;
}
// Classes with annotations must be in the same dex file as the annotation. As all
@@ -93,6 +95,23 @@
}
}
+ private boolean isVisibleAnnotation(DexProgramClass clazz) {
+ if (retainCompileTimeAnnotation(clazz.type)) {
+ return true;
+ }
+ DexAnnotation retentionAnnotation =
+ clazz.annotations().getFirstMatching(appView.dexItemFactory().retentionType);
+ // Default is CLASS retention
+ if (retentionAnnotation == null) {
+ return false;
+ }
+ return retentionAnnotation.annotation.toString().contains("RUNTIME");
+ }
+
+ private boolean retainCompileTimeAnnotation(DexType type) {
+ return DexAnnotation.retainCompileTimeAnnotation(type, appView.options());
+ }
+
private boolean isAnnotationWithEnum(DexType dexType) {
Boolean value = annotationTypeContainEnum.get(dexType);
if (value == null) {
@@ -109,15 +128,18 @@
if (proto.parameters.isEmpty()) {
DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
if (valueType.isClassType()) {
- if (isEnum(valueType)) {
- value = true;
- break;
- } else if (isAnnotation(valueType) && isAnnotationWithEnum(valueType)) {
- value = true;
- break;
- }
+ assert !value;
+ boolean notLibraryOrTakeBootClasspath =
+ !appInfo().definitionFor(valueType).isLibraryClass()
+ || !appView.options().ignoreBootClasspathEnumsForMaindexTracing;
+ value =
+ (isEnum(valueType) && notLibraryOrTakeBootClasspath)
+ || (isAnnotation(valueType) && isAnnotationWithEnum(valueType));
}
}
+ if (value) {
+ break;
+ }
}
}
annotationTypeContainEnum.put(dexType, value);
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 78aab7d..0fdc11c 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -518,7 +518,11 @@
// Skipping min_api check and compiling an intermediate result intended for later merging.
// Intermediate builds also emits or update synthesized classes mapping.
public boolean intermediate = false;
- public boolean readCompileTimeAnnotations = true;
+ public boolean retainCompileTimeAnnotations = true;
+ public boolean ignoreBootClasspathEnumsForMaindexTracing =
+ System.getProperty("com.android.tools.r8.ignoreBootClasspathEnumsForMaindexTracing") != null;
+ public boolean pruneNonVissibleAnnotationClasses =
+ System.getProperty("com.android.tools.r8.pruneNonVissibleAnnotationClasses") != null;
public List<String> logArgumentsFilter = ImmutableList.of();
// Flag to turn on/offLoad/store optimization in the Cf back-end.
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
index 634cfe8..853c057 100644
--- a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
@@ -32,6 +32,12 @@
});
}
+ public final GenerateMainDexListRunResult inspectMainDexClasses(
+ Consumer<List<ClassReference>> consumer) {
+ consumer.accept(getMainDexList());
+ return self();
+ }
+
public GenerateMainDexListRunResult inspectDiagnosticMessages(
Consumer<TestDiagnosticMessages> consumer) {
consumer.accept(state.getDiagnosticsMessages());
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 0d02a13..8f3b1e4 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1342,6 +1342,14 @@
D8.runForTesting(command.getInputApp(), internalOptions);
}
+ public static List<String> runGenerateMainDexList(
+ GenerateMainDexListCommand command, Consumer<InternalOptions> optionsConsumer)
+ throws CompilationFailedException {
+ InternalOptions internalOptions = command.getInternalOptions();
+ optionsConsumer.accept(internalOptions);
+ return GenerateMainDexList.runForTesting(command.getInputApp(), internalOptions);
+ }
+
public static AndroidApp runDexer(String fileName, String outDir, String... extraArgs)
throws IOException {
List<String> args = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java
new file mode 100644
index 0000000..9d5f2f1
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java
@@ -0,0 +1,162 @@
+// 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.maindexlist;
+
+import static com.android.tools.r8.maindexlist.MainDexRuntimeAndProgramEnumInAnnotationTest.EnumForAnnotation.TEST;
+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.references.Reference;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+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 MainDexRuntimeAndProgramEnumInAnnotationTest extends TestBase {
+
+ Set<Class<?>> CUSTOM_CLASSES =
+ ImmutableSet.of(
+ B.class,
+ Main.class,
+ EnumForAnnotation.class,
+ RuntimeRetentionAnnotationWithProgramEnum.class);
+ Set<Class<?>> DEFAULT_CLASSES =
+ Sets.union(
+ CUSTOM_CLASSES,
+ ImmutableSet.of(
+ C.class,
+ RuntimeRetentionAnnotationWithRuntimeEnum.class,
+ RuntimeRetentionAnnotationWithoutEnum.class));
+
+ @Parameter(0)
+ public TestParameters parameters;
+
+ @Parameter(1)
+ public boolean ignoreBootclasspathEnumsForMaindexTracing;
+
+ @Parameters(name = "{0}, ignoreBootclasspathEnumsForMaindexTracing: {1}")
+ public static List<Object[]> parameters() {
+ return buildParameters(
+ getTestParameters()
+ .withDexRuntimes()
+ .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
+ .build(),
+ BooleanUtils.values());
+ }
+
+ @Test
+ public void testMainDex() throws Exception {
+ testForMainDexListGenerator(temp)
+ .addInnerClasses(getClass())
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .addMainDexRules(
+ "-keep class " + Main.class.getTypeName() + " {",
+ " public static void main(java.lang.String[]);",
+ "}")
+ .applyIf(
+ ignoreBootclasspathEnumsForMaindexTracing,
+ builder ->
+ builder.addOptionsModification(
+ options -> {
+ options.ignoreBootClasspathEnumsForMaindexTracing = true;
+ }))
+ .run()
+ .inspectMainDexClasses(
+ mainDexList -> {
+ assertEquals(
+ (ignoreBootclasspathEnumsForMaindexTracing ? CUSTOM_CLASSES : DEFAULT_CLASSES)
+ .stream().map(Reference::classFromClass).collect(Collectors.toSet()),
+ new HashSet<>(mainDexList));
+ });
+ }
+
+ @Test
+ public void testD8() throws Exception {
+ testForD8(temp)
+ .addInnerClasses(getClass())
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .setMinApi(parameters.getApiLevel())
+ .applyIf(
+ ignoreBootclasspathEnumsForMaindexTracing,
+ builder ->
+ builder.addOptionsModification(
+ options -> options.ignoreBootClasspathEnumsForMaindexTracing = true))
+ .collectMainDexClasses()
+ .addMainDexRules(
+ "-keep class " + Main.class.getTypeName() + " {",
+ " public static void main(java.lang.String[]);",
+ "}")
+ .compile()
+ .inspectMainDexClasses(
+ mainDexClasses -> {
+ assertEquals(
+ (ignoreBootclasspathEnumsForMaindexTracing ? CUSTOM_CLASSES : DEFAULT_CLASSES)
+ .stream().map(TestBase::typeName).collect(Collectors.toSet()),
+ mainDexClasses);
+ });
+ }
+
+ public enum EnumForAnnotation {
+ TEST
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.TYPE)
+ public @interface RuntimeRetentionAnnotationWithoutEnum {}
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.TYPE)
+ public @interface RuntimeRetentionAnnotationWithProgramEnum {
+
+ EnumForAnnotation value() default TEST;
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.TYPE)
+ public @interface RuntimeRetentionAnnotationWithRuntimeEnum {
+
+ ElementType value();
+ }
+
+ @RuntimeRetentionAnnotationWithoutEnum
+ public static class A {
+
+ public static void main(String[] args) {}
+ }
+
+ @RuntimeRetentionAnnotationWithProgramEnum
+ public static class B {
+
+ public static void main(String[] args) {}
+ }
+
+ @RuntimeRetentionAnnotationWithRuntimeEnum(ElementType.TYPE)
+ public static class C {
+
+ public static void main(String[] args) {}
+ }
+
+ public static class Main {
+
+ public static void main(String[] args) {
+ System.out.println("Hello, world!");
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
index 74cc91d..089f670 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
@@ -8,11 +8,9 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
-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.BooleanUtils;
import com.google.common.collect.ImmutableSet;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -21,82 +19,106 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
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 MainDexSourceAndClassRetentionTest extends TestBase {
- private final TestParameters parameters;
+ private static final Set<Class<?>> MAINDEX_CLASSES = ImmutableSet.of(Main.class);
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters()
- .withDexRuntimes()
- .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
- .build();
- }
+ @Parameter(0)
+ public TestParameters parameters;
- public MainDexSourceAndClassRetentionTest(TestParameters parameters) {
- this.parameters = parameters;
+ @Parameter(1)
+ public boolean pruneNonVisibleAnnotationClasses;
+
+ @Parameters(name = "{0}, pruneNonVisibleAnnotationClasses: {1}")
+ public static List<Object[]> parameters() {
+ return buildParameters(
+ getTestParameters()
+ .withDexRuntimes()
+ .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
+ .build(),
+ BooleanUtils.values());
}
@Test
public void testMainDex() throws Exception {
- List<ClassReference> mainDexList =
- testForMainDexListGenerator(temp)
- .addInnerClasses(getClass())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.B))
- .addMainDexRules(
- "-keep class " + Main.class.getTypeName() + " {",
- " public static void main(java.lang.String[]);",
- "}")
- .run()
- .getMainDexList();
- // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included.
- assertEquals(
- ImmutableSet.of(
- Reference.classFromClass(Foo.class),
- Reference.classFromClass(Bar.class),
- Reference.classFromClass(Main.class),
- Reference.classFromClass(ClassRetentionAnnotation.class),
- Reference.classFromClass(SourceRetentionAnnotation.class)),
- new HashSet<>(mainDexList));
+ testForMainDexListGenerator(temp)
+ .addInnerClasses(getClass())
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .addMainDexRules(
+ "-keep class " + Main.class.getTypeName() + " {",
+ " public static void main(java.lang.String[]);",
+ "}")
+ .applyIf(
+ pruneNonVisibleAnnotationClasses,
+ builder -> {
+ builder.addOptionsModification(
+ options -> options.pruneNonVissibleAnnotationClasses = true);
+ })
+ .run()
+ .inspectMainDexClasses(
+ mainDexList -> {
+ assertEquals(
+ MAINDEX_CLASSES.stream()
+ .map(Reference::classFromClass)
+ .collect(Collectors.toSet()),
+ new HashSet<>(mainDexList));
+ });
}
@Test
public void testD8() throws Exception {
- Set<String> mainDexClasses =
- testForD8(temp)
- .addInnerClasses(getClass())
- .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
- .setMinApi(parameters.getApiLevel())
- .collectMainDexClasses()
- .addMainDexRules(
- "-keep class " + Main.class.getTypeName() + " {",
- " public static void main(java.lang.String[]);",
- "}")
- .compile()
- .getMainDexClasses();
- // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included.
- assertEquals(
- ImmutableSet.of(
- typeName(Foo.class),
- typeName(Bar.class),
- typeName(Main.class),
- typeName(ClassRetentionAnnotation.class),
- typeName(SourceRetentionAnnotation.class)),
- mainDexClasses);
+ testForD8(temp)
+ .addInnerClasses(getClass())
+ .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+ .setMinApi(parameters.getApiLevel())
+ .applyIf(
+ pruneNonVisibleAnnotationClasses,
+ builder -> {
+ builder.addOptionsModification(
+ options -> options.pruneNonVissibleAnnotationClasses = true);
+ })
+ .collectMainDexClasses()
+ .addMainDexRules(
+ "-keep class " + Main.class.getTypeName() + " {",
+ " public static void main(java.lang.String[]);",
+ "}")
+ .allowStdoutMessages()
+ .compile()
+ .inspect(
+ inspector -> {
+ // Source and class retention annotation classes are still in the output, but does not
+ // annotate anything.
+ assertEquals(
+ pruneNonVisibleAnnotationClasses,
+ !inspector.clazz(SourceRetentionAnnotation.class).isPresent());
+ assertEquals(
+ pruneNonVisibleAnnotationClasses,
+ !inspector.clazz(ClassRetentionAnnotation.class).isPresent());
+ assertEquals(0, inspector.clazz(Main.class).annotations().size());
+ assertEquals(0, inspector.clazz(A.class).annotations().size());
+ })
+ .inspectMainDexClasses(
+ mainDexClasses -> {
+ assertEquals(
+ MAINDEX_CLASSES.stream().map(TestBase::typeName).collect(Collectors.toSet()),
+ new HashSet<>(mainDexClasses));
+ });
}
public enum Foo {
- TEST;
+ TEST
}
public enum Bar {
- TEST;
+ TEST
}
@Retention(RetentionPolicy.SOURCE)
@@ -115,6 +137,13 @@
@SourceRetentionAnnotation(Foo.TEST)
@ClassRetentionAnnotation(Bar.TEST)
+ public static class A {
+
+ public static void main(String[] args) {}
+ }
+
+ @SourceRetentionAnnotation(Foo.TEST)
+ @ClassRetentionAnnotation(Bar.TEST)
public static class Main {
public static void main(String[] args) {}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 4ea9a82..2d74926 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -110,6 +110,11 @@
}
@Override
+ public List<AnnotationSubject> annotations() {
+ throw new Unreachable("Cannot determine if an absent class has annotations");
+ }
+
+ @Override
public AnnotationSubject annotation(String name) {
return new AbsentAnnotationSubject();
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
index 6d7067a..8d91f3c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.naming.MemberNaming.Signature;
import com.android.tools.r8.references.FieldReference;
+import java.util.List;
public class AbsentFieldSubject extends FieldSubject {
@@ -59,6 +60,11 @@
}
@Override
+ public List<AnnotationSubject> annotations() {
+ throw new Unreachable("Cannot determine if an absent field has annotations");
+ }
+
+ @Override
public AnnotationSubject annotation(String name) {
return new AbsentAnnotationSubject();
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
index 9299e7f..4ffcdb4 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.naming.MemberNaming.Signature;
+import java.util.List;
public class AbsentMethodSubject extends MethodSubject {
@@ -116,6 +117,11 @@
}
@Override
+ public List<AnnotationSubject> annotations() {
+ throw new Unreachable("Cannot determine if an absent method has annotations");
+ }
+
+ @Override
public AnnotationSubject annotation(String name) {
return new AbsentAnnotationSubject();
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
index 2dc0774..754b470 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
@@ -6,9 +6,12 @@
import com.android.tools.r8.graph.AccessFlags;
import java.lang.annotation.Annotation;
+import java.util.List;
public abstract class ClassOrMemberSubject extends Subject {
+ public abstract List<AnnotationSubject> annotations();
+
public abstract AnnotationSubject annotation(String name);
public final AnnotationSubject annotation(Class<? extends Annotation> clazz) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 318f0d9..a0839d8 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -349,6 +349,15 @@
}
@Override
+ public List<AnnotationSubject> annotations() {
+ List<AnnotationSubject> result = new ArrayList<>();
+ for (DexAnnotation annotation : dexClass.annotations().annotations) {
+ result.add(new FoundAnnotationSubject(annotation));
+ }
+ return result;
+ }
+
+ @Override
public AnnotationSubject annotation(String name) {
// Ensure we don't check for annotations represented as attributes.
assert !name.endsWith("EnclosingClass")
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
index 023c088..2ea0107 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.utils.codeinspector;
+import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.graph.AccessFlags;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexEncodedField;
@@ -15,6 +16,7 @@
import com.android.tools.r8.naming.signature.GenericSignatureParser;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.Reference;
+import java.util.List;
public class FoundFieldSubject extends FieldSubject {
@@ -112,6 +114,11 @@
}
@Override
+ public List<AnnotationSubject> annotations() {
+ throw new Unimplemented();
+ }
+
+ @Override
public AnnotationSubject annotation(String name) {
DexAnnotation annotation = codeInspector.findAnnotation(name, dexField.annotations());
return annotation == null
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index d781ef5..7c882b4 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -325,6 +325,11 @@
}
@Override
+ public List<AnnotationSubject> annotations() {
+ throw new Unimplemented();
+ }
+
+ @Override
public AnnotationSubject annotation(String name) {
DexAnnotation annotation = codeInspector.findAnnotation(name, dexMethod.annotations());
return annotation == null
diff --git a/third_party/bazel.tar.gz.sha1 b/third_party/bazel.tar.gz.sha1
index b1968d5..1bf5a5d 100644
--- a/third_party/bazel.tar.gz.sha1
+++ b/third_party/bazel.tar.gz.sha1
@@ -1 +1 @@
-83891f00eacc568434eb59a43ba2ee31ac5c4342
\ No newline at end of file
+5b62e958e734266ebf0e136ee23e440a99b508e1
\ No newline at end of file
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index 64f4609..4e9a38b 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-112c4e2bbfdd1e825ee02a98416ba385ad5433d0
\ No newline at end of file
+ae9eb01960d396ab603c611960f456d14ce7a1a8
\ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index d2c1ef1..a44524e 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -33,6 +33,10 @@
def ParseOptions(argv):
result = optparse.OptionParser()
+ result.add_option('--variant',
+ help='.',
+ choices = ['jdk8', 'jdk11'],
+ default='jdk8')
result.add_option('--dry-run', '--dry_run',
help='Running on bot, use third_party dependency.',
default=False,
@@ -90,7 +94,11 @@
raise Exception('Variant ' + variant + 'is not supported')
with utils.ChangedWorkingDirectory(checkout_dir):
bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel')
- cmd = [bazel, 'build', 'maven_release' + ('_jdk11' if variant == 'jdk11' else '')]
+ cmd = [
+ bazel,
+ '--bazelrc=/dev/null',
+ 'build',
+ 'maven_release' + ('_jdk11' if variant == 'jdk11' else '')]
utils.PrintCmd(cmd)
subprocess.check_call(cmd)
cmd = [bazel, 'shutdown']
@@ -108,7 +116,7 @@
maven_zip = os.path.join(
checkout_dir,
'bazel-bin',
- LIBRARY_NAME + ('_jdk11' if variant != 'jdk11' else '') +'.zip')
+ LIBRARY_NAME + ('_jdk11' if variant == 'jdk11' else '') +'.zip')
return (library_jar, maven_zip)
@@ -138,7 +146,7 @@
if options.build_only:
with utils.TempDir() as checkout_dir:
CloneDesugaredLibrary(options.github_account, checkout_dir)
- (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, "jdk8")
+ (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant)
shutil.copyfile(
library_jar,
os.path.join(options.build_only, os.path.basename(library_jar)))
@@ -160,7 +168,7 @@
raise Exception(
'Target archive directory %s already exists' % destination)
- (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, "jdk8")
+ (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant)
storage_path = LIBRARY_NAME + '/' + version
# Upload the jar file with the library.