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 override val moduleOrigin: ModuleOrigin
get() = ModuleOrigin.OTHER get() = ModuleOrigin.OTHER
val externalDependencies: ScriptDependencies
get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile)
val relatedModuleSourceInfo: ModuleSourceInfo? val relatedModuleSourceInfo: ModuleSourceInfo?
get() = getScriptRelatedModuleInfo(project, scriptFile) get() = getScriptRelatedModuleInfo(project, scriptFile)
@@ -47,9 +44,10 @@ data class ScriptModuleInfo(
override fun dependencies(): List<IdeaModuleInfo> { override fun dependencies(): List<IdeaModuleInfo> {
return arrayListOf<IdeaModuleInfo>(this).apply { 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()) } 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? override val sourcesModuleInfo: SourceForBinaryModuleInfo?
get() = ScriptDependenciesSourceInfo.ForProject(project) 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? override val sdk: Sdk?
get() = findJdk(scriptModuleInfo.externalDependencies, project) get() = findJdk(externalDependencies, project)
override fun contentScope(): GlobalSearchScope { 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 facadeForScriptDependenciesForProject = createFacadeForScriptDependencies(ScriptDependenciesInfo.ForProject(project))
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 fun createFacadeForScriptDependencies( private fun createFacadeForScriptDependencies(
dependenciesModuleInfo: ScriptDependenciesInfo, dependenciesModuleInfo: ScriptDependenciesInfo,
@@ -113,8 +96,9 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
ScriptDependenciesModificationTracker.getInstance(project) ScriptDependenciesModificationTracker.getInstance(project)
) )
val scriptModuleInfo = (dependenciesModuleInfo as? ScriptDependenciesInfo.ForFile)?.scriptModuleInfo val scriptFile = (dependenciesModuleInfo as? ScriptDependenciesInfo.ForFile)?.scriptFile
val globalFacade = if (scriptModuleInfo?.relatedModuleSourceInfo != null) { val relatedModuleSourceInfo = scriptFile?.let { getScriptRelatedModuleInfo(project, it) }
val globalFacade = if (relatedModuleSourceInfo != null) {
globalFacade(settings) globalFacade(settings)
} else { } else {
getOrBuildGlobalFacade(settings).facadeForSdk getOrBuildGlobalFacade(settings).facadeForSdk
@@ -258,7 +242,9 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
} }
specialModuleInfo is ScriptModuleInfo -> { specialModuleInfo is ScriptModuleInfo -> {
val facadeForScriptDependencies = getFacadeForScriptDependencies(specialModuleInfo) val facadeForScriptDependencies = createFacadeForScriptDependencies(
ScriptDependenciesInfo.ForFile(project, specialModuleInfo.scriptFile, specialModuleInfo.scriptDefinition)
)
val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker() val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker()
makeProjectResolutionFacade( makeProjectResolutionFacade(
"facadeForSpecialModuleInfo (ScriptModuleInfo)", "facadeForSpecialModuleInfo (ScriptModuleInfo)",
@@ -268,17 +254,13 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
moduleFilter = { it == specialModuleInfo } moduleFilter = { it == specialModuleInfo }
) )
} }
specialModuleInfo is ScriptDependenciesInfo -> { specialModuleInfo is ScriptDependenciesInfo -> facadeForScriptDependenciesForProject
createFacadeForScriptDependencies(specialModuleInfo, files)
}
specialModuleInfo is ScriptDependenciesSourceInfo -> { specialModuleInfo is ScriptDependenciesSourceInfo -> {
// TODO: can be optimized by caching facadeForScriptDependencies val globalContext = facadeForScriptDependenciesForProject.globalContext.contextWithNewLockAndCompositeExceptionTracker()
val facadeForScriptDependencies = createFacadeForScriptDependencies(specialModuleInfo.binariesModuleInfo, files)
val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker()
makeProjectResolutionFacade( makeProjectResolutionFacade(
"facadeForSpecialModuleInfo (ScriptDependenciesSourceInfo)", "facadeForSpecialModuleInfo (ScriptDependenciesSourceInfo)",
globalContext, globalContext,
reuseDataFrom = facadeForScriptDependencies, reuseDataFrom = facadeForScriptDependenciesForProject,
allModules = specialModuleInfo.dependencies(), allModules = specialModuleInfo.dependencies(),
moduleFilter = { it == specialModuleInfo } moduleFilter = { it == specialModuleInfo }
) )
@@ -430,8 +412,8 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
val settings = PlatformAnalysisSettings(platform, moduleInfo.sdk, moduleInfo.supportsAdditionalBuiltInsMembers()) val settings = PlatformAnalysisSettings(platform, moduleInfo.sdk, moduleInfo.supportsAdditionalBuiltInsMembers())
val projectFacade = when (moduleInfo) { val projectFacade = when (moduleInfo) {
is ScriptDependenciesInfo.ForProject, is ScriptDependenciesInfo.ForProject,
is ScriptDependenciesSourceInfo.ForProject -> facadesForScriptDependencies[null] is ScriptDependenciesSourceInfo.ForProject -> facadeForScriptDependenciesForProject
is ScriptDependenciesInfo.ForFile -> facadesForScriptDependencies[moduleInfo.scriptModuleInfo] is ScriptDependenciesInfo.ForFile -> createFacadeForScriptDependencies(moduleInfo)
else -> globalFacade(settings) else -> globalFacade(settings)
} }
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo) return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
@@ -49,7 +49,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider {
moduleInfo is LibraryInfo -> project.getLanguageVersionSettings(extraAnalysisFlags = getExtraAnalysisFlags(project)) moduleInfo is LibraryInfo -> project.getLanguageVersionSettings(extraAnalysisFlags = getExtraAnalysisFlags(project))
moduleInfo is ScriptModuleInfo -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition) moduleInfo is ScriptModuleInfo -> getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition)
moduleInfo is ScriptDependenciesInfo.ForFile -> moduleInfo is ScriptDependenciesInfo.ForFile ->
getVersionLanguageSettingsForScripts(project, moduleInfo.scriptModuleInfo.scriptDefinition) getVersionLanguageSettingsForScripts(project, moduleInfo.scriptDefinition)
else -> project.getLanguageVersionSettings() else -> project.getLanguageVersionSettings()
} }
@@ -67,7 +67,7 @@ class IdeSamWithReceiverComponentContributor(val project: Project) : StorageComp
val annotations = val annotations =
when (moduleInfo) { when (moduleInfo) {
is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers
is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptModuleInfo.scriptDefinition?.annotationsForSamWithReceivers is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers
is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module) is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module)
else -> null else -> null
} ?: return } ?: return