提交 da0db20e 编写于 作者: S Stepan Koltsov

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
上级 d2a137d9
......@@ -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));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册