From e584f044d7213715d63cc14587d35a8552b515cd Mon Sep 17 00:00:00 2001 From: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com> Date: Mon, 2 Nov 2026 20:21:21 +0800 Subject: [PATCH] fix(java): say when a configured JDK path no longer exists (#764) A JDK path chosen in settings that was later removed (a version manager replacing it on upgrade) was reported as "is not a JDK home", which reads as a wrong folder layout. A missing path is now reported as missing, with how to fix it; the project JDK's log warning uses the same wording. Fixes #741 --- crates/ide-sdk/src/apply.rs | 19 ++++++++++++++----- crates/ide-sdk/src/tests.rs | 7 ++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/crates/ide-sdk/src/apply.rs b/crates/ide-sdk/src/apply.rs index 8f60fa5d3..8c484f9fd 100644 --- a/crates/ide-sdk/src/apply.rs +++ b/crates/ide-sdk/src/apply.rs @@ -78,7 +78,7 @@ fn jdk_setting(root: &Path, value: &str) -> Option Option { match jdk_setting(root, &s.languages.java.jdk) { - Some(jdk) => jdk.inspect_err(|p| tracing::warn!("project JDK {} is not a JDK home", p.display())).ok(), + Some(jdk) => jdk.inspect_err(|p| tracing::warn!("project JDK {}", not_a_jdk(p))).ok(), None => pinned::pinned_install(root, Tool::Java).and_then(|(dir, _)| pinned::jdk_in_install(&dir)), } } @@ -92,10 +92,19 @@ pub fn jdtls_jdk(root: &Path, s: &Settings) -> Result, Err(crate::java::server_jdk_incomplete_message(&jdk, jdk.major.max(crate::java::JDTLS_MIN_JAVA))) } Some(Ok(jdk)) => Ok(Some(jdk)), - Some(Err(p)) => Err(format!( - "The language server JDK {} is not a JDK home (Settings › Languages & Frameworks › Java).", - p.display() - )), + Some(Err(p)) => { + Err(format!("The language server JDK {} (Settings › Languages & Frameworks › Java).", not_a_jdk(&p))) + } + } +} + +/// Why the configured JDK path `p` is not used: gone (e.g. a version manager removed +/// it on upgrade) or not a JDK. +fn not_a_jdk(p: &Path) -> String { + if p.exists() { + format!("{} is not a JDK home", p.display()) + } else { + format!("{} does not exist; choose another JDK or clear the setting to detect one", p.display()) } } diff --git a/crates/ide-sdk/src/tests.rs b/crates/ide-sdk/src/tests.rs index 5f3ed5a0a..dd4628b2e 100644 --- a/crates/ide-sdk/src/tests.rs +++ b/crates/ide-sdk/src/tests.rs @@ -319,8 +319,13 @@ fn jdtls_jdk_setting() { .unwrap(); assert!(jdtls_jdk(tmp.path(), &s).unwrap_err().contains("full JDK")); // A chosen path that is not a JDK is an error, not a silent fallback. - s.languages.java.jdtls_jdk = "missing".into(); + std::fs::create_dir(tmp.path().join("not-a-jdk")).unwrap(); + s.languages.java.jdtls_jdk = "not-a-jdk".into(); assert!(jdtls_jdk(tmp.path(), &s).unwrap_err().contains("is not a JDK home")); + // A JDK removed after it was chosen (a version manager upgraded it) says so. + s.languages.java.jdtls_jdk = "jdk17.0.1".into(); + let err = jdtls_jdk(tmp.path(), &s).unwrap_err(); + assert!(err.contains("jdk17.0.1 does not exist") && err.contains("Languages & Frameworks › Java"), "{err}"); } #[test]