From da0db20ed599f473d8e9c51361714af324d9a8d5 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 18 Feb 2012 00:08:58 +0400 Subject: [PATCH] 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 --- .../lang/resolve/java/JavaDescriptorResolver.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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 e82962fd00c..b7798696486 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 @@ -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(), outerTypeVariableByNameResolver));