scripting, sdk cache: same key for locating sdk
This commit is contained in:
+1
@@ -59,6 +59,7 @@ class ScriptClassRootsBuilder(
|
||||
classes.addAll(classesRoots)
|
||||
}
|
||||
|
||||
@Deprecated("Don't use, used only from DefaultScriptingSupport for saving to storage")
|
||||
fun add(other: ScriptClassRootsBuilder) {
|
||||
classes.addAll(other.classes)
|
||||
sources.addAll(other.sources)
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ class ScriptClassRootsCache(
|
||||
val configuration = lightScriptInfo.buildConfiguration() ?: return null
|
||||
|
||||
val roots = configuration.dependenciesClassPath
|
||||
val sdk = sdks[configuration.javaHome?.canonicalPath]
|
||||
val sdk = sdks[SdkId(configuration.javaHome)]
|
||||
|
||||
return if (sdk == null) {
|
||||
HeavyScriptInfo(configuration, compose(toVfsRoots(roots)), null)
|
||||
|
||||
@@ -12,15 +12,12 @@ import com.intellij.openapi.roots.ModuleRootManager
|
||||
import com.intellij.openapi.roots.OrderRootType
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||
import java.io.File
|
||||
|
||||
class ScriptSdks(val project: Project, private val sdks: Map<String?, Sdk?>) {
|
||||
class ScriptSdks(val project: Project, private val sdks: Map<SdkId, Sdk?>) {
|
||||
fun rebuild(remove: Sdk?): ScriptSdks {
|
||||
val builder = ScriptSdksBuilder(project, remove = remove)
|
||||
sdks.keys.forEach { home ->
|
||||
if (home != null) {
|
||||
builder.addSdk(File(home))
|
||||
}
|
||||
sdks.keys.forEach { id ->
|
||||
builder.addSdk(id)
|
||||
}
|
||||
return builder.build()
|
||||
}
|
||||
@@ -29,7 +26,8 @@ class ScriptSdks(val project: Project, private val sdks: Map<String?, Sdk?>) {
|
||||
val nonIndexedSourceRoots = mutableSetOf<VirtualFile>()
|
||||
|
||||
val first: Sdk? = sdks.values.firstOrNull()
|
||||
operator fun get(sdkHome: String?) = sdks[sdkHome]
|
||||
|
||||
operator fun get(sdkId: SdkId) = sdks[sdkId]
|
||||
|
||||
init {
|
||||
val nonIndexedSdks = sdks.values.filterNotNullTo(mutableSetOf())
|
||||
|
||||
+12
-7
@@ -9,7 +9,6 @@ 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.util.io.FileUtil
|
||||
import com.intellij.openapi.vfs.VfsUtil
|
||||
import org.jetbrains.kotlin.idea.caches.project.getAllProjectSdks
|
||||
import org.jetbrains.kotlin.idea.core.script.LOG
|
||||
@@ -19,22 +18,28 @@ import java.io.File
|
||||
|
||||
class ScriptSdksBuilder(
|
||||
val project: Project,
|
||||
private val sdks: MutableMap<String?, Sdk?> = mutableMapOf(),
|
||||
private val sdks: MutableMap<SdkId, Sdk?> = mutableMapOf(),
|
||||
private val remove: Sdk? = null
|
||||
) {
|
||||
private val defaultSdk by lazy { getScriptDefaultSdk() }
|
||||
|
||||
fun build() = ScriptSdks(project, sdks)
|
||||
|
||||
@Deprecated("Don't use, used only from DefaultScriptingSupport for saving to storage")
|
||||
fun addAll(other: ScriptSdksBuilder) {
|
||||
sdks.putAll(other.sdks)
|
||||
}
|
||||
|
||||
// add sdk by home path with checking for removed sdk
|
||||
fun addSdk(sdkId: SdkId): Sdk? {
|
||||
val canonicalPath = sdkId.homeDirectory ?: return addDefaultSdk()
|
||||
return addSdk(File(canonicalPath))
|
||||
}
|
||||
|
||||
fun addSdk(javaHome: File?): Sdk? {
|
||||
if (javaHome == null) return addDefaultSdk()
|
||||
|
||||
val canonicalPath = FileUtil.toSystemIndependentName(javaHome.canonicalPath)
|
||||
return sdks.getOrPut(canonicalPath) {
|
||||
return sdks.getOrPut(SdkId(javaHome)) {
|
||||
getScriptSdkByJavaHome(javaHome) ?: defaultSdk
|
||||
}
|
||||
}
|
||||
@@ -52,7 +57,7 @@ class ScriptSdksBuilder(
|
||||
}
|
||||
|
||||
fun addDefaultSdk(): Sdk? =
|
||||
sdks.getOrPut(null) { defaultSdk }
|
||||
sdks.getOrPut(SdkId.default) { defaultSdk }
|
||||
|
||||
fun addSdkByName(sdkName: String) {
|
||||
val sdk = getProjectJdkTableSafe().allJdks
|
||||
@@ -60,7 +65,7 @@ class ScriptSdksBuilder(
|
||||
?.takeIf { it.canBeUsedForScript() }
|
||||
?: defaultSdk ?: return
|
||||
val homePath = sdk.homePath ?: return
|
||||
sdks[homePath] = sdk
|
||||
sdks[SdkId(homePath)] = sdk
|
||||
}
|
||||
|
||||
private fun getScriptDefaultSdk(): Sdk? {
|
||||
@@ -85,7 +90,7 @@ class ScriptSdksBuilder(
|
||||
|
||||
fun toStorage(storage: ScriptClassRootsStorage) {
|
||||
storage.sdks = sdks.values.mapNotNullTo(mutableSetOf()) { it?.name }
|
||||
storage.defaultSdkUsed = sdks.containsKey(null)
|
||||
storage.defaultSdkUsed = sdks.containsKey(SdkId.default)
|
||||
}
|
||||
|
||||
fun fromStorage(storage: ScriptClassRootsStorage) {
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.core.script.ucache
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Safe key for locating sdk in intellij project jdk table
|
||||
*
|
||||
* null means default sdk
|
||||
*/
|
||||
class SdkId private constructor(val homeDirectory: String?) {
|
||||
companion object {
|
||||
val default = SdkId(null as String?)
|
||||
|
||||
operator fun invoke(homeDirectory: File?): SdkId {
|
||||
if (homeDirectory == null) return default
|
||||
val canonicalPath = FileUtil.toSystemIndependentName(homeDirectory.canonicalPath)
|
||||
return SdkId(canonicalPath)
|
||||
}
|
||||
|
||||
operator fun invoke(homeDirectory: String?): SdkId {
|
||||
if (homeDirectory == null) return default
|
||||
return invoke(File(homeDirectory))
|
||||
}
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (this === other) return true
|
||||
if (javaClass != other?.javaClass) return false
|
||||
|
||||
other as SdkId
|
||||
|
||||
if (homeDirectory != other.homeDirectory) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return homeDirectory?.hashCode() ?: 0
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user