From 30e668634c263688cd24451ce2566a9ce1c20b6b Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 27 Nov 2013 15:12:38 +0400 Subject: [PATCH] Locking scopes of MutablePackageFragmentDescriptors. --- .../MutablePackageFragmentProvider.java | 5 +++++ .../lang/resolve/NamespaceFactoryImpl.java | 9 -------- .../jet/lang/resolve/TopDownAnalyzer.java | 22 ++++++++++++------- .../MutablePackageFragmentDescriptor.java | 5 +---- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MutablePackageFragmentProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MutablePackageFragmentProvider.java index a6a9e401ca7..4aca59d5ad2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MutablePackageFragmentProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/MutablePackageFragmentProvider.java @@ -56,4 +56,9 @@ public class MutablePackageFragmentProvider implements PackageFragmentProvider { public ModuleDescriptor getModule() { return module; } + + @NotNull + public Collection getAllFragments() { + return fqNameToPackage.values(); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java index 25e09395514..23c318c0e9e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/NamespaceFactoryImpl.java @@ -81,15 +81,6 @@ public class NamespaceFactoryImpl implements NamespaceFactory { @Override @NotNull public PackageFragmentDescriptor createNamespaceDescriptorPathIfNeeded(@NotNull FqName fqName) { - for (FqName pathElement : fqName.path()) { - if (pathElement.isRoot()) { - getOrCreatePackageFragment(FqName.ROOT, null, RedeclarationHandler.DO_NOTHING); - } - else { - getOrCreatePackageFragment(pathElement, null, RedeclarationHandler.DO_NOTHING); - } - - } return packageFragmentProvider.getOrCreateFragment(fqName); } 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 731158758d6..e170bd36aa3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -17,17 +17,16 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.base.Predicates; +import com.google.common.collect.Sets; import com.intellij.psi.PsiElement; 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.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.descriptors.impl.*; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -39,7 +38,7 @@ import javax.inject.Inject; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; +import java.util.Set; public class TopDownAnalyzer { @@ -143,10 +142,17 @@ public class TopDownAnalyzer { for (MutableClassDescriptor mutableClassDescriptor : context.getClasses().values()) { mutableClassDescriptor.lockScopes(); } - for (Map.Entry namespaceScope : context.getNamespaceScopes().entrySet()) { + Set scriptFqNames = Sets.newHashSet(); + for (JetFile file : context.getNamespaceScopes().keySet()) { + if (file.isScript()) { + scriptFqNames.add(JetPsiUtil.getFQName(file)); + } + } + for (MutablePackageFragmentDescriptor fragment : packageFragmentProvider.getAllFragments()) { // todo: this is hack in favor of REPL - if(!namespaceScope.getKey().isScript()) - namespaceScope.getValue().changeLockLevel(WritableScope.LockLevel.READING); + if (!scriptFqNames.contains(fragment.getFqName())) { + fragment.getMemberScope().changeLockLevel(WritableScope.LockLevel.READING); + } } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutablePackageFragmentDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutablePackageFragmentDescriptor.java index b6d690adff2..d81c1300e26 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutablePackageFragmentDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutablePackageFragmentDescriptor.java @@ -47,10 +47,7 @@ public class MutablePackageFragmentDescriptor extends DeclarationDescriptorImpl this.module = module; this.fqName = fqName; - scope = new WritableScopeImpl(JetScope.EMPTY, this, RedeclarationHandler.DO_NOTHING, - "Members of " + fqName + " in " + module); - - // TODO 1 make read-only after + scope = new WritableScopeImpl(JetScope.EMPTY, this, RedeclarationHandler.DO_NOTHING, "Members of " + fqName + " in " + module); scope.changeLockLevel(WritableScope.LockLevel.BOTH); builder = new ScopeBasedNamespaceLikeBuilder(this, scope); }