Support extension lambda inlining

#KT-7962 Fixed
This commit is contained in:
Michael Bogdanov
2015-06-08 12:48:38 +03:00
parent 18753a16d7
commit 7a1625fc9e
5 changed files with 34 additions and 2 deletions
@@ -24,11 +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.DescriptorUtils;
import org.jetbrains.kotlin.resolve.jvm.AsmTypes;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode;
@@ -156,7 +156,14 @@ public class LambdaInfo implements CapturedParamOwner, LabelOwner {
//add skipped this cause inlined lambda doesn't have it
builder.addThis(AsmTypes.OBJECT_TYPE, true).setLambda(this);
List<ValueParameterDescriptor> valueParameters = getFunctionDescriptor().getValueParameters();
FunctionDescriptor lambdaDescriptor = getFunctionDescriptor();
ReceiverParameterDescriptor extensionParameter = lambdaDescriptor.getExtensionReceiverParameter();
if (extensionParameter != null) {
Type type = typeMapper.mapType(extensionParameter.getType());
builder.addNextParameter(type, false, null);
}
List<ValueParameterDescriptor> valueParameters = lambdaDescriptor.getValueParameters();
for (ValueParameterDescriptor parameter : valueParameters) {
Type type = typeMapper.mapType(parameter.getType());
builder.addNextParameter(type, false, null);
@@ -181,3 +188,4 @@ public class LambdaInfo implements CapturedParamOwner, LabelOwner {
}
}
@@ -0,0 +1,9 @@
import test.*
fun box(): String {
val p = "".test(50.0) {
it
}
return if (p == 50.0) "OK" else "fail $p"
}
@@ -0,0 +1,3 @@
package test
inline fun <T> String.test(default: T, cb: String.(T) -> T): T = cb(default)
@@ -823,6 +823,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
doTestMultiFileWithInlineCheck(fileName);
}
@TestMetadata("extensionLambda.1.kt")
public void testExtensionLambda() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/simple/extensionLambda.1.kt");
doTestMultiFileWithInlineCheck(fileName);
}
@TestMetadata("params.1.kt")
public void testParams() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/simple/params.1.kt");
@@ -823,6 +823,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
doBoxTestWithInlineCheck(fileName);
}
@TestMetadata("extensionLambda.1.kt")
public void testExtensionLambda() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/simple/extensionLambda.1.kt");
doBoxTestWithInlineCheck(fileName);
}
@TestMetadata("params.1.kt")
public void testParams() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/simple/params.1.kt");