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"); + } }