From e3ed8870dd467b6faf241c7c94c43cd5767b8412 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Tue, 26 May 2020 12:21:10 +0300 Subject: [PATCH] scripting, sdk cache: same key for locating sdk --- .../script/ucache/ScriptClassRootsBuilder.kt | 1 + .../script/ucache/ScriptClassRootsCache.kt | 2 +- .../idea/core/script/ucache/ScriptSdks.kt | 12 ++--- .../core/script/ucache/ScriptSdksBuilder.kt | 19 +++++--- .../kotlin/idea/core/script/ucache/SdkId.kt | 46 +++++++++++++++++++ 5 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/SdkId.kt diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsBuilder.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsBuilder.kt index 27ad33c8533..a37d7bc3bf9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsBuilder.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsBuilder.kt @@ -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) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt index 5af7e4b3974..58105d9691a 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsCache.kt @@ -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) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdks.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdks.kt index 53ea347e076..f2f7b240403 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdks.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdks.kt @@ -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) { +class ScriptSdks(val project: Project, private val sdks: Map) { 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) { val nonIndexedSourceRoots = mutableSetOf() 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()) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdksBuilder.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdksBuilder.kt index ab3fb3bbf47..16bb38c1b7a 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdksBuilder.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptSdksBuilder.kt @@ -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 = mutableMapOf(), + private val sdks: MutableMap = 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) { diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/SdkId.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/SdkId.kt new file mode 100644 index 00000000000..0104a4f0129 --- /dev/null +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/SdkId.kt @@ -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 + } +} \ No newline at end of file