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:
+13
-8
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-30
@@ -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)
|
||||
|
||||
+1
-1
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user