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
This commit is contained in:
Natalia Selezneva
2018-05-23 11:58:29 +03:00
parent 2b322ecf9c
commit 30c62bccb2
4 changed files with 27 additions and 40 deletions
@@ -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<IdeaModuleInfo> {
return arrayListOf<IdeaModuleInfo>(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)
}
}
@@ -80,24 +80,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
}
}
private val facadesForScriptDependencies: SLRUCache<ScriptModuleInfo, ProjectResolutionFacade> =
object : SLRUCache<ScriptModuleInfo, ProjectResolutionFacade>(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)
@@ -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()
}
@@ -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