IDE scripting: add default sdk only when used

This commit is contained in:
Sergey Rostov
2020-05-22 18:55:48 +03:00
parent 53983a99e5
commit 72aba2fce2
3 changed files with 19 additions and 10 deletions
@@ -22,6 +22,7 @@ class ScriptClassRootsStorage(val project: Project) : PersistentStateComponent<S
var classpath: Set<String> = hashSetOf() var classpath: Set<String> = hashSetOf()
var sources: Set<String> = hashSetOf() var sources: Set<String> = hashSetOf()
var sdks: Set<String> = hashSetOf() var sdks: Set<String> = hashSetOf()
var defaultSdkUsed: Boolean = false
override fun getState(): ScriptClassRootsStorage? { override fun getState(): ScriptClassRootsStorage? {
return this return this
@@ -77,10 +77,8 @@ class ScriptClassRootsBuilder(
storage.project, storage.project,
storage.classpath.toMutableSet(), storage.classpath.toMutableSet(),
storage.sources.toMutableSet(), storage.sources.toMutableSet(),
).also { roots -> ).also {
storage.sdks.forEach { it.sdks.fromStorage(storage)
roots.sdks.addSdkByName(it)
}
} }
} }
} }
@@ -22,11 +22,7 @@ class ScriptSdksBuilder(
private val sdks: MutableMap<String?, Sdk?> = mutableMapOf(), private val sdks: MutableMap<String?, Sdk?> = mutableMapOf(),
private val remove: Sdk? = null private val remove: Sdk? = null
) { ) {
private val defaultSdk = getScriptDefaultSdk() private val defaultSdk by lazy { getScriptDefaultSdk() }
init {
sdks[null] = defaultSdk
}
fun build() = ScriptSdks(project, sdks) fun build() = ScriptSdks(project, sdks)
@@ -35,7 +31,8 @@ class ScriptSdksBuilder(
} }
fun addSdk(javaHome: File?): Sdk? { fun addSdk(javaHome: File?): Sdk? {
if (javaHome == null) return defaultSdk if (javaHome == null) return addDefaultSdk()
val canonicalPath = FileUtil.toSystemIndependentName(javaHome.canonicalPath) val canonicalPath = FileUtil.toSystemIndependentName(javaHome.canonicalPath)
return sdks.getOrPut(canonicalPath) { return sdks.getOrPut(canonicalPath) {
getScriptSdkByJavaHome(javaHome) ?: defaultSdk getScriptSdkByJavaHome(javaHome) ?: defaultSdk
@@ -54,6 +51,9 @@ class ScriptSdksBuilder(
?.takeIf { it.canBeUsedForScript() } ?.takeIf { it.canBeUsedForScript() }
} }
fun addDefaultSdk(): Sdk? =
sdks.getOrPut(null) { defaultSdk }
fun addSdkByName(sdkName: String) { fun addSdkByName(sdkName: String) {
val sdk = getProjectJdkTableSafe().allJdks val sdk = getProjectJdkTableSafe().allJdks
.find { it.name == sdkName } .find { it.name == sdkName }
@@ -85,5 +85,15 @@ class ScriptSdksBuilder(
fun toStorage(storage: ScriptClassRootsStorage) { fun toStorage(storage: ScriptClassRootsStorage) {
storage.sdks = sdks.values.mapNotNullTo(mutableSetOf()) { it?.name } storage.sdks = sdks.values.mapNotNullTo(mutableSetOf()) { it?.name }
storage.defaultSdkUsed = sdks.containsKey(null)
}
fun fromStorage(storage: ScriptClassRootsStorage) {
storage.sdks.forEach {
addSdkByName(it)
}
if (storage.defaultSdkUsed) {
addDefaultSdk()
}
} }
} }