From 2a0567d15b51eebb7f76feb4c91a4b5bd11c8470 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 26 May 2011 19:32:39 +0400 Subject: [PATCH] map String methods; don't try to push void values on stack --- .../jet/codegen/ExpressionCodegen.java | 22 ++++++++++++++++++- .../jet/codegen/PatternMatchingTest.java | 6 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index b5e4cc2578a..3f17fcb2d2a 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -682,7 +682,24 @@ public class ExpressionCodegen extends JetVisitor { } } + PsiElement declarationPsiElement = bindingContext.getDeclarationPsiElement(funDescriptor); + if (declarationPsiElement == null && isClass(functionParent, "String")) { + final Project project = expression.getProject(); + PsiClass jlString = JavaPsiFacade.getInstance(project).findClass("java.lang.String", + ProjectScope.getAllScope(project)); + // TODO better overload mapping + final PsiMethod[] methods = jlString.findMethodsByName(funDescriptor.getName(), false); + final int arity = ((FunctionDescriptor) funDescriptor).getUnsubstitutedValueParameters().size(); + for (PsiMethod method : methods) { + if (method.getParameterList().getParametersCount() == arity) { + declarationPsiElement = method; + } + } + } + if (declarationPsiElement == null) { + throw new UnsupportedOperationException("couldn't find declaration for " + funDescriptor); + } Method methodDescriptor; if (declarationPsiElement instanceof PsiMethod) { PsiMethod psiMethod = (PsiMethod) declarationPsiElement; @@ -1629,7 +1646,10 @@ public class ExpressionCodegen extends JetVisitor { v.athrow(); } v.mark(end); - myStack.push(StackValue.onStack(expressionType(expression))); + final Type type = expressionType(expression); + if (type.getSort() != Type.VOID) { + myStack.push(StackValue.onStack(type)); + } myMap.leaveTemp(subjectType.getSize()); } diff --git a/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java b/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java index eaf9ee21c3f..6f27ac9ebf6 100644 --- a/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/PatternMatchingTest.java @@ -55,4 +55,10 @@ public class PatternMatchingTest extends CodegenTestCase { Method foo = generateFunction(); assertEquals("something", foo.invoke(null, "")); } + + public void testNoReturnType() throws Exception { + loadText("fun foo(x: String) = when(x) { is * => return \"x\" }"); + Method foo = generateFunction(); + assertEquals("x", foo.invoke(null, "")); + } }