From c0657320f5c4a3794c05181abe165f1846986c04 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 16 Sep 2014 14:04:12 +0400 Subject: [PATCH] Allow to provide delegate ModuleResolverProvider when computing resolve sessions for bodies --- .../caches/resolve/ModuleDependencyMapper.kt | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt index 53a26ac566b..c4cd9a3dcd1 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/ModuleDependencyMapper.kt @@ -26,7 +26,6 @@ import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.lang.resolve.java.JvmPlatformParameters import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl import com.intellij.openapi.roots.JdkOrderEntry -import org.jetbrains.kotlin.util.sure import org.jetbrains.jet.analyzer.AnalyzerFacade import org.jetbrains.jet.analyzer.ResolverForModule import org.jetbrains.jet.lang.psi.* @@ -34,13 +33,13 @@ import org.jetbrains.jet.storage.ExceptionTracker import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.analyzer.ResolverForProject import org.jetbrains.jet.analyzer.ModuleContent -import org.jetbrains.jet.analyzer.PlatformAnalysisParameters -import org.jetbrains.jet.plugin.caches.resolve +import org.jetbrains.jet.analyzer.EmptyResolverForProject fun createModuleResolverProvider( project: Project, analyzerFacade: AnalyzerFacade, - syntheticFiles: Collection + syntheticFiles: Collection, + delegateProvider: ModuleResolverProvider = EmptyModuleResolverProvider ): ModuleResolverProvider { val allModuleInfos = collectAllModuleInfosFromIdeaModel(project).toHashSet() @@ -62,7 +61,7 @@ fun createModuleResolverProvider( } val resolverForProject = analyzerFacade.setupResolverForProject( - globalContext, project, allModuleInfos, modulesContent, jvmPlatformParameters + globalContext, project, allModuleInfos, modulesContent, jvmPlatformParameters, delegateProvider.resolverForProject ) return resolverForProject } @@ -74,10 +73,11 @@ fun createModuleResolverProvider( val analyzer = resolverForProject.resolverForModule(module) ResolveSessionForBodies(project, analyzer.lazyResolveSession) } - return ModuleResolverProvider( + return ModuleResolverProviderImpl( resolverForProject, moduleToBodiesResolveSession, - globalContext.exceptionTracker + globalContext.exceptionTracker, + delegateProvider ) } @@ -106,14 +106,31 @@ private fun collectAllModuleInfosFromIdeaModel(project: Project): List, - private val bodiesResolveByModule: Map, - val exceptionTracker: ExceptionTracker -) { +trait ModuleResolverProvider { + val exceptionTracker: ExceptionTracker fun resolverByModule(module: IdeaModuleInfo): ResolverForModule = resolverForProject.resolverForModule(module) + fun resolveSessionForBodiesByModule(module: IdeaModuleInfo): ResolveSessionForBodies + val resolverForProject: ResolverForProject +} - fun resolveSessionForBodiesByModule(module: IdeaModuleInfo) = - //NOTE: if this assert fails in production, additional information can be obtained by logging on the call site - bodiesResolveByModule[module] ?: throw AssertionError("Requested data for $module not contained in this resolver.") +object EmptyModuleResolverProvider: ModuleResolverProvider { + override val exceptionTracker: ExceptionTracker + get() = throw IllegalStateException("Should not be called") + + override fun resolveSessionForBodiesByModule(module: IdeaModuleInfo): ResolveSessionForBodies + = throw IllegalStateException("Trying to obtain resolve session for unknown $module") + + override val resolverForProject: ResolverForProject = EmptyResolverForProject() + +} + +class ModuleResolverProviderImpl( + override val resolverForProject: ResolverForProject, + private val bodiesResolveByModule: Map, + override val exceptionTracker: ExceptionTracker, + val delegateProvider: ModuleResolverProvider = EmptyModuleResolverProvider +): ModuleResolverProvider { + override fun resolveSessionForBodiesByModule(module: IdeaModuleInfo): ResolveSessionForBodies = + bodiesResolveByModule[module] ?: + delegateProvider.resolveSessionForBodiesByModule(module) } \ No newline at end of file