Simplify renaming and setting of KmType.
Bug: 70169921
Change-Id: I4f248cfb998cc5afa4a1e8339c4ddf5b74dbbcf6
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
index 81324e5..88a1d8c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
@@ -27,6 +28,7 @@
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.List;
+import java.util.function.Consumer;
import kotlinx.metadata.KmConstructor;
import kotlinx.metadata.KmFunction;
import kotlinx.metadata.KmProperty;
@@ -185,6 +187,19 @@
}
}
+ private static KmType setRenamedKmType(
+ DexType type,
+ TypeSignature signature,
+ AppView<AppInfoWithLiveness> appView,
+ NamingLens lens,
+ Consumer<KmType> consumer) {
+ KmType renamedKmType = toRenamedKmType(type, signature, appView, lens);
+ if (renamedKmType != null) {
+ consumer.accept(renamedKmType);
+ }
+ return renamedKmType;
+ }
+
static KmConstructor toRenamedKmConstructor(
DexEncodedMethod method,
AppView<AppInfoWithLiveness> appView,
@@ -233,7 +248,8 @@
// corresponding backend definitions, like DexAnnotation (DEX) or Signature attribute (CF).
MethodTypeSignature signature = GenericSignature.Parser.toMethodTypeSignature(method, appView);
- DexType returnType = method.method.proto.returnType;
+ DexProto proto = method.method.proto;
+ DexType returnType = proto.returnType;
TypeSignature returnSignature = signature.returnType();
KmType kmReturnType = toRenamedKmType(returnType, returnSignature, appView, lens);
if (kmReturnType == null) {
@@ -242,9 +258,9 @@
kmFunction.setReturnType(kmReturnType);
if (method.isKotlinExtensionFunction()) {
- assert method.method.proto.parameters.values.length > 0
+ assert proto.parameters.values.length > 0
: method.method.toSourceString();
- DexType receiverType = method.method.proto.parameters.values[0];
+ DexType receiverType = proto.parameters.values[0];
TypeSignature receiverSignature = signature.getParameterTypeSignature(0);
KmType kmReceiverType = toRenamedKmType(receiverType, receiverSignature, appView, lens);
if (kmReceiverType == null) {
@@ -297,14 +313,14 @@
String candidateParameterName,
AppView<AppInfoWithLiveness> appView,
NamingLens lens) {
- KmType kmParamType = toRenamedKmType(parameterType, parameterTypeSignature, appView, lens);
- if (kmParamType == null) {
- return null;
- }
int flag = valueParameterInfo != null ? valueParameterInfo.flag : flagsOf();
String name = valueParameterInfo != null ? valueParameterInfo.name : candidateParameterName;
KmValueParameter kmValueParameter = new KmValueParameter(flag, name);
- kmValueParameter.setType(kmParamType);
+ KmType kmParamType = setRenamedKmType(
+ parameterType, parameterTypeSignature, appView, lens, kmValueParameter::setType);
+ if (kmParamType == null) {
+ return null;
+ }
if (valueParameterInfo != null && valueParameterInfo.isVararg) {
if (!parameterType.isArrayType()) {
@@ -314,11 +330,11 @@
TypeSignature elementSignature =
parameterTypeSignature != null
? parameterTypeSignature.toArrayElementTypeSignature(appView) : null;
- KmType kmElementType = toRenamedKmType(elementType, elementSignature, appView, lens);
+ KmType kmElementType = setRenamedKmType(
+ elementType, elementSignature, appView, lens, kmValueParameter::setVarargElementType);
if (kmElementType == null) {
return null;
}
- kmValueParameter.setVarargElementType(kmElementType);
}
return kmValueParameter;
@@ -471,10 +487,8 @@
}
FieldTypeSignature signature =
GenericSignature.Parser.toFieldTypeSignature(field, appView);
- kmPropertyType = toRenamedKmType(field.field.type, signature, appView, lens);
- if (kmPropertyType != null) {
- kmProperty.setReturnType(kmPropertyType);
- }
+ kmPropertyType =
+ setRenamedKmType(field.field.type, signature, appView, lens, kmProperty::setReturnType);
JvmExtensionsKt.setFieldSignature(kmProperty, toJvmFieldSignature(renamedField));
}
@@ -484,29 +498,27 @@
}
if (criteria == GetterSetterCriteria.MET) {
- assert getter != null
+ assert getter != null && getter.method.proto.parameters.size() == (isExtension ? 1 : 0)
: "checkGetterCriteria: " + this.toString();
MethodTypeSignature signature =
GenericSignature.Parser.toMethodTypeSignature(getter, appView);
if (isExtension) {
- assert getter.method.proto.parameters.size() == 1
- : "checkGetterCriteria: " + this.toString();
TypeSignature receiverSignature = signature.getParameterTypeSignature(0);
- kmReceiverType = toRenamedKmType(
- getter.method.proto.parameters.values[0], receiverSignature, appView, lens);
- if (kmReceiverType != null) {
- kmProperty.setReceiverParameterType(kmReceiverType);
- }
+ kmReceiverType =
+ setRenamedKmType(
+ getter.method.proto.parameters.values[0],
+ receiverSignature,
+ appView,
+ lens,
+ kmProperty::setReceiverParameterType);
}
DexType returnType = getter.method.proto.returnType;
TypeSignature returnSignature = signature.returnType();
if (kmPropertyType == null) {
// The property type is not set yet.
- kmPropertyType = toRenamedKmType(returnType, returnSignature, appView, lens);
- if (kmPropertyType != null) {
- kmProperty.setReturnType(kmPropertyType);
- }
+ kmPropertyType = setRenamedKmType(
+ returnType, returnSignature, appView, lens, kmProperty::setReturnType);
} else {
// If property type is set already (via backing field), make sure it's consistent.
KmType kmPropertyTypeFromGetter =
@@ -535,20 +547,21 @@
}
if (criteria == GetterSetterCriteria.MET) {
- assert setter != null && setter.method.proto.parameters.size() >= 1
+ assert setter != null && setter.method.proto.parameters.size() == (isExtension ? 2 : 1)
: "checkSetterCriteria: " + this.toString();
MethodTypeSignature signature =
GenericSignature.Parser.toMethodTypeSignature(setter, appView);
if (isExtension) {
- assert setter.method.proto.parameters.size() == 2
- : "checkSetterCriteria: " + this.toString();
DexType receiverType = setter.method.proto.parameters.values[0];
TypeSignature receiverSignature = signature.getParameterTypeSignature(0);
if (kmReceiverType == null) {
- kmReceiverType = toRenamedKmType(receiverType, receiverSignature, appView, lens);
- if (kmReceiverType != null) {
- kmProperty.setReceiverParameterType(kmReceiverType);
- }
+ kmReceiverType =
+ setRenamedKmType(
+ receiverType,
+ receiverSignature,
+ appView,
+ lens,
+ kmProperty::setReceiverParameterType);
} else {
// If the receiver type for the extension property is set already (via getter),
// make sure it's consistent.
@@ -566,10 +579,8 @@
TypeSignature valueSignature = signature.getParameterTypeSignature(valueIndex);
if (kmPropertyType == null) {
// The property type is not set yet.
- kmPropertyType = toRenamedKmType(valueType, valueSignature, appView, lens);
- if (kmPropertyType != null) {
- kmProperty.setReturnType(kmPropertyType);
- }
+ kmPropertyType =
+ setRenamedKmType(valueType, valueSignature, appView, lens, kmProperty::setReturnType);
} else {
// If property type is set already (via either backing field or getter),
// make sure it's consistent.
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
index 562fdbb..390de2e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
@@ -15,4 +15,12 @@
static final String PKG = KotlinMetadataTestBase.class.getPackage().getName();
static final String PKG_PREFIX = DescriptorUtils.getBinaryNameFromJavaType(PKG);
+
+ static final String KT_ARRAY = "Lkotlin/Array;";
+ static final String KT_CHAR_SEQUENCE = "Lkotlin/CharSequence;";
+ static final String KT_STRING = "Lkotlin/String;";
+ static final String KT_LONG = "Lkotlin/Long;";
+ static final String KT_LONG_ARRAY = "Lkotlin/LongArray;";
+ static final String KT_MAP = "Lkotlin/collections/Map;";
+ static final String KT_UNIT = "Lkotlin/Unit;";
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
index 1f8fee7..a358113 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
@@ -190,16 +190,16 @@
kmFunction = kmPackage.kmFunctionExtensionWithUniqueName("csHash");
assertThat(kmFunction, isExtensionFunction());
kmTypeSubject = kmFunction.receiverParameterType();
- assertEquals("Lkotlin/CharSequence;", kmTypeSubject.descriptor());
+ assertEquals(KT_CHAR_SEQUENCE, kmTypeSubject.descriptor());
kmTypeSubject = kmFunction.returnType();
- assertEquals("Lkotlin/Long;", kmTypeSubject.descriptor());
+ assertEquals(KT_LONG, kmTypeSubject.descriptor());
kmFunction = kmPackage.kmFunctionExtensionWithUniqueName("longArrayHash");
assertThat(kmFunction, isExtensionFunction());
kmTypeSubject = kmFunction.receiverParameterType();
- assertEquals("Lkotlin/LongArray;", kmTypeSubject.descriptor());
+ assertEquals(KT_LONG_ARRAY, kmTypeSubject.descriptor());
kmTypeSubject = kmFunction.returnType();
- assertEquals("Lkotlin/Long;", kmTypeSubject.descriptor());
+ assertEquals(KT_LONG, kmTypeSubject.descriptor());
kmFunction = kmPackage.kmFunctionExtensionWithUniqueName("myApply");
assertThat(kmFunction, isExtensionFunction());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
index f5d26ae..b100f44 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
@@ -122,16 +122,16 @@
KmValueParameterSubject valueParameter = valueParameters.get(0);
assertFalse(valueParameter.declaresDefaultValue());
- assertEquals("Lkotlin/collections/Map;", valueParameter.type().descriptor());
+ assertEquals(KT_MAP, valueParameter.type().descriptor());
List<KmTypeProjectionSubject> typeArguments = valueParameter.type().typeArguments();
assertEquals(2, typeArguments.size());
KmTypeSubject typeArgument = typeArguments.get(0).type();
- assertEquals("Lkotlin/String;", typeArgument.descriptor());
+ assertEquals(KT_STRING, typeArgument.descriptor());
typeArgument = typeArguments.get(1).type();
- assertEquals("Lkotlin/String;", typeArgument.descriptor());
+ assertEquals(KT_STRING, typeArgument.descriptor());
valueParameter = valueParameters.get(1);
assertTrue(valueParameter.declaresDefaultValue());
- assertEquals("Lkotlin/String;", valueParameter.type().descriptor());
+ assertEquals(KT_STRING, valueParameter.type().descriptor());
}
}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
index ea12b9e..e3b0952 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
@@ -128,13 +128,13 @@
KmValueParameterSubject valueParameter = valueParameters.get(0);
assertTrue(valueParameter.isVararg());
- assertEquals("Lkotlin/String;", valueParameter.varargElementType().descriptor());
+ assertEquals(KT_STRING, valueParameter.varargElementType().descriptor());
- assertEquals("Lkotlin/Array;", valueParameter.type().descriptor());
+ assertEquals(KT_ARRAY, valueParameter.type().descriptor());
List<KmTypeProjectionSubject> typeArguments = valueParameter.type().typeArguments();
assertEquals(1, typeArguments.size());
KmTypeSubject typeArgument = typeArguments.get(0).type();
- assertEquals("Lkotlin/String;", typeArgument.descriptor());
+ assertEquals(KT_STRING, typeArgument.descriptor());
valueParameter = valueParameters.get(1);
assertFalse(valueParameter.isVararg());
@@ -144,8 +144,8 @@
typeArgument = typeArguments.get(0).type();
assertEquals(cls.getFinalDescriptor(), typeArgument.descriptor());
typeArgument = typeArguments.get(1).type();
- assertEquals("Lkotlin/String;", typeArgument.descriptor());
+ assertEquals(KT_STRING, typeArgument.descriptor());
typeArgument = typeArguments.get(2).type();
- assertEquals("Lkotlin/Unit;", typeArgument.descriptor());
+ assertEquals(KT_UNIT, typeArgument.descriptor());
}
}