Verify Kotlin info is set for D8 classes in R8 partial

This changes the KotlinClassMetadataReader so that it is possible to read a kotlin.Metadata annotation without mutating any DexEncodedField or DexEncodedMethod instances.

Change-Id: Ie174f3a5c6ebddf8054082cde36dd602b88da766
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 4197ffc..4697a51 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexString;
@@ -28,6 +29,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import kotlin.Metadata;
 import kotlin.metadata.KmClass;
@@ -109,7 +111,8 @@
       String packageName,
       DexClass hostClass,
       AppView<?> appView,
-      Consumer<DexEncodedMethod> keepByteCode) {
+      Consumer<DexEncodedMethod> keepByteCode,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     DexItemFactory factory = appView.dexItemFactory();
     Reporter reporter = appView.reporter();
     KmClass kmClass = metadata.getKmClass();
@@ -131,7 +134,7 @@
       if (signature != null) {
         DexEncodedMethod method = methodMap.get(signature.toString());
         if (method != null) {
-          method.setKotlinMemberInfo(constructorInfo);
+          memberInfoConsumer.accept(method, constructorInfo);
           originalMembersWithKotlinInfo.add(method.getReference());
           continue;
         }
@@ -147,6 +150,7 @@
             factory,
             reporter,
             keepByteCode,
+            memberInfoConsumer,
             originalMembersWithKotlinInfo);
     KotlinTypeReference anonymousObjectOrigin = getAnonymousObjectOrigin(kmClass, factory);
     boolean nameCanBeDeducedFromClassOrOrigin =
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 09f0679..411c29f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.graph.DexAnnotationElement;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedAnnotation;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexString;
@@ -21,6 +22,7 @@
 import com.android.tools.r8.utils.StringDiagnostic;
 import java.util.IdentityHashMap;
 import java.util.Map;
+import java.util.function.BiConsumer;
 import java.util.function.BooleanSupplier;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -55,8 +57,27 @@
       DexAnnotation meta,
       Consumer<DexEncodedMethod> keepByteCode,
       BooleanSupplier reportUnknownMetadata) {
+    return getKotlinInfoFromAnnotation(
+        appView,
+        clazz,
+        meta,
+        keepByteCode,
+        reportUnknownMetadata,
+        (member, memberInfo) ->
+            member.accept(
+                f -> f.setKotlinMemberInfo(memberInfo.asFieldInfo()),
+                m -> m.setKotlinMemberInfo(memberInfo.asMethodInfo())));
+  }
+
+  public static KotlinClassLevelInfo getKotlinInfoFromAnnotation(
+      AppView<?> appView,
+      DexClass clazz,
+      DexAnnotation meta,
+      Consumer<DexEncodedMethod> keepByteCode,
+      BooleanSupplier reportUnknownMetadata,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     try {
-      return getKotlinInfo(appView, clazz, keepByteCode, meta);
+      return getKotlinInfo(appView, clazz, keepByteCode, meta, memberInfoConsumer);
     } catch (KotlinMetadataException e) {
       if (reportUnknownMetadata.getAsBoolean()) {
         appView.reporter().warning(KotlinMetadataDiagnostic.unknownMetadataVersion());
@@ -90,7 +111,8 @@
       AppView<?> appView,
       DexClass clazz,
       Consumer<DexEncodedMethod> keepByteCode,
-      DexAnnotation annotation)
+      DexAnnotation annotation,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer)
       throws KotlinMetadataException {
     Kotlin kotlin = appView.dexItemFactory().kotlin;
     KotlinClassMetadata kMetadata = toKotlinClassMetadata(kotlin, annotation.annotation);
@@ -98,7 +120,7 @@
       throw new KotlinMetadataException(
           new Exception("Could not parse metadata for " + clazz.toSourceString()));
     }
-    return createKotlinInfo(kotlin, clazz, kMetadata, appView, keepByteCode);
+    return createKotlinInfo(kotlin, clazz, kMetadata, appView, keepByteCode, memberInfoConsumer);
   }
 
   public static boolean isLambda(
@@ -212,7 +234,8 @@
       DexClass clazz,
       KotlinClassMetadata kMetadata,
       AppView<?> appView,
-      Consumer<DexEncodedMethod> keepByteCode) {
+      Consumer<DexEncodedMethod> keepByteCode,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     Metadata metadata = extractMetadataWithPossiblyUnsupportedMetadataVersion(kMetadata);
     String packageName = metadata.pn();
     if (kMetadata instanceof KotlinClassMetadata.Class) {
@@ -221,11 +244,12 @@
           packageName,
           clazz,
           appView,
-          keepByteCode);
+          keepByteCode,
+          memberInfoConsumer);
     } else if (kMetadata instanceof KotlinClassMetadata.FileFacade) {
       // e.g., B.kt becomes class `BKt`
       return KotlinFileFacadeInfo.create(
-          (FileFacade) kMetadata, packageName, clazz, appView, keepByteCode);
+          (FileFacade) kMetadata, packageName, clazz, appView, keepByteCode, memberInfoConsumer);
     } else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassFacade) {
       // multi-file class with the same @JvmName.
       return KotlinMultiFileClassFacadeInfo.create(
@@ -237,14 +261,16 @@
           packageName,
           clazz,
           appView,
-          keepByteCode);
+          keepByteCode,
+          memberInfoConsumer);
     } else if (kMetadata instanceof KotlinClassMetadata.SyntheticClass) {
       return KotlinSyntheticClassInfo.create(
           (KotlinClassMetadata.SyntheticClass) kMetadata,
           packageName,
           clazz,
           kotlin,
-          appView);
+          appView,
+          memberInfoConsumer);
     } else {
       throw new MetadataError("unsupported 'k' value: " + metadata.k());
     }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
index 0c28fa7..530364a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.kotlin.KotlinMetadataUtils.KmPropertyProcessor;
@@ -24,6 +25,7 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import kotlin.metadata.Attributes;
 import kotlin.metadata.KmDeclarationContainer;
@@ -60,6 +62,7 @@
       DexItemFactory factory,
       Reporter reporter,
       Consumer<DexEncodedMethod> keepByteCode,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer,
       KotlinMetadataMembersTracker originalAssignmentTracker) {
     ImmutableList.Builder<KotlinFunctionInfo> notBackedFunctions = ImmutableList.builder();
     for (KmFunction kmFunction : container.getFunctions()) {
@@ -86,7 +89,7 @@
         continue;
       }
       keepIfInline(kmFunction, method, signature, methodSignatureMap, keepByteCode);
-      method.setKotlinMemberInfo(kotlinFunctionInfo);
+      memberInfoConsumer.accept(method, kotlinFunctionInfo);
       originalAssignmentTracker.add(method.getReference());
     }
 
@@ -111,8 +114,8 @@
         if (method != null) {
           hasBacking = true;
           keepIfAccessorInline(kmProperty.getGetter(), method, keepByteCode);
-          method.setKotlinMemberInfo(
-              new KotlinPropertyInfoDelegate(kotlinPropertyInfo, PropertyType.GETTER));
+          memberInfoConsumer.accept(
+              method, new KotlinPropertyInfoDelegate(kotlinPropertyInfo, PropertyType.GETTER));
           originalAssignmentTracker.add(method.getReference());
         }
       }
@@ -122,8 +125,8 @@
         if (method != null) {
           hasBacking = true;
           keepIfAccessorInline(kmProperty.getGetter(), method, keepByteCode);
-          method.setKotlinMemberInfo(
-              new KotlinPropertyInfoDelegate(kotlinPropertyInfo, PropertyType.SETTER));
+          memberInfoConsumer.accept(
+              method, new KotlinPropertyInfoDelegate(kotlinPropertyInfo, PropertyType.SETTER));
           originalAssignmentTracker.add(method.getReference());
         }
       }
@@ -133,7 +136,8 @@
                 propertyProcessor.syntheticMethodForAnnotationsSignature().toString());
         if (method != null) {
           hasBacking = true;
-          method.setKotlinMemberInfo(
+          memberInfoConsumer.accept(
+              method,
               new KotlinPropertyInfoDelegate(
                   kotlinPropertyInfo, PropertyType.SYNTHETIC_METHOD_FOR_ANNOTATIONS));
           originalAssignmentTracker.add(method.getReference());
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFieldLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFieldLevelInfo.java
index 26a35ba..3e5db19 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFieldLevelInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFieldLevelInfo.java
@@ -6,4 +6,8 @@
 
 public interface KotlinFieldLevelInfo extends KotlinMemberLevelInfo {
 
+  @Override
+  default KotlinFieldLevelInfo asFieldInfo() {
+    return this;
+  }
 }
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 91a92cc..6b9a26c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -8,8 +8,10 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.Pair;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import kotlin.Metadata;
 import kotlin.metadata.KmPackage;
@@ -35,11 +37,12 @@
       String packageName,
       DexClass clazz,
       AppView<?> appView,
-      Consumer<DexEncodedMethod> keepByteCode) {
+      Consumer<DexEncodedMethod> keepByteCode,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     KmPackage kmPackage = kmFileFacade.getKmPackage();
     return new KotlinFileFacadeInfo(
         kmFileFacade,
-        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
+        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode, memberInfoConsumer),
         packageName);
   }
 
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 86f7b3d..0595cab 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -8,10 +8,12 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import com.android.tools.r8.utils.Reporter;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import kotlin.metadata.KmLambda;
 import kotlin.metadata.jvm.JvmExtensionsKt;
@@ -29,7 +31,11 @@
   }
 
   static KotlinLambdaInfo create(
-      DexClass clazz, KmLambda lambda, DexItemFactory factory, Reporter reporter) {
+      DexClass clazz,
+      KmLambda lambda,
+      DexItemFactory factory,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer,
+      Reporter reporter) {
     if (lambda == null) {
       assert false;
       return null;
@@ -40,7 +46,7 @@
     if (signature != null) {
       for (DexEncodedMethod method : clazz.methods()) {
         if (toJvmMethodSignature(method.getReference()).toString().equals(signature.toString())) {
-          method.setKotlinMemberInfo(kotlinFunctionInfo);
+          memberInfoConsumer.accept(method, kotlinFunctionInfo);
           return new KotlinLambdaInfo(kotlinFunctionInfo, true);
         }
       }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMemberLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMemberLevelInfo.java
index 7c6a6c1..9ad62c0 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMemberLevelInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMemberLevelInfo.java
@@ -8,6 +8,14 @@
 
 public interface KotlinMemberLevelInfo extends EnqueuerMetadataTraceable {
 
+  default KotlinFieldLevelInfo asFieldInfo() {
+    return null;
+  }
+
+  default KotlinMethodLevelInfo asMethodInfo() {
+    return null;
+  }
+
   default boolean isNoKotlinInformation() {
     return false;
   }
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 874e219..e8a830c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -8,6 +8,8 @@
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getInvalidKotlinInfo;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
 import static com.android.tools.r8.kotlin.KotlinMetadataWriter.kotlinMetadataToString;
+import static com.android.tools.r8.utils.ConsumerUtils.emptyBiConsumer;
+import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
 
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -25,7 +27,6 @@
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.graph.lens.GraphLens;
 import com.android.tools.r8.utils.BooleanBox;
-import com.android.tools.r8.utils.ConsumerUtils;
 import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.ThreadUtils;
 import java.util.ArrayList;
@@ -178,15 +179,15 @@
     }
     // In D8 of R8 partial the kotlin.Metadata annotations have already been read during trace
     // references.
-    KotlinClassLevelInfo kotlinInfo =
-        appView.options().partialSubCompilationConfiguration != null
-            ? clazz.getKotlinInfo()
-            : KotlinClassMetadataReader.getKotlinInfoFromAnnotation(
-                appView,
-                clazz,
-                metadata,
-                ConsumerUtils.emptyConsumer(),
-                reportedUnknownMetadataVersion::getAndSet);
+    KotlinClassLevelInfo kotlinInfo;
+    if (appView.options().partialSubCompilationConfiguration != null) {
+      assert verifyKotlinInfoIsSet(clazz, metadata);
+      kotlinInfo = clazz.getKotlinInfo();
+    } else {
+      kotlinInfo =
+          KotlinClassMetadataReader.getKotlinInfoFromAnnotation(
+              appView, clazz, metadata, emptyConsumer(), reportedUnknownMetadataVersion::getAndSet);
+    }
     if (kotlinInfo == getNoKotlinInfo()) {
       return;
     }
@@ -194,6 +195,15 @@
     writeKotlinInfoToAnnotation(clazz, kotlinInfo, metadata, writeMetadataFieldInfo);
   }
 
+  private boolean verifyKotlinInfoIsSet(DexProgramClass clazz, DexAnnotation metadata) {
+    assert appView.options().partialSubCompilationConfiguration != null;
+    KotlinClassLevelInfo classInfo =
+        KotlinClassMetadataReader.getKotlinInfoFromAnnotation(
+            appView, clazz, metadata, emptyConsumer(), () -> false, emptyBiConsumer());
+    assert classInfo.isNoKotlinInformation() || !clazz.getKotlinInfo().isNoKotlinInformation();
+    return true;
+  }
+
   private boolean recordMissingClassesInR8Partial(
       DexProgramClass clazz, KotlinClassLevelInfo kotlinInfo) {
     if (appView.options().partialSubCompilationConfiguration != null) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMethodLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMethodLevelInfo.java
index c7ecdf8..9c843c4 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMethodLevelInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMethodLevelInfo.java
@@ -6,4 +6,8 @@
 
 public interface KotlinMethodLevelInfo extends KotlinMemberLevelInfo {
 
+  @Override
+  default KotlinMethodLevelInfo asMethodInfo() {
+    return this;
+  }
 }
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 b127f0a..c20d801 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -8,8 +8,10 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.Pair;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import kotlin.Metadata;
 import kotlin.metadata.KmPackage;
@@ -35,10 +37,13 @@
       String packageName,
       DexClass clazz,
       AppView<?> appView,
-      Consumer<DexEncodedMethod> keepByteCode) {
+      Consumer<DexEncodedMethod> keepByteCode,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     KmPackage kmPackage = classPart.getKmPackage();
     return new KotlinMultiFileClassPartInfo(
-        classPart, KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode), packageName);
+        classPart,
+        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode, memberInfoConsumer),
+        packageName);
   }
 
   @Override
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 36bfab9..57c5d91 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
@@ -10,10 +10,12 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import kotlin.metadata.KmPackage;
 import kotlin.metadata.jvm.JvmExtensionsKt;
@@ -41,7 +43,8 @@
       KmPackage kmPackage,
       DexClass clazz,
       AppView<?> appView,
-      Consumer<DexEncodedMethod> keepByteCode) {
+      Consumer<DexEncodedMethod> keepByteCode,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     Map<String, DexEncodedField> fieldMap = new HashMap<>();
     for (DexEncodedField field : clazz.fields()) {
       fieldMap.put(toJvmFieldSignature(field.getReference()).toString(), field);
@@ -61,6 +64,7 @@
             appView.dexItemFactory(),
             appView.reporter(),
             keepByteCode,
+            memberInfoConsumer,
             originalMembersWithKotlinInfo),
         KotlinLocalDelegatedPropertyInfo.create(
             JvmExtensionsKt.getLocalDelegatedProperties(kmPackage),
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 4c34c40..48e79a9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -8,8 +8,10 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedMember;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.Pair;
+import java.util.function.BiConsumer;
 import kotlin.Metadata;
 import kotlin.metadata.KmLambda;
 import kotlin.metadata.jvm.JvmMetadataVersion;
@@ -43,13 +45,15 @@
       String packageName,
       DexClass clazz,
       Kotlin kotlin,
-      AppView<?> appView) {
+      AppView<?> appView,
+      BiConsumer<DexEncodedMember<?, ?>, KotlinMemberLevelInfo> memberInfoConsumer) {
     KmLambda lambda = syntheticClass.getKmLambda();
     assert lambda == null || syntheticClass.isLambda();
     return new KotlinSyntheticClassInfo(
         syntheticClass,
         lambda != null
-            ? KotlinLambdaInfo.create(clazz, lambda, appView.dexItemFactory(), appView.reporter())
+            ? KotlinLambdaInfo.create(
+                clazz, lambda, appView.dexItemFactory(), memberInfoConsumer, appView.reporter())
             : null,
         getFlavour(clazz, kotlin),
         packageName);