From 30c62bccb274d15619250141dba2df0c69372c39 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 23 May 2018 11:58:29 +0300 Subject: [PATCH] Refactoring: do not store scriptModuleInfo inside ScriptDependenciesInfo Cache for ScriptDependenciesInfo.ForFile is dropped because there is a cache for ScriptModuleInfo, so the facade for dependencies shouldn't be created too often Cache for ScriptDependenciesInfo.ForProject is stored in a field --- .../idea/caches/project/ScriptModuleInfos.kt | 21 ++++++---- .../caches/resolve/KotlinCacheServiceImpl.kt | 42 ++++++------------- .../compiler/IDELanguageSettingsProvider.kt | 2 +- .../IdeSamWithReceiverComponentContributor.kt | 2 +- 4 files changed, 27 insertions(+), 40 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt index 3e420b9e5d7..01936c48902 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt @@ -35,9 +35,6 @@ data class ScriptModuleInfo( override val moduleOrigin: ModuleOrigin get() = ModuleOrigin.OTHER - val externalDependencies: ScriptDependencies - get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile) - val relatedModuleSourceInfo: ModuleSourceInfo? get() = getScriptRelatedModuleInfo(project, scriptFile) @@ -47,9 +44,10 @@ data class ScriptModuleInfo( override fun dependencies(): List { return arrayListOf(this).apply { - add(ScriptDependenciesInfo.ForFile(project, this@ScriptModuleInfo)) + val dependenciesInfo = ScriptDependenciesInfo.ForFile(project, scriptFile, scriptDefinition) + add(dependenciesInfo) relatedModuleSourceInfo?.let { addAll(it.dependencies()) } - findJdk(externalDependencies, project)?.let { add(SdkInfo(project, it)) } + dependenciesInfo.sdk?.let { add(SdkInfo(project, it)) } } } } @@ -87,12 +85,19 @@ sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, Bina override val sourcesModuleInfo: SourceForBinaryModuleInfo? get() = ScriptDependenciesSourceInfo.ForProject(project) - class ForFile(project: Project, val scriptModuleInfo: ScriptModuleInfo) : ScriptDependenciesInfo(project) { + class ForFile( + project: Project, + val scriptFile: VirtualFile, + val scriptDefinition: KotlinScriptDefinition + ) : ScriptDependenciesInfo(project) { + private val externalDependencies: ScriptDependencies + get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile) + override val sdk: Sdk? - get() = findJdk(scriptModuleInfo.externalDependencies, project) + get() = findJdk(externalDependencies, project) override fun contentScope(): GlobalSearchScope { - return ServiceManager.getService(project, ScriptBinariesScopeCache::class.java).get(scriptModuleInfo.externalDependencies) + return ServiceManager.getService(project, ScriptBinariesScopeCache::class.java).get(externalDependencies) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index 91e012b1992..4a3df1eae74 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -80,24 +80,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { } } - - private val facadesForScriptDependencies: SLRUCache = - object : SLRUCache(2, 3) { - override fun createValue(scriptModuleInfo: ScriptModuleInfo?): ProjectResolutionFacade { - val dependenciesInfo = if (scriptModuleInfo != null) { - ScriptDependenciesInfo.ForFile(project, scriptModuleInfo) - } else { - ScriptDependenciesInfo.ForProject(project) - } - return createFacadeForScriptDependencies(dependenciesInfo) - } - } - - private fun getFacadeForScriptDependencies(scriptModuleInfo: ScriptModuleInfo): ProjectResolutionFacade { - return synchronized(facadesForScriptDependencies) { - facadesForScriptDependencies.get(scriptModuleInfo) - } - } + private val facadeForScriptDependenciesForProject = createFacadeForScriptDependencies(ScriptDependenciesInfo.ForProject(project)) private fun createFacadeForScriptDependencies( dependenciesModuleInfo: ScriptDependenciesInfo, @@ -113,8 +96,9 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { ScriptDependenciesModificationTracker.getInstance(project) ) - val scriptModuleInfo = (dependenciesModuleInfo as? ScriptDependenciesInfo.ForFile)?.scriptModuleInfo - val globalFacade = if (scriptModuleInfo?.relatedModuleSourceInfo != null) { + val scriptFile = (dependenciesModuleInfo as? ScriptDependenciesInfo.ForFile)?.scriptFile + val relatedModuleSourceInfo = scriptFile?.let { getScriptRelatedModuleInfo(project, it) } + val globalFacade = if (relatedModuleSourceInfo != null) { globalFacade(settings) } else { getOrBuildGlobalFacade(settings).facadeForSdk @@ -258,7 +242,9 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { } specialModuleInfo is ScriptModuleInfo -> { - val facadeForScriptDependencies = getFacadeForScriptDependencies(specialModuleInfo) + val facadeForScriptDependencies = createFacadeForScriptDependencies( + ScriptDependenciesInfo.ForFile(project, specialModuleInfo.scriptFile, specialModuleInfo.scriptDefinition) + ) val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker() makeProjectResolutionFacade( "facadeForSpecialModuleInfo (ScriptModuleInfo)", @@ -268,17 +254,13 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { moduleFilter = { it == specialModuleInfo } ) } - specialModuleInfo is ScriptDependenciesInfo -> { - createFacadeForScriptDependencies(specialModuleInfo, files) - } + specialModuleInfo is ScriptDependenciesInfo -> facadeForScriptDependenciesForProject specialModuleInfo is ScriptDependenciesSourceInfo -> { - // TODO: can be optimized by caching facadeForScriptDependencies - val facadeForScriptDependencies = createFacadeForScriptDependencies(specialModuleInfo.binariesModuleInfo, files) - val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker() + val globalContext = facadeForScriptDependenciesForProject.globalContext.contextWithNewLockAndCompositeExceptionTracker() makeProjectResolutionFacade( "facadeForSpecialModuleInfo (ScriptDependenciesSourceInfo)", globalContext, - reuseDataFrom = facadeForScriptDependencies, + reuseDataFrom = facadeForScriptDependenciesForProject, allModules = specialModuleInfo.dependencies(), moduleFilter = { it == specialModuleInfo } ) @@ -430,8 +412,8 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { val settings = PlatformAnalysisSettings(platform, moduleInfo.sdk, moduleInfo.supportsAdditionalBuiltInsMembers()) val projectFacade = when (moduleInfo) { is ScriptDependenciesInfo.ForProject, - is ScriptDependenciesSourceInfo.ForProject -> facadesForScriptDependencies[null] - is ScriptDependenciesInfo.ForFile -> facadesForScriptDependencies[moduleInfo.scriptModuleInfo] + is ScriptDependenciesSourceInfo.ForProject -> facadeForScriptDependenciesForProject + is ScriptDependenciesInfo.ForFile -> createFacadeForScriptDependencies(moduleInfo) else -> globalFacade(settings) } return ModuleResolutionFacadeImpl(projectFacade, moduleInfo) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt index 4f3511b2c42..3c7b8e2533f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt @@ -49,7 +49,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider { moduleInfo is LibraryInfo -> project.getLanguageVersionSettings(extraAnalysisFlags = getExtraAnalysisFlags(project)) moduleInfo is ScriptModuleInfo -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) moduleInfo is ScriptDependenciesInfo.ForFile -> - getVersionLanguageSettingsForScripts(project, moduleInfo.scriptModuleInfo.scriptDefinition) + getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) else -> project.getLanguageVersionSettings() } diff --git a/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt b/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt index 0047c86520e..782013c17c6 100644 --- a/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt +++ b/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt @@ -67,7 +67,7 @@ class IdeSamWithReceiverComponentContributor(val project: Project) : StorageComp val annotations = when (moduleInfo) { is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers - is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptModuleInfo.scriptDefinition?.annotationsForSamWithReceivers + is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module) else -> null } ?: return