From 1f089af21293e83df75f434e8a8d0295b166f1ca Mon Sep 17 00:00:00 2001 From: "Alexander.Glukhov" Date: Tue, 10 Feb 2026 18:08:52 +0100 Subject: [PATCH] [gradle][IDEA-383981] `ExternalSystemJdkUtil.resolveJdkName` should resolve project jdk lazily GitOrigin-RevId: 16961c6a19854ac5672f66180cc49b08cc394303 --- platform/external-system-impl/api-dump.txt | 1 + .../execution/ExternalSystemJdkUtil.java | 18 +++++++++++++++++- .../ExternalSystemUsagesCollector.kt | 2 +- .../execution/ExternalSystemJdkUtilTest.kt | 12 ++++++------ .../project/JavaGradleProjectResolver.java | 12 ++++++++---- .../importing/AbstractKotlinDslSyncListener.kt | 2 +- .../quickfixes/InvalidTargetReleaseQuickFix.kt | 2 +- 7 files changed, 35 insertions(+), 14 deletions(-) diff --git a/platform/external-system-impl/api-dump.txt b/platform/external-system-impl/api-dump.txt index 76928888fba3..3e20e9332d3d 100644 --- a/platform/external-system-impl/api-dump.txt +++ b/platform/external-system-impl/api-dump.txt @@ -219,6 +219,7 @@ f:com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil - s:isValidJdk(com.intellij.openapi.projectRoots.Sdk):Z - s:isValidJdk(java.lang.String):Z - s:resolveDependentJdk(com.intellij.openapi.projectRoots.Sdk):com.intellij.openapi.projectRoots.Sdk +- s:resolveJdkName(com.intellij.openapi.project.Project,java.lang.String):com.intellij.openapi.projectRoots.Sdk - s:resolveJdkName(com.intellij.openapi.projectRoots.Sdk,java.lang.String):com.intellij.openapi.projectRoots.Sdk - s:suggestJdkHomePaths():java.util.Collection - s:suggestJdkHomePaths(com.intellij.openapi.project.Project):java.util.Collection 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 6a7603ee0d8a..0e7798187d9b 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 @@ -40,6 +40,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Stream; import static com.intellij.openapi.util.Pair.pair; @@ -51,17 +52,32 @@ public final class ExternalSystemJdkUtil { public static final String USE_PROJECT_JDK = "#USE_PROJECT_JDK"; public static final String USE_JAVA_HOME = "#JAVA_HOME"; + /** + * @deprecated Use {@link ExternalSystemJdkUtil#resolveJdkName(Project, String)} instead. + */ + @Deprecated @Contract("_, null -> null") public static @Nullable Sdk getJdk(@Nullable Project project, @Nullable String jdkName) throws ExternalSystemJdkException { - return resolveJdkName(getProjectJdk(project), jdkName); + return resolveJdkName(project, jdkName); + } + + @Contract("_, null -> null") + public static @Nullable Sdk resolveJdkName(@Nullable Project project, @Nullable String jdkName) throws ExternalSystemJdkException { + return matchJdkName(jdkName, () -> getProjectJdk(project)); } @Contract("_, null -> null") public static @Nullable Sdk resolveJdkName(@Nullable Sdk projectSdk, @Nullable String jdkName) throws ExternalSystemJdkException { + return matchJdkName(jdkName, () -> projectSdk); + } + + @Contract("null, _ -> null") + private static @Nullable Sdk matchJdkName(@Nullable String jdkName, @NotNull Supplier projectSdkSupplier) { return switch (jdkName) { case null -> null; case USE_INTERNAL_JAVA -> getInternalJdk(); case USE_PROJECT_JDK -> { + Sdk projectSdk = projectSdkSupplier.get(); if (projectSdk == null) { throw new ProjectJdkNotFoundException(); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemUsagesCollector.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemUsagesCollector.kt index ad09e351ec07..a672fefcd553 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemUsagesCollector.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemUsagesCollector.kt @@ -31,7 +31,7 @@ object ExternalSystemUsageFields { fun getJreVersion(project: Project, jreName: String?): String { val jdk = try { - ExternalSystemJdkUtil.getJdk(project, jreName) + ExternalSystemJdkUtil.resolveJdkName(project, jreName) } catch (ignored: Throwable) { return UNKNOWN diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtilTest.kt b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtilTest.kt index 097cfb29c271..66774a16f7f4 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtilTest.kt +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/execution/ExternalSystemJdkUtilTest.kt @@ -69,7 +69,7 @@ class ExternalSystemJdkUtilTest : UsefulTestCase() { fun testGetJdk() { assertThat(getJdk(project, null)).isNull() - assertThat(resolveJdkName(null, USE_INTERNAL_JAVA)?.homePath) + assertThat(resolveJdkName(null as Sdk?, USE_INTERNAL_JAVA)?.homePath) .isEqualTo(StringUtil.trimEnd(FileUtil.toSystemIndependentName(SystemProperties.getJavaHome()), "/jre")) val javaHomeEnv = EnvironmentUtil.getValue("JAVA_HOME")?.let { FileUtil.toSystemIndependentName(it) } @@ -101,22 +101,22 @@ class ExternalSystemJdkUtilTest : UsefulTestCase() { } private fun doTestResolveJdkName() { - assertThat(resolveJdkName(null, null)).isNull() + assertThat(resolveJdkName(null as Sdk?, null)).isNull() - assertThat(resolveJdkName(null, USE_INTERNAL_JAVA)?.homePath) + assertThat(resolveJdkName(null as Sdk?, USE_INTERNAL_JAVA)?.homePath) .isEqualTo(StringUtil.trimEnd(FileUtil.toSystemIndependentName(SystemProperties.getJavaHome()), "/jre")) val javaHomeEnv = EnvironmentUtil.getValue("JAVA_HOME")?.let { FileUtil.toSystemIndependentName(it) } if (javaHomeEnv.isNullOrBlank()) { - assertThrows(UndefinedJavaHomeException::class.java) { resolveJdkName(null, USE_JAVA_HOME) } + assertThrows(UndefinedJavaHomeException::class.java) { resolveJdkName(null as Sdk?, USE_JAVA_HOME) } } else { - assertThat(resolveJdkName(null, USE_JAVA_HOME)?.homePath) + assertThat(resolveJdkName(null as Sdk?, USE_JAVA_HOME)?.homePath) .isEqualTo(javaHomeEnv) } assertThrows(ProjectJdkNotFoundException::class.java) { - resolveJdkName(null, USE_PROJECT_JDK) + resolveJdkName(null as Sdk?, USE_PROJECT_JDK) } val sdk: Sdk = mock(Sdk::class.java) assertThat(resolveJdkName(sdk, USE_PROJECT_JDK)) diff --git a/plugins/gradle/java/src/service/project/JavaGradleProjectResolver.java b/plugins/gradle/java/src/service/project/JavaGradleProjectResolver.java index abfab27dcba4..227212965a67 100644 --- a/plugins/gradle/java/src/service/project/JavaGradleProjectResolver.java +++ b/plugins/gradle/java/src/service/project/JavaGradleProjectResolver.java @@ -489,7 +489,7 @@ public final class JavaGradleProjectResolver extends AbstractProjectResolverExte private @Nullable Sdk lookupGradleJvmByVersion(@NotNull JavaVersion sdkVersion) { var sdk = lookupGradleJvm(); if (sdk == null) return null; - if (ExternalSystemJdkUtil.matchJavaVersion(sdkVersion, sdk.getVersionString())) { + if (matchJavaVersion(sdkVersion, sdk.getVersionString())) { return sdk; } return null; @@ -497,10 +497,14 @@ public final class JavaGradleProjectResolver extends AbstractProjectResolverExte private @Nullable Sdk lookupGradleJvm() { var projectSettings = getProjectSettings(); - if (projectSettings == null) return null; + if (projectSettings == null) { + return null; + } var gradleJvm = projectSettings.getGradleJvm(); - if (gradleJvm == null) return null; - return ExternalSystemJdkUtil.getJdk(resolverCtx.getProject(), gradleJvm); + if (gradleJvm == null) { + return null; + } + return ExternalSystemJdkUtil.resolveJdkName(resolverCtx.getProject(), gradleJvm); } private @Nullable GradleProjectSettings getProjectSettings() { diff --git a/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/importing/AbstractKotlinDslSyncListener.kt b/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/importing/AbstractKotlinDslSyncListener.kt index 589d2cc0f782..7c87d9844c1d 100644 --- a/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/importing/AbstractKotlinDslSyncListener.kt +++ b/plugins/kotlin/gradle/scripting/kotlin.gradle.scripting.shared/src/org/jetbrains/kotlin/gradle/scripting/shared/importing/AbstractKotlinDslSyncListener.kt @@ -60,7 +60,7 @@ abstract class AbstractKotlinDslSyncListener : ExternalSystemTaskNotificationLis // roll back to specified in GRADLE_JVM if for some reason sync.javaHome points to corrupted SDK val gradleJvm = GradleSettings.getInstance(project).getLinkedProjectSettings(sync.workingDir)?.gradleJvm try { - ExternalSystemJdkUtil.getJdk(project, gradleJvm)?.homePath + ExternalSystemJdkUtil.resolveJdkName(project, gradleJvm)?.homePath } catch (_: Exception) { null } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/InvalidTargetReleaseQuickFix.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/InvalidTargetReleaseQuickFix.kt index 839ae94a7f6b..8b71a09bfa3a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/InvalidTargetReleaseQuickFix.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/InvalidTargetReleaseQuickFix.kt @@ -73,7 +73,7 @@ class InvalidTargetReleaseQuickFix : MavenSpyLoggedEventParser { if (jreName == null) { return ProjectRootManager.getInstance(project).projectSdkName } - return ExternalSystemJdkUtil.resolveJdkName(ProjectRootManager.getInstance(project).projectSdk, jreName)?.name + return ExternalSystemJdkUtil.resolveJdkName(project, jreName)?.name }