Keep kotlin.jvm.JvmName annotation when having -keepkotlinmetadata

Change-Id: I03c36cb8c371526e5c385b48f0bd73dfb977698d
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 44506fd..bfa111e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -304,6 +304,7 @@
   public final DexString reflectiveOperationExceptionDescriptor =
       createString("Ljava/lang/ReflectiveOperationException;");
   public final DexString kotlinMetadataDescriptor = createString("Lkotlin/Metadata;");
+  public final DexString kotlinJvmNameDescriptor = createString("Lkotlin/jvm/JvmName;");
 
   public final DexString intFieldUpdaterDescriptor =
       createString("Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;");
@@ -490,6 +491,7 @@
   public final DexType reflectiveOperationExceptionType =
       createStaticallyKnownType(reflectiveOperationExceptionDescriptor);
   public final DexType kotlinMetadataType = createStaticallyKnownType(kotlinMetadataDescriptor);
+  public final DexType kotlinJvmNameType = createStaticallyKnownType(kotlinJvmNameDescriptor);
 
   public final DexType javaIoFileType = createStaticallyKnownType("Ljava/io/File;");
   public final DexType javaMathBigIntegerType = createStaticallyKnownType("Ljava/math/BigInteger;");
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 773903d..526fc5f 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
+import static com.android.tools.r8.shaking.ProguardKeepAttributes.RUNTIME_INVISIBLE_ANNOTATIONS;
 import static com.android.tools.r8.shaking.ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS;
 import static com.android.tools.r8.utils.DescriptorUtils.javaTypeToDescriptor;
 
@@ -288,26 +289,23 @@
           || parseUnsupportedOptionAndErr(optionStart)) {
         // Intentionally left empty.
       } else if (acceptString("keepkotlinmetadata")) {
+        String source = "-keepkotlinmetadata";
         ProguardKeepRule keepKotlinMetadata =
-            ProguardKeepRule.builder()
-                .setType(ProguardKeepRuleType.KEEP)
-                .setClassType(ProguardClassType.CLASS)
-                .setOrigin(origin)
-                .setStart(optionStart)
-                .setClassNames(
-                    ProguardClassNameList.builder()
-                        .addClassName(
-                            false, ProguardTypeMatcher.create(dexItemFactory.kotlinMetadataType))
-                        .build())
-                .setMemberRules(Collections.singletonList(ProguardMemberRule.defaultKeepAllRule()))
-                .setSource("-keepkotlinmetadata")
-                .build();
-        // Mark the rule as used to ensure we do not report any information messages if the class
+            ProguardKeepRuleUtils.keepClassAndMembersRule(
+                origin, optionStart, dexItemFactory.kotlinMetadataType, source);
+        ProguardKeepRule keepKotlinJvmNameAnnotation =
+            ProguardKeepRuleUtils.keepClassAndMembersRule(
+                origin, optionStart, dexItemFactory.kotlinJvmNameType, source);
+        // Mark the rules as used to ensure we do not report any information messages if the class
         // is not present.
         keepKotlinMetadata.markAsUsed();
+        keepKotlinJvmNameAnnotation.markAsUsed();
         configurationBuilder.addRule(keepKotlinMetadata);
+        configurationBuilder.addRule(keepKotlinJvmNameAnnotation);
         configurationBuilder.addKeepAttributePatterns(
             Collections.singletonList(RUNTIME_VISIBLE_ANNOTATIONS));
+        configurationBuilder.addKeepAttributePatterns(
+            Collections.singletonList(RUNTIME_INVISIBLE_ANNOTATIONS));
       } else if (acceptString("renamesourcefileattribute")) {
         skipWhitespace();
         if (isOptionalArgumentGiven()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleUtils.java b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleUtils.java
new file mode 100644
index 0000000..b086470
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleUtils.java
@@ -0,0 +1,29 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.shaking;
+
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+import java.util.Collections;
+
+public class ProguardKeepRuleUtils {
+
+  public static ProguardKeepRule keepClassAndMembersRule(
+      Origin origin, Position start, DexType type, String source) {
+    return ProguardKeepRule.builder()
+        .setType(ProguardKeepRuleType.KEEP)
+        .setClassType(ProguardClassType.CLASS)
+        .setOrigin(origin)
+        .setStart(start)
+        .setClassNames(
+            ProguardClassNameList.builder()
+                .addClassName(false, ProguardTypeMatcher.create(type))
+                .build())
+        .setMemberRules(Collections.singletonList(ProguardMemberRule.defaultKeepAllRule()))
+        .setSource(source)
+        .build();
+  }
+}