Introduce separate cache for scripts
^KT-22588 Fixed
This commit is contained in:
+3
-2
@@ -35,8 +35,9 @@ data class ScriptModuleInfo(
|
|||||||
override val moduleOrigin: ModuleOrigin
|
override val moduleOrigin: ModuleOrigin
|
||||||
get() = ModuleOrigin.OTHER
|
get() = ModuleOrigin.OTHER
|
||||||
|
|
||||||
val externalDependencies: ScriptDependencies
|
val externalDependencies: ScriptDependencies by lazy {
|
||||||
get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile)
|
ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile)
|
||||||
|
}
|
||||||
|
|
||||||
val relatedModuleSourceInfo: ModuleSourceInfo? = getScriptRelatedModuleInfo(project, scriptFile)
|
val relatedModuleSourceInfo: ModuleSourceInfo? = getScriptRelatedModuleInfo(project, scriptFile)
|
||||||
|
|
||||||
|
|||||||
+36
-11
@@ -216,8 +216,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
val dependenciesForSyntheticFileCache =
|
val dependenciesForSyntheticFileCache =
|
||||||
listOf(
|
listOf(
|
||||||
PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT,
|
PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT,
|
||||||
filesModificationTracker,
|
filesModificationTracker
|
||||||
ScriptDependenciesModificationTracker.getInstance(project)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
val resolverDebugName =
|
val resolverDebugName =
|
||||||
@@ -383,17 +382,37 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val scriptsCacheProvider = CachedValueProvider {
|
||||||
|
CachedValueProvider.Result(
|
||||||
|
object : SLRUCache<Set<KtFile>, ProjectResolutionFacade>(2, 3) {
|
||||||
|
override fun createValue(files: Set<KtFile>) = createFacadeForFilesWithSpecialModuleInfo(files)
|
||||||
|
},
|
||||||
|
LibraryModificationTracker.getInstance(project),
|
||||||
|
ProjectRootModificationTracker.getInstance(project),
|
||||||
|
ScriptDependenciesModificationTracker.getInstance(project))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getFacadeForScripts(files: Set<KtFile>): ProjectResolutionFacade {
|
||||||
|
return CachedValuesManager.getManager(project).getCachedValue(project, scriptsCacheProvider).get(files)
|
||||||
|
}
|
||||||
|
|
||||||
private fun getFacadeToAnalyzeFiles(files: Collection<KtFile>): ResolutionFacade {
|
private fun getFacadeToAnalyzeFiles(files: Collection<KtFile>): ResolutionFacade {
|
||||||
val file = files.first()
|
val file = files.first()
|
||||||
val moduleInfo = file.getModuleInfo()
|
val moduleInfo = file.getModuleInfo()
|
||||||
val specialFiles = files.filterNotInProjectSourceOrScript(moduleInfo)
|
val scripts = files.filterScripts()
|
||||||
return if (specialFiles.isNotEmpty()) {
|
if (scripts.isNotEmpty()) {
|
||||||
val projectFacade = getFacadeForSpecialFiles(specialFiles)
|
val projectFacade = getFacadeForScripts(scripts)
|
||||||
ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
||||||
} else {
|
|
||||||
val platform = TargetPlatformDetector.getPlatform(file)
|
|
||||||
getResolutionFacadeByModuleInfo(moduleInfo, platform)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val specialFiles = files.filterNotInProjectSource(moduleInfo)
|
||||||
|
if (specialFiles.isNotEmpty()) {
|
||||||
|
val projectFacade = getFacadeForSpecialFiles(specialFiles)
|
||||||
|
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
val platform = TargetPlatformDetector.getPlatform(file)
|
||||||
|
return getResolutionFacadeByModuleInfo(moduleInfo, platform)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade? {
|
override fun getResolutionFacadeByFile(file: PsiFile, platform: TargetPlatform): ResolutionFacade? {
|
||||||
@@ -421,14 +440,20 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? =
|
override fun getResolutionFacadeByModuleInfo(moduleInfo: ModuleInfo, platform: TargetPlatform): ResolutionFacade? =
|
||||||
(moduleInfo as? IdeaModuleInfo)?.let { getResolutionFacadeByModuleInfo(it, platform) }
|
(moduleInfo as? IdeaModuleInfo)?.let { getResolutionFacadeByModuleInfo(it, platform) }
|
||||||
|
|
||||||
private fun Collection<KtFile>.filterNotInProjectSourceOrScript(moduleInfo: IdeaModuleInfo): Set<KtFile> {
|
private fun Collection<KtFile>.filterNotInProjectSource (moduleInfo: IdeaModuleInfo): Set<KtFile> {
|
||||||
return mapNotNull {
|
return mapNotNull {
|
||||||
if (it is KtCodeFragment) it.getContextFile() else it
|
if (it is KtCodeFragment) it.getContextFile() else it
|
||||||
}.filter {
|
}.filter {
|
||||||
!ProjectRootsUtil.isInProjectSource(it) || !moduleInfo.contentScope().contains(it) || it.isScript()
|
!ProjectRootsUtil.isInProjectSource(it) || !moduleInfo.contentScope().contains(it)
|
||||||
}.toSet()
|
}.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun Collection<KtFile>.filterScripts(): Set<KtFile> {
|
||||||
|
return mapNotNull {
|
||||||
|
if (it is KtCodeFragment) it.getContextFile() else it
|
||||||
|
}.filter { it.isScript() }.toSet()
|
||||||
|
}
|
||||||
|
|
||||||
private fun KtCodeFragment.getContextFile(): KtFile? {
|
private fun KtCodeFragment.getContextFile(): KtFile? {
|
||||||
val contextElement = context ?: return null
|
val contextElement = context ?: return null
|
||||||
val contextFile = (contextElement as? KtElement)?.containingKtFile
|
val contextFile = (contextElement as? KtElement)?.containingKtFile
|
||||||
|
|||||||
Reference in New Issue
Block a user