[eel, jdk] IJ-CR-162252: Address review feedback

GitOrigin-RevId: c7910b6a865af87ca81b3774753569b70ae099fc
This commit is contained in:
Konstantin.Nisht
2025-01-03 18:44:38 +00:00
committed by intellij-monorepo-bot
parent dcd1121b80
commit bcc463b3ea
2 changed files with 54 additions and 49 deletions
@@ -21,6 +21,7 @@ import com.intellij.openapi.components.service
import com.intellij.openapi.module.StdModuleTypes
import com.intellij.openapi.observable.properties.GraphProperty
import com.intellij.openapi.observable.util.whenDisposed
import com.intellij.openapi.progress.runBlockingMaybeCancellable
import com.intellij.openapi.project.DefaultProjectFactory
import com.intellij.openapi.projectRoots.*
import com.intellij.openapi.projectRoots.impl.AddJdkService
@@ -42,6 +43,7 @@ import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.EelDescriptor
import com.intellij.platform.eel.provider.*
import com.intellij.platform.eel.provider.utils.EelPathUtils
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.*
import com.intellij.ui.AnimatedIcon.ANIMATION_IN_RENDERER_ALLOWED
@@ -60,9 +62,7 @@ import kotlinx.coroutines.*
import java.awt.BorderLayout
import java.awt.Component
import java.nio.file.Path
import java.util.*
import javax.accessibility.AccessibleContext
import javax.swing.DefaultComboBoxModel
import javax.swing.Icon
import javax.swing.JList
import kotlin.io.path.Path
@@ -118,14 +118,15 @@ fun projectWizardJdkComboBox(
val sdkPropertyId = StdModuleTypes.JAVA
val selectedJdkProperty = "jdk.selected.${sdkPropertyId.id}"
val combo = ProjectWizardJdkComboBox(projectJdk, locationProperty.get(), disposable)
val combo = ProjectWizardJdkComboBox(projectJdk, disposable)
locationProperty.afterPropagation {
val path = locationProperty.get()
if (path.isEmpty()) {
return@afterPropagation
}
combo.projectLocationChanged(locationProperty.get())
val newDescriptor = guardEelDescriptor { Path(locationProperty.get()).getEelDescriptor() } ?: LocalEelDescriptor
combo.eelChanged(newDescriptor)
}
combo.filterItems { sdkFilter(it) }
@@ -264,18 +265,17 @@ private inline fun guardEelDescriptor(producer: () -> EelDescriptor): EelDescrip
class ProjectWizardJdkComboBox(
val projectJdk: Sdk? = null,
var projectLocation: String,
disposable: Disposable,
) : ComboBox<ProjectWizardJdkIntent>(), UiDataProvider {
) : ComboBox<ProjectWizardJdkIntent>(MutableCollectionComboBoxModel()), UiDataProvider {
// used in third-party plugin
@Suppress("unused")
@Deprecated("Use constructor with location parameter", ReplaceWith("ProjectWizardJdkComboBox(projectJdk, projectLocation, disposable)"))
constructor(projectSdk: Sdk?, disposable: Disposable) : this(projectSdk, System.getProperty("user.home"), disposable)
override fun getModel(): CollectionComboBoxModel<ProjectWizardJdkIntent> {
return super.getModel() as CollectionComboBoxModel<ProjectWizardJdkIntent>
}
val registered: MutableList<ExistingJdk> = mutableListOf()
val detectedJDKs: MutableList<DetectedJdk> = mutableListOf()
val jdkItems: MutableList<ProjectWizardJdkIntent> = mutableListOf()
val registered: List<ExistingJdk>
get() = model.items.filterIsInstance<ExistingJdk>()
val detectedJDKs: List<DetectedJdk>
get() = model.items.filterIsInstance<DetectedJdk>()
var isLoadingDownloadItem: Boolean = false
var isLoadingExistingJdks: Boolean = true
val progressIcon: JBLabel = JBLabel(AnimatedIcon.Default.INSTANCE)
@@ -287,8 +287,6 @@ class ProjectWizardJdkComboBox(
var currentEelDescriptor: EelDescriptor? = guardEelDescriptor { LocalEelDescriptor }
init {
model = DefaultComboBoxModel(Vector())
disposable.whenDisposed { coroutineScope.cancel() }
reloadJdks(guardEelDescriptor { LocalEelDescriptor })
@@ -376,34 +374,22 @@ class ProjectWizardJdkComboBox(
}
}
fun projectLocationChanged(newLocation: String) {
projectLocation = newLocation
val key = guardEelDescriptor { Path(newLocation).getEelDescriptor() }
if (key != currentEelDescriptor) {
currentEelDescriptor = key
reloadJdks(key)
@RequiresEdt
fun eelChanged(descriptor: EelDescriptor) {
if (descriptor != currentEelDescriptor) {
currentEelDescriptor = descriptor
reloadJdks(descriptor)
}
}
@RequiresEdt
private fun reloadJdks(key: EelDescriptor?) {
for (item in jdkItems) {
removeItem(item)
}
jdkItems.clear()
model.removeAll()
registered.clear()
registered.addAll(computeRegisteredSdks(key))
for (registeredItem in registered) {
jdkItems.add(registeredItem)
addItem(registeredItem)
}
model.add(computeRegisteredSdks(key))
model.add(computeHelperJdks(registered))
val helperJdks = computeHelperJdks(registered)
for (helperItem in helperJdks) {
jdkItems.add(helperItem)
addItem(helperItem)
}
selectedIndex = 0
downloadOpenJdkJob?.cancel()
isLoadingDownloadItem = false
@@ -412,10 +398,9 @@ class ProjectWizardJdkComboBox(
downloadOpenJdkJob = coroutineScope.getDownloadOpenJdkIntent(this)
}
detectedJDKs.clear()
isLoadingExistingJdks = false
addExistingJdkJob?.cancel()
addExistingJdkJob = coroutineScope.findExistingJdks(projectLocation, this)
addExistingJdkJob = coroutineScope.findExistingJdks(currentEelDescriptor, this)
}
@RequiresEdt
@@ -426,7 +411,6 @@ class ProjectWizardJdkComboBox(
}
insertItemAt(task, lastRegisteredJdkIndex)
jdkItems.add(lastRegisteredJdkIndex, task)
if (selectedItem is NoJdk) selectedIndex = 1
isLoadingDownloadItem = false
}
@@ -436,8 +420,6 @@ class ProjectWizardJdkComboBox(
detected
.filter { d -> registered.none { r -> FileUtil.pathsEqual(d.home, r.jdk.homePath) } }
.forEach {
detectedJDKs.add(it)
jdkItems.add(it)
addItem(it)
}
if ((selectedItem is NoJdk || selectedItem is DownloadJdk) && detected.any()) {
@@ -468,7 +450,11 @@ class ProjectWizardJdkComboBox(
}
fun filterItems(sdkFilter: (Sdk) -> Boolean) {
registered.removeAll { !sdkFilter(it.jdk) }
registered.forEach {
if (!sdkFilter(it.jdk)) {
removeItem(it)
}
}
for (i in itemCount - 1 downTo 0) {
val item = getItemAt(i)
if (item is ExistingJdk && !sdkFilter(item.jdk)) {
@@ -496,7 +482,9 @@ class ProjectWizardJdkComboBox(
}
sink[JDK_DOWNLOADER_EXT] = object : JdkDownloaderDialogHostExtension {
override fun getEel(): EelApi {
return Path.of(projectLocation).getEelApiBlocking()
return runBlockingMaybeCancellable {
currentEelDescriptor?.upgrade() ?: localEel
}
}
}
}
@@ -504,10 +492,15 @@ class ProjectWizardJdkComboBox(
private fun selectAndAddJdk(combo: ProjectWizardJdkComboBox) {
combo.popup?.hide()
SdkConfigurationUtil.selectSdkHome(JavaSdk.getInstance(), null, Path(combo.projectLocation)) { path: String ->
val path = if (Registry.`is`("java.home.finder.use.eel")) {
EelPathUtils.getHomePath(combo.currentEelDescriptor ?: LocalEelDescriptor)
}
else {
Path.of(System.getProperty("user.home"))
}
SdkConfigurationUtil.selectSdkHome(JavaSdk.getInstance(), null, path) { path: String ->
val version = JavaSdk.getInstance().getVersionString(path)
val comboItem = DetectedJdk(version ?: "", path)
combo.detectedJDKs.add(comboItem)
combo.addItem(comboItem)
combo.selectedItem = comboItem
}
@@ -542,7 +535,7 @@ private fun computeHelperJdks(registered: List<ExistingJdk>): List<ProjectWizard
// Suggests to download OpenJDK if nothing else is available in the IDE
private fun CoroutineScope.getDownloadOpenJdkIntent(comboBox: ProjectWizardJdkComboBox): Job = launch {
val eel = if (Registry.`is`("java.home.finder.use.eel")) {
comboBox.projectLocation.takeIf { it.isNotEmpty() }?.let { Path(it).getEelApi() } ?: localEel
comboBox.currentEelDescriptor?.upgrade() ?: localEel
}
else {
null
@@ -579,10 +572,10 @@ private fun CoroutineScope.getDownloadOpenJdkIntent(comboBox: ProjectWizardJdkCo
// Searches for JDKs located on the computer, but not added to the IDE
private fun CoroutineScope.findExistingJdks(location: String?, comboBox: ProjectWizardJdkComboBox): Job = launch {
private fun CoroutineScope.findExistingJdks(descriptor: EelDescriptor?, comboBox: ProjectWizardJdkComboBox): Job = launch {
val javaSdk = JavaSdk.getInstance()
val homePaths = if (Registry.`is`("java.home.finder.use.eel")) {
val eel = location?.takeIf { it.isNotEmpty() }?.let { Path(it).getEelApi() } ?: localEel
val eel = descriptor?.upgrade() ?: localEel
JavaHomeFinder.suggestHomePaths(eel, false)
}
else {
@@ -4,6 +4,7 @@ package com.intellij.platform.eel.provider.utils
import com.intellij.openapi.progress.runBlockingMaybeCancellable
import com.intellij.openapi.project.Project
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.EelDescriptor
import com.intellij.platform.eel.EelPlatform
import com.intellij.platform.eel.LocalEelApi
import com.intellij.platform.eel.fs.EelFileSystemApi
@@ -12,6 +13,7 @@ import com.intellij.platform.eel.provider.getEelApi
import com.intellij.platform.eel.provider.getEelApiBlocking
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import kotlinx.coroutines.runBlocking
import org.jetbrains.annotations.ApiStatus
import java.io.IOException
import java.net.URI
@@ -126,6 +128,16 @@ object EelPathUtils {
return targetPath
}
fun getHomePath(descriptor: EelDescriptor): Path {
// usually eel is already initialized to this moment
@Suppress("RAW_RUN_BLOCKING")
val api = runBlocking {
descriptor.upgrade()
}
val someEelPath = api.fs.user.home
return api.mapper.toNioPath(someEelPath)
}
@RequiresBackgroundThread
fun walkingTransfer(sourceRoot: Path, targetRoot: Path, removeSource: Boolean, copyAttributes: Boolean) {
val sourceStack = ArrayDeque<Path>()