From 167e5bb4008cd83298d9862c257b98f6a891226e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 17 Jun 2011 16:45:45 +0200 Subject: [PATCH] correctly generate Java superclass constructor calls; don't replace owner when Java method is called via a Jet class --- .../jetbrains/jet/codegen/ExpressionCodegen.java | 7 ++++++- .../jet/codegen/ImplementationBodyCodegen.java | 13 ++++++++++++- .../codegen/classes/exceptionConstructor.jet | 7 +++++++ .../org/jetbrains/jet/codegen/ClassGenTest.java | 4 ++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 idea/testData/codegen/classes/exceptionConstructor.jet diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index dfd72db5e8f..7ef61c429ef 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -729,7 +729,12 @@ public class ExpressionCodegen extends JetVisitor { ensureReceiverOnStack(expression, null); if (expression.getParent() instanceof JetQualifiedExpression) { final JetExpression receiver = ((JetQualifiedExpression) expression.getParent()).getReceiverExpression(); - owner = expressionType(receiver).getInternalName(); + JetType expressionType = bindingContext.getExpressionType(receiver); + DeclarationDescriptor declarationDescriptor = expressionType.getConstructor().getDeclarationDescriptor(); + PsiElement ownerDeclaration = bindingContext.getDeclarationPsiElement(declarationDescriptor); + if (ownerDeclaration instanceof PsiClass) { + owner = typeMapper.mapType(expressionType).getInternalName(); + } } } pushMethodArguments(expression, methodDescriptor); diff --git a/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 6a16bb09ebc..f2d90d0edbe 100644 --- a/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1,5 +1,7 @@ package org.jetbrains.jet.codegen; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -220,7 +222,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ConstructorFrameMap frameMap) { ClassDescriptor classDecl = constructorDescriptor.getContainingDeclaration(); boolean isDelegating = kind == OwnerKind.DELEGATING_IMPLEMENTATION; - Type type = isDelegating ? JetTypeMapper.jetDelegatingImplementationType(classDecl) : JetTypeMapper.jetImplementationType(classDecl); + PsiElement declaration = bindingContext.getDeclarationPsiElement(classDecl); + Type type; + if (declaration instanceof PsiClass) { + type = JetTypeMapper.psiClassType((PsiClass) declaration); + } + else { + type = isDelegating + ? JetTypeMapper.jetDelegatingImplementationType(classDecl) + : JetTypeMapper.jetImplementationType(classDecl); + } if (!isJavaSuperclass) { if (kind == OwnerKind.DELEGATING_IMPLEMENTATION) { diff --git a/idea/testData/codegen/classes/exceptionConstructor.jet b/idea/testData/codegen/classes/exceptionConstructor.jet new file mode 100644 index 00000000000..ab6117e266e --- /dev/null +++ b/idea/testData/codegen/classes/exceptionConstructor.jet @@ -0,0 +1,7 @@ +class GameError(msg: String): Exception(msg) { +} + +fun box(): String { + val e = GameError("foo") + return if (e.getMessage() == "foo") "OK" else "fail" +} diff --git a/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 8a0f75bdbff..4a21d7faa56 100644 --- a/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -99,4 +99,8 @@ public class ClassGenTest extends CodegenTestCase { public void testSecondaryConstructors() throws Exception { blackBoxFile("classes/secondaryConstructors.jet"); } + + public void testExceptionConstructor() throws Exception { + blackBoxFile("classes/exceptionConstructor.jet"); + } }