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);
}
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<StackValue, StackValue> 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) {
@@ -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<JetScript> {
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
@@ -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;
}
@@ -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 */
@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;
}
}