ResolveSession caches script descriptors

This commit is contained in:
Andrey Breslav
2014-03-29 15:16:32 +04:00
parent 77261330b9
commit 1335152625
2 changed files with 38 additions and 30 deletions
@@ -38,7 +38,6 @@ import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.LazyImportScope;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyScriptDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -77,10 +76,6 @@ public class TopDownAnalyzer {
@NotNull
private BodyResolver bodyResolver;
@NotNull
private ScriptParameterResolver scriptParameterResolver;
@NotNull
private ScriptBodyResolver scriptBodyResolver;
@NotNull
private Project project;
@Inject
@@ -123,16 +118,6 @@ public class TopDownAnalyzer {
this.bodyResolver = bodyResolver;
}
@Inject
public void setScriptParameterResolver(@NotNull ScriptParameterResolver scriptParameterResolver) {
this.scriptParameterResolver = scriptParameterResolver;
}
@Inject
public void setScriptBodyResolver(@NotNull ScriptBodyResolver scriptBodyResolver) {
this.scriptBodyResolver = scriptBodyResolver;
}
@Inject
public void setProject(@NotNull Project project) {
this.project = project;
@@ -196,17 +181,7 @@ public class TopDownAnalyzer {
JetScript script = file.getScript();
assert script != null;
c.getScripts().put(
script,
new LazyScriptDescriptor(
resolveSession,
scriptParameterResolver,
c.getTopDownAnalysisParameters(),
scriptBodyResolver,
script,
ScriptHeaderResolver.getScriptPriority(script)
)
);
c.getScripts().put(script, resolveSession.getScriptDescriptor(script));
}
else {
JetPackageDirective packageDirective = file.getPackageDirective();
@@ -23,6 +23,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import kotlin.Function0;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly;
@@ -36,15 +37,13 @@ import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFacto
import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider;
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor;
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor;
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyScriptDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.name.SpecialNames;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.storage.ExceptionTracker;
import org.jetbrains.jet.storage.LazyResolveStorageManager;
import org.jetbrains.jet.storage.LockBasedLazyResolveStorageManager;
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.storage.*;
import javax.inject.Inject;
import java.util.Collection;
@@ -74,6 +73,8 @@ public class ResolveSession implements KotlinCodeAnalyzer {
private final MemoizedFunctionToNullable<FqName, LazyPackageDescriptor> packages;
private final PackageFragmentProvider packageFragmentProvider;
private final MemoizedFunctionToNotNull<JetScript, LazyScriptDescriptor> scriptDescriptors;
private ScopeProvider scopeProvider;
private JetImportsFactory jetImportFactory;
@@ -81,6 +82,8 @@ public class ResolveSession implements KotlinCodeAnalyzer {
private DescriptorResolver descriptorResolver;
private TypeResolver typeResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver;
private ScriptParameterResolver scriptParameterResolver;
private ScriptBodyResolver scriptBodyResolver;
@Inject
public void setJetImportFactory(JetImportsFactory jetImportFactory) {
@@ -112,6 +115,16 @@ public class ResolveSession implements KotlinCodeAnalyzer {
this.scopeProvider = scopeProvider;
}
@Inject
public void setScriptParameterResolver(ScriptParameterResolver scriptParameterResolver) {
this.scriptParameterResolver = scriptParameterResolver;
}
@Inject
public void setScriptBodyResolver(ScriptBodyResolver scriptBodyResolver) {
this.scriptBodyResolver = scriptBodyResolver;
}
// Only calls from injectors expected
@Deprecated
public ResolveSession(
@@ -159,6 +172,21 @@ public class ResolveSession implements KotlinCodeAnalyzer {
// TODO: parameter modification
rootDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider);
this.scriptDescriptors = storageManager.createMemoizedFunction(
new Function1<JetScript, LazyScriptDescriptor>() {
@Override
public LazyScriptDescriptor invoke(JetScript script) {
return new LazyScriptDescriptor(
ResolveSession.this,
scriptParameterResolver,
scriptBodyResolver,
script,
ScriptHeaderResolver.getScriptPriority(script)
);
}
}
);
}
@NotNull
@@ -262,6 +290,11 @@ public class ResolveSession implements KotlinCodeAnalyzer {
return (ClassDescriptor) classifier;
}
@NotNull
public ScriptDescriptor getScriptDescriptor(@NotNull JetScript script) {
return scriptDescriptors.invoke(script);
}
@NotNull
/*package*/ LazyClassDescriptor getClassObjectDescriptor(@NotNull JetClassObject classObject) {
JetClass aClass = PsiTreeUtil.getParentOfType(classObject, JetClass.class);