Importing root scope without members.

This commit is contained in:
Evgeny Gerashchenko
2014-01-15 21:05:37 +04:00
parent 78e7cbb7fb
commit ae4c68830d
61 changed files with 316 additions and 89 deletions
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
@@ -83,16 +82,16 @@ public class ImportsResolver {
private void processImports(@NotNull LookupMode lookupMode) {
for (JetFile file : context.getPackageFragments().keySet()) {
WritableScope fileScope = context.getFileScopes().get(file);
processImportsInFile(lookupMode, fileScope, Lists.newArrayList(file.getImportDirectives()));
processImportsInFile(lookupMode, fileScope, Lists.newArrayList(file.getImportDirectives()), JetPsiUtil.getFQName(file).isRoot());
}
for (JetScript script : context.getScripts().keySet()) {
WritableScope scriptScope = context.getScriptScopes().get(script);
processImportsInFile(lookupMode, scriptScope, script.getImportDirectives());
processImportsInFile(lookupMode, scriptScope, script.getImportDirectives(), true);
}
}
private void processImportsInFile(@NotNull LookupMode lookupMode, WritableScope scope, List<JetImportDirective> directives) {
processImportsInFile(lookupMode, scope, directives, moduleDescriptor, trace, qualifiedExpressionResolver, importsFactory);
private void processImportsInFile(@NotNull LookupMode lookupMode, WritableScope scope, List<JetImportDirective> directives, boolean inRootPackage) {
processImportsInFile(lookupMode, scope, directives, moduleDescriptor, trace, qualifiedExpressionResolver, importsFactory, inRootPackage);
}
private static void processImportsInFile(
@@ -102,9 +101,10 @@ public class ImportsResolver {
@NotNull ModuleDescriptor module,
@NotNull BindingTrace trace,
@NotNull QualifiedExpressionResolver qualifiedExpressionResolver,
@NotNull JetImportsFactory importsFactory
@NotNull JetImportsFactory importsFactory,
boolean inRootPackage
) {
@NotNull JetScope rootScope = module.getPackage(FqName.ROOT).getMemberScope();
@NotNull JetScope rootScope = JetModuleUtil.getSubpackagesOfRootScope(module);
Importer.DelayedImporter delayedImporter = new Importer.DelayedImporter(fileScope);
if (lookupMode == LookupMode.EVERYTHING) {
@@ -122,10 +122,12 @@ public class ImportsResolver {
Map<JetImportDirective, Collection<? extends DeclarationDescriptor>> resolvedDirectives = Maps.newHashMap();
JetScope rootScopeForFile = JetModuleUtil.getImportsResolutionScope(module, inRootPackage);
for (JetImportDirective importDirective : importDirectives) {
Collection<? extends DeclarationDescriptor> descriptors =
qualifiedExpressionResolver.processImportReference(importDirective, rootScope, fileScope, delayedImporter,
trace, module, lookupMode);
qualifiedExpressionResolver.processImportReference(importDirective, rootScopeForFile, fileScope, delayedImporter,
trace, module, lookupMode);
if (!descriptors.isEmpty()) {
resolvedDirectives.put(importDirective, descriptors);
}
@@ -16,7 +16,12 @@
package org.jetbrains.jet.lang.resolve;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.SubpackagesScope;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.SpecialNames;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
@@ -27,4 +32,19 @@ public class JetModuleUtil {
// TODO: this is a stub: at least the modules' root packages must be indexed here
return new PackageType(SpecialNames.ROOT_PACKAGE, JetScope.EMPTY, ReceiverValue.NO_RECEIVER);
}
public static JetScope getSubpackagesOfRootScope(@NotNull ModuleDescriptor module) {
return getRootPackageScope(module, /* scopeIncludingMembers = */ false);
}
public static JetScope getImportsResolutionScope(ModuleDescriptor module, boolean inRootPackage) {
return getRootPackageScope(module, /* scopeIncludingMembers = */ inRootPackage);
}
private static JetScope getRootPackageScope(ModuleDescriptor module, boolean scopeIncludingMembers) {
PackageViewDescriptor rootPackage = module.getPackage(FqName.ROOT);
assert rootPackage != null : "Couldn't find root package for " + module;
return scopeIncludingMembers ? rootPackage.getMemberScope() : new SubpackagesScope(rootPackage);
}
}
@@ -217,14 +217,9 @@ public class TopDownAnalyzer {
// "depend on" builtins module
((ModuleDescriptorImpl) moduleDescriptor).addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
// Import a scope that contains all top-level packages that come from dependencies
// This makes the package visible at all, does not import themselves
PackageViewDescriptor rootPackage = moduleDescriptor.getPackage(FqName.ROOT);
assert rootPackage != null : "Coulnd't find root package for " + moduleDescriptor;
// dummy builder is used because "root" is module descriptor,
// packages added to module explicitly in
doProcess(rootPackage.getMemberScope(), new PackageLikeBuilderDummy(), files);
doProcess(JetModuleUtil.getSubpackagesOfRootScope(moduleDescriptor), new PackageLikeBuilderDummy(), files);
}
@@ -28,7 +28,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.Importer;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.JetModuleUtil;
import org.jetbrains.jet.lang.resolve.name.LabelName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*;
@@ -123,7 +123,8 @@ public class LazyImportScope implements JetScope {
@NotNull PackageViewDescriptor packageDescriptor,
@NotNull List<JetImportDirective> imports,
@NotNull BindingTrace traceForImportResolve,
@NotNull String debugName
@NotNull String debugName,
boolean inRootPackage
) {
this.resolveSession = resolveSession;
this.packageDescriptor = packageDescriptor;
@@ -138,11 +139,7 @@ public class LazyImportScope implements JetScope {
}
});
PackageViewDescriptor rootPackage = resolveSession.getModuleDescriptor().getPackage(FqName.ROOT);
if (rootPackage == null) {
throw new IllegalStateException("Root package not found");
}
rootScope = rootPackage.getMemberScope();
this.rootScope = JetModuleUtil.getImportsResolutionScope(resolveSession.getModuleDescriptor(), inRootPackage);
}
public static LazyImportScope createImportScopeForFile(
@@ -157,7 +154,8 @@ public class LazyImportScope implements JetScope {
packageDescriptor,
Lists.reverse(jetFile.getImportDirectives()),
traceForImportResolve,
debugName);
debugName,
packageDescriptor.getFqName().isRoot());
}
@Nullable
@@ -25,6 +25,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.JetModuleUtil;
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace;
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -66,12 +67,8 @@ public class ScopeProvider {
return fileScopes.invoke(file);
}
private JetScope createFileScope(JetFile file) {
PackageViewDescriptor rootPackageDescriptor = resolveSession.getModuleDescriptor().getPackage(FqName.ROOT);
if (rootPackageDescriptor == null) {
throw new IllegalStateException("Root package not found");
}
@NotNull
private JetScope createFileScope(@NotNull JetFile file) {
PackageViewDescriptor packageDescriptor = getFilePackageDescriptor(file);
JetScope importsScope = LazyImportScope.createImportScopeForFile(
@@ -84,7 +81,7 @@ public class ScopeProvider {
return new ChainedScope(resolveSession.getPackageFragment(JetPsiUtil.getFQName(file)),
"File scope: " + file.getName(),
packageDescriptor.getMemberScope(),
rootPackageDescriptor.getMemberScope(),
JetModuleUtil.getSubpackagesOfRootScope(resolveSession.getModuleDescriptor()),
importsScope,
defaultImportsScope.invoke());
}
@@ -105,7 +102,8 @@ public class ScopeProvider {
rootPackage,
Lists.reverse(Lists.newArrayList(defaultImportDirectives)),
TemporaryBindingTrace.create(resolveSession.getTrace(), "Transient trace for default imports lazy resolve"),
"Lazy default imports scope");
"Lazy default imports scope",
false);
}
@NotNull