Expose lazy scopes to enable calling forceResolveAllContents()

This commit is contained in:
Andrey Breslav
2014-02-26 21:25:21 +04:00
parent ac8b12baf1
commit f244cb05eb
3 changed files with 28 additions and 22 deletions
@@ -28,6 +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.ImportsResolver;
import org.jetbrains.jet.lang.resolve.JetModuleUtil;
import org.jetbrains.jet.lang.resolve.name.LabelName;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -42,7 +43,7 @@ import java.util.Set;
import static org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver.LookupMode;
public class LazyImportScope implements JetScope {
public class LazyImportScope implements JetScope, LazyEntity {
private final ResolveSession resolveSession;
private final PackageViewDescriptor packageDescriptor;
private final ImportsProvider importsProvider;
@@ -158,6 +159,13 @@ public class LazyImportScope implements JetScope {
packageDescriptor.getFqName().isRoot());
}
@Override
public void forceResolveAllContents() {
for (JetImportDirective importDirective : importsProvider.getAllImports()) {
getImportScope(importDirective, LookupMode.EVERYTHING);
}
}
@Nullable
private <D extends DeclarationDescriptor> D selectFirstFromImports(
final Name name,
@@ -40,17 +40,17 @@ import java.util.List;
public class ScopeProvider {
private final ResolveSession resolveSession;
private final MemoizedFunctionToNotNull<JetFile, JetScope> fileScopes;
private final MemoizedFunctionToNotNull<JetFile, LazyImportScope> explicitImportScopes;
private final NotNullLazyValue<JetScope> defaultImportsScope;
public ScopeProvider(@NotNull ResolveSession resolveSession) {
this.resolveSession = resolveSession;
this.fileScopes = resolveSession.getStorageManager().createMemoizedFunction(new Function1<JetFile, JetScope>() {
this.explicitImportScopes = resolveSession.getStorageManager().createMemoizedFunction(new Function1<JetFile, LazyImportScope>() {
@Override
public JetScope invoke(@NotNull JetFile file) {
return createFileScope(file);
public LazyImportScope invoke(@NotNull JetFile file) {
return createExplicitImportScope(file);
}
});
@@ -62,30 +62,30 @@ public class ScopeProvider {
});
}
@NotNull
public JetScope getFileScope(JetFile file) {
return fileScopes.invoke(file);
}
@NotNull
private JetScope createFileScope(@NotNull JetFile file) {
PackageViewDescriptor packageDescriptor = getFilePackageDescriptor(file);
JetScope importsScope = LazyImportScope.createImportScopeForFile(
private LazyImportScope createExplicitImportScope(@NotNull JetFile file) {
return LazyImportScope.createImportScopeForFile(
resolveSession,
packageDescriptor,
getFilePackageDescriptor(file),
file,
resolveSession.getTrace(),
"Lazy Imports Scope for file " + file.getName());
}
@NotNull
public JetScope getFileScope(@NotNull JetFile file) {
return new ChainedScope(resolveSession.getPackageFragment(JetPsiUtil.getFQName(file)),
"File scope: " + file.getName(),
packageDescriptor.getMemberScope(),
getFilePackageDescriptor(file).getMemberScope(),
JetModuleUtil.getSubpackagesOfRootScope(resolveSession.getModuleDescriptor()),
importsScope,
explicitImportScopes.invoke(file),
defaultImportsScope.invoke());
}
@NotNull
public LazyImportScope getExplicitImportsScopeForFile(@NotNull JetFile file) {
return explicitImportScopes.invoke(file);
}
private JetScope createScopeWithDefaultImports() {
PackageViewDescriptor rootPackage = resolveSession.getModuleDescriptor().getPackage(FqName.ROOT);
if (rootPackage == null) {
@@ -145,10 +145,8 @@ public class ResolveElementCache {
}
else if (resolveElement instanceof JetImportDirective) {
JetImportDirective importDirective = (JetImportDirective) resolveElement;
JetScope scope = resolveSession.getScopeProvider().getFileScope((JetFile) importDirective.getContainingFile());
// Get all descriptors to force resolving all imports
scope.getAllDescriptors();
LazyImportScope scope = resolveSession.getScopeProvider().getExplicitImportsScopeForFile((JetFile) importDirective.getContainingFile());
scope.forceResolveAllContents();
}
else if (resolveElement instanceof JetAnnotationEntry) {
annotationAdditionalResolve(resolveSession, (JetAnnotationEntry) resolveElement);