diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java index 8fd05f110db..fd99cba7eff 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java @@ -82,15 +82,6 @@ public class AnonymousObjectTransformer { typeRemapper = new TypeRemapper(inliningContext.typeMapping); } - private void buildInvokeParamsFor(@NotNull ParametersBuilder builder, @NotNull MethodNode node) { - builder.addThis(oldObjectType, false); - - Type[] types = Type.getArgumentTypes(node.desc); - for (Type type : types) { - builder.addNextParameter(type, false, null); - } - } - @NotNull public InlineResult doTransform(@NotNull AnonymousObjectGeneration anonymousObjectGen, @NotNull FieldRemapper parentRemapper) { ClassBuilder classBuilder = createClassBuilder(); @@ -346,8 +337,7 @@ public class AnonymousObjectTransformer { @NotNull ParametersBuilder capturedBuilder, @NotNull MethodNode sourceNode ) { - ParametersBuilder builder = ParametersBuilder.newBuilder(); - buildInvokeParamsFor(builder, sourceNode); + ParametersBuilder builder = ParametersBuilder.initializeBuilderFrom(oldObjectType, sourceNode.desc); for (CapturedParamInfo param : capturedBuilder.listCaptured()) { builder.addCapturedParamCopy(param); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.java index c3782e78277..91cc92f1967 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.java @@ -24,12 +24,11 @@ import org.jetbrains.kotlin.codegen.context.EnclosedValueDescriptor; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor; -import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor; -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetFunctionLiteralExpression; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.jvm.AsmTypes; +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode; @@ -152,22 +151,9 @@ public class LambdaInfo implements CapturedParamOwner, LabelOwner { @NotNull public Parameters addAllParameters(FieldRemapper remapper) { - ParametersBuilder builder = ParametersBuilder.newBuilder(); - //add skipped this cause inlined lambda doesn't have it - builder.addThis(AsmTypes.OBJECT_TYPE, true).setLambda(this); - - FunctionDescriptor lambdaDescriptor = getFunctionDescriptor(); - ReceiverParameterDescriptor extensionParameter = lambdaDescriptor.getExtensionReceiverParameter(); - if (extensionParameter != null) { - Type type = typeMapper.mapType(extensionParameter.getType()); - builder.addNextParameter(type, false, null); - } - - List valueParameters = lambdaDescriptor.getValueParameters(); - for (ValueParameterDescriptor parameter : valueParameters) { - Type type = typeMapper.mapType(parameter.getType()); - builder.addNextParameter(type, false, null); - } + JvmMethodSignature signature = typeMapper.mapSignature(getFunctionDescriptor()); + ParametersBuilder builder = + ParametersBuilder.initializeBuilderFrom(AsmTypes.OBJECT_TYPE, signature.getAsmMethod().getDescriptor(), this); for (CapturedParamDesc info : getCapturedVars()) { CapturedParamInfo field = remapper.findField(new FieldInsnNode(0, info.getContainingLambdaName(), info.getFieldName(), "")); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParameterInfo.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParameterInfo.java index 44fa33f9e17..2580d048731 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParameterInfo.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParameterInfo.java @@ -82,7 +82,7 @@ class ParameterInfo { return lambda; } - public void setLambda(LambdaInfo lambda) { + public void setLambda(@Nullable LambdaInfo lambda) { this.lambda = lambda; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.java index cda05b65e61..0d64b549364 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ParametersBuilder.java @@ -141,4 +141,20 @@ public class ParametersBuilder { public int getNextValueParameterIndex() { return nextIndex; } + + public static ParametersBuilder initializeBuilderFrom(@NotNull Type objectType, @NotNull String descriptor) { + return initializeBuilderFrom(objectType, descriptor, null); + } + + public static ParametersBuilder initializeBuilderFrom(@NotNull Type objectType, @NotNull String descriptor, @Nullable LambdaInfo inlineLambda) { + ParametersBuilder builder = newBuilder(); + //skipped this for inlined lambda cause it will be removed + builder.addThis(objectType, inlineLambda != null).setLambda(inlineLambda); + + Type[] types = Type.getArgumentTypes(descriptor); + for (Type type : types) { + builder.addNextParameter(type, false, null); + } + return builder; + } }