diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java index a7c162b9a89..a3dd41c6f4c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java @@ -123,7 +123,7 @@ public class ScriptCodegen extends MemberCodegen { @NotNull ScriptDescriptor scriptDescriptor, @NotNull ClassDescriptor classDescriptorForScript, @NotNull ClassBuilder classBuilder, - @NotNull final MethodContext methodContext + @NotNull MethodContext methodContext ) { //noinspection ConstantConditions Type blockType = typeMapper.mapType(scriptDescriptor.getScriptCodeDescriptor().getReturnType()); @@ -143,7 +143,7 @@ public class ScriptCodegen extends MemberCodegen { if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); - final InstructionAdapter iv = new InstructionAdapter(mv); + InstructionAdapter iv = new InstructionAdapter(mv); Type classType = typeMapper.mapType(classDescriptorForScript); @@ -152,7 +152,7 @@ public class ScriptCodegen extends MemberCodegen { iv.load(0, classType); - final FrameMap frameMap = new FrameMap(); + FrameMap frameMap = new FrameMap(); frameMap.enterTemp(OBJECT_TYPE); for (ScriptDescriptor importedScript : context.getEarlierScripts()) { @@ -167,13 +167,6 @@ public class ScriptCodegen extends MemberCodegen { frameMap.enter(parameter, argTypes[i + add]); } - generateInitializers(new Function0() { - @Override - public ExpressionCodegen invoke() { - return new ExpressionCodegen(iv, frameMap, Type.VOID_TYPE, methodContext, state, ScriptCodegen.this); - } - }); - int offset = 1; for (ScriptDescriptor earlierScript : context.getEarlierScripts()) { @@ -192,9 +185,16 @@ public class ScriptCodegen extends MemberCodegen { iv.putfield(classType.getInternalName(), parameter.getName().getIdentifier(), parameterType.getDescriptor()); } - StackValue stackValue = - new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, methodContext, state, this) - .gen(scriptDeclaration.getBlockExpression()); + final ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, methodContext, state, this); + + generateInitializers(new Function0() { + @Override + public ExpressionCodegen invoke() { + return codegen; + } + }); + + StackValue stackValue = codegen.gen(scriptDeclaration.getBlockExpression()); if (stackValue.type != Type.VOID_TYPE) { StackValue.Field resultValue = StackValue .field(blockType, classType, ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME, false, StackValue.LOCAL_0); diff --git a/compiler/testData/repl/regressions/kt6843.repl b/compiler/testData/repl/regressions/kt6843.repl new file mode 100644 index 00000000000..ea547a0cb76 --- /dev/null +++ b/compiler/testData/repl/regressions/kt6843.repl @@ -0,0 +1,5 @@ +>>> [data] class Person(val name: String) +>>> var x: String? = "hello" +>>> val y = x?.let { Person(it) } +>>> y +Person(name=hello) diff --git a/compiler/testData/repl/simpleTwoVals.repl b/compiler/testData/repl/simpleTwoVals.repl new file mode 100644 index 00000000000..059ef4b5b08 --- /dev/null +++ b/compiler/testData/repl/simpleTwoVals.repl @@ -0,0 +1,4 @@ +>>> val x = "" +>>> val y = x +>>> x == y +true diff --git a/compiler/tests/org/jetbrains/kotlin/repl/ReplInterpreterTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/repl/ReplInterpreterTestGenerated.java index 4a86ede6205..276d0ba7878 100644 --- a/compiler/tests/org/jetbrains/kotlin/repl/ReplInterpreterTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/repl/ReplInterpreterTestGenerated.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("compiler/testData/repl") @TestDataPath("$PROJECT_ROOT") -@InnerTestClasses({ReplInterpreterTestGenerated.Classes.class, ReplInterpreterTestGenerated.Multiline.class, ReplInterpreterTestGenerated.Objects.class, ReplInterpreterTestGenerated.PrimitiveTypes.class, ReplInterpreterTestGenerated.Reflection.class}) +@InnerTestClasses({ReplInterpreterTestGenerated.Classes.class, ReplInterpreterTestGenerated.Multiline.class, ReplInterpreterTestGenerated.Objects.class, ReplInterpreterTestGenerated.PrimitiveTypes.class, ReplInterpreterTestGenerated.Reflection.class, ReplInterpreterTestGenerated.Regressions.class}) @RunWith(JUnit3RunnerWithInners.class) public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest { public void testAllFilesPresentInRepl() throws Exception { @@ -97,6 +97,12 @@ public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest { doTest(fileName); } + @TestMetadata("simpleTwoVals.repl") + public void testSimpleTwoVals() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/repl/simpleTwoVals.repl"); + doTest(fileName); + } + @TestMetadata("syntaxErrors.repl") public void testSyntaxErrors() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/repl/syntaxErrors.repl"); @@ -267,4 +273,19 @@ public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest { doTest(fileName); } } + + @TestMetadata("compiler/testData/repl/regressions") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Regressions extends AbstractReplInterpreterTest { + public void testAllFilesPresentInRegressions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/repl/regressions"), Pattern.compile("^(.+)\\.repl$"), true); + } + + @TestMetadata("kt6843.repl") + public void testKt6843() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/repl/regressions/kt6843.repl"); + doTest(fileName); + } + } }