From 9cc11adf7b15e01346be1beecffd4bb93a5b8aec Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Thu, 19 Apr 2012 14:05:39 +0400 Subject: [PATCH] replace lazy type with explicit deferred task list --- .../resolve/java/JavaDescriptorResolver.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 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 7cc5d1b55b8..9f8015a8b06 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 @@ -333,7 +333,15 @@ public class JavaDescriptorResolver { @Nullable public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) { + List tasks = Lists.newArrayList(); + ClassDescriptor clazz = resolveClass(qualifiedName, searchRule, tasks); + for (Runnable task : tasks) { + task.run(); + } + return clazz; + } + private ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule, @NotNull List tasks) { if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) { // TODO: only if -$$TImpl class is created by Kotlin return null; @@ -368,12 +376,12 @@ public class JavaDescriptorResolver { if (psiClass == null) { return null; } - classData = createJavaClassDescriptor(psiClass); + classData = createJavaClassDescriptor(psiClass, tasks); } return classData.getClassDescriptor(); } - private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) { + private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List taskList) { FqName fqName = new FqName(psiClass.getQualifiedName()); if (classDescriptorCache.containsKey(fqName)) { throw new IllegalStateException(psiClass.getQualifiedName()); @@ -387,7 +395,7 @@ public class JavaDescriptorResolver { ResolverBinaryClassData classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind)); classDescriptorCache.put(fqName, classData); classData.classDescriptor.setName(name); - classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass)); + classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass, taskList)); List supertypes = new ArrayList(); @@ -1599,11 +1607,11 @@ public class JavaDescriptorResolver { return (FunctionDescriptorImpl) substitutedFunctionDescriptor; } - private List resolveAnnotations(PsiModifierListOwner owner) { + private List resolveAnnotations(PsiModifierListOwner owner, @NotNull List tasks) { PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations(); List r = Lists.newArrayListWithCapacity(psiAnnotations.length); for (PsiAnnotation psiAnnotation : psiAnnotations) { - AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation); + AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation, tasks); if (annotation != null) { r.add(annotation); } @@ -1611,9 +1619,18 @@ public class JavaDescriptorResolver { return r; } + private List resolveAnnotations(PsiModifierListOwner owner) { + List tasks = Lists.newArrayList(); + List annotations = resolveAnnotations(owner, tasks); + for (Runnable task : tasks) { + task.run(); + } + return annotations; + } + @Nullable - private AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation) { - AnnotationDescriptor annotation = new AnnotationDescriptor(); + private AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation, @NotNull List taskList) { + final AnnotationDescriptor annotation = new AnnotationDescriptor(); String qname = psiAnnotation.getQualifiedName(); if (qname.startsWith("java.lang.annotation.") || qname.startsWith("jet.runtime.typeinfo.") || qname.equals(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName())) { @@ -1621,18 +1638,16 @@ public class JavaDescriptorResolver { return null; } - final ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN); + final ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN, taskList); if (clazz == null) { return null; } - // TODO: no lazy types - //annotation.setAnnotationType(clazz.getDefaultType()); - annotation.setAnnotationType(DeferredType.create(new BindingTraceContext(), new LazyValue() { + taskList.add(new Runnable() { @Override - protected JetType compute() { - return clazz.getDefaultType(); + public void run() { + annotation.setAnnotationType(clazz.getDefaultType()); } - })); + }); ArrayList> valueArguments = new ArrayList>(); PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList();