From 5cb967180375649bcc60181a631f18affc97a3ee Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 18 May 2015 13:23:12 +0300 Subject: [PATCH] Support inlining in scripts and outer expression capturing #KT-7744 Fixed --- .../jetbrains/kotlin/codegen/MemberCodegen.java | 11 +++++++++-- .../codegen/binding/CodegenAnnotatingVisitor.java | 2 +- .../kotlin/codegen/inline/InlineCodegen.java | 9 +++++++++ compiler/testData/codegen/script/inline.kts | 14 ++++++++++++++ compiler/testData/codegen/script/outerCapture.kts | 14 ++++++++++++++ .../kotlin/codegen/ScriptCodegenTestGenerated.java | 12 ++++++++++++ 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/script/inline.kts create mode 100644 compiler/testData/codegen/script/outerCapture.kts diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 2084afdac6e..4ce453d8635 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -54,6 +54,7 @@ import java.util.*; import static org.jetbrains.kotlin.codegen.AsmUtil.calculateInnerClassAccessFlags; import static org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive; +import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.asmTypeForScriptDescriptor; import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED; import static org.jetbrains.kotlin.descriptors.SourceElement.NO_SOURCE; import static org.jetbrains.kotlin.resolve.BindingContext.VARIABLE; @@ -242,8 +243,12 @@ public abstract class MemberCodegen earlierScripts = state.getEarlierScriptsForReplInterpreter(); + return parent.intoScript((ScriptDescriptor) descriptor, + earlierScripts == null ? Collections.emptyList() : earlierScripts, + classDescriptorForScript); + } else if (descriptor instanceof FunctionDescriptor) { return parent.intoFunction((FunctionDescriptor) descriptor); } diff --git a/compiler/testData/codegen/script/inline.kts b/compiler/testData/codegen/script/inline.kts new file mode 100644 index 00000000000..6de32d8f42d --- /dev/null +++ b/compiler/testData/codegen/script/inline.kts @@ -0,0 +1,14 @@ +// expected: rv: 2 +@inline fun foo(l: (Int) -> Int ): Int { + return l(1) +} + +fun bar(p: Int): Int { + return p + 1 +} + +fun main(): Int { + return foo { x -> bar(x) } +} + +main() \ No newline at end of file diff --git a/compiler/testData/codegen/script/outerCapture.kts b/compiler/testData/codegen/script/outerCapture.kts new file mode 100644 index 00000000000..ab5b9e9520a --- /dev/null +++ b/compiler/testData/codegen/script/outerCapture.kts @@ -0,0 +1,14 @@ +// expected: rv: 2 +fun foo(l: (Int) -> Int ): Int { + return l(1) +} + +fun bar(p: Int): Int { + return p + 1 +} + +fun main(): Int { + return foo { x -> bar(x) } +} + +main() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java index aee1afce3a4..19c990e9b47 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptCodegenTestGenerated.java @@ -47,6 +47,18 @@ public class ScriptCodegenTestGenerated extends AbstractScriptCodegenTest { doTest(fileName); } + @TestMetadata("inline.kts") + public void testInline() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/script/inline.kts"); + doTest(fileName); + } + + @TestMetadata("outerCapture.kts") + public void testOuterCapture() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/script/outerCapture.kts"); + doTest(fileName); + } + @TestMetadata("parameter.kts") public void testParameter() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/script/parameter.kts");