read kotlin supertypes in JavaDescriptorResolver

+ tests
+ remove jet.Any from supers
This commit is contained in:
Stepan Koltsov
2012-01-27 14:25:43 +04:00
parent 1ed5471341
commit bfb1b6e7b5
8 changed files with 88 additions and 8 deletions
@@ -236,7 +236,7 @@ public class JavaDescriptorResolver {
initializeTypeParameters(psiClass); initializeTypeParameters(psiClass);
// TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes // 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()) { if (psiClass.isInterface()) {
//classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object //classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
@@ -579,16 +579,60 @@ public class JavaDescriptorResolver {
return typeParameterDescriptor; return typeParameterDescriptor;
} }
private Collection<? extends JetType> getSupertypes(PsiClass psiClass) { private Collection<? extends JetType> getSupertypes(PsiClassWrapper psiClass, List<TypeParameterDescriptor> typeParameters) {
List<JetType> result = new ArrayList<JetType>(); final List<JetType> result = new ArrayList<JetType>();
result.add(JetStandardClasses.getAnyType());
transformSupertypeList(result, psiClass.getExtendsListTypes()); if (psiClass.getJetClass().signature().length() > 0) {
transformSupertypeList(result, psiClass.getImplementsListTypes()); 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; return result;
} }
private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes) { private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes) {
for (PsiClassType type : 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); JetType transform = semanticServices.getTypeTransformer().transformToType(type);
result.add(TypeUtils.makeNotNullable(transform)); result.add(TypeUtils.makeNotNullable(transform));
@@ -4,6 +4,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField; import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiMethod;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -56,4 +57,13 @@ public class PsiClassWrapper {
public PsiClass getPsiClass() { public PsiClass getPsiClass() {
return psiClass; return psiClass;
} }
private JetClassAnnotation jetClass;
@NotNull
public JetClassAnnotation getJetClass() {
if (jetClass == null) {
jetClass = JetClassAnnotation.get(psiClass);
}
return jetClass;
}
} }
@@ -41,7 +41,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
} }
return newSubstitutor; return newSubstitutor;
} }
@NotNull @NotNull
@Override @Override
public TypeConstructor getTypeConstructor() { public TypeConstructor getTypeConstructor() {
@@ -0,0 +1,5 @@
package test
abstract class Aaa()
class Bbb() : Aaa()
@@ -0,0 +1,5 @@
package test
abstract class Aaa<P>()
class Bbb() : Aaa<java.util.Random>()
@@ -0,0 +1,5 @@
package test
trait Aaa<P>
class Bbb() : Aaa<java.util.Random>
@@ -0,0 +1,7 @@
package test
open class Base<T>() {
fun foo(): T = throw Exception()
}
class Inh() : Base<String>()
@@ -436,8 +436,12 @@ class NamespaceComparator {
serializeCommaSeparated(klass.getTypeConstructor().getParameters()); serializeCommaSeparated(klass.getTypeConstructor().getParameters());
sb.append(">"); sb.append(">");
} }
if (!klass.getTypeConstructor().getSupertypes().isEmpty()) {
sb.append(" : ");
new Serializer(sb).serializeCommaSeparated(new ArrayList<JetType>(klass.getTypeConstructor().getSupertypes()));
}
// TODO: supers
// TODO: constructors // TODO: constructors
sb.append(" {\n"); sb.append(" {\n");