From f0e0411847e1b425eba2aaeb20f0e94f78e6b089 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 26 Jun 2012 19:23:17 +0200 Subject: [PATCH] Special classes (for Any and Nothing) introduced to Lazy Resolve --- .../resolve/lazy/LazyClassDescriptor.java | 18 ++++++++++----- .../jet/lang/resolve/lazy/ResolveSession.java | 23 ++++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index c452f039d21..10c934e77a0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.lazy.data.FilteringClassLikeInfo; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; @@ -275,15 +276,20 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @Override public Collection getSupertypes() { if (supertypes == null) { - JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject(); - if (classOrObject == null) { + if (resolveSession.isClassSpecial(DescriptorUtils.getFQName(LazyClassDescriptor.this))) { this.supertypes = Collections.emptyList(); } else { - this.supertypes = resolveSession.getInjector().getDescriptorResolver() - .resolveSupertypes(getScopeForClassHeaderResolution(), - classOrObject, - resolveSession.getTrace()); + JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject(); + if (classOrObject == null) { + this.supertypes = Collections.emptyList(); + } + else { + this.supertypes = resolveSession.getInjector().getDescriptorResolver() + .resolveSupertypes(getScopeForClassHeaderResolution(), + classOrObject, + resolveSession.getTrace()); + } } } return supertypes; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index cdbbb7d6a5d..6807e53ef3b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -16,6 +16,8 @@ package org.jetbrains.jet.lang.resolve.lazy; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.Maps; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; @@ -49,17 +51,32 @@ public class ResolveSession { private final BindingTrace trace = new BindingTraceContext(); private final DeclarationProviderFactory declarationProviderFactory; + private final Predicate specialClasses; + + private final InjectorForLazyResolve injector; private final ModuleConfiguration moduleConfiguration; private final Map enumEntryClassDescriptorCache = Maps.newHashMap(); + public ResolveSession( + @NotNull Project project, + @NotNull ModuleDescriptor rootDescriptor, + @NotNull ModuleConfiguration moduleConfiguration, + @NotNull DeclarationProviderFactory declarationProviderFactory + ) { + this(project, rootDescriptor, moduleConfiguration, declarationProviderFactory, Predicates.alwaysFalse()); + } + + @Deprecated // Internal use only public ResolveSession( @NotNull Project project, @NotNull ModuleDescriptor rootDescriptor, @NotNull ModuleConfiguration moduleConfiguration, - @NotNull DeclarationProviderFactory declarationProviderFactory + @NotNull DeclarationProviderFactory declarationProviderFactory, + @NotNull Predicate specialClasses ) { + this.specialClasses = specialClasses; this.injector = new InjectorForLazyResolve(project, this, trace); this.module = rootDescriptor; this.moduleConfiguration = moduleConfiguration; @@ -76,6 +93,10 @@ public class ResolveSession { return injector; } + /*package*/ boolean isClassSpecial(@NotNull FqNameUnsafe fqName) { + return specialClasses.apply(fqName); + } + @NotNull public ModuleConfiguration getModuleConfiguration() { return moduleConfiguration;