[Metadata] Use kotlin jvm metadata library 0.4.1

Bug: 207481117
Bug: 208365670
Change-Id: I8ab147b6e21d7493de3c40e838f6afd1621d1530
diff --git a/build.gradle b/build.gradle
index 68b9ecd..48e01cd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -46,7 +46,7 @@
     // The kotlin version is only here to specify the kotlin language level,
     // all kotlin compilations are done in tests.
     kotlinVersion = '1.5.0'
-    kotlinExtMetadataJVMVersion = '0.3.0'
+    kotlinExtMetadataJVMVersion = '0.4.1'
     smaliVersion = '2.2b4'
     errorproneVersion = '2.3.2'
     testngVersion = '6.10'
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 9e7d703..bd8696b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -54,6 +54,7 @@
   private final int[] metadataVersion;
   private final String inlineClassUnderlyingPropertyName;
   private final KotlinTypeInfo inlineClassUnderlyingType;
+  private final int jvmFlags;
 
   // List of tracked assignments of kotlin metadata.
   private final KotlinMetadataMembersTracker originalMembersWithKotlinInfo;
@@ -77,7 +78,8 @@
       int[] metadataVersion,
       String inlineClassUnderlyingPropertyName,
       KotlinTypeInfo inlineClassUnderlyingType,
-      KotlinMetadataMembersTracker originalMembersWithKotlinInfo) {
+      KotlinMetadataMembersTracker originalMembersWithKotlinInfo,
+      int jvmFlags) {
     this.flags = flags;
     this.name = name;
     this.nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin =
@@ -98,6 +100,7 @@
     this.inlineClassUnderlyingPropertyName = inlineClassUnderlyingPropertyName;
     this.inlineClassUnderlyingType = inlineClassUnderlyingType;
     this.originalMembersWithKotlinInfo = originalMembersWithKotlinInfo;
+    this.jvmFlags = jvmFlags;
   }
 
   public static KotlinClassInfo create(
@@ -180,7 +183,8 @@
         metadataVersion,
         kmClass.getInlineClassUnderlyingPropertyName(),
         KotlinTypeInfo.create(kmClass.getInlineClassUnderlyingType(), factory, reporter),
-        originalMembersWithKotlinInfo);
+        originalMembersWithKotlinInfo,
+        JvmExtensionsKt.getJvmFlags(kmClass));
   }
 
   private static KotlinTypeReference getAnonymousObjectOrigin(
@@ -371,6 +375,7 @@
     }
     JvmClassExtensionVisitor extensionVisitor =
         (JvmClassExtensionVisitor) kmClass.visitExtensions(JvmClassExtensionVisitor.TYPE);
+    extensionVisitor.visitJvmFlags(jvmFlags);
     extensionVisitor.visitModuleName(moduleName);
     if (anonymousObjectOrigin != null) {
       rewritten |=
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
index ee9ea2c..1e4d633 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -303,6 +303,7 @@
 
   public static void appendKmClass(String indent, StringBuilder sb, KmClass kmClass) {
     appendKeyValue(indent, "flags", sb, kmClass.getFlags() + "");
+    appendKeyValue(indent, "jvmFlags", sb, JvmExtensionsKt.getJvmFlags(kmClass) + "");
     appendKeyValue(indent, "name", sb, kmClass.getName());
     appendKeyValue(
         indent,
@@ -518,13 +519,22 @@
               "setterSignature",
               sb,
               setterSignature != null ? setterSignature.asString() : "null");
-          JvmMethodSignature syntheticMethod =
+          JvmMethodSignature syntheticMethodForAnnotations =
               JvmExtensionsKt.getSyntheticMethodForAnnotations(kmProperty);
           appendKeyValue(
               newIndent,
               "syntheticMethodForAnnotations",
               sb,
-              syntheticMethod != null ? syntheticMethod.asString() : "null");
+              syntheticMethodForAnnotations != null
+                  ? syntheticMethodForAnnotations.asString()
+                  : "null");
+          JvmMethodSignature syntheticMethodForDelegate =
+              JvmExtensionsKt.getSyntheticMethodForAnnotations(kmProperty);
+          appendKeyValue(
+              newIndent,
+              "syntheticMethodForDelegate",
+              sb,
+              syntheticMethodForDelegate != null ? syntheticMethodForDelegate.asString() : "null");
         });
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java
index 9d0597d..39ab90c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java
@@ -58,6 +58,8 @@
 
   private final KotlinJvmMethodSignatureInfo syntheticMethodForAnnotations;
 
+  private final KotlinJvmMethodSignatureInfo syntheticMethodForDelegate;
+
   private KotlinPropertyInfo(
       int flags,
       int getterFlags,
@@ -72,7 +74,8 @@
       KotlinJvmFieldSignatureInfo fieldSignature,
       KotlinJvmMethodSignatureInfo getterSignature,
       KotlinJvmMethodSignatureInfo setterSignature,
-      KotlinJvmMethodSignatureInfo syntheticMethodForAnnotations) {
+      KotlinJvmMethodSignatureInfo syntheticMethodForAnnotations,
+      KotlinJvmMethodSignatureInfo syntheticMethodForDelegate) {
     this.flags = flags;
     this.getterFlags = getterFlags;
     this.setterFlags = setterFlags;
@@ -87,6 +90,7 @@
     this.getterSignature = getterSignature;
     this.setterSignature = setterSignature;
     this.syntheticMethodForAnnotations = syntheticMethodForAnnotations;
+    this.syntheticMethodForDelegate = syntheticMethodForDelegate;
   }
 
   public static KotlinPropertyInfo create(
@@ -108,7 +112,9 @@
         KotlinJvmMethodSignatureInfo.create(
             JvmExtensionsKt.getSetterSignature(kmProperty), factory),
         KotlinJvmMethodSignatureInfo.create(
-            JvmExtensionsKt.getSyntheticMethodForAnnotations(kmProperty), factory));
+            JvmExtensionsKt.getSyntheticMethodForAnnotations(kmProperty), factory),
+        KotlinJvmMethodSignatureInfo.create(
+            JvmExtensionsKt.getSyntheticMethodForDelegate(kmProperty), factory));
   }
 
   @Override
@@ -187,6 +193,11 @@
             syntheticMethodForAnnotations.rewrite(
                 extensionVisitor::visitSyntheticMethodForAnnotations, null, appView, namingLens);
       }
+      if (syntheticMethodForDelegate != null) {
+        rewritten |=
+            syntheticMethodForDelegate.rewrite(
+                extensionVisitor::visitSyntheticMethodForDelegate, null, appView, namingLens);
+      }
     }
     return rewritten;
   }
@@ -215,5 +226,8 @@
     if (syntheticMethodForAnnotations != null) {
       syntheticMethodForAnnotations.trace(definitionSupplier);
     }
+    if (syntheticMethodForDelegate != null) {
+      syntheticMethodForDelegate.trace(definitionSupplier);
+    }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java
index 5ac1258..8fdbe8f 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.ToolHelper.getKotlinReflectJar;
 import static com.android.tools.r8.ToolHelper.getKotlinStdlibJar;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
@@ -23,7 +24,6 @@
 import java.nio.file.Path;
 import java.util.Collection;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
-import org.hamcrest.CoreMatchers;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -129,7 +129,7 @@
     Assert.assertEquals(1, compileResult.exitCode);
     assertThat(
         compileResult.stderr,
-        CoreMatchers.containsString(
+        containsString(
             "unsupported [reference to the synthetic extension property for a Java get/set"
                 + " method]"));
   }
@@ -140,9 +140,6 @@
     KotlinClassMetadata kotlinClassMetadata = clazz.getKotlinClassMetadata();
     Assert.assertNotNull(kotlinClassMetadata);
     String metadataAsString = KotlinMetadataWriter.kotlinMetadataToString("", kotlinClassMetadata);
-    // TODO(b/208365670): We should model this when landed.
-    assertThat(
-        metadataAsString,
-        CoreMatchers.not(CoreMatchers.containsString("syntheticMethodForDelegate:")));
+    assertThat(metadataAsString, containsString("syntheticMethodForDelegate:"));
   }
 }