Importing root scope without members.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user