diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index aff50c829f3..012dfc1ee87 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2442,7 +2442,10 @@ public class ExpressionCodegen extends JetVisitor implem return generateTopLevelPropertyReference(descriptor); } else if (containingDeclaration instanceof ClassDescriptor) { - return generateMemberPropertyReference(descriptor); + return generateMemberPropertyReference(descriptor, (ClassDescriptor) containingDeclaration); + } + else if (containingDeclaration instanceof ScriptDescriptor) { + return generateMemberPropertyReference(descriptor, ((ScriptDescriptor) containingDeclaration).getClassDescriptor()); } else { throw new UnsupportedOperationException("Unsupported callable reference container: " + containingDeclaration); @@ -2485,8 +2488,7 @@ public class ExpressionCodegen extends JetVisitor implem } @NotNull - private StackValue generateMemberPropertyReference(@NotNull VariableDescriptor descriptor) { - ClassDescriptor containingClass = (ClassDescriptor) descriptor.getContainingDeclaration(); + private StackValue generateMemberPropertyReference(@NotNull VariableDescriptor descriptor, @NotNull ClassDescriptor containingClass) { Type classAsmType = typeMapper.mapClass(containingClass); if (containingClass instanceof JavaClassDescriptor) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java index 82d3c8bbade..4ad6c44bd7e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature; import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.Type; @@ -36,8 +37,9 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; import java.util.Collections; import java.util.List; +import static org.jetbrains.jet.codegen.AsmUtil.method; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; -import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; import static org.jetbrains.jet.lang.resolve.java.diagnostics.DiagnosticsPackage.OtherOrigin; import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -98,6 +100,9 @@ public class ScriptCodegen extends MemberCodegen { null, "java/lang/Object", new String[0]); + + generateReflectionObjectField(state, classType, v, method("kClassFromKotlin", K_CLASS_IMPL_TYPE, getType(Class.class)), + JvmAbi.KOTLIN_CLASS_FIELD_NAME, createOrGetClInitCodegen().v); } @Override diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplFromTerminal.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplFromTerminal.java index 105e6cedf84..55f0a76b3a2 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplFromTerminal.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplFromTerminal.java @@ -125,7 +125,7 @@ public class ReplFromTerminal { return WhatNextAfterOneLine.QUIT; } - if (line.startsWith(":")) { + if (line.startsWith(":") && (line.length() == 1 || line.charAt(1) != ':')) { boolean notQuit = oneCommand(line.substring(1)); return notQuit ? WhatNextAfterOneLine.READ_LINE : WhatNextAfterOneLine.QUIT; } diff --git a/compiler/testData/repl/reflection/propertyReference.repl b/compiler/testData/repl/reflection/propertyReference.repl new file mode 100644 index 00000000000..9f3e71fa9f3 --- /dev/null +++ b/compiler/testData/repl/reflection/propertyReference.repl @@ -0,0 +1,6 @@ +>>> val foo = "REPL" +>>> ::foo.name +foo +>>> :: +... foo.name +foo diff --git a/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTestGenerated.java b/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTestGenerated.java index c52128c1503..6d25c9552d9 100644 --- a/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/repl/ReplInterpreterTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.repl.AbstractReplInterpreterTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/repl") -@InnerTestClasses({ReplInterpreterTestGenerated.Classes.class, ReplInterpreterTestGenerated.Objects.class}) +@InnerTestClasses({ReplInterpreterTestGenerated.Classes.class, ReplInterpreterTestGenerated.Objects.class, ReplInterpreterTestGenerated.Reflection.class}) public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest { public void testAllFilesPresentInRepl() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/repl"), Pattern.compile("^(.+)\\.repl$"), true); @@ -178,11 +178,25 @@ public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest { } + @TestMetadata("compiler/testData/repl/reflection") + public static class Reflection extends AbstractReplInterpreterTest { + public void testAllFilesPresentInReflection() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/repl/reflection"), Pattern.compile("^(.+)\\.repl$"), true); + } + + @TestMetadata("propertyReference.repl") + public void testPropertyReference() throws Exception { + doTest("compiler/testData/repl/reflection/propertyReference.repl"); + } + + } + public static Test suite() { TestSuite suite = new TestSuite("ReplInterpreterTestGenerated"); suite.addTestSuite(ReplInterpreterTestGenerated.class); suite.addTestSuite(Classes.class); suite.addTestSuite(Objects.class); + suite.addTestSuite(Reflection.class); return suite; } }