提交 9cc11adf 编写于 作者: S Stepan Koltsov

replace lazy type with explicit deferred task list

上级 cd8e275c
......@@ -333,7 +333,15 @@ public class JavaDescriptorResolver {
@Nullable
public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
List<Runnable> 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<Runnable> 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<Runnable> 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<JetType> supertypes = new ArrayList<JetType>();
......@@ -1599,11 +1607,11 @@ public class JavaDescriptorResolver {
return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
}
private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) {
PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
List<AnnotationDescriptor> 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<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
List<Runnable> tasks = Lists.newArrayList();
List<AnnotationDescriptor> 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<Runnable> 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<JetType>() {
taskList.add(new Runnable() {
@Override
protected JetType compute() {
return clazz.getDefaultType();
public void run() {
annotation.setAnnotationType(clazz.getDefaultType());
}
}));
});
ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册