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.components.ServiceManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.DelegatingGlobalSearchScope
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.NonClasspathDirectoriesScope import com.intellij.psi.search.NonClasspathDirectoriesScope
import com.intellij.util.containers.SLRUCache 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.idea.stubindex.KotlinSourceFilterScope
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
import java.io.File
import kotlin.script.experimental.dependencies.ScriptDependencies import kotlin.script.experimental.dependencies.ScriptDependencies
data class ScriptModuleInfo( 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 { sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, BinaryModuleInfo {
abstract val sdk: Sdk? abstract val sdk: Sdk?
@@ -97,7 +80,10 @@ sealed class ScriptDependenciesInfo(val project: Project) : IdeaModuleInfo, Bina
get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile) get() = ScriptDependenciesManager.getInstance(project).getScriptDependencies(scriptFile)
override val sdk: Sdk? 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 { override fun contentScope(): GlobalSearchScope {
return ServiceManager.getService(project, ScriptBinariesScopeCache::class.java).get(externalDependencies) 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) { class ForProject(project: Project) : ScriptDependenciesInfo(project) {
override val sdk: Sdk? override val sdk: Sdk?
get() = findJdk(null, project) get() = ScriptDependenciesManager.getScriptDefaultSdk(project)
override fun contentScope(): GlobalSearchScope { override fun contentScope(): GlobalSearchScope {
// we do not know which scripts these dependencies are // 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.components.ServiceManager
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project 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.StandardFileSystems
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.io.URLUtil import com.intellij.util.io.URLUtil
import org.jetbrains.annotations.TestOnly 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.idea.core.script.dependencies.SyncScriptDependenciesLoader
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import java.io.File import java.io.File
import kotlin.script.experimental.dependencies.ScriptDependencies 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 getScriptClasspath(file: VirtualFile): List<VirtualFile> = toVfsRoots(cacheUpdater.getCurrentDependencies(file).classpath)
fun getScriptDependencies(file: VirtualFile): ScriptDependencies = cacheUpdater.getCurrentDependencies(file) fun getScriptDependencies(file: VirtualFile): ScriptDependencies = cacheUpdater.getCurrentDependencies(file)
fun getScriptSdk(file: VirtualFile): Sdk? = getScriptSdk(getScriptDependencies(file))
fun getAllScriptsClasspathScope() = cache.allScriptsClasspathScope fun getAllScriptsClasspathScope() = cache.allScriptsClasspathScope
fun getAllLibrarySourcesScope() = cache.allLibrarySourcesScope fun getAllLibrarySourcesScope() = cache.allLibrarySourcesScope
@@ -57,6 +62,24 @@ class ScriptDependenciesManager internal constructor(
fun getInstance(project: Project): ScriptDependenciesManager = fun getInstance(project: Project): ScriptDependenciesManager =
ServiceManager.getService(project, ScriptDependenciesManager::class.java) 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> { fun toVfsRoots(roots: Iterable<File>): List<VirtualFile> {
return roots.mapNotNull { it.classpathEntryToVfs() } return roots.mapNotNull { it.classpathEntryToVfs() }
} }