Support new convention for local variables name mangling: '$receiver' -> '$this$<label>' (KT-26913)
This commit is contained in:
@@ -103,6 +103,8 @@ public class AsmUtil {
|
||||
|
||||
public static final String LABELED_THIS_FIELD = THIS + "_";
|
||||
|
||||
public static final String LABELED_THIS_PARAMETER = "$" + THIS + "$";
|
||||
|
||||
public static final String CAPTURED_THIS_FIELD = "this$0";
|
||||
|
||||
public static final String RECEIVER_PARAMETER_NAME = "$receiver";
|
||||
@@ -141,13 +143,35 @@ public class AsmUtil {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String getLabeledThisNameForReceiver(
|
||||
public static String getNameForCapturedReceiverField(
|
||||
@NotNull CallableDescriptor descriptor,
|
||||
@NotNull BindingContext bindingContext,
|
||||
@NotNull LanguageVersionSettings languageVersionSettings
|
||||
) {
|
||||
return getLabeledThisNameForReceiver(
|
||||
descriptor, bindingContext, languageVersionSettings, LABELED_THIS_FIELD, CAPTURED_RECEIVER_FIELD);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String getNameForReceiverParameter(
|
||||
@NotNull CallableDescriptor descriptor,
|
||||
@NotNull BindingContext bindingContext,
|
||||
@NotNull LanguageVersionSettings languageVersionSettings
|
||||
) {
|
||||
return getLabeledThisNameForReceiver(
|
||||
descriptor, bindingContext, languageVersionSettings, LABELED_THIS_PARAMETER, RECEIVER_PARAMETER_NAME);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getLabeledThisNameForReceiver(
|
||||
@NotNull CallableDescriptor descriptor,
|
||||
@NotNull BindingContext bindingContext,
|
||||
@NotNull LanguageVersionSettings languageVersionSettings,
|
||||
@NotNull String prefix,
|
||||
@NotNull String defaultName
|
||||
) {
|
||||
if (!languageVersionSettings.supportsFeature(LanguageFeature.NewCapturedReceiverFieldNamingConvention)) {
|
||||
return CAPTURED_RECEIVER_FIELD;
|
||||
return defaultName;
|
||||
}
|
||||
|
||||
Name callableName = null;
|
||||
@@ -155,7 +179,7 @@ public class AsmUtil {
|
||||
if (descriptor instanceof FunctionDescriptor) {
|
||||
String labelName = bindingContext.get(CodegenBinding.CALL_LABEL_FOR_LAMBDA_ARGUMENT, (FunctionDescriptor) descriptor);
|
||||
if (labelName != null) {
|
||||
return getLabeledThisName(labelName, CAPTURED_RECEIVER_FIELD);
|
||||
return getLabeledThisName(labelName, prefix, defaultName);
|
||||
}
|
||||
|
||||
if (descriptor instanceof VariableAccessorDescriptor) {
|
||||
@@ -169,23 +193,23 @@ public class AsmUtil {
|
||||
}
|
||||
|
||||
if (callableName.isSpecial()) {
|
||||
return CAPTURED_RECEIVER_FIELD;
|
||||
return defaultName;
|
||||
}
|
||||
|
||||
return getLabeledThisName(callableName.asString(), CAPTURED_RECEIVER_FIELD);
|
||||
return getLabeledThisName(callableName.asString(), prefix, defaultName);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getLabeledThisName(@NotNull String callableName, @NotNull String defaultName) {
|
||||
public static String getLabeledThisName(@NotNull String callableName, @NotNull String prefix, @NotNull String defaultName) {
|
||||
if (!Name.isValidIdentifier(callableName)) {
|
||||
return defaultName;
|
||||
}
|
||||
|
||||
if (!DalvikIdentifierUtils.isValidDalvikIdentifier(callableName)) {
|
||||
return LABELED_THIS_FIELD + mangleLabel(callableName);
|
||||
return prefix + mangleLabel(callableName);
|
||||
}
|
||||
|
||||
return LABELED_THIS_FIELD + callableName;
|
||||
return prefix + callableName;
|
||||
}
|
||||
|
||||
private static String mangleLabel(String label) {
|
||||
@@ -925,7 +949,8 @@ public class AsmUtil {
|
||||
if (descriptor.isOperator()) {
|
||||
ReceiverParameterDescriptor receiverParameter = descriptor.getExtensionReceiverParameter();
|
||||
if (receiverParameter != null) {
|
||||
genParamAssertion(v, state.getTypeMapper(), frameMap, receiverParameter, CAPTURED_RECEIVER_FIELD, descriptor);
|
||||
String name = getNameForReceiverParameter(descriptor, state.getBindingContext(), state.getLanguageVersionSettings());
|
||||
genParamAssertion(v, state.getTypeMapper(), frameMap, receiverParameter, name, descriptor);
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -933,7 +958,8 @@ public class AsmUtil {
|
||||
|
||||
ReceiverParameterDescriptor receiverParameter = descriptor.getExtensionReceiverParameter();
|
||||
if (receiverParameter != null) {
|
||||
genParamAssertion(v, state.getTypeMapper(), frameMap, receiverParameter, CAPTURED_RECEIVER_FIELD, descriptor);
|
||||
String name = getNameForReceiverParameter(descriptor, state.getBindingContext(), state.getLanguageVersionSettings());
|
||||
genParamAssertion(v, state.getTypeMapper(), frameMap, receiverParameter, name, descriptor);
|
||||
}
|
||||
|
||||
for (ValueParameterDescriptor parameter : descriptor.getValueParameters()) {
|
||||
|
||||
+2
-2
@@ -160,7 +160,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
||||
|
||||
if (!state.classBuilderMode.generateBodies) {
|
||||
FunctionCodegen.generateLocalVariablesForParameters(
|
||||
mv, signature, null, Label(), Label(), remainingParameters, isStatic, typeMapper
|
||||
mv, signature, functionDescriptor, null, Label(), Label(), remainingParameters, isStatic, typeMapper
|
||||
)
|
||||
mv.visitEnd()
|
||||
return
|
||||
@@ -245,7 +245,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
||||
mv.visitLabel(methodEnd)
|
||||
|
||||
FunctionCodegen.generateLocalVariablesForParameters(
|
||||
mv, signature, null, methodBegin, methodEnd, remainingParameters, isStatic, typeMapper
|
||||
mv, signature, functionDescriptor, null, methodBegin, methodEnd, remainingParameters, isStatic, typeMapper
|
||||
)
|
||||
|
||||
FunctionCodegen.endVisit(mv, null, methodElement)
|
||||
|
||||
@@ -784,7 +784,7 @@ public class FunctionCodegen {
|
||||
}
|
||||
|
||||
generateLocalVariablesForParameters(mv,
|
||||
jvmMethodSignature,
|
||||
jvmMethodSignature, functionDescriptor,
|
||||
thisType, methodBegin, methodEnd, functionDescriptor.getValueParameters(),
|
||||
destructuredParametersForSuspendLambda,
|
||||
AsmUtil.isStaticMethod(ownerKind, functionDescriptor), typeMapper, shiftForDestructuringVariables
|
||||
@@ -794,6 +794,7 @@ public class FunctionCodegen {
|
||||
public static void generateLocalVariablesForParameters(
|
||||
@NotNull MethodVisitor mv,
|
||||
@NotNull JvmMethodSignature jvmMethodSignature,
|
||||
@NotNull FunctionDescriptor functionDescriptor,
|
||||
@Nullable Type thisType,
|
||||
@NotNull Label methodBegin,
|
||||
@NotNull Label methodEnd,
|
||||
@@ -802,13 +803,15 @@ public class FunctionCodegen {
|
||||
KotlinTypeMapper typeMapper
|
||||
) {
|
||||
generateLocalVariablesForParameters(
|
||||
mv, jvmMethodSignature, thisType, methodBegin, methodEnd, valueParameters, Collections.emptyList(), isStatic, typeMapper,
|
||||
mv, jvmMethodSignature, functionDescriptor,
|
||||
thisType, methodBegin, methodEnd, valueParameters, Collections.emptyList(), isStatic, typeMapper,
|
||||
0);
|
||||
}
|
||||
|
||||
private static void generateLocalVariablesForParameters(
|
||||
@NotNull MethodVisitor mv,
|
||||
@NotNull JvmMethodSignature jvmMethodSignature,
|
||||
@NotNull FunctionDescriptor functionDescriptor,
|
||||
@Nullable Type thisType,
|
||||
@NotNull Label methodBegin,
|
||||
@NotNull Label methodEnd,
|
||||
@@ -847,6 +850,10 @@ public class FunctionCodegen {
|
||||
? computeParameterName(i, parameter)
|
||||
: nameForDestructuredParameter;
|
||||
}
|
||||
else if (kind == JvmMethodParameterKind.RECEIVER) {
|
||||
parameterName = AsmUtil.getNameForReceiverParameter(
|
||||
functionDescriptor, typeMapper.getBindingContext(), typeMapper.getLanguageVersionSettings());
|
||||
}
|
||||
else {
|
||||
String lowercaseKind = kind.name().toLowerCase();
|
||||
parameterName = needIndexForVar(kind)
|
||||
|
||||
@@ -111,7 +111,7 @@ public final class MutableClosure implements CalculatedClosure {
|
||||
return AsmUtil.CAPTURED_RECEIVER_FIELD;
|
||||
}
|
||||
|
||||
String labeledThis = AsmUtil.getLabeledThisNameForReceiver(
|
||||
String labeledThis = AsmUtil.getNameForCapturedReceiverField(
|
||||
enclosingFunWithReceiverDescriptor, bindingContext, languageVersionSettings);
|
||||
|
||||
return AsmUtil.getCapturedFieldName(labeledThis);
|
||||
|
||||
@@ -46,7 +46,9 @@ internal fun generateParameterNames(
|
||||
isEnumName = !isEnumName
|
||||
if (!isEnumName) "\$enum\$name" else "\$enum\$ordinal"
|
||||
}
|
||||
JvmMethodParameterKind.RECEIVER -> AsmUtil.RECEIVER_PARAMETER_NAME
|
||||
JvmMethodParameterKind.RECEIVER -> {
|
||||
AsmUtil.getNameForReceiverParameter(functionDescriptor, state.bindingContext, state.languageVersionSettings)
|
||||
}
|
||||
JvmMethodParameterKind.OUTER -> AsmUtil.CAPTURED_THIS_FIELD
|
||||
JvmMethodParameterKind.VALUE -> iterator.next().name.asString()
|
||||
|
||||
|
||||
@@ -217,6 +217,10 @@ public class KotlinTypeMapper {
|
||||
return jvmTarget;
|
||||
}
|
||||
|
||||
public LanguageVersionSettings getLanguageVersionSettings() {
|
||||
return languageVersionSettings;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Type mapOwner(@NotNull DeclarationDescriptor descriptor) {
|
||||
return mapOwner(descriptor, true);
|
||||
|
||||
Reference in New Issue
Block a user