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