Towards lazy parsing of kotlin metadata.

Bug: 138975804, 70169921
Change-Id: I448e4f571d62e9065628f2be81dd14fb24690b3f
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
index e25e05d..92ba6a0 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
@@ -5,10 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.DexClass;
-import kotlinx.metadata.KmClassVisitor;
-import kotlinx.metadata.KmConstructorVisitor;
-import kotlinx.metadata.KmFunctionVisitor;
-import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public class KotlinClass extends KotlinInfo<KotlinClassMetadata.Class> {
@@ -25,28 +21,10 @@
   }
 
   @Override
-  void processMetadata(KotlinClassMetadata.Class metadata) {
-    // To avoid lazy parsing/verifying metadata.
-    // TODO(jsjeon): once migration is complete, use #toKmClass and store a mutable model.
-    metadata.accept(new ClassVisitorForNonNullParameterHints());
-  }
-
-  private static class ClassVisitorForNonNullParameterHints extends KmClassVisitor {
-    @Override
-    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return null;
-    }
-
-    @Override
-    public KmConstructorVisitor visitConstructor(int ctorFlags) {
-      return null;
-    }
-
-    @Override
-    public KmPropertyVisitor visitProperty(
-        int propertyFlags, String name, int getterFlags, int setterFlags) {
-      return null;
-    }
+  void processMetadata() {
+    assert !isProcessed;
+    isProcessed = true;
+    // TODO(b/70169921): once migration is complete, use #toKmClass and store a mutable model.
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
index de8a12a..0bd545c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
@@ -20,8 +20,10 @@
   }
 
   @Override
-  void processMetadata(KotlinClassMetadata.MultiFileClassFacade metadata) {
-    // No worries about lazy parsing/verifying, since no API to explore metadata details.
+  void processMetadata() {
+    assert !isProcessed;
+    isProcessed = true;
+    // No API to explore metadata details, hence nothing to do further.
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
index 633788f..1ae3db8 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
@@ -4,9 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import kotlinx.metadata.KmFunctionVisitor;
-import kotlinx.metadata.KmPackageVisitor;
-import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public final class KotlinClassPart extends KotlinInfo<KotlinClassMetadata.MultiFileClassPart> {
@@ -23,23 +20,10 @@
   }
 
   @Override
-  void processMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
-    // To avoid lazy parsing/verifying metadata.
-    // TODO(jsjeon): once migration is complete, use #toKmPackage and store a mutable model.
-    metadata.accept(new PackageVisitorForNonNullParameterHints());
-  }
-
-  private static class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
-    @Override
-    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return null;
-    }
-
-    @Override
-    public KmPropertyVisitor visitProperty(
-        int propertyFlags, String name, int getterFlags, int setterFlags) {
-      return null;
-    }
+  void processMetadata() {
+    assert !isProcessed;
+    isProcessed = true;
+    // TODO(b/70169921): once migration is complete, use #toKmPackage and store a mutable model.
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
index 2b4c326..c22dcdb 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
@@ -4,9 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import kotlinx.metadata.KmFunctionVisitor;
-import kotlinx.metadata.KmPackageVisitor;
-import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public final class KotlinFile extends KotlinInfo<KotlinClassMetadata.FileFacade> {
@@ -23,23 +20,10 @@
   }
 
   @Override
-  void processMetadata(KotlinClassMetadata.FileFacade metadata) {
-    // To avoid lazy parsing/verifying metadata.
-    // TODO(jsjeon): once migration is complete, use #toKmPackage and store a mutable model.
-    metadata.accept(new PackageVisitorForNonNullParameterHints());
-  }
-
-  private static class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
-    @Override
-    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return null;
-    }
-
-    @Override
-    public KmPropertyVisitor visitProperty(
-        int propertyFlags, String name, int getterFlags, int setterFlags) {
-      return null;
-    }
+  void processMetadata() {
+    assert !isProcessed;
+    isProcessed = true;
+    // TODO(b/70169921): once migration is complete, use #toKmPackage and store a mutable model.
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
index 9d7be0e..6603357 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -9,21 +9,21 @@
 
 // Provides access to kotlin information.
 public abstract class KotlinInfo<MetadataKind extends KotlinClassMetadata> {
-  MetadataKind metadata;
-  DexClass clazz;
+  final MetadataKind metadata;
+  final DexClass clazz;
+  boolean isProcessed;
 
   KotlinInfo(MetadataKind metadata) {
     this(metadata, null);
   }
 
   KotlinInfo(MetadataKind metadata, DexClass clazz) {
-    this.clazz = clazz;
-    processMetadata(metadata);
     this.metadata = metadata;
+    this.clazz = clazz;
   }
 
   // Subtypes will define how to process the given metadata.
-  abstract void processMetadata(MetadataKind metadata);
+  abstract void processMetadata();
 
   public enum Kind {
     Class, File, Synthetic, Part, Facade
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
index 12823c5..fa65464 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.DexClass;
-import kotlinx.metadata.KmFunctionVisitor;
-import kotlinx.metadata.KmLambdaVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public final class KotlinSyntheticClass extends KotlinInfo<KotlinClassMetadata.SyntheticClass> {
@@ -38,18 +36,11 @@
   }
 
   @Override
-  void processMetadata(KotlinClassMetadata.SyntheticClass metadata) {
+  void processMetadata() {
+    assert !isProcessed;
+    isProcessed = true;
     if (metadata.isLambda()) {
-      // To avoid lazy parsing/verifying metadata.
-      // TODO(jsjeon): once migration is complete, use #toKmLambda and store a mutable model.
-      metadata.accept(new LambdaVisitorForNonNullParameterHints());
-    }
-  }
-
-  private static class LambdaVisitorForNonNullParameterHints extends KmLambdaVisitor {
-    @Override
-    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return null;
+      // TODO(b/70169921): once migration is complete, use #toKmLambda and store a mutable model.
     }
   }