JavaDescriptorResolver: initialize outer class first

Outer class must be initialized before inner class because inner class
because inner class needs a reference to outer class.

Fixes http://youtrack.jetbrains.com/issue/KT-1324
This commit is contained in:
Stepan Koltsov
2012-02-18 00:08:58 +04:00
parent d2a137d944
commit da0db20ed5
@@ -219,6 +219,12 @@ public class JavaDescriptorResolver {
return new ResolverSrcClassData(kotlinClassDescriptor);
}
PsiClass containingClass = psiClass.getContainingClass();
if (containingClass != null) {
// must resolve containing class first, because inner class must have a reference to it
resolveClass(containingClass);
}
// Not let's take a descriptor of a Java class
ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
if (classData == null) {
@@ -265,11 +271,13 @@ public class JavaDescriptorResolver {
}
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
assert !classDescriptorCache.containsKey(psiClass.getQualifiedName()) : psiClass.getQualifiedName();
classDescriptorCache.put(psiClass.getQualifiedName(), null); // TODO
if (classDescriptorCache.containsKey(psiClass.getQualifiedName())) {
throw new IllegalStateException(psiClass.getQualifiedName());
}
String name = psiClass.getName();
ResolverBinaryClassData classData = new ResolverBinaryClassData();
classDescriptorCache.put(psiClass.getQualifiedName(), classData);
ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
DeclarationDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
@@ -294,7 +302,6 @@ public class JavaDescriptorResolver {
!psiClass.hasModifierProperty(PsiModifier.FINAL))
);
classData.classDescriptor.createTypeConstructor();
classDescriptorCache.put(psiClass.getQualifiedName(), classData);
classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
initializeTypeParameters(classData.typeParameters, new TypeVariableResolverFromTypeDescriptors(new ArrayList<TypeParameterDescriptor>(), outerTypeVariableByNameResolver));