fix complex case of recursion in JavaDescriptorResolver

#KT-1804
This commit is contained in:
Stepan Koltsov
2012-04-24 22:14:01 +04:00
parent 0f3aa9e567
commit 4a1c36d733
3 changed files with 91 additions and 1 deletions
@@ -410,6 +410,7 @@ public class JavaDescriptorResolver {
return classData.classDescriptor;
}
@NotNull
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
FqName fqName = new FqName(psiClass.getQualifiedName());
if (classDescriptorCache.containsKey(fqName)) {
@@ -421,7 +422,14 @@ public class JavaDescriptorResolver {
String name = psiClass.getName();
ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
ResolverBinaryClassData classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind));
// class may be resolved during resolution of parent
ResolverBinaryClassData classData = classDescriptorCache.get(fqName);
if (classData != null) {
return classData;
}
classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind));
classDescriptorCache.put(fqName, classData);
classData.classDescriptor.setName(name);
classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass, taskList));