diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 52cbb87ab87..0c94103d715 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -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(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index d7d33ad128c..bdd4a375b66 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -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 packages; private final PackageFragmentProvider packageFragmentProvider; + private final MemoizedFunctionToNotNull 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() { + @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);