diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 6ca20a702a8..1344ca9f5ff 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -680,16 +680,21 @@ public class ExpressionCodegen extends JetVisitor { Method methodDescriptor; if (declarationPsiElement instanceof PsiMethod) { PsiMethod psiMethod = (PsiMethod) declarationPsiElement; + String owner = JetTypeMapper.jvmName(psiMethod.getContainingClass()); methodDescriptor = getMethodDescriptor(psiMethod); final boolean isStatic = psiMethod.hasModifierProperty(PsiModifier.STATIC); if (!isStatic) { ensureReceiverOnStack(expression); + if (expression.getParent() instanceof JetQualifiedExpression) { + final JetExpression receiver = ((JetQualifiedExpression) expression.getParent()).getReceiverExpression(); + owner = expressionType(receiver).getInternalName(); + } } pushMethodArguments(expression, methodDescriptor); v.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : Opcodes.INVOKEVIRTUAL, - JetTypeMapper.jvmName(psiMethod.getContainingClass()), + owner, methodDescriptor.getName(), methodDescriptor.getDescriptor()); } diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index ef29499407c..f69c722c0e4 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -393,4 +393,11 @@ public class NamespaceGenTest extends CodegenTestCase { main.invoke(null, l); assertEquals(10, l.get(0).intValue()); } + + public void testCallMethodDeclaredInSuperclass() throws Exception { + loadText("fun foo(sb: StringBuilder) = sb.charAt(0)"); + final Method main = generateFunction(); + final StringBuilder sb = new StringBuilder("x"); + assertEquals('x', ((Character) main.invoke(null, sb)).charValue()); + } }