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);
// 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<? extends JetType> getSupertypes(PsiClass psiClass) {
List<JetType> result = new ArrayList<JetType>();
result.add(JetStandardClasses.getAnyType());
transformSupertypeList(result, psiClass.getExtendsListTypes());
transformSupertypeList(result, psiClass.getImplementsListTypes());
private Collection<? extends JetType> getSupertypes(PsiClassWrapper psiClass, List<TypeParameterDescriptor> typeParameters) {
final List<JetType> result = new ArrayList<JetType>();
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<JetType> 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));
@@ -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;
}
}
@@ -41,7 +41,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
}
return newSubstitutor;
}
@NotNull
@Override
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());
sb.append(">");
}
if (!klass.getTypeConstructor().getSupertypes().isEmpty()) {
sb.append(" : ");
new Serializer(sb).serializeCommaSeparated(new ArrayList<JetType>(klass.getTypeConstructor().getSupertypes()));
}
// TODO: supers
// TODO: constructors
sb.append(" {\n");