Cache constructed scopes for files

This commit is contained in:
Nikolay Krasko
2012-09-19 16:28:31 +04:00
parent bffbe1dd38
commit a37f2e9d2d
@@ -26,6 +26,9 @@ import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.*;
import java.util.Map;
import java.util.WeakHashMap;
/** /**
* @author abreslav * @author abreslav
*/ */
@@ -37,9 +40,12 @@ public class ScopeProvider {
this.resolveSession = resolveSession; this.resolveSession = resolveSession;
} }
private final Map<JetFile, JetScope> fileScopeCache = new WeakHashMap<JetFile, JetScope>();
// This scope does not contain imported functions // This scope does not contain imported functions
@NotNull @NotNull
public JetScope getFileScopeForDeclarationResolution(JetFile file) { public JetScope getFileScopeForDeclarationResolution(JetFile file) {
if (!fileScopeCache.containsKey(file)) {
// package // package
JetNamespaceHeader header = file.getNamespaceHeader(); JetNamespaceHeader header = file.getNamespaceHeader();
if (header == null) { if (header == null) {
@@ -74,9 +80,10 @@ public class ScopeProvider {
resolveSession.getInjector().getQualifiedExpressionResolver()); resolveSession.getInjector().getQualifiedExpressionResolver());
fileScope.changeLockLevel(WritableScope.LockLevel.READING); fileScope.changeLockLevel(WritableScope.LockLevel.READING);
fileScopeCache.put(file, new ChainedScope(packageDescriptor, packageDescriptor.getMemberScope(), fileScope));
}
// TODO: Cache return fileScopeCache.get(file);
return new ChainedScope(packageDescriptor, packageDescriptor.getMemberScope(), fileScope);
} }
@NotNull @NotNull