Locking scopes of MutablePackageFragmentDescriptors.

This commit is contained in:
Evgeny Gerashchenko
2013-11-27 15:12:38 +04:00
parent 98ad890b60
commit 30e668634c
4 changed files with 20 additions and 21 deletions
@@ -56,4 +56,9 @@ public class MutablePackageFragmentProvider implements PackageFragmentProvider {
public ModuleDescriptor getModule() {
return module;
}
@NotNull
public Collection<MutablePackageFragmentDescriptor> getAllFragments() {
return fqNameToPackage.values();
}
}
@@ -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);
}
@@ -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<JetFile, WritableScope> namespaceScope : context.getNamespaceScopes().entrySet()) {
Set<FqName> 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);
}
}
}
@@ -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);
}