diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 07f42c21831..731158758d6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -17,16 +17,16 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.base.Predicates; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerBasic; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.descriptors.impl.*; +import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptorLite; +import org.jetbrains.jet.lang.descriptors.impl.NamespaceLikeBuilder; +import org.jetbrains.jet.lang.descriptors.impl.NamespaceLikeBuilderDummy; import org.jetbrains.jet.lang.psi.JetClassOrObject; -import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -36,7 +36,10 @@ import org.jetbrains.jet.lang.types.expressions.ExpressionTypingContext; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import javax.inject.Inject; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; public class TopDownAnalyzer { @@ -147,36 +150,6 @@ public class TopDownAnalyzer { } } - public static void processStandardLibraryNamespace( - @NotNull Project project, - @NotNull BindingTrace trace, - @NotNull WritableScope outerScope, - @NotNull NamespaceDescriptorImpl standardLibraryNamespace, - @NotNull List files) { - - TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters( - Predicates.alwaysFalse(), true, false, Collections.emptyList()); - InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic( - project, topDownAnalysisParameters, new ObservableBindingTrace(trace), - KotlinBuiltIns.getInstance().getBuiltInsModule(), PlatformToKotlinClassMap.EMPTY); - - injector.getTopDownAnalyzer().doProcessStandardLibraryNamespace(outerScope, standardLibraryNamespace, files); - } - - private void doProcessStandardLibraryNamespace( - WritableScope outerScope, NamespaceDescriptorImpl standardLibraryNamespace, List files) { - ArrayList toAnalyze = new ArrayList(); - for (JetFile file : files) { - // TODO 1 restore - //context.getPackageFragments().put(file, standardLibraryNamespace); - context.getNamespaceScopes().put(file, standardLibraryNamespace.getMemberScope()); - toAnalyze.addAll(file.getDeclarations()); - } -// context.getDeclaringScopes().put(file, outerScope); - - doProcess(outerScope, standardLibraryNamespace.getBuilder(), toAnalyze); - } - public static void processClassOrObject( @NotNull ExpressionTypingContext context, @NotNull final DeclarationDescriptor containingDeclaration, diff --git a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java index 3867e02c15e..301297e9494 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.plugin.references; +import com.google.common.base.Predicates; import com.google.common.collect.Sets; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.AbstractProjectComponent; @@ -32,30 +33,25 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.LightClassUtil; +import org.jetbrains.jet.di.InjectorForTopDownAnalyzerBasic; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; -import org.jetbrains.jet.lang.resolve.scopes.WritableScope; -import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.renderer.DescriptorRenderer; import java.net.URL; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; public class BuiltInsReferenceResolver extends AbstractProjectComponent { - private volatile BindingContext bindingContext = null; - private volatile Set builtInsSources = Sets.newHashSet(); + private volatile BindingContext bindingContext; + private volatile Set builtInsSources; + private volatile MutablePackageFragmentDescriptor builtinsPackageFragment; public BuiltInsReferenceResolver(Project project) { super(project); @@ -74,24 +70,24 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { private void initialize() { assert bindingContext == null : "Attempt to initialize twice"; - final List jetBuiltInsFiles = getJetBuiltInsFiles(); + final Set jetBuiltInsFiles = getJetBuiltInsFiles(); final Runnable initializeRunnable = new Runnable() { @Override public void run() { - BindingTraceContext context = new BindingTraceContext(); - FakeJetNamespaceDescriptor jetNamespace = new FakeJetNamespaceDescriptor(); - context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, jetNamespace); + TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters( + Predicates.alwaysFalse(), true, false, Collections.emptyList()); + ModuleDescriptorImpl module = new ModuleDescriptorImpl( + Name.special(""), Collections.emptyList(), PlatformToKotlinClassMap.EMPTY); + InjectorForTopDownAnalyzerBasic injector = new InjectorForTopDownAnalyzerBasic( + myProject, topDownAnalysisParameters, new BindingTraceContext(), module, PlatformToKotlinClassMap.EMPTY); - WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION, - "Builtin classes scope"); - scope.changeLockLevel(WritableScope.LockLevel.BOTH); - jetNamespace.setMemberScope(scope); - - TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, jetBuiltInsFiles); + TopDownAnalyzer analyzer = injector.getTopDownAnalyzer(); + analyzer.analyzeFiles(jetBuiltInsFiles, Collections.emptyList()); + builtinsPackageFragment = analyzer.getPackageFragmentProvider().getOrCreateFragment(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME); builtInsSources = Sets.newHashSet(jetBuiltInsFiles); - bindingContext = context.getBindingContext(); + bindingContext = injector.getBindingTrace().getBindingContext(); } }; @@ -106,9 +102,10 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { } }); } + } - private List getJetBuiltInsFiles() { + private Set getJetBuiltInsFiles() { URL url = LightClassUtil.getBuiltInsDirUrl(); VirtualFile vf = VfsUtil.findFileByURL(url); assert vf != null : "Virtual file not found by URL: " + url; @@ -123,12 +120,12 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { PsiDirectory psiDirectory = PsiManager.getInstance(myProject).findDirectory(vf); assert psiDirectory != null : "No PsiDirectory for " + vf; - return ContainerUtil.mapNotNull(psiDirectory.getFiles(), new Function() { + return new HashSet(ContainerUtil.mapNotNull(psiDirectory.getFiles(), new Function() { @Override public JetFile fun(PsiFile file) { return file instanceof JetFile ? (JetFile) file : null; } - }); + })); } @Nullable @@ -170,9 +167,10 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { if (originalDescriptor instanceof ClassDescriptor) { return findCurrentDescriptorForClass((ClassDescriptor) originalDescriptor); } - else if (originalDescriptor instanceof NamespaceDescriptor) { - return bindingContext.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, - DescriptorUtils.getFQName(originalDescriptor).toSafe()); + else if (originalDescriptor instanceof PackageFragmentDescriptor) { + return KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.equals(((PackageFragmentDescriptor) originalDescriptor).getFqName()) + ? builtinsPackageFragment + : null; } else if (originalDescriptor instanceof MemberDescriptor) { return findCurrentDescriptorForMember((MemberDescriptor) originalDescriptor); @@ -221,32 +219,11 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { if (parent instanceof ClassDescriptor) { return ((ClassDescriptor) parent).getDefaultType().getMemberScope(); } - else if (parent instanceof NamespaceDescriptor) { - return ((NamespaceDescriptor)parent).getMemberScope(); + else if (parent instanceof PackageFragmentDescriptor) { + return ((PackageFragmentDescriptor) parent).getMemberScope(); } else { return null; } } - - private static class FakeJetNamespaceDescriptor extends NamespaceDescriptorImpl { - private WritableScope memberScope; - - private FakeJetNamespaceDescriptor() { - super(new NamespaceDescriptorImpl( - new ModuleDescriptorImpl(Name.special(""), Collections.emptyList(), PlatformToKotlinClassMap.EMPTY), - Collections.emptyList(), Name.special("")), Collections.emptyList(), - KotlinBuiltIns.BUILT_INS_PACKAGE_NAME); - } - - void setMemberScope(WritableScope memberScope) { - this.memberScope = memberScope; - } - - @NotNull - @Override - public WritableScope getMemberScope() { - return memberScope; - } - } } diff --git a/idea/tests/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolverTest.java b/idea/tests/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolverTest.java index 9c33bfb7746..80aa2ef942e 100644 --- a/idea/tests/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolverTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolverTest.java @@ -19,11 +19,8 @@ package org.jetbrains.jet.plugin.references; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.ResolveTestCase; -import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.plugin.PluginTestCaseBase; @@ -74,40 +71,35 @@ public class BuiltInsReferenceResolverTest extends ResolveTestCase { public void testAllReferencesResolved() { BuiltInsReferenceResolver referenceResolver = getProject().getComponent(BuiltInsReferenceResolver.class); - for (DeclarationDescriptor descriptor : getAllStandardDescriptors(KotlinBuiltIns.getInstance().getBuiltInsPackageFragment())) { - if (descriptor instanceof NamespaceDescriptor && "jet".equals(descriptor.getName().asString())) continue; + for (DeclarationDescriptor descriptor : getAllStandardDescriptors()) { assertNotNull("Can't resolve " + descriptor, referenceResolver.resolveBuiltInSymbol(descriptor)); } } - private static Collection getAllStandardDescriptors(DeclarationDescriptor baseDescriptor) { - final ArrayList descriptors = new ArrayList(); - baseDescriptor.acceptVoid(new DeclarationDescriptorVisitorEmptyBodies() { - private Void visitDescriptors(Collection descriptors) { - for (DeclarationDescriptor descriptor : descriptors) { - descriptor.acceptVoid(this); + private static Collection getAllStandardDescriptors() { + final List descriptors = new ArrayList(); + + PackageFragmentDescriptor builtinsPackageFragment = KotlinBuiltIns.getInstance().getBuiltInsPackageFragment(); + + for (DeclarationDescriptor packageMember : builtinsPackageFragment.getMemberScope().getAllDescriptors()) { + packageMember.acceptVoid(new DeclarationDescriptorVisitorEmptyBodies() { + @Override + public Void visitClassDescriptor(ClassDescriptor descriptor, Void data) { + descriptors.add(descriptor); + for (DeclarationDescriptor classMember : descriptor.getDefaultType().getMemberScope().getAllDescriptors()) { + classMember.acceptVoid(this); + } + return null; } - return null; - } - @Override - public Void visitClassDescriptor(ClassDescriptor descriptor, Void data) { - descriptors.add(descriptor); - return visitDescriptors(descriptor.getDefaultType().getMemberScope().getAllDescriptors()); - } + @Override + public Void visitDeclarationDescriptor(DeclarationDescriptor descriptor, Void data) { + descriptors.add(descriptor); + return null; + } + }); + } - @Override - public Void visitPackageViewDescriptor(PackageViewDescriptor descriptor, Void data) { - descriptors.add(descriptor); - return visitDescriptors(descriptor.getMemberScope().getAllDescriptors()); - } - - @Override - public Void visitDeclarationDescriptor(DeclarationDescriptor descriptor, Void data) { - descriptors.add(descriptor); - return null; - } - }); return descriptors; }