From 4fdfcdc541883ce73f9dbed42b956eb8a2951acc Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 30 May 2011 16:26:12 +0400 Subject: [PATCH] superclass stuff improvements --- .../codegen/ImplementationBodyCodegen.java | 26 +++++++------------ .../codegen/classes/inheritedMethod.jet | 13 ++++++++++ .../jetbrains/jet/codegen/ClassGenTest.java | 4 +++ 3 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 idea/testData/codegen/classes/inheritedMethod.jet diff --git a/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index e2ff95fafad..43e7a429096 100644 --- a/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1,7 +1,5 @@ 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; @@ -47,19 +45,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (delegationSpecifiers.isEmpty()) return "java/lang/Object"; JetDelegationSpecifier first = delegationSpecifiers.get(0); - if (first instanceof JetDelegatorToSuperClass) { - JetType superType = bindingContext.resolveTypeReference(first.getTypeReference()); - ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor(); - PsiElement superPsi = bindingContext.getDeclarationPsiElement(superClassDescriptor); - if (superPsi instanceof PsiClass) { - PsiClass psiClass = (PsiClass) superPsi; - String fqn = psiClass.getQualifiedName(); - if (!psiClass.isInterface()) { - return fqn.replace('.', '/'); - } - } - } - else if (first instanceof JetDelegatorToSuperCall) { + if (first instanceof JetDelegatorToSuperClass || first instanceof JetDelegatorToSuperCall) { JetType superType = bindingContext.resolveTypeReference(first.getTypeReference()); ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor(); return typeMapper.jvmName(superClassDescriptor, kind); @@ -104,7 +90,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { List specifiers = myClass.getDelegationSpecifiers(); if (specifiers.isEmpty() || !(specifiers.get(0) instanceof JetDelegatorToSuperCall)) { - String superClass = getSuperClass(); + // TODO correct calculation of super class + String superClass = "java/lang/Object"; + if (!specifiers.isEmpty()) { + final JetType superType = bindingContext.resolveTypeReference(specifiers.get(0).getTypeReference()); + ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor(); + if (superClassDescriptor.hasConstructors()) { + superClass = getSuperClass(); + } + } iv.load(0, Type.getType("L" + superClass + ";")); iv.invokespecial(superClass, "", /* TODO super constructor descriptor */"()V"); } diff --git a/idea/testData/codegen/classes/inheritedMethod.jet b/idea/testData/codegen/classes/inheritedMethod.jet new file mode 100644 index 00000000000..c872bdff53d --- /dev/null +++ b/idea/testData/codegen/classes/inheritedMethod.jet @@ -0,0 +1,13 @@ +class Foo { + fun xyzzy(): String = "xyzzy" +} + +class Bar(): Foo { + fun test(): String = xyzzy() +} + +fun box() { + val bar = new Bar() + val f = bar.test() + return if (f == "xyzzy") "OK" else "fail" +} diff --git a/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 312021e9aad..0fce968a329 100644 --- a/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -75,4 +75,8 @@ public class ClassGenTest extends CodegenTestCase { assertNull(findMethodByName(implClass, "x")); assertNotNull(findMethodByName(implClass, "y")); } + + public void testInheritedMethod() throws Exception { + blackBoxFile("classes/inheritedMethod.jet"); + } }