Remove deprecation in kotlin function model
Bug: b/341991457
Change-Id: I4f2fe6893e1dd819a140429ae62f6bf94e3c59fd
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFlagUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFlagUtils.java
index 1743bc9..301ac65 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFlagUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFlagUtils.java
@@ -8,6 +8,7 @@
import kotlin.metadata.KmClass;
import kotlin.metadata.KmConstructor;
import kotlin.metadata.KmEffectExpression;
+import kotlin.metadata.KmFunction;
import kotlin.metadata.KmProperty;
import kotlin.metadata.KmPropertyAccessorAttributes;
import kotlin.metadata.jvm.JvmAttributes;
@@ -66,6 +67,21 @@
Attributes.setHasNonStableParameterNames(dest, Attributes.getHasNonStableParameterNames(src));
}
+ static void copyAllFlags(KmFunction src, KmFunction dest) {
+ Attributes.setHasAnnotations(dest, Attributes.getHasAnnotations(src));
+ Attributes.setKind(dest, Attributes.getKind(src));
+ Attributes.setModality(dest, Attributes.getModality(src));
+ Attributes.setOperator(dest, Attributes.isOperator(src));
+ Attributes.setInfix(dest, Attributes.isInfix(src));
+ Attributes.setInline(dest, Attributes.isInline(src));
+ Attributes.setTailrec(dest, Attributes.isTailrec(src));
+ Attributes.setExternal(dest, Attributes.isExternal(src));
+ Attributes.setSuspend(dest, Attributes.isSuspend(src));
+ Attributes.setExpect(dest, Attributes.isExpect(src));
+ Attributes.setVisibility(dest, Attributes.getVisibility(src));
+ Attributes.setHasNonStableParameterNames(dest, Attributes.getHasNonStableParameterNames(src));
+ }
+
static void copyAllFlags(KmEffectExpression src, KmEffectExpression dest) {
Attributes.setNegated(dest, Attributes.isNegated(src));
Attributes.setNullCheckPredicate(dest, Attributes.isNullCheckPredicate(src));
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
index aa453f6..c880a0e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.kotlin.KotlinMetadataUtils.consume;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.rewriteIfNotNull;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.rewriteList;
import static com.android.tools.r8.utils.FunctionUtils.forEachApply;
@@ -22,10 +21,8 @@
// Holds information about KmFunction
public final class KotlinFunctionInfo implements KotlinMethodLevelInfo {
- // Original flags
- private final int flags;
- // Original name;
- private final String name;
+ // Original function.
+ private final KmFunction kmFunction;
// Information from original KmValueParameter(s) if available.
private final List<KotlinValueParameterInfo> valueParameters;
// Information from original KmFunction.returnType. Null if this is from a KmConstructor.
@@ -38,8 +35,6 @@
private final KotlinJvmMethodSignatureInfo signature;
// Information about the lambdaClassOrigin.
private final KotlinTypeReference lambdaClassOrigin;
- // Information about version requirements.
- private final KotlinVersionRequirementInfo versionRequirements;
// Kotlin contract information.
private final KotlinContractInfo contract;
// A value describing if any of the parameters are crossinline.
@@ -48,27 +43,23 @@
private final List<KotlinTypeInfo> contextReceiverTypes;
private KotlinFunctionInfo(
- int flags,
- String name,
+ KmFunction kmFunction,
KotlinTypeInfo returnType,
KotlinTypeInfo receiverParameterType,
List<KotlinValueParameterInfo> valueParameters,
List<KotlinTypeParameterInfo> typeParameters,
KotlinJvmMethodSignatureInfo signature,
KotlinTypeReference lambdaClassOrigin,
- KotlinVersionRequirementInfo versionRequirements,
KotlinContractInfo contract,
boolean crossInlineParameter,
List<KotlinTypeInfo> contextReceiverTypes) {
- this.flags = flags;
- this.name = name;
+ this.kmFunction = kmFunction;
this.returnType = returnType;
this.receiverParameterType = receiverParameterType;
this.valueParameters = valueParameters;
this.typeParameters = typeParameters;
this.signature = signature;
this.lambdaClassOrigin = lambdaClassOrigin;
- this.versionRequirements = versionRequirements;
this.contract = contract;
this.crossInlineParameter = crossInlineParameter;
this.contextReceiverTypes = contextReceiverTypes;
@@ -90,15 +81,13 @@
}
}
return new KotlinFunctionInfo(
- kmFunction.getFlags(),
- kmFunction.getName(),
+ kmFunction,
KotlinTypeInfo.create(kmFunction.getReturnType(), factory, reporter),
KotlinTypeInfo.create(kmFunction.getReceiverParameterType(), factory, reporter),
valueParameters,
KotlinTypeParameterInfo.create(kmFunction.getTypeParameters(), factory, reporter),
KotlinJvmMethodSignatureInfo.create(JvmExtensionsKt.getSignature(kmFunction), factory),
getlambdaClassOrigin(kmFunction, factory),
- KotlinVersionRequirementInfo.create(kmFunction.getVersionRequirements()),
KotlinContractInfo.create(kmFunction.getContract(), factory, reporter),
isCrossInline,
ListUtils.map(
@@ -117,7 +106,7 @@
}
public String getName() {
- return name;
+ return kmFunction.getName();
}
boolean rewriteNoBacking(Consumer<KmFunction> consumer, AppView<?> appView) {
@@ -127,7 +116,7 @@
boolean rewrite(Consumer<KmFunction> consumer, DexEncodedMethod method, AppView<?> appView) {
// TODO(b/154348683): Check method for flags to pass in.
boolean rewritten = false;
- String finalName = name;
+ String finalName = getName();
// Only rewrite the kotlin method name if it was equal to the method name when reading the
// metadata.
if (method != null) {
@@ -138,51 +127,56 @@
finalName = rewrittenName;
}
}
- KmFunction kmFunction = consume(new KmFunction(flags, finalName), consumer);
+ KmFunction rewrittenKmFunction = new KmFunction(finalName);
+ consumer.accept(rewrittenKmFunction);
+ KotlinFlagUtils.copyAllFlags(kmFunction, rewrittenKmFunction);
// TODO(b/154348149): ReturnType could have been merged to a subtype.
- rewritten |= returnType.rewrite(kmFunction::setReturnType, appView);
+ rewritten |= returnType.rewrite(rewrittenKmFunction::setReturnType, appView);
rewritten |=
rewriteList(
appView,
valueParameters,
- kmFunction.getValueParameters(),
+ rewrittenKmFunction.getValueParameters(),
KotlinValueParameterInfo::rewrite);
rewritten |=
rewriteList(
appView,
typeParameters,
- kmFunction.getTypeParameters(),
+ rewrittenKmFunction.getTypeParameters(),
KotlinTypeParameterInfo::rewrite);
rewritten |=
rewriteList(
appView,
contextReceiverTypes,
- kmFunction.getContextReceiverTypes(),
+ rewrittenKmFunction.getContextReceiverTypes(),
KotlinTypeInfo::rewrite);
rewritten |=
rewriteIfNotNull(
appView,
receiverParameterType,
- kmFunction::setReceiverParameterType,
+ rewrittenKmFunction::setReceiverParameterType,
KotlinTypeInfo::rewrite);
- rewritten |= versionRequirements.rewrite(kmFunction.getVersionRequirements()::addAll);
+ rewrittenKmFunction.getVersionRequirements().addAll(kmFunction.getVersionRequirements());
if (signature != null) {
rewritten |=
signature.rewrite(
- signature -> JvmExtensionsKt.setSignature(kmFunction, signature), method, appView);
+ signature -> JvmExtensionsKt.setSignature(rewrittenKmFunction, signature),
+ method,
+ appView);
}
if (lambdaClassOrigin != null) {
rewritten |=
lambdaClassOrigin.toRenamedBinaryNameOrDefault(
lambdaClassOriginName -> {
if (lambdaClassOriginName != null) {
- JvmExtensionsKt.setLambdaClassOriginName(kmFunction, lambdaClassOriginName);
+ JvmExtensionsKt.setLambdaClassOriginName(
+ rewrittenKmFunction, lambdaClassOriginName);
}
},
appView,
null);
}
- rewritten |= contract.rewrite(kmFunction::setContract, appView);
+ rewritten |= contract.rewrite(rewrittenKmFunction::setContract, appView);
return rewritten;
}