diff --git a/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/base/analysis/LibraryDependenciesCache.kt b/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/base/analysis/LibraryDependenciesCache.kt index 8f2db939efbf..14ac61a5ac08 100644 --- a/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/base/analysis/LibraryDependenciesCache.kt +++ b/plugins/kotlin/base/analysis/src/org/jetbrains/kotlin/idea/base/analysis/LibraryDependenciesCache.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.idea.base.util.caching.findSdkBridge import org.jetbrains.kotlin.idea.base.util.caching.getChanges import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.configuration.isMavenized +import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -177,6 +178,13 @@ class LibraryDependenciesCacheImpl(private val project: Project) : LibraryDepend val filteredLibraries = filterForBuiltins(libraryInfo, libraryDependencyCandidatesAndSdkInfos.libraryDependencyCandidates) + libraryDependencyCandidatesAndSdkInfos.sdkInfos.takeIf { it.isEmpty() }?.apply { + val scriptConfigurationManager = ScriptConfigurationManager.getInstance(project) + scriptConfigurationManager.getScriptDependingOn(libraryInfo.getLibraryRoots()) + ?.let { script -> scriptConfigurationManager.getScriptSdk(script) } + ?.let { sdk -> add(SdkInfo(project, sdk)) } + } + return LibraryDependencyCandidatesAndSdkInfos(filteredLibraries, libraryDependencyCandidatesAndSdkInfos.sdkInfos) } diff --git a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt index c56ec2f65e5e..f2d5c6fbfc91 100644 --- a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt +++ b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ScriptConfigurationManager.kt @@ -119,6 +119,7 @@ interface ScriptConfigurationManager { fun getAllScriptDependenciesSources(): Collection fun getAllScriptsSdkDependenciesClassFiles(): Collection fun getAllScriptSdkDependenciesSources(): Collection + fun getScriptDependingOn(dependencies: Collection): VirtualFile? companion object { fun getServiceIfCreated(project: Project): ScriptConfigurationManager? = project.serviceIfCreated() diff --git a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt index abb9796942c8..6620d3e61125 100644 --- a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt +++ b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/configuration/CompositeScriptConfigurationManager.kt @@ -4,11 +4,11 @@ package org.jetbrains.kotlin.idea.core.script.configuration import com.intellij.codeInsight.daemon.OutsidersPsiFileSupport import com.intellij.ide.scratch.ScratchUtil -import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.ProjectRootManager +import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.platform.backend.workspace.WorkspaceModelChangeListener import com.intellij.platform.backend.workspace.WorkspaceModelTopics @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.core.script.ucache.* import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper +import java.nio.file.Path /** * The [CompositeScriptConfigurationManager] will provide redirection of [ScriptConfigurationManager] calls to the @@ -183,6 +184,15 @@ class CompositeScriptConfigurationManager(val project: Project, val scope: Corou override fun getAllScriptSdkDependenciesSources(): Collection = classpathRoots.sdks.nonIndexedSourceRoots + override fun getScriptDependingOn(dependencies: Collection): VirtualFile? = + classpathRoots.scriptsPaths().firstNotNullOfOrNull { scriptPath -> + VfsUtil.findFile(Path.of(scriptPath), true)?.takeIf { scriptVirtualFile -> + getScriptDependenciesClassFiles(scriptVirtualFile).any { scriptDependency -> + dependencies.contains(scriptDependency.presentableUrl) + } + } + } + override fun getScriptDependenciesClassFiles(file: VirtualFile): Collection = classpathRoots.getScriptDependenciesClassFiles(file) diff --git a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt index 7822de9c7510..c58e41c5b516 100644 --- a/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt +++ b/plugins/kotlin/base/scripting/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt @@ -148,8 +148,11 @@ class ScriptClassRootsCache( fun getScriptConfiguration(file: VirtualFile): ScriptCompilationConfigurationWrapper? = getHeavyScriptInfo(file.path)?.scriptConfiguration + fun getScriptSdk(path: String): Sdk? = + getHeavyScriptInfo(path)?.sdk + fun getScriptSdk(file: VirtualFile): Sdk? = - getHeavyScriptInfo(file.path)?.sdk + getScriptSdk(file.path) fun getScriptDependenciesClassFilesScope(file: VirtualFile): GlobalSearchScope = getHeavyScriptInfo(file.path)?.classFilesScope ?: GlobalSearchScope.EMPTY_SCOPE