Proper scope merging for file scope

This commit is contained in:
Nikolay Krasko
2012-08-08 17:34:37 +04:00
parent 39daa11e13
commit 79ffea63a6
@@ -24,16 +24,11 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
import java.util.List;
import org.jetbrains.jet.lang.resolve.scopes.*;
/**
* @author abreslav
*/
* @author abreslav
*/
public class ScopeProvider {
private final ResolveSession resolveSession;
@@ -58,9 +53,10 @@ public class ScopeProvider {
throw new IllegalStateException("Package not found: " + fqName + " maybe the file is not in scope of this resolve session: " + file.getName());
}
WritableScope writableScope = new WritableScopeImpl(
WritableScope fileScope = new WritableScopeImpl(
JetScope.EMPTY, packageDescriptor, RedeclarationHandler.DO_NOTHING, "File scope for declaration resolution");
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
fileScope.changeLockLevel(WritableScope.LockLevel.BOTH);
NamespaceDescriptor rootPackageDescriptor = resolveSession.getPackageDescriptorByFqName(FqName.ROOT);
if (rootPackageDescriptor == null) {
@@ -69,19 +65,18 @@ public class ScopeProvider {
// Don't import twice
if (!packageDescriptor.getQualifiedName().equals(FqName.ROOT)) {
writableScope.importScope(rootPackageDescriptor.getMemberScope());
fileScope.importScope(rootPackageDescriptor.getMemberScope());
}
ImportsResolver.processImportsInFile(true, writableScope, Lists.newArrayList(file.getImportDirectives()),
ImportsResolver.processImportsInFile(true, fileScope, Lists.newArrayList(file.getImportDirectives()),
rootPackageDescriptor.getMemberScope(),
resolveSession.getModuleConfiguration(), resolveSession.getTrace(),
resolveSession.getInjector().getQualifiedExpressionResolver());
writableScope.importScope(packageDescriptor.getMemberScope());
fileScope.changeLockLevel(WritableScope.LockLevel.READING);
writableScope.changeLockLevel(WritableScope.LockLevel.READING);
// TODO: Cache
return writableScope;
return new ChainedScope(packageDescriptor, packageDescriptor.getMemberScope(), fileScope);
}
@NotNull
@@ -109,4 +104,4 @@ public class ScopeProvider {
throw new IllegalStateException("Don't call this method for local declarations: " + jetDeclaration + " " + jetDeclaration.getText());
}
}
}
}