Proper scope merging for file scope
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user