REPL: don't fail on a callable reference

There should probably be a special kind of property, but at least it won't
throw an exception for now
This commit is contained in:
Alexander Udalov
2014-07-27 17:10:20 -07:00
parent 8d2ab0fd52
commit 4213ce318e
5 changed files with 33 additions and 6 deletions
@@ -2442,7 +2442,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return generateTopLevelPropertyReference(descriptor); return generateTopLevelPropertyReference(descriptor);
} }
else if (containingDeclaration instanceof ClassDescriptor) { 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 { else {
throw new UnsupportedOperationException("Unsupported callable reference container: " + containingDeclaration); throw new UnsupportedOperationException("Unsupported callable reference container: " + containingDeclaration);
@@ -2485,8 +2488,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
@NotNull @NotNull
private StackValue generateMemberPropertyReference(@NotNull VariableDescriptor descriptor) { private StackValue generateMemberPropertyReference(@NotNull VariableDescriptor descriptor, @NotNull ClassDescriptor containingClass) {
ClassDescriptor containingClass = (ClassDescriptor) descriptor.getContainingDeclaration();
Type classAsmType = typeMapper.mapClass(containingClass); Type classAsmType = typeMapper.mapClass(containingClass);
if (containingClass instanceof JavaClassDescriptor) { if (containingClass instanceof JavaClassDescriptor) {
@@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; 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.jet.lang.resolve.java.jvmSignature.JvmMethodSignature;
import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Type; 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.Collections;
import java.util.List; 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.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.DiagnosticsPackage.OtherOrigin;
import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN;
import static org.jetbrains.org.objectweb.asm.Opcodes.*; import static org.jetbrains.org.objectweb.asm.Opcodes.*;
@@ -98,6 +100,9 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
null, null,
"java/lang/Object", "java/lang/Object",
new String[0]); new String[0]);
generateReflectionObjectField(state, classType, v, method("kClassFromKotlin", K_CLASS_IMPL_TYPE, getType(Class.class)),
JvmAbi.KOTLIN_CLASS_FIELD_NAME, createOrGetClInitCodegen().v);
} }
@Override @Override
@@ -125,7 +125,7 @@ public class ReplFromTerminal {
return WhatNextAfterOneLine.QUIT; return WhatNextAfterOneLine.QUIT;
} }
if (line.startsWith(":")) { if (line.startsWith(":") && (line.length() == 1 || line.charAt(1) != ':')) {
boolean notQuit = oneCommand(line.substring(1)); boolean notQuit = oneCommand(line.substring(1));
return notQuit ? WhatNextAfterOneLine.READ_LINE : WhatNextAfterOneLine.QUIT; return notQuit ? WhatNextAfterOneLine.READ_LINE : WhatNextAfterOneLine.QUIT;
} }
@@ -0,0 +1,6 @@
>>> val foo = "REPL"
>>> ::foo.name
foo
>>> ::
... foo.name
foo
@@ -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 */ /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("compiler/testData/repl") @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 class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest {
public void testAllFilesPresentInRepl() throws Exception { public void testAllFilesPresentInRepl() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/repl"), Pattern.compile("^(.+)\\.repl$"), true); 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() { public static Test suite() {
TestSuite suite = new TestSuite("ReplInterpreterTestGenerated"); TestSuite suite = new TestSuite("ReplInterpreterTestGenerated");
suite.addTestSuite(ReplInterpreterTestGenerated.class); suite.addTestSuite(ReplInterpreterTestGenerated.class);
suite.addTestSuite(Classes.class); suite.addTestSuite(Classes.class);
suite.addTestSuite(Objects.class); suite.addTestSuite(Objects.class);
suite.addTestSuite(Reflection.class);
return suite; return suite;
} }
} }