[gradle][IDEA-383981] ExternalSystemJdkUtil.resolveJdkName should resolve project jdk lazily

GitOrigin-RevId: 16961c6a19854ac5672f66180cc49b08cc394303
This commit is contained in:
Alexander.Glukhov
2026-02-10 18:08:52 +01:00
committed by intellij-monorepo-bot
parent 7906446900
commit 1f089af212
7 changed files with 35 additions and 14 deletions

View File

@@ -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

View File

@@ -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<Sdk> 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();
}

View File

@@ -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

View File

@@ -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))

View File

@@ -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() {

View File

@@ -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
}

View File

@@ -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
}