Reland "Report warning if unable to reflectively read kotlin metadata message"
This reverts commit e9d337722d6ec88093847378a0dcb96e04fe4aa6.
Bug: 185756596
Change-Id: I6347c349fd6524bb9fe97d9e65f43d2ae671315f
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index c3bb323..2e78e71 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -88,12 +88,14 @@
String packageName,
int[] metadataVersion,
DexClass hostClass,
- DexItemFactory factory,
- Reporter reporter,
+ AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
+ DexItemFactory factory = appView.dexItemFactory();
+ Reporter reporter = appView.reporter();
KmClass kmClass = metadata.toKmClass();
KotlinJvmSignatureExtensionInformation extensionInformation =
- KotlinJvmSignatureExtensionInformation.readInformationFromMessage(metadata);
+ KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
+ metadata, appView.options());
Map<String, DexEncodedField> fieldMap = new HashMap<>();
for (DexEncodedField field : hostClass.fields()) {
fieldMap.put(toJvmFieldSignature(field.getReference()).asString(), field);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
index cb0a7e8..15d8bb4 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -19,7 +19,6 @@
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexValue.DexValueArray;
import com.android.tools.r8.kotlin.KotlinSyntheticClassInfo.Flavour;
-import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.StringDiagnostic;
import java.util.IdentityHashMap;
import java.util.Map;
@@ -35,43 +34,43 @@
public final class KotlinClassMetadataReader {
public static KotlinClassLevelInfo getKotlinInfo(
- Kotlin kotlin,
- DexClass clazz,
- DexItemFactory factory,
- Reporter reporter,
- Consumer<DexEncodedMethod> keepByteCode) {
- DexAnnotation meta = clazz.annotations().getFirstMatching(factory.kotlinMetadataType);
+ DexClass clazz, AppView<?> appView, Consumer<DexEncodedMethod> keepByteCode) {
+ DexAnnotation meta =
+ clazz.annotations().getFirstMatching(appView.dexItemFactory().kotlinMetadataType);
if (meta != null) {
- return getKotlinInfo(kotlin, clazz, factory, reporter, keepByteCode, meta);
+ return getKotlinInfo(clazz, appView, keepByteCode, meta);
}
return NO_KOTLIN_INFO;
}
public static KotlinClassLevelInfo getKotlinInfo(
- Kotlin kotlin,
DexClass clazz,
- DexItemFactory factory,
- Reporter reporter,
+ AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode,
DexAnnotation annotation) {
try {
+ Kotlin kotlin = appView.dexItemFactory().kotlin;
KotlinClassMetadata kMetadata = toKotlinClassMetadata(kotlin, annotation.annotation);
- return createKotlinInfo(kotlin, clazz, kMetadata, factory, reporter, keepByteCode);
+ return createKotlinInfo(kotlin, clazz, kMetadata, appView, keepByteCode);
} catch (ClassCastException | InconsistentKotlinMetadataException | MetadataError e) {
- reporter.info(
- new StringDiagnostic(
- "Class "
- + clazz.type.toSourceString()
- + " has malformed kotlin.Metadata: "
- + e.getMessage()));
+ appView
+ .reporter()
+ .info(
+ new StringDiagnostic(
+ "Class "
+ + clazz.type.toSourceString()
+ + " has malformed kotlin.Metadata: "
+ + e.getMessage()));
return INVALID_KOTLIN_INFO;
} catch (Throwable e) {
- reporter.info(
- new StringDiagnostic(
- "Unexpected error while reading "
- + clazz.type.toSourceString()
- + "'s kotlin.Metadata: "
- + e.getMessage()));
+ appView
+ .reporter()
+ .info(
+ new StringDiagnostic(
+ "Unexpected error while reading "
+ + clazz.type.toSourceString()
+ + "'s kotlin.Metadata: "
+ + e.getMessage()));
return INVALID_KOTLIN_INFO;
}
}
@@ -135,8 +134,7 @@
Kotlin kotlin,
DexClass clazz,
KotlinClassMetadata kMetadata,
- DexItemFactory factory,
- Reporter reporter,
+ AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
String packageName = kMetadata.getHeader().getPackageName();
int[] metadataVersion = kMetadata.getHeader().getMetadataVersion();
@@ -146,23 +144,16 @@
packageName,
metadataVersion,
clazz,
- factory,
- reporter,
+ appView,
keepByteCode);
} else if (kMetadata instanceof KotlinClassMetadata.FileFacade) {
// e.g., B.kt becomes class `BKt`
return KotlinFileFacadeInfo.create(
- (FileFacade) kMetadata,
- packageName,
- metadataVersion,
- clazz,
- factory,
- reporter,
- keepByteCode);
+ (FileFacade) kMetadata, packageName, metadataVersion, clazz, appView, keepByteCode);
} else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassFacade) {
// multi-file class with the same @JvmName.
return KotlinMultiFileClassFacadeInfo.create(
- (MultiFileClassFacade) kMetadata, packageName, metadataVersion, factory);
+ (MultiFileClassFacade) kMetadata, packageName, metadataVersion, appView.dexItemFactory());
} else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassPart) {
// A single file, which is part of multi-file class.
return KotlinMultiFileClassPartInfo.create(
@@ -170,8 +161,7 @@
packageName,
metadataVersion,
clazz,
- factory,
- reporter,
+ appView,
keepByteCode);
} else if (kMetadata instanceof KotlinClassMetadata.SyntheticClass) {
return KotlinSyntheticClassInfo.create(
@@ -180,8 +170,7 @@
metadataVersion,
clazz,
kotlin,
- factory,
- reporter);
+ appView);
} else {
throw new MetadataError("unsupported 'k' value: " + kMetadata.getHeader().getKind());
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
index abb6ff1..6d1d831 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -8,9 +8,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.naming.NamingLens;
-import com.android.tools.r8.utils.Reporter;
import java.util.function.Consumer;
import kotlinx.metadata.KmPackage;
import kotlinx.metadata.jvm.KotlinClassHeader;
@@ -36,15 +34,14 @@
String packageName,
int[] metadataVersion,
DexClass clazz,
- DexItemFactory factory,
- Reporter reporter,
+ AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
KmPackage kmPackage = kmFileFacade.toKmPackage();
KotlinJvmSignatureExtensionInformation extensionInformation =
- KotlinJvmSignatureExtensionInformation.readInformationFromMessage(kmFileFacade);
+ KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
+ kmFileFacade, appView.options());
return new KotlinFileFacadeInfo(
- KotlinPackageInfo.create(
- kmPackage, clazz, factory, reporter, keepByteCode, extensionInformation),
+ KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode, extensionInformation),
packageName,
metadataVersion);
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java
index 955c1ba..98ebaed 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.kotlin;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.ReflectionHelper;
import java.util.HashSet;
@@ -37,16 +38,17 @@
}
public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
- FileFacade fileFacadeMetadata) {
- return readPackageDataFromMessage(fileFacadeMetadata);
+ FileFacade fileFacadeMetadata, InternalOptions options) {
+ return readPackageDataFromMessage(fileFacadeMetadata, options);
}
public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
- MultiFileClassPart classPart) {
- return readPackageDataFromMessage(classPart);
+ MultiFileClassPart classPart, InternalOptions options) {
+ return readPackageDataFromMessage(classPart, options);
}
- private static KotlinJvmSignatureExtensionInformation readPackageDataFromMessage(Object object) {
+ private static KotlinJvmSignatureExtensionInformation readPackageDataFromMessage(
+ Object object, InternalOptions options) {
try {
Pair<?, ProtoBuf.Package> kotlinPairData =
ReflectionHelper.performReflection(
@@ -61,12 +63,13 @@
.build());
return builder().visit(kotlinPairData.getSecond()).build();
} catch (Exception e) {
+ options.warningReadingKotlinMetadataReflective();
return empty();
}
}
public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
- SyntheticClass syntheticClass) {
+ SyntheticClass syntheticClass, InternalOptions options) {
try {
Pair<?, ProtoBuf.Function> kotlinPairData =
ReflectionHelper.performReflection(
@@ -84,12 +87,13 @@
}
return builder().visit(kotlinPairData.getSecond(), 0).build();
} catch (Exception e) {
+ options.warningReadingKotlinMetadataReflective();
return empty();
}
}
public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
- KotlinClassMetadata.Class kMetadata) {
+ KotlinClassMetadata.Class kMetadata, InternalOptions options) {
try {
Pair<?, ProtoBuf.Class> kotlinPairData =
ReflectionHelper.performReflection(
@@ -104,6 +108,7 @@
.build());
return builder().visit(kotlinPairData.getSecond()).build();
} catch (Exception e) {
+ options.warningReadingKotlinMetadataReflective();
return empty();
}
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index d092bff..2fc43a7 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -73,11 +73,7 @@
} else {
clazz.setKotlinInfo(
KotlinClassMetadataReader.getKotlinInfo(
- appView.dexItemFactory().kotlin,
- clazz,
- appView.dexItemFactory(),
- appView.options().reporter,
- method -> keepByteCodeFunctions.add(method.getReference())));
+ clazz, appView, method -> keepByteCodeFunctions.add(method.getReference())));
if (clazz.getEnclosingMethodAttribute() != null
&& clazz.getEnclosingMethodAttribute().getEnclosingMethod() != null) {
localOrAnonymousClasses.add(clazz);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index ee582bb..fb12564 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -20,7 +20,6 @@
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.ConsumerUtils;
-import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.List;
@@ -131,8 +130,6 @@
if (lens.isIdentityLens()) {
return;
}
- final Kotlin kotlin = factory.kotlin;
- final Reporter reporter = appView.options().reporter;
final WriteMetadataFieldInfo writeMetadataFieldInfo = WriteMetadataFieldInfo.rewriteAll();
ThreadUtils.processItems(
appView.appInfo().classes(),
@@ -141,9 +138,9 @@
if (metadata == null) {
return;
}
- final KotlinClassLevelInfo kotlinInfo =
+ KotlinClassLevelInfo kotlinInfo =
KotlinClassMetadataReader.getKotlinInfo(
- kotlin, clazz, factory, reporter, ConsumerUtils.emptyConsumer(), metadata);
+ clazz, appView, ConsumerUtils.emptyConsumer(), metadata);
if (kotlinInfo == NO_KOTLIN_INFO) {
return;
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
index e0db449..ba56b39 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -8,9 +8,7 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.naming.NamingLens;
-import com.android.tools.r8.utils.Reporter;
import java.util.function.Consumer;
import kotlinx.metadata.KmPackage;
import kotlinx.metadata.jvm.KotlinClassHeader;
@@ -42,16 +40,15 @@
String packageName,
int[] metadataVersion,
DexClass clazz,
- DexItemFactory factory,
- Reporter reporter,
+ AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
KmPackage kmPackage = classPart.toKmPackage();
KotlinJvmSignatureExtensionInformation extensionInformation =
- KotlinJvmSignatureExtensionInformation.readInformationFromMessage(classPart);
+ KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
+ classPart, appView.options());
return new KotlinMultiFileClassPartInfo(
classPart.getFacadeClassName(),
- KotlinPackageInfo.create(
- kmPackage, clazz, factory, reporter, keepByteCode, extensionInformation),
+ KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode, extensionInformation),
packageName,
metadataVersion);
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
index 397d0fa..28b81fa 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
@@ -12,10 +12,8 @@
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
-import com.android.tools.r8.utils.Reporter;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
@@ -42,8 +40,7 @@
public static KotlinPackageInfo create(
KmPackage kmPackage,
DexClass clazz,
- DexItemFactory factory,
- Reporter reporter,
+ AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode,
KotlinJvmSignatureExtensionInformation extensionInformation) {
Map<String, DexEncodedField> fieldMap = new HashMap<>();
@@ -57,9 +54,17 @@
return new KotlinPackageInfo(
JvmExtensionsKt.getModuleName(kmPackage),
KotlinDeclarationContainerInfo.create(
- kmPackage, methodMap, fieldMap, factory, reporter, keepByteCode, extensionInformation),
+ kmPackage,
+ methodMap,
+ fieldMap,
+ appView.dexItemFactory(),
+ appView.reporter(),
+ keepByteCode,
+ extensionInformation),
KotlinLocalDelegatedPropertyInfo.create(
- JvmExtensionsKt.getLocalDelegatedProperties(kmPackage), factory, reporter));
+ JvmExtensionsKt.getLocalDelegatedProperties(kmPackage),
+ appView.dexItemFactory(),
+ appView.reporter()));
}
public void rewrite(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
index b2381de..898d28c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -7,9 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
-import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.naming.NamingLens;
-import com.android.tools.r8.utils.Reporter;
import kotlinx.metadata.KmLambda;
import kotlinx.metadata.jvm.KotlinClassHeader;
import kotlinx.metadata.jvm.KotlinClassMetadata;
@@ -45,15 +43,16 @@
int[] metadataVersion,
DexClass clazz,
Kotlin kotlin,
- DexItemFactory factory,
- Reporter reporter) {
+ AppView<?> appView) {
KmLambda lambda = syntheticClass.toKmLambda();
assert lambda == null || syntheticClass.isLambda();
KotlinJvmSignatureExtensionInformation extensionInformation =
- KotlinJvmSignatureExtensionInformation.readInformationFromMessage(syntheticClass);
+ KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
+ syntheticClass, appView.options());
return new KotlinSyntheticClassInfo(
lambda != null
- ? KotlinLambdaInfo.create(clazz, lambda, factory, reporter, extensionInformation)
+ ? KotlinLambdaInfo.create(
+ clazz, lambda, appView.dexItemFactory(), appView.reporter(), extensionInformation)
: null,
getFlavour(syntheticClass, clazz, kotlin),
packageName,
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 f0aeb2f..d868ed1 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -81,6 +81,7 @@
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
@@ -815,6 +816,8 @@
/** A set of dexitems we have reported missing to dedupe warnings. */
private final Set<DexItem> reportedMissingForDesugaring = Sets.newConcurrentHashSet();
+ private final AtomicBoolean reportedErrorReadingKotlinMetadataReflectively =
+ new AtomicBoolean(false);
private final Set<DexItem> invalidLibraryClasses = Sets.newConcurrentHashSet();
public RuntimeException errorMissingNestHost(DexClass clazz) {
@@ -903,6 +906,16 @@
}
}
+ public void warningReadingKotlinMetadataReflective() {
+ if (reportedErrorReadingKotlinMetadataReflectively.compareAndSet(false, true)) {
+ reporter.warning(
+ new StringDiagnostic(
+ "Could not read the kotlin metadata message reflectively which indicates the"
+ + " compiler running in the context of a Security Manager. Not being able to"
+ + " read the kotlin metadata will have a negative effect oncode size"));
+ }
+ }
+
public void warningInvalidLibrarySuperclassForDesugar(
Origin origin,
DexType libraryType,