use receiver type as owner when calling Java methods

This commit is contained in:
Dmitry Jemerov
2011-05-26 18:08:51 +04:00
parent 815a423dc1
commit 71a10295d7
2 changed files with 13 additions and 1 deletions
@@ -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());
}