From 71a10295d7ac4d885f19ff3767336d5c2a7c8ac9 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 26 May 2011 18:08:51 +0400 Subject: [PATCH] use receiver type as owner when calling Java methods --- idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java | 7 ++++++- idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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()); + } }