From bfb1b6e7b5e26c6d9b731bae1f302147da31b8e2 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 27 Jan 2012 14:25:43 +0400 Subject: [PATCH] read kotlin supertypes in JavaDescriptorResolver + tests + remove jet.Any from supers --- .../resolve/java/JavaDescriptorResolver.java | 56 +++++++++++++++++-- .../lang/resolve/java/PsiClassWrapper.java | 10 ++++ .../LazySubstitutingClassDescriptor.java | 2 +- .../class/InheritClassSimple.kt | 5 ++ .../class/InheritClassWithParam.kt | 5 ++ .../class/InheritTraitWithParam.kt | 5 ++ .../classFun/FunInParamSuper.kt | 7 +++ .../jet/compiler/NamespaceComparator.java | 6 +- 8 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/readKotlinBinaryClass/class/InheritClassSimple.kt create mode 100644 compiler/testData/readKotlinBinaryClass/class/InheritClassWithParam.kt create mode 100644 compiler/testData/readKotlinBinaryClass/class/InheritTraitWithParam.kt create mode 100644 compiler/testData/readKotlinBinaryClass/classFun/FunInParamSuper.kt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index db4a96c1944..76b3c548290 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -236,7 +236,7 @@ public class JavaDescriptorResolver { initializeTypeParameters(psiClass); // TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes - supertypes.addAll(getSupertypes(psiClass)); + supertypes.addAll(getSupertypes(new PsiClassWrapper(psiClass), classData.classDescriptor.getTypeConstructor().getParameters())); if (psiClass.isInterface()) { //classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object @@ -579,16 +579,60 @@ public class JavaDescriptorResolver { return typeParameterDescriptor; } - private Collection getSupertypes(PsiClass psiClass) { - List result = new ArrayList(); - result.add(JetStandardClasses.getAnyType()); - transformSupertypeList(result, psiClass.getExtendsListTypes()); - transformSupertypeList(result, psiClass.getImplementsListTypes()); + private Collection getSupertypes(PsiClassWrapper psiClass, List typeParameters) { + final List result = new ArrayList(); + + if (psiClass.getJetClass().signature().length() > 0) { + final TypeParameterListTypeVariableResolver typeVariableResolver = new TypeParameterListTypeVariableResolver(typeParameters); + + new JetSignatureReader(psiClass.getJetClass().signature()).accept(new JetSignatureExceptionsAdapter() { + @Override + public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) { + // TODO: collect + return new JetSignatureAdapter(); + } + + @Override + public JetSignatureVisitor visitSuperclass() { + return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) { + @Override + protected void done(@NotNull JetType jetType) { + if (!jetType.equals(JetStandardClasses.getAnyType())) { + result.add(jetType); + } + } + }; + } + + @Override + public JetSignatureVisitor visitInterface() { + return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) { + @Override + protected void done(@NotNull JetType jetType) { + if (!jetType.equals(JetStandardClasses.getAnyType())) { + result.add(jetType); + } + } + }; + } + }); + } else { + transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes()); + transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes()); + } + if (result.isEmpty()) { + result.add(JetStandardClasses.getAnyType()); + } return result; } private void transformSupertypeList(List result, PsiClassType[] extendsListTypes) { for (PsiClassType type : extendsListTypes) { + PsiClass resolved = type.resolve(); + if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) { + continue; + } + JetType transform = semanticServices.getTypeTransformer().transformToType(type); result.add(TypeUtils.makeNotNullable(transform)); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassWrapper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassWrapper.java index 0eb52048fa3..b31fb22714d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassWrapper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/PsiClassWrapper.java @@ -4,6 +4,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; import java.util.ArrayList; import java.util.List; @@ -56,4 +57,13 @@ public class PsiClassWrapper { public PsiClass getPsiClass() { return psiClass; } + + private JetClassAnnotation jetClass; + @NotNull + public JetClassAnnotation getJetClass() { + if (jetClass == null) { + jetClass = JetClassAnnotation.get(psiClass); + } + return jetClass; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java index adcd080266f..dc297c9eaea 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java @@ -41,7 +41,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { } return newSubstitutor; } - + @NotNull @Override public TypeConstructor getTypeConstructor() { diff --git a/compiler/testData/readKotlinBinaryClass/class/InheritClassSimple.kt b/compiler/testData/readKotlinBinaryClass/class/InheritClassSimple.kt new file mode 100644 index 00000000000..33c2bd0aa84 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/class/InheritClassSimple.kt @@ -0,0 +1,5 @@ +package test + +abstract class Aaa() + +class Bbb() : Aaa() diff --git a/compiler/testData/readKotlinBinaryClass/class/InheritClassWithParam.kt b/compiler/testData/readKotlinBinaryClass/class/InheritClassWithParam.kt new file mode 100644 index 00000000000..c758eb05eca --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/class/InheritClassWithParam.kt @@ -0,0 +1,5 @@ +package test + +abstract class Aaa

() + +class Bbb() : Aaa() diff --git a/compiler/testData/readKotlinBinaryClass/class/InheritTraitWithParam.kt b/compiler/testData/readKotlinBinaryClass/class/InheritTraitWithParam.kt new file mode 100644 index 00000000000..027afdd15e8 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/class/InheritTraitWithParam.kt @@ -0,0 +1,5 @@ +package test + +trait Aaa

+ +class Bbb() : Aaa diff --git a/compiler/testData/readKotlinBinaryClass/classFun/FunInParamSuper.kt b/compiler/testData/readKotlinBinaryClass/classFun/FunInParamSuper.kt new file mode 100644 index 00000000000..d2211784060 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/classFun/FunInParamSuper.kt @@ -0,0 +1,7 @@ +package test + +open class Base() { + fun foo(): T = throw Exception() +} + +class Inh() : Base() diff --git a/compiler/tests/org/jetbrains/jet/compiler/NamespaceComparator.java b/compiler/tests/org/jetbrains/jet/compiler/NamespaceComparator.java index 02f316a61b6..5b1e5aaaacb 100644 --- a/compiler/tests/org/jetbrains/jet/compiler/NamespaceComparator.java +++ b/compiler/tests/org/jetbrains/jet/compiler/NamespaceComparator.java @@ -436,8 +436,12 @@ class NamespaceComparator { serializeCommaSeparated(klass.getTypeConstructor().getParameters()); sb.append(">"); } + + if (!klass.getTypeConstructor().getSupertypes().isEmpty()) { + sb.append(" : "); + new Serializer(sb).serializeCommaSeparated(new ArrayList(klass.getTypeConstructor().getSupertypes())); + } - // TODO: supers // TODO: constructors sb.append(" {\n");