diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt index 21de82b55bc..4eaaa1ed31f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/ScriptModuleInfos.kt @@ -8,9 +8,7 @@ package org.jetbrains.kotlin.idea.caches.project import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk -import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.search.DelegatingGlobalSearchScope import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.NonClasspathDirectoriesScope import com.intellij.util.containers.SLRUCache @@ -20,7 +18,6 @@ import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptAdditionalIdeaDe import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition -import java.io.File import kotlin.script.experimental.dependencies.ScriptDependencies data class ScriptModuleInfo( @@ -55,20 +52,6 @@ data class ScriptModuleInfo( } } -fun findJdk(dependencies: ScriptDependencies?, project: Project): Sdk? { - val allJdks = getAllProjectSdks() - // workaround for mismatched gradle wrapper and plugin version - val javaHome = try { - dependencies?.javaHome?.canonicalPath - } catch (e: Throwable) { - null - } - - return allJdks.find { javaHome != null && File(it.homePath).canonicalPath == javaHome } - ?: ProjectRootManager.getInstance(project).projectSdk - ?: allJdks.firstOrNull() -} - sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, BinaryModuleInfo { abstract val sdk: Sdk? @@ -97,7 +80,10 @@ sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, Bina get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile) override val sdk: Sdk? - get() = findJdk(externalDependencies, project) + get() { + val manager = ScriptDependenciesManager.getInstance(project) + return manager.getScriptSdk(scriptFile) ?: ScriptDependenciesManager.getScriptDefaultSdk(project) + } override fun contentScope(): GlobalSearchScope { return ServiceManager.getService(project, ScriptBinariesScopeCache::class.java).get(externalDependencies) @@ -106,7 +92,7 @@ sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, Bina class ForProject(project: Project) : ScriptDependenciesInfo(project) { override val sdk: Sdk? - get() = findJdk(null, project) + get() = ScriptDependenciesManager.getScriptDefaultSdk(project) override fun contentScope(): GlobalSearchScope { // we do not know which scripts these dependencies are diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt index 206deae16eb..3c4f1da282a 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesManager.kt @@ -19,13 +19,17 @@ package org.jetbrains.kotlin.idea.core.script import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.JavaSdkType +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.vfs.StandardFileSystems +import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.io.URLUtil import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.idea.caches.project.getAllProjectSdks import org.jetbrains.kotlin.idea.core.script.dependencies.SyncScriptDependenciesLoader import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider -import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition import java.io.File import kotlin.script.experimental.dependencies.ScriptDependencies @@ -46,6 +50,7 @@ class ScriptDependenciesManager internal constructor( ) { fun getScriptClasspath(file: VirtualFile): List = toVfsRoots(cacheUpdater.getCurrentDependencies(file).classpath) fun getScriptDependencies(file: VirtualFile): ScriptDependencies = cacheUpdater.getCurrentDependencies(file) + fun getScriptSdk(file: VirtualFile): Sdk? = getScriptSdk(getScriptDependencies(file)) fun getAllScriptsClasspathScope() = cache.allScriptsClasspathScope fun getAllLibrarySourcesScope() = cache.allLibrarySourcesScope @@ -57,6 +62,24 @@ class ScriptDependenciesManager internal constructor( fun getInstance(project: Project): ScriptDependenciesManager = ServiceManager.getService(project, ScriptDependenciesManager::class.java) + fun getScriptSdk(dependencies: ScriptDependencies): Sdk? { + // workaround for mismatched gradle wrapper and plugin version + try { + val javaHome = dependencies.javaHome + ?.let { VfsUtil.findFileByIoFile(it, true) } + ?: return null + + return getAllProjectSdks().find { it.homeDirectory == javaHome } + } catch (e: Throwable) { + return null + } + + return getAllProjectSdks().find { javaHome != null && File(it.homePath).canonicalPath == javaHome } + } + + fun getScriptDefaultSdk(project: Project): Sdk? = + ProjectRootManager.getInstance(project).projectSdk ?: getAllProjectSdks().firstOrNull() + fun toVfsRoots(roots: Iterable): List { return roots.mapNotNull { it.classpathEntryToVfs() } }