From 4839f7a2302310d189b655a586805d7fc7351d7c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 8 Apr 2014 16:38:35 +0400 Subject: [PATCH] Make lazy analysis accessible to clients --- .../di/InjectorForTopDownAnalyzerForJvm.java | 32 +++++++++++-------- .../di/InjectorForTopDownAnalyzerBasic.java | 32 +++++++++++-------- .../jet/lang/resolve/LazyTopDownAnalyzer.java | 5 ++- .../resolve/TopDownAnalysisParameters.java | 12 +++++++ .../generators/injectors/GenerateInjectors.kt | 5 +-- .../di/InjectorForTopDownAnalyzerForJs.java | 32 +++++++++++-------- 6 files changed, 73 insertions(+), 45 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 7cb2b744286..c53248b6832 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -20,9 +20,10 @@ import com.intellij.openapi.project.Project; import org.jetbrains.jet.context.GlobalContext; import org.jetbrains.jet.storage.StorageManager; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.resolve.TopDownAnalyzer; +import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer; import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider; import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; @@ -59,7 +60,6 @@ import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; -import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; @@ -81,9 +81,10 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final GlobalContext globalContext; private final StorageManager storageManager; private final BindingTrace bindingTrace; - private final ModuleDescriptorImpl moduleDescriptor; + private final ModuleDescriptor moduleDescriptor; private final PlatformToKotlinClassMap platformToKotlinClassMap; private final TopDownAnalyzer topDownAnalyzer; + private final LazyTopDownAnalyzer lazyTopDownAnalyzer; private final MutablePackageFragmentProvider mutablePackageFragmentProvider; private final MemberFilter memberFilter; private final JavaDescriptorResolver javaDescriptorResolver; @@ -120,7 +121,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final JetImportsFactory jetImportsFactory; private final ScriptHeaderResolver scriptHeaderResolver; private final ScriptParameterResolver scriptParameterResolver; - private final LazyTopDownAnalyzer lazyTopDownAnalyzer; private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; @@ -136,7 +136,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly @NotNull Project project, @NotNull GlobalContext globalContext, @NotNull BindingTrace bindingTrace, - @NotNull ModuleDescriptorImpl moduleDescriptor, + @NotNull ModuleDescriptor moduleDescriptor, @NotNull MemberFilter memberFilter ) { this.project = project; @@ -146,6 +146,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.moduleDescriptor = moduleDescriptor; this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap(); this.topDownAnalyzer = new TopDownAnalyzer(); + this.lazyTopDownAnalyzer = new LazyTopDownAnalyzer(); this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor()); this.memberFilter = memberFilter; this.javaClassFinder = new JavaClassFinderImpl(); @@ -185,7 +186,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.jetImportsFactory = new JetImportsFactory(); this.scriptHeaderResolver = new ScriptHeaderResolver(); this.scriptParameterResolver = new ScriptParameterResolver(); - this.lazyTopDownAnalyzer = new LazyTopDownAnalyzer(); this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); @@ -205,6 +205,13 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.topDownAnalyzer.setTrace(bindingTrace); this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); + this.lazyTopDownAnalyzer.setBodyResolver(bodyResolver); + this.lazyTopDownAnalyzer.setDeclarationResolver(declarationResolver); + this.lazyTopDownAnalyzer.setModuleDescriptor(moduleDescriptor); + this.lazyTopDownAnalyzer.setOverloadResolver(overloadResolver); + this.lazyTopDownAnalyzer.setOverrideResolver(overrideResolver); + this.lazyTopDownAnalyzer.setTrace(bindingTrace); + javaClassFinder.setProject(project); traceBasedExternalSignatureResolver.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver); @@ -305,13 +312,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly scriptParameterResolver.setDependencyClassByQualifiedNameResolver(javaDescriptorResolver); - lazyTopDownAnalyzer.setBodyResolver(bodyResolver); - lazyTopDownAnalyzer.setDeclarationResolver(declarationResolver); - lazyTopDownAnalyzer.setModuleDescriptor(moduleDescriptor); - lazyTopDownAnalyzer.setOverloadResolver(overloadResolver); - lazyTopDownAnalyzer.setOverrideResolver(overrideResolver); - lazyTopDownAnalyzer.setTrace(bindingTrace); - overloadResolver.setTrace(bindingTrace); overrideResolver.setTrace(bindingTrace); @@ -353,7 +353,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly public void destroy() { } - public ModuleDescriptorImpl getModuleDescriptor() { + public ModuleDescriptor getModuleDescriptor() { return this.moduleDescriptor; } @@ -361,6 +361,10 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly return this.topDownAnalyzer; } + public LazyTopDownAnalyzer getLazyTopDownAnalyzer() { + return this.lazyTopDownAnalyzer; + } + public JavaDescriptorResolver getJavaDescriptorResolver() { return this.javaDescriptorResolver; } diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java index 4c3e451bbd9..d28d8652566 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java @@ -20,9 +20,10 @@ import com.intellij.openapi.project.Project; import org.jetbrains.jet.context.GlobalContext; import org.jetbrains.jet.storage.StorageManager; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.resolve.TopDownAnalyzer; +import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer; import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl; import org.jetbrains.jet.lang.resolve.BodyResolver; @@ -50,7 +51,6 @@ import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; -import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; @@ -65,9 +65,10 @@ public class InjectorForTopDownAnalyzerBasic { private final GlobalContext globalContext; private final StorageManager storageManager; private final BindingTrace bindingTrace; - private final ModuleDescriptorImpl moduleDescriptor; + private final ModuleDescriptor moduleDescriptor; private final PlatformToKotlinClassMap platformToKotlinClassMap; private final TopDownAnalyzer topDownAnalyzer; + private final LazyTopDownAnalyzer lazyTopDownAnalyzer; private final MutablePackageFragmentProvider mutablePackageFragmentProvider; private final DependencyClassByQualifiedNameResolverDummyImpl dependencyClassByQualifiedNameResolverDummy; private final BodyResolver bodyResolver; @@ -95,7 +96,6 @@ public class InjectorForTopDownAnalyzerBasic { private final JetImportsFactory jetImportsFactory; private final ScriptHeaderResolver scriptHeaderResolver; private final ScriptParameterResolver scriptParameterResolver; - private final LazyTopDownAnalyzer lazyTopDownAnalyzer; private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; @@ -104,7 +104,7 @@ public class InjectorForTopDownAnalyzerBasic { @NotNull Project project, @NotNull GlobalContext globalContext, @NotNull BindingTrace bindingTrace, - @NotNull ModuleDescriptorImpl moduleDescriptor + @NotNull ModuleDescriptor moduleDescriptor ) { this.project = project; this.globalContext = globalContext; @@ -113,6 +113,7 @@ public class InjectorForTopDownAnalyzerBasic { this.moduleDescriptor = moduleDescriptor; this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap(); this.topDownAnalyzer = new TopDownAnalyzer(); + this.lazyTopDownAnalyzer = new LazyTopDownAnalyzer(); this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor()); this.dependencyClassByQualifiedNameResolverDummy = new DependencyClassByQualifiedNameResolverDummyImpl(); this.bodyResolver = new BodyResolver(); @@ -140,7 +141,6 @@ public class InjectorForTopDownAnalyzerBasic { this.jetImportsFactory = new JetImportsFactory(); this.scriptHeaderResolver = new ScriptHeaderResolver(); this.scriptParameterResolver = new ScriptParameterResolver(); - this.lazyTopDownAnalyzer = new LazyTopDownAnalyzer(); this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); @@ -156,6 +156,13 @@ public class InjectorForTopDownAnalyzerBasic { this.topDownAnalyzer.setTrace(bindingTrace); this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); + this.lazyTopDownAnalyzer.setBodyResolver(bodyResolver); + this.lazyTopDownAnalyzer.setDeclarationResolver(declarationResolver); + this.lazyTopDownAnalyzer.setModuleDescriptor(moduleDescriptor); + this.lazyTopDownAnalyzer.setOverloadResolver(overloadResolver); + this.lazyTopDownAnalyzer.setOverrideResolver(overrideResolver); + this.lazyTopDownAnalyzer.setTrace(bindingTrace); + bodyResolver.setAnnotationResolver(annotationResolver); bodyResolver.setCallResolver(callResolver); bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); @@ -243,13 +250,6 @@ public class InjectorForTopDownAnalyzerBasic { scriptParameterResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); - lazyTopDownAnalyzer.setBodyResolver(bodyResolver); - lazyTopDownAnalyzer.setDeclarationResolver(declarationResolver); - lazyTopDownAnalyzer.setModuleDescriptor(moduleDescriptor); - lazyTopDownAnalyzer.setOverloadResolver(overloadResolver); - lazyTopDownAnalyzer.setOverrideResolver(overrideResolver); - lazyTopDownAnalyzer.setTrace(bindingTrace); - overloadResolver.setTrace(bindingTrace); overrideResolver.setTrace(bindingTrace); @@ -266,7 +266,7 @@ public class InjectorForTopDownAnalyzerBasic { public void destroy() { } - public ModuleDescriptorImpl getModuleDescriptor() { + public ModuleDescriptor getModuleDescriptor() { return this.moduleDescriptor; } @@ -274,4 +274,8 @@ public class InjectorForTopDownAnalyzerBasic { return this.topDownAnalyzer; } + public LazyTopDownAnalyzer getLazyTopDownAnalyzer() { + return this.lazyTopDownAnalyzer; + } + } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java index 7d64c0a4855..4e5cc2984c7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java @@ -79,7 +79,8 @@ public class LazyTopDownAnalyzer { this.bodyResolver = bodyResolver; } - public void analyzeDeclarations( + @NotNull + public TopDownAnalysisContext analyzeDeclarations( final ResolveSession resolveSession, @NotNull TopDownAnalysisParameters topDownAnalysisParameters, @NotNull Collection declarations @@ -252,6 +253,8 @@ public class LazyTopDownAnalyzer { overloadResolver.process(c); bodyResolver.resolveBodies(c); + + return c; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisParameters.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisParameters.java index 43c473e6b0a..0603dbe57b4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisParameters.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisParameters.java @@ -45,6 +45,18 @@ public class TopDownAnalysisParameters implements GlobalContext { declaredLocally, LAZY); } + @NotNull + public static TopDownAnalysisParameters createForLazy( + @NotNull StorageManager storageManager, + @NotNull ExceptionTracker exceptionTracker, + @NotNull Predicate analyzeCompletely, + boolean analyzingBootstrapLibrary, + boolean declaredLocally + ) { + return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, analyzingBootstrapLibrary, + declaredLocally, true); + } + @NotNull public static TopDownAnalysisParameters createForLocalDeclarations( @NotNull StorageManager storageManager, diff --git a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt index 33c7004f957..d04e37643c3 100644 --- a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt +++ b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.kt @@ -68,10 +68,11 @@ private fun DependencyInjectorGenerator.commonForTopDownAnalyzer() { parameter(javaClass()) parameter(javaClass(), useAsContext = true) parameter(javaClass()) - publicParameter(javaClass(), useAsContext = true) + publicParameter(javaClass(), useAsContext = true) publicFields( - javaClass() + javaClass(), + javaClass() ) field(javaClass()) diff --git a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java index 7ff6bba1a12..e6d5fca0264 100644 --- a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java +++ b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java @@ -20,9 +20,10 @@ import com.intellij.openapi.project.Project; import org.jetbrains.jet.context.GlobalContext; import org.jetbrains.jet.storage.StorageManager; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.resolve.TopDownAnalyzer; +import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer; import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl; import org.jetbrains.jet.lang.resolve.BodyResolver; @@ -50,7 +51,6 @@ import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.ScriptParameterResolver; -import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; @@ -65,9 +65,10 @@ public class InjectorForTopDownAnalyzerForJs { private final GlobalContext globalContext; private final StorageManager storageManager; private final BindingTrace bindingTrace; - private final ModuleDescriptorImpl moduleDescriptor; + private final ModuleDescriptor moduleDescriptor; private final PlatformToKotlinClassMap platformToKotlinClassMap; private final TopDownAnalyzer topDownAnalyzer; + private final LazyTopDownAnalyzer lazyTopDownAnalyzer; private final MutablePackageFragmentProvider mutablePackageFragmentProvider; private final DependencyClassByQualifiedNameResolverDummyImpl dependencyClassByQualifiedNameResolverDummy; private final BodyResolver bodyResolver; @@ -95,7 +96,6 @@ public class InjectorForTopDownAnalyzerForJs { private final JetImportsFactory jetImportsFactory; private final ScriptHeaderResolver scriptHeaderResolver; private final ScriptParameterResolver scriptParameterResolver; - private final LazyTopDownAnalyzer lazyTopDownAnalyzer; private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; @@ -104,7 +104,7 @@ public class InjectorForTopDownAnalyzerForJs { @NotNull Project project, @NotNull GlobalContext globalContext, @NotNull BindingTrace bindingTrace, - @NotNull ModuleDescriptorImpl moduleDescriptor + @NotNull ModuleDescriptor moduleDescriptor ) { this.project = project; this.globalContext = globalContext; @@ -113,6 +113,7 @@ public class InjectorForTopDownAnalyzerForJs { this.moduleDescriptor = moduleDescriptor; this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap(); this.topDownAnalyzer = new TopDownAnalyzer(); + this.lazyTopDownAnalyzer = new LazyTopDownAnalyzer(); this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor()); this.dependencyClassByQualifiedNameResolverDummy = new DependencyClassByQualifiedNameResolverDummyImpl(); this.bodyResolver = new BodyResolver(); @@ -140,7 +141,6 @@ public class InjectorForTopDownAnalyzerForJs { this.jetImportsFactory = new JetImportsFactory(); this.scriptHeaderResolver = new ScriptHeaderResolver(); this.scriptParameterResolver = new ScriptParameterResolver(); - this.lazyTopDownAnalyzer = new LazyTopDownAnalyzer(); this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); @@ -156,6 +156,13 @@ public class InjectorForTopDownAnalyzerForJs { this.topDownAnalyzer.setTrace(bindingTrace); this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver); + this.lazyTopDownAnalyzer.setBodyResolver(bodyResolver); + this.lazyTopDownAnalyzer.setDeclarationResolver(declarationResolver); + this.lazyTopDownAnalyzer.setModuleDescriptor(moduleDescriptor); + this.lazyTopDownAnalyzer.setOverloadResolver(overloadResolver); + this.lazyTopDownAnalyzer.setOverrideResolver(overrideResolver); + this.lazyTopDownAnalyzer.setTrace(bindingTrace); + bodyResolver.setAnnotationResolver(annotationResolver); bodyResolver.setCallResolver(callResolver); bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); @@ -243,13 +250,6 @@ public class InjectorForTopDownAnalyzerForJs { scriptParameterResolver.setDependencyClassByQualifiedNameResolver(dependencyClassByQualifiedNameResolverDummy); - lazyTopDownAnalyzer.setBodyResolver(bodyResolver); - lazyTopDownAnalyzer.setDeclarationResolver(declarationResolver); - lazyTopDownAnalyzer.setModuleDescriptor(moduleDescriptor); - lazyTopDownAnalyzer.setOverloadResolver(overloadResolver); - lazyTopDownAnalyzer.setOverrideResolver(overrideResolver); - lazyTopDownAnalyzer.setTrace(bindingTrace); - overloadResolver.setTrace(bindingTrace); overrideResolver.setTrace(bindingTrace); @@ -266,7 +266,7 @@ public class InjectorForTopDownAnalyzerForJs { public void destroy() { } - public ModuleDescriptorImpl getModuleDescriptor() { + public ModuleDescriptor getModuleDescriptor() { return this.moduleDescriptor; } @@ -274,4 +274,8 @@ public class InjectorForTopDownAnalyzerForJs { return this.topDownAnalyzer; } + public LazyTopDownAnalyzer getLazyTopDownAnalyzer() { + return this.lazyTopDownAnalyzer; + } + }