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,