From 61eb40745b0a86013be71f6e8314dff93cc32c5d Mon Sep 17 00:00:00 2001 From: Vlad Koshkin Date: Mon, 7 Apr 2025 20:04:57 +0200 Subject: [PATCH] [kotlin] refactor ScriptClassPathVirtualFileCache #KTIJ-33351 GitOrigin-RevId: f401644ad6aa3d063bfbb5391c38eaca51f2b9a4 --- .../core/script/k2/ScriptClassPathUtil.kt | 28 ++++++++--------- .../k2/ScriptConfigurationsProviderImpl.kt | 30 +++++++++---------- .../kotlin/idea/core/script/scriptUtils.kt | 5 ++-- ...radleScriptRefinedConfigurationProvider.kt | 4 +-- 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptClassPathUtil.kt b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptClassPathUtil.kt index 70f9ec5f2ce8..63554585aec9 100644 --- a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptClassPathUtil.kt +++ b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptClassPathUtil.kt @@ -16,18 +16,7 @@ import kotlin.script.experimental.api.ScriptDependency import kotlin.script.experimental.jvm.JvmDependency class ScriptClassPathUtil { - private constructor() - - private val cache = mutableMapOf() - - fun findVirtualFile(pathString: String): VirtualFile? = - cache.computeIfAbsent(pathString) { - ScriptClassPathUtil.findVirtualFile(pathString) - } - companion object { - fun getInstance(): ScriptClassPathUtil = ScriptClassPathUtil() - fun List?.findVirtualFiles(): List { this ?: return emptyList() return this @@ -39,7 +28,7 @@ class ScriptClassPathUtil { fun findVirtualFile(pathString: String): VirtualFile? { val path = pathString.toNioPathOrNull() - val resultFile = when { + return when { path == null -> { scriptingWarnLog("Invalid classpath entry '$pathString'") null @@ -63,8 +52,6 @@ class ScriptClassPathUtil { null } } - - return resultFile } private fun VirtualFileSystem.refreshIfNeededAndFindFileByPath(path: String): VirtualFile? { @@ -81,3 +68,16 @@ class ScriptClassPathUtil { } } } + +class ScriptVirtualFileCache() { + private val cache = mutableMapOf>() + + fun findVirtualFile(pathString: String): VirtualFile? { + val result = cache.computeIfAbsent(pathString) { + val resultFile = ScriptClassPathUtil.findVirtualFile(pathString) + resultFile?.let { Result.success(it) } ?: Result.failure(Throwable()) + } + + return result.getOrNull() + } +} diff --git a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptConfigurationsProviderImpl.kt b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptConfigurationsProviderImpl.kt index e7fcc5167400..86b3c5dec375 100644 --- a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptConfigurationsProviderImpl.kt +++ b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/k2/ScriptConfigurationsProviderImpl.kt @@ -33,23 +33,9 @@ private class ScriptDependenciesData( ) { operator fun plus(other: ScriptDependenciesData): ScriptDependenciesData { return ScriptDependenciesData( - this.classes + other.classes, - this.sources + other.sources, - this.sdks + other.sdks + this.classes + other.classes, this.sources + other.sources, this.sdks + other.sdks ) } - - companion object { - fun from(configuration: ScriptConfigurationWithSdk): ScriptDependenciesData { - val cache = ScriptClassPathUtil.getInstance() - return ScriptDependenciesData( - configuration.scriptConfiguration.valueOrNull()?.dependenciesClassPath?.mapNotNull { cache.findVirtualFile(it.path) } - ?.toSet() ?: emptySet(), - configuration.scriptConfiguration.valueOrNull()?.dependenciesSources?.mapNotNull { cache.findVirtualFile(it.path) } - ?.toSet() ?: emptySet(), - ) - } - } } class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: CoroutineScope) : ScriptConfigurationsProvider(project), @@ -57,8 +43,20 @@ class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: Cor private val allDependencies = AtomicReference(ScriptDependenciesData()) fun store(configurations: Collection) { + val cache = ScriptVirtualFileCache() + val dataToAdd = configurations.fold(ScriptDependenciesData()) { left, right -> - left + ScriptDependenciesData.from(right) + val configurationWrapper = right.scriptConfiguration.valueOrNull() + + if (configurationWrapper == null) { + left + } else { + left + ScriptDependenciesData( + configurationWrapper.dependenciesClassPath.mapNotNull { cache.findVirtualFile(it.path) }.toSet(), + configurationWrapper.dependenciesSources.mapNotNull { cache.findVirtualFile(it.path) }.toSet(), + setOfNotNull(right.sdk) + ) + } } allDependencies.accumulateAndGet(dataToAdd) { left, right -> left + right } } diff --git a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/scriptUtils.kt b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/scriptUtils.kt index b68041753b58..bf2f17718492 100644 --- a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/scriptUtils.kt +++ b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/scriptUtils.kt @@ -90,16 +90,15 @@ fun MutableEntityStorage.getOrCreateDefinitionDependency( val libraryId = LibraryId(".${definition.fileExtension} definition dependencies", LibraryTableId.ProjectLibraryTableId) if (!this.contains(libraryId)) { val fileUrlManager = WorkspaceModel.getInstance(project).getVirtualFileUrlManager() - val virtualFileCache = ScriptClassPathUtil.getInstance() val classes = definition.compilationConfiguration[ScriptCompilationConfiguration.dependencies] .toClassPathOrEmpty() - .mapNotNull { virtualFileCache.findVirtualFile(it.path) } + .mapNotNull { ScriptClassPathUtil.findVirtualFile(it.path) } .sortedBy { it.name } val sources = definition.compilationConfiguration[ScriptCompilationConfiguration.ide.dependenciesSources] .toClassPathOrEmpty() - .mapNotNull { virtualFileCache.findVirtualFile(it.path) } + .mapNotNull { ScriptClassPathUtil.findVirtualFile(it.path) } .sortedBy { it.name } val classRoots = classes.map { diff --git a/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/GradleScriptRefinedConfigurationProvider.kt b/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/GradleScriptRefinedConfigurationProvider.kt index c0e1a3b1d97c..900991ccee04 100644 --- a/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/GradleScriptRefinedConfigurationProvider.kt +++ b/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/GradleScriptRefinedConfigurationProvider.kt @@ -87,7 +87,7 @@ class GradleScriptRefinedConfigurationProvider( val result = MutableEntityStorage.create() val urlManager = WorkspaceModel.getInstance(project).getVirtualFileUrlManager() - val virtualFileCache = ScriptClassPathUtil.getInstance() + val virtualFileCache = ScriptVirtualFileCache() val dependencyFactory = ScriptDependencyFactory(result, configurations, virtualFileCache) for ((scriptFile, configurationWithSdk) in configurations) { @@ -179,7 +179,7 @@ class GradleScriptRefinedConfigurationProvider( inner class ScriptDependencyFactory( private val entityStorage: MutableEntityStorage, scripts: Map, - virtualFileCache: ScriptClassPathUtil, + virtualFileCache: ScriptVirtualFileCache, ) { private val nameCache = HashMap>()