Remove deprecated write in kotlin class model
Bug: b/341991457
Change-Id: Icbce569be402e97435f8d4b004af0abb452c5264
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 594eb68..d0f39cb 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -4,12 +4,10 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.rewriteList;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmFieldSignature;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmMethodSignature;
import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
@@ -41,7 +39,7 @@
public class KotlinClassInfo implements KotlinClassLevelInfo {
- private final KmClass kmClass;
+ private final KotlinClassMetadata.Class classMetadata;
private final boolean nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin;
private final String moduleName;
private final List<KotlinConstructorInfo> constructorsWithNoBacking;
@@ -56,7 +54,6 @@
private final KotlinTypeReference anonymousObjectOrigin;
private final String packageName;
private final KotlinLocalDelegatedPropertyInfo localDelegatedProperties;
- private final int[] metadataVersion;
private final String inlineClassUnderlyingPropertyName;
private final KotlinTypeInfo inlineClassUnderlyingType;
private final String companionObjectName;
@@ -67,7 +64,7 @@
private final KotlinMetadataMembersTracker originalMembersWithKotlinInfo;
private KotlinClassInfo(
- KmClass kmClass,
+ KotlinClassMetadata.Class classMetadata,
boolean nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin,
String moduleName,
KotlinDeclarationContainerInfo declarationContainerInfo,
@@ -80,13 +77,12 @@
KotlinTypeReference anonymousObjectOrigin,
String packageName,
KotlinLocalDelegatedPropertyInfo localDelegatedProperties,
- int[] metadataVersion,
String inlineClassUnderlyingPropertyName,
KotlinTypeInfo inlineClassUnderlyingType,
KotlinMetadataMembersTracker originalMembersWithKotlinInfo,
String companionObjectName,
List<KotlinTypeInfo> contextReceiverTypes) {
- this.kmClass = kmClass;
+ this.classMetadata = classMetadata;
this.nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin =
nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin;
this.moduleName = moduleName;
@@ -100,7 +96,6 @@
this.anonymousObjectOrigin = anonymousObjectOrigin;
this.packageName = packageName;
this.localDelegatedProperties = localDelegatedProperties;
- this.metadataVersion = metadataVersion;
this.inlineClassUnderlyingPropertyName = inlineClassUnderlyingPropertyName;
this.inlineClassUnderlyingType = inlineClassUnderlyingType;
this.originalMembersWithKotlinInfo = originalMembersWithKotlinInfo;
@@ -111,7 +106,6 @@
public static KotlinClassInfo create(
KotlinClassMetadata.Class metadata,
String packageName,
- int[] metadataVersion,
DexClass hostClass,
AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
@@ -161,7 +155,7 @@
|| (anonymousObjectOrigin != null
&& kmClass.name.equals(anonymousObjectOrigin.toKotlinClassifier(true)));
return new KotlinClassInfo(
- kmClass,
+ metadata,
nameCanBeDeducedFromClassOrOrigin,
JvmExtensionsKt.getModuleName(kmClass),
container,
@@ -175,7 +169,6 @@
packageName,
KotlinLocalDelegatedPropertyInfo.create(
JvmExtensionsKt.getLocalDelegatedProperties(kmClass), factory, reporter),
- metadataVersion,
kmClass.getInlineClassUnderlyingPropertyName(),
KotlinTypeInfo.create(kmClass.getInlineClassUnderlyingType(), factory, reporter),
originalMembersWithKotlinInfo,
@@ -279,6 +272,7 @@
@Override
@SuppressWarnings("ReferenceEquality")
public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
+ KmClass kmClass = classMetadata.getKmClass();
KmClass rewrittenKmClass = new KmClass();
KotlinFlagUtils.copyAllFlags(kmClass, rewrittenKmClass);
// Set potentially renamed class name.
@@ -444,8 +438,9 @@
rewritten |=
localDelegatedProperties.rewrite(
JvmExtensionsKt.getLocalDelegatedProperties(rewrittenKmClass)::add, appView);
+ classMetadata.setKmClass(rewrittenKmClass);
return Pair.create(
- Companion.writeClass(rewrittenKmClass, getCompatibleKotlinInfo(), 0),
+ classMetadata.write(),
rewritten || !originalMembersWithKotlinInfo.isEqual(rewrittenReferences, appView));
}
@@ -456,7 +451,7 @@
@Override
public int[] getMetadataVersion() {
- return metadataVersion;
+ return KotlinJvmMetadataVersionUtils.toIntArray(classMetadata.getVersion());
}
@Override
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 4a66565..715d376 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -218,29 +218,26 @@
Consumer<DexEncodedMethod> keepByteCode) {
Metadata metadata = extractMetadataWithPossiblyUnsupportedMetadataVersion(kMetadata);
String packageName = metadata.pn();
- int[] metadataVersion = KotlinJvmMetadataVersionUtils.toIntArray(kMetadata.getVersion());
if (kMetadata instanceof KotlinClassMetadata.Class) {
return KotlinClassInfo.create(
(KotlinClassMetadata.Class) kMetadata,
packageName,
- metadataVersion,
clazz,
appView,
keepByteCode);
} else if (kMetadata instanceof KotlinClassMetadata.FileFacade) {
// e.g., B.kt becomes class `BKt`
return KotlinFileFacadeInfo.create(
- (FileFacade) kMetadata, packageName, metadataVersion, clazz, appView, keepByteCode);
+ (FileFacade) kMetadata, packageName, clazz, appView, keepByteCode);
} else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassFacade) {
// multi-file class with the same @JvmName.
return KotlinMultiFileClassFacadeInfo.create(
- (MultiFileClassFacade) kMetadata, packageName, metadataVersion, appView.dexItemFactory());
+ (MultiFileClassFacade) kMetadata, packageName, appView.dexItemFactory());
} else if (kMetadata instanceof KotlinClassMetadata.MultiFileClassPart) {
// A single file, which is part of multi-file class.
return KotlinMultiFileClassPartInfo.create(
(MultiFileClassPart) kMetadata,
packageName,
- metadataVersion,
clazz,
appView,
keepByteCode);
@@ -248,7 +245,6 @@
return KotlinSyntheticClassInfo.create(
(KotlinClassMetadata.SyntheticClass) kMetadata,
packageName,
- metadataVersion,
clazz,
kotlin,
appView);
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 2c46b82..4f66ccd 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -4,9 +4,6 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
-
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
@@ -20,29 +17,28 @@
// Holds information about Metadata.FileFacade
public class KotlinFileFacadeInfo implements KotlinClassLevelInfo {
+ private final FileFacade kmFileFacade;
private final KotlinPackageInfo packageInfo;
private final String packageName;
- private final int[] metadataVersion;
private KotlinFileFacadeInfo(
- KotlinPackageInfo packageInfo, String packageName, int[] metadataVersion) {
+ FileFacade kmFileFacade, KotlinPackageInfo packageInfo, String packageName) {
+ this.kmFileFacade = kmFileFacade;
this.packageInfo = packageInfo;
this.packageName = packageName;
- this.metadataVersion = metadataVersion;
}
public static KotlinFileFacadeInfo create(
FileFacade kmFileFacade,
String packageName,
- int[] metadataVersion,
DexClass clazz,
AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
KmPackage kmPackage = kmFileFacade.getKmPackage();
return new KotlinFileFacadeInfo(
+ kmFileFacade,
KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
- packageName,
- metadataVersion);
+ packageName);
}
@Override
@@ -59,8 +55,8 @@
public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
KmPackage kmPackage = new KmPackage();
boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView);
- return Pair.create(
- Companion.writeFileFacade(kmPackage, getCompatibleKotlinInfo(), 0), rewritten);
+ kmFileFacade.setKmPackage(kmPackage);
+ return Pair.create(kmFileFacade.write(), rewritten);
}
@Override
@@ -74,7 +70,7 @@
@Override
public int[] getMetadataVersion() {
- return metadataVersion;
+ return KotlinJvmMetadataVersionUtils.toIntArray(kmFileFacade.getVersion());
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index c2f31ef..170a7a2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -220,20 +220,6 @@
return DescriptorUtils.descriptorToKotlinClassifier(descriptor);
}
- static int[] getCompatibleKotlinInfo() {
- // The kotlin metadata changelog recommends:
- // "Main migration path here is to replace KotlinClassMetadata.COMPATIBLE_METADATA_VERSION
- // with new value with the same meaning: JvmMetadataVersion.LATEST_STABLE_SUPPORTED."
- // The inspection error "Usage of Kotlin internal declaration from different module" does not
- // prevent the code to work correctly.
- return JvmMetadataVersion.LATEST_STABLE_SUPPORTED.toIntArray();
- }
-
- static <TKm> TKm consume(TKm tKm, Consumer<TKm> consumer) {
- consumer.accept(tKm);
- return tKm;
- }
-
static <TInfo, TKm> boolean rewriteIfNotNull(
AppView<?> appView,
TInfo info,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
index db4ab66..bcb8c9b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -4,9 +4,7 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
@@ -22,21 +20,22 @@
// Holds information about Metadata.MultiFileClassFace
public class KotlinMultiFileClassFacadeInfo implements KotlinClassLevelInfo {
+ private final MultiFileClassFacade kmMultiFileClassFacade;
private final List<KotlinTypeReference> partClassNames;
private final String packageName;
- private final int[] metadataVersion;
private KotlinMultiFileClassFacadeInfo(
- List<KotlinTypeReference> partClassNames, String packageName, int[] metadataVersion) {
+ MultiFileClassFacade kmMultiFileClassFacade,
+ List<KotlinTypeReference> partClassNames,
+ String packageName) {
+ this.kmMultiFileClassFacade = kmMultiFileClassFacade;
this.partClassNames = partClassNames;
this.packageName = packageName;
- this.metadataVersion = metadataVersion;
}
static KotlinMultiFileClassFacadeInfo create(
MultiFileClassFacade kmMultiFileClassFacade,
String packageName,
- int[] metadataVersion,
DexItemFactory factory) {
ImmutableList.Builder<KotlinTypeReference> builder = ImmutableList.builder();
for (String partClassName : kmMultiFileClassFacade.getPartClassNames()) {
@@ -44,7 +43,7 @@
KotlinTypeReference.fromBinaryNameOrKotlinClassifier(
partClassName, factory, partClassName));
}
- return new KotlinMultiFileClassFacadeInfo(builder.build(), packageName, metadataVersion);
+ return new KotlinMultiFileClassFacadeInfo(kmMultiFileClassFacade, builder.build(), packageName);
}
@Override
@@ -72,9 +71,8 @@
appView,
null);
}
- return Pair.create(
- Companion.writeMultiFileClassFacade(partClassNameStrings, getCompatibleKotlinInfo(), 0),
- rewritten);
+ kmMultiFileClassFacade.setPartClassNames(partClassNameStrings);
+ return Pair.create(kmMultiFileClassFacade.write(), rewritten);
}
@Override
@@ -84,7 +82,7 @@
@Override
public int[] getMetadataVersion() {
- return metadataVersion;
+ return KotlinJvmMetadataVersionUtils.toIntArray(kmMultiFileClassFacade.getVersion());
}
@Override
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 6c00f88..d780c13 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -4,9 +4,6 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
-
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
@@ -20,35 +17,26 @@
// Holds information about Metadata.MultiFileClassPartInfo
public class KotlinMultiFileClassPartInfo implements KotlinClassLevelInfo {
- private final String facadeClassName;
+ private final MultiFileClassPart classPart;
private final KotlinPackageInfo packageInfo;
private final String packageName;
- private final int[] metadataVersion;
private KotlinMultiFileClassPartInfo(
- String facadeClassName,
- KotlinPackageInfo packageInfo,
- String packageName,
- int[] metadataVersion) {
- this.facadeClassName = facadeClassName;
+ MultiFileClassPart classPart, KotlinPackageInfo packageInfo, String packageName) {
+ this.classPart = classPart;
this.packageInfo = packageInfo;
this.packageName = packageName;
- this.metadataVersion = metadataVersion;
}
static KotlinMultiFileClassPartInfo create(
MultiFileClassPart classPart,
String packageName,
- int[] metadataVersion,
DexClass clazz,
AppView<?> appView,
Consumer<DexEncodedMethod> keepByteCode) {
KmPackage kmPackage = classPart.getKmPackage();
return new KotlinMultiFileClassPartInfo(
- classPart.getFacadeClassName(),
- KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
- packageName,
- metadataVersion);
+ classPart, KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode), packageName);
}
@Override
@@ -65,9 +53,8 @@
public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
KmPackage kmPackage = new KmPackage();
boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView);
- return Pair.create(
- Companion.writeMultiFileClassPart(kmPackage, facadeClassName, getCompatibleKotlinInfo(), 0),
- rewritten);
+ classPart.setKmPackage(kmPackage);
+ return Pair.create(classPart.write(), rewritten);
}
@Override
@@ -81,7 +68,7 @@
@Override
public int[] getMetadataVersion() {
- return metadataVersion;
+ return KotlinJvmMetadataVersionUtils.toIntArray(classPart.getVersion());
}
@Override
@@ -90,6 +77,6 @@
}
public String getFacadeClassName() {
- return facadeClassName;
+ return classPart.getFacadeClassName();
}
}
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 5e31efb..068c60c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -4,9 +4,6 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo;
-import static kotlin.metadata.jvm.KotlinClassMetadata.Companion;
-
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexDefinitionSupplier;
@@ -19,9 +16,9 @@
// Holds information about a Metadata.SyntheticClass object.
public class KotlinSyntheticClassInfo implements KotlinClassLevelInfo {
+ private final SyntheticClass syntheticClass;
private final KotlinLambdaInfo lambda;
private final String packageName;
- private final int[] metadataVersion;
public enum Flavour {
KotlinStyleLambda,
@@ -32,29 +29,28 @@
private final Flavour flavour;
private KotlinSyntheticClassInfo(
- KotlinLambdaInfo lambda, Flavour flavour, String packageName, int[] metadataVersion) {
+ SyntheticClass syntheticClass, KotlinLambdaInfo lambda, Flavour flavour, String packageName) {
+ this.syntheticClass = syntheticClass;
this.lambda = lambda;
this.flavour = flavour;
this.packageName = packageName;
- this.metadataVersion = metadataVersion;
}
static KotlinSyntheticClassInfo create(
SyntheticClass syntheticClass,
String packageName,
- int[] metadataVersion,
DexClass clazz,
Kotlin kotlin,
AppView<?> appView) {
KmLambda lambda = syntheticClass.getKmLambda();
assert lambda == null || syntheticClass.isLambda();
return new KotlinSyntheticClassInfo(
+ syntheticClass,
lambda != null
? KotlinLambdaInfo.create(clazz, lambda, appView.dexItemFactory(), appView.reporter())
: null,
getFlavour(clazz, kotlin),
- packageName,
- metadataVersion);
+ packageName);
}
public boolean isLambda() {
@@ -74,13 +70,14 @@
@Override
public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
if (lambda == null) {
- return Pair.create(Companion.writeSyntheticClass(getCompatibleKotlinInfo(), 0), false);
+ return Pair.create(syntheticClass.write(), false);
}
Box<KmLambda> newLambda = new Box<>();
boolean rewritten = lambda.rewrite(newLambda::set, clazz, appView);
assert newLambda.isSet();
- return Pair.create(
- Companion.writeLambda(newLambda.get(), getCompatibleKotlinInfo(), 0), rewritten);
+ syntheticClass.setKmLambda(newLambda.get());
+ syntheticClass.setFlags(0);
+ return Pair.create(syntheticClass.write(), rewritten);
}
@Override
@@ -97,7 +94,7 @@
@Override
public int[] getMetadataVersion() {
- return metadataVersion;
+ return KotlinJvmMetadataVersionUtils.toIntArray(syntheticClass.getVersion());
}
@SuppressWarnings("ReferenceEquality")