Refactoring: move method that find sdk for script to ScriptDependenciesManager

This commit is contained in:
Natalia Selezneva
2019-04-26 15:01:45 +03:00
parent 2f5deefd0a
commit 144ff8ae91
2 changed files with 29 additions and 20 deletions
@@ -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
@@ -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<VirtualFile> = 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<File>): List<VirtualFile> {
return roots.mapNotNull { it.classpathEntryToVfs() }
}