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();
+ }
+}