diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtil.java index 2fc001d04407..4936632eb96c 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtil.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtil.java @@ -82,10 +82,7 @@ public class ExternalSystemJdkUtil { String javaHome = EnvironmentUtil.getEnvironmentMap().get("JAVA_HOME"); if (StringUtil.isEmptyOrSpaces(javaHome)) throw new UndefinedJavaHomeException(); if (!isValidJdk(javaHome)) throw new InvalidJavaHomeException(javaHome); - - SimpleJavaSdkType sdkType = SimpleJavaSdkType.getInstance(); - String sdkName = sdkType.suggestSdkName(null, javaHome); - return sdkType.createJdk(sdkName, javaHome); + return ExternalSystemJdkProvider.getInstance().createJdk(null, javaHome); } @Nullable @@ -172,8 +169,7 @@ public class ExternalSystemJdkUtil { @Contract("null -> false") public static boolean isValidJdk(@Nullable Sdk jdk) { if (jdk == null) return false; - SdkType javaSdkType = getJavaSdkType(); - if (!javaSdkType.equals(jdk.getSdkType())) return false; + if (!(jdk.getSdkType() instanceof JavaSdkType)) return false; if (SdkDownloadTracker.getInstance().isDownloading(jdk)) return true; return isValidJdk(jdk.getHomePath()); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalSystemJdkComboBoxUtil.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalSystemJdkComboBoxUtil.kt index 1509cc30935e..ed574cbcb004 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalSystemJdkComboBoxUtil.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalSystemJdkComboBoxUtil.kt @@ -3,8 +3,10 @@ package com.intellij.openapi.externalSystem.service.ui +import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkException import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil -import com.intellij.openapi.externalSystem.service.execution.InvalidSdkException +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil import com.intellij.openapi.roots.ui.configuration.SdkComboBox import com.intellij.openapi.roots.ui.configuration.SdkListItem @@ -27,12 +29,22 @@ fun SdkComboBox.setSelectedJdkReference(jdkReference: String?) { private fun SdkComboBox.resolveSdkItem(selectedJdkReference: String): SdkListItem { try { - val selectedJdk = ExternalSystemJdkUtil.resolveJdkName(model.sdksModel.projectSdk, selectedJdkReference) - val selectedSdkItem = selectedJdk?.let { model.listModel.findSdkItem(selectedJdk) } - if (selectedSdkItem == null) return showInvalidSdkItem(selectedJdkReference) - return selectedSdkItem + val selectedJdk = ExternalSystemJdkUtil.resolveJdkName(null, selectedJdkReference) + if (selectedJdk == null) return showInvalidSdkItem(selectedJdkReference) + return findSdkItem(selectedJdk) ?: addAndGetSdkItem(selectedJdk) } - catch (ex: InvalidSdkException) { + catch (ex: ExternalSystemJdkException) { return showInvalidSdkItem(selectedJdkReference) } +} + +private fun SdkComboBox.addAndGetSdkItem(sdk: Sdk): SdkListItem { + SdkConfigurationUtil.addSdk(sdk) + model.sdksModel.addSdk(sdk) + reloadModel() + return findSdkItem(sdk) ?: showInvalidSdkItem(sdk.name) +} + +private fun SdkComboBox.findSdkItem(sdk: Sdk): SdkListItem? { + return model.listModel.findSdkItem(sdk) } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBoxBase.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBoxBase.java index 57e5a1ef78a5..10c35a2fae1e 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBoxBase.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBoxBase.java @@ -37,7 +37,7 @@ public abstract class SdkComboBoxBase extends ComboBox { } @NotNull - public SdkListItem showInvalidSdkItem(String name) { + public SdkListItem showInvalidSdkItem(@NotNull String name) { return myModel.showInvalidSdkItem(name); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java index 904456a04bb0..ea8707e4dcd6 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java @@ -166,7 +166,7 @@ public final class SdkListModelBuilder { } @NotNull - public SdkListItem showInvalidSdkItem(String name) { + public SdkListItem showInvalidSdkItem(@NotNull String name) { InvalidSdkItem invalidItem = new InvalidSdkItem(name); if (Objects.equals(myInvalidItem, invalidItem)) return myInvalidItem; myInvalidItem = invalidItem; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/open/GradleOpenProjectProvider.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/open/GradleOpenProjectProvider.kt index 3438709fe628..c1ab02ff0a6d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/open/GradleOpenProjectProvider.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/open/GradleOpenProjectProvider.kt @@ -20,7 +20,6 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemUtil import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.projectRoots.Sdk -import com.intellij.openapi.projectRoots.SimpleJavaSdkType import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.io.FileUtil @@ -126,10 +125,7 @@ internal class GradleOpenProjectProvider : AbstractOpenProjectProvider() { val javaHome = EnvironmentUtil.getEnvironmentMap()["JAVA_HOME"] ?: return null val jdk = GradleJdk.valueOf(javaHome) ?: return null if (!jdk.isSupported(gradleVersion)) return null - val simpleJavaSdkType = SimpleJavaSdkType.getInstance() - val sdkName = simpleJavaSdkType.suggestSdkName(null, javaHome) - simpleJavaSdkType.createJdk(sdkName, javaHome) - return ExternalSystemJdkUtil.USE_JAVA_HOME + return ExternalSystemJdkUtil.addJdk(javaHome).name } private fun SettingsContext.getProjectJdkReference(): String? { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java index 9e6c4de55611..894c097e2d39 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/IdeaGradleProjectSettingsControlBuilder.java @@ -609,9 +609,13 @@ public class IdeaGradleProjectSettingsControlBuilder implements GradleProjectSet return true; } - if (myGradleJdkComboBox != null && - !StringUtil.equals(getSelectedJdkReference(myGradleJdkComboBox), myInitialSettings.getGradleJvm())) { - return true; + if (myGradleJdkComboBox != null) { + if (!StringUtil.equals(getSelectedJdkReference(myGradleJdkComboBox), myInitialSettings.getGradleJvm())) { + return true; + } + if (myGradleJdkComboBox.getModel().getSdksModel().isModified()) { + return true; + } } if (myGradleHomePathField == null) return false;