diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfos.kt index 4a6f51072f1..f2be6dc5d4f 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IdeaModuleInfos.kt @@ -151,4 +151,6 @@ private data class LibraryWithoutSourceScope(project: Project, private val libra //TODO: (module refactoring) android sdk has modified scope private data class SdkScope(project: Project, private val sdk: Sdk) : - LibraryScopeBase(project, sdk.getRootProvider().getFiles(OrderRootType.CLASSES), array()) \ No newline at end of file + LibraryScopeBase(project, sdk.getRootProvider().getFiles(OrderRootType.CLASSES), array()) + +private fun IdeaModuleInfo.isLibraryClasses() = this is SdkInfo || this is LibraryInfo \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt index c013720cce9..9733b0384ca 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt @@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils import org.jetbrains.jet.context.GlobalContext import org.jetbrains.jet.plugin.stubindex.JetSourceFilterScope import com.intellij.psi.PsiElement +import org.jetbrains.jet.utils.keysToMap private val LOG = Logger.getInstance(javaClass()) @@ -65,22 +66,37 @@ public class KotlinCacheService(val project: Project) { public fun getInstance(project: Project): KotlinCacheService = ServiceManager.getService(project, javaClass())!! } - private fun globalResolveSessionProvider(platform: TargetPlatform, syntheticFiles: Collection = listOf()): - () -> CachedValueProvider.Result = { + fun globalResolveSessionProvider( + platform: TargetPlatform, + reuseDataFromCache: KotlinResolveCache? = null, + syntheticFiles: Collection = listOf(), + moduleFilter: (IdeaModuleInfo) -> Boolean = { true } + ): () -> CachedValueProvider.Result = { val analyzerFacade = AnalyzerFacadeProvider.getAnalyzerFacade(platform) - val moduleMapping = createModuleResolverProvider(project, analyzerFacade, syntheticFiles) + val delegateResolverProvider = reuseDataFromCache?.moduleResolverProvider ?: EmptyModuleResolverProvider + val moduleResolverProvider = createModuleResolverProvider(project, analyzerFacade, syntheticFiles, delegateResolverProvider, moduleFilter) CachedValueProvider.Result.create( - moduleMapping, + moduleResolverProvider, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, - moduleMapping.exceptionTracker + moduleResolverProvider.exceptionTracker ) - } - private val globalCachesPerPlatform = mapOf( - JVM to KotlinResolveCache(project, globalResolveSessionProvider(JVM)), - JS to KotlinResolveCache(project, globalResolveSessionProvider(JS)) - ) + private val globalCachesPerPlatform = listOf(JVM, JS).keysToMap { platform -> GlobalCache(platform) } + + private inner class GlobalCache(platform: TargetPlatform) { + val librariesCache = KotlinResolveCache( + project, globalResolveSessionProvider(platform, moduleFilter = { it.isLibraryClasses() }) + ) + + val modulesCache = KotlinResolveCache( + project, globalResolveSessionProvider(platform, + reuseDataFromCache = librariesCache, + moduleFilter = { !it.isLibraryClasses() }) + ) + } + + private fun getGlobalCache(platform: TargetPlatform) = globalCachesPerPlatform[platform]!!.modulesCache private val syntheticFileCaches = object : SLRUCache(2, 3) { override fun createValue(file: JetFile?): KotlinResolveCache { @@ -88,7 +104,7 @@ public class KotlinCacheService(val project: Project) { project, globalResolveSessionProvider( TargetPlatformDetector.getPlatform(file!!), - listOf(file) + syntheticFiles = listOf(file) ) ) } @@ -101,7 +117,7 @@ public class KotlinCacheService(val project: Project) { } public fun getGlobalLazyResolveSession(file: JetFile, platform: TargetPlatform): ResolveSessionForBodies { - return globalCachesPerPlatform[platform]!!.getLazyResolveSession(file) + return getGlobalCache(platform).getLazyResolveSession(file) } public fun getLazyResolveSession(element: JetElement): ResolveSessionForBodies { @@ -121,8 +137,7 @@ public class KotlinCacheService(val project: Project) { return getCacheForSyntheticFile(firstFile).getAnalysisResultsForElements(elements) } - val resolveCache = globalCachesPerPlatform[TargetPlatformDetector.getPlatform(firstFile)]!! - return resolveCache.getAnalysisResultsForElements(elements) + return getGlobalCache(TargetPlatformDetector.getPlatform(firstFile)).getAnalysisResultsForElements(elements) } private fun isFileInScope(jetFile: JetFile): Boolean { @@ -138,6 +153,6 @@ public class KotlinCacheService(val project: Project) { } public fun get(extension: CacheExtension): T { - return globalCachesPerPlatform[extension.platform]!![extension] + return getGlobalCache(extension.platform)[extension] } } 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 b4030793adc..14f2ede6b1e 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 @@ -39,17 +39,20 @@ fun createModuleResolverProvider( project: Project, analyzerFacade: AnalyzerFacade, syntheticFiles: Collection, - delegateProvider: ModuleResolverProvider = EmptyModuleResolverProvider + delegateProvider: ModuleResolverProvider, + moduleFilter: (IdeaModuleInfo) -> Boolean ): ModuleResolverProvider { val allModuleInfos = collectAllModuleInfosFromIdeaModel(project).toHashSet() val globalContext = (delegateProvider as? ModuleResolverProviderImpl)?.globalContext ?: GlobalContext() - fun createResolverForProject(): ResolverForProject { - val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() } - allModuleInfos.addAll(syntheticFilesByModule.keySet()) + val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() } + allModuleInfos.addAll(syntheticFilesByModule.keySet()) + val modulesToCreateResolversFor = allModuleInfos.filter(moduleFilter) + + fun createResolverForProject(): ResolverForProject { val modulesContent = {(module: IdeaModuleInfo) -> ModuleContent(syntheticFilesByModule[module] ?: listOf(), module.contentScope()) } @@ -61,14 +64,14 @@ fun createModuleResolverProvider( } val resolverForProject = analyzerFacade.setupResolverForProject( - globalContext, project, allModuleInfos, modulesContent, jvmPlatformParameters, delegateProvider.resolverForProject + globalContext, project, modulesToCreateResolversFor, modulesContent, jvmPlatformParameters, delegateProvider.resolverForProject ) return resolverForProject } val resolverForProject = createResolverForProject() - val moduleToBodiesResolveSession = allModuleInfos.keysToMap { + val moduleToBodiesResolveSession = modulesToCreateResolversFor.keysToMap { module -> val analyzer = resolverForProject.resolverForModule(module) ResolveSessionForBodies(project, analyzer.lazyResolveSession)