Skip to content

Commit 16d20a9

Browse files
committed
fix(jdtls): Preserve configured artifact paths
Custom Lombok and debugger paths were redundantly joined with the extension working directory, producing malformed paths. Resolve only extension-managed artifacts against the extension directory and pass user-provided paths through unchanged. Preserve the existing path behavior for JDTLS, Gradle LS, and JDK installations. Add regression coverage for managed and custom debugger bundle paths.
1 parent a7206bd commit 16d20a9

3 files changed

Lines changed: 71 additions & 30 deletions

File tree

‎src/debugger.rs‎

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ const JAVA_DEBUG_PLUGIN_FORK_URL: &str = "https://github.com/zed-industries/java
6868
const MAVEN_METADATA_URL: &str = "https://repo1.maven.org/maven2/com/microsoft/java/com.microsoft.java.debug.plugin/maven-metadata.xml";
6969

7070
fn find_latest_local_debugger() -> Option<PathBuf> {
71-
let prefix = PathBuf::from(DEBUGGER_INSTALL_PATH);
71+
let prefix = get_curr_dir().ok()?.join(DEBUGGER_INSTALL_PATH);
7272
fs::read_dir(&prefix)
7373
.map(|entries| {
7474
entries
@@ -101,11 +101,13 @@ impl Debugger {
101101
&mut self,
102102
_language_server_id: &LanguageServerId,
103103
) -> zed::Result<PathBuf> {
104-
let prefix = "debugger";
104+
let prefix = get_curr_dir()
105+
.map_err(|err| format!("Failed to get extension directory for debugger: {err}"))?
106+
.join(DEBUGGER_INSTALL_PATH);
105107
let artifact = "com.microsoft.java.debug.plugin";
106108
let latest_version = "0.53.2";
107109
let jar_name = format!("{artifact}-{latest_version}.jar");
108-
let jar_path = PathBuf::from(prefix).join(&jar_name);
110+
let jar_path = prefix.join(&jar_name);
109111

110112
if let Some(path) = &self.plugin_path
111113
&& fs::metadata(path).is_ok_and(|stat| stat.is_file())
@@ -119,8 +121,8 @@ impl Debugger {
119121
return Ok(jar_path);
120122
}
121123

122-
create_path_if_not_exists(prefix)
123-
.map_err(|err| format!("Failed to create debugger directory '{prefix}': {err}"))?;
124+
create_path_if_not_exists(&prefix)
125+
.map_err(|err| format!("Failed to create debugger directory '{prefix:?}': {err}"))?;
124126

125127
download_file(
126128
JAVA_DEBUG_PLUGIN_FORK_URL,
@@ -146,7 +148,9 @@ impl Debugger {
146148
&mut self,
147149
language_server_id: &LanguageServerId,
148150
) -> zed::Result<PathBuf> {
149-
let prefix = "debugger";
151+
let prefix = get_curr_dir()
152+
.map_err(|err| format!("Failed to get extension directory for debugger: {err}"))?
153+
.join(DEBUGGER_INSTALL_PATH);
150154

151155
if let Some(path) = &self.plugin_path
152156
&& fs::metadata(path).is_ok_and(|stat| stat.is_file())
@@ -168,13 +172,13 @@ impl Debugger {
168172

169173
// Maven loves to be down, trying to resolve it gracefully
170174
if let Err(err) = &res {
171-
if !fs::metadata(prefix).is_ok_and(|stat| stat.is_dir()) {
175+
if !fs::metadata(&prefix).is_ok_and(|stat| stat.is_dir()) {
172176
return Err(err.to_owned());
173177
}
174178

175179
println!("Could not fetch debugger: {err}\nFalling back to local version.");
176180

177-
let exists = fs::read_dir(prefix)
181+
let exists = fs::read_dir(&prefix)
178182
.ok()
179183
.and_then(|dir| dir.last().map(|v| v.ok()))
180184
.flatten();
@@ -192,7 +196,7 @@ impl Debugger {
192196
return Err(err.to_owned());
193197
}
194198

195-
let jar_path = PathBuf::from(prefix).join(file.file_name());
199+
let jar_path = prefix.join(file.file_name());
196200
self.plugin_path = Some(jar_path.clone());
197201

198202
return Ok(jar_path);
@@ -217,18 +221,18 @@ impl Debugger {
217221
let artifact = "com.microsoft.java.debug.plugin";
218222

219223
let jar_name = format!("{artifact}-{latest_version}.jar");
220-
let jar_path = PathBuf::from(prefix).join(&jar_name);
224+
let jar_path = prefix.join(&jar_name);
221225

222226
if !fs::metadata(&jar_path).is_ok_and(|stat| stat.is_file()) {
223-
if let Err(err) = fs::remove_dir_all(prefix) {
227+
if let Err(err) = fs::remove_dir_all(&prefix) {
224228
println!("failed to remove directory entry: {err}");
225229
}
226230

227231
set_language_server_installation_status(
228232
language_server_id,
229233
&LanguageServerInstallationStatus::Downloading,
230234
);
231-
create_path_if_not_exists(prefix)?;
235+
create_path_if_not_exists(&prefix)?;
232236

233237
let url = format!(
234238
"https://repo1.maven.org/maven2/com/microsoft/java/{artifact}/{latest_version}/{jar_name}"
@@ -376,16 +380,10 @@ impl Debugger {
376380
&self,
377381
initialization_options: Option<Value>,
378382
) -> zed::Result<Value> {
379-
let current_dir = get_curr_dir()
380-
.map_err(|err| format!("Failed to get current directory for debugger plugin: {err}"))?;
381-
382383
let canonical_path = Value::String(
383-
current_dir
384-
.join(
385-
self.plugin_path
386-
.as_ref()
387-
.ok_or("Debugger plugin path not set")?,
388-
)
384+
self.plugin_path
385+
.as_ref()
386+
.ok_or("Debugger plugin path not set")?
389387
.to_string_lossy()
390388
.to_string(),
391389
);
@@ -449,7 +447,7 @@ impl Downloadable for Debugger {
449447
worktree: &Worktree,
450448
) -> zed::Result<PathBuf> {
451449
if let Some(jar_path) = self.user_configured_path(configuration, worktree) {
452-
let path = PathBuf::from(&jar_path);
450+
let path = PathBuf::from(jar_path);
453451
self.plugin_path = Some(path.clone());
454452
return Ok(path);
455453
}
@@ -477,3 +475,44 @@ impl Downloadable for Debugger {
477475
get_java_debug_jar(configuration, worktree)
478476
}
479477
}
478+
479+
#[cfg(test)]
480+
mod tests {
481+
use super::*;
482+
483+
fn injected_bundle(plugin_path: PathBuf) -> String {
484+
let debugger = Debugger {
485+
plugin_path: Some(plugin_path),
486+
};
487+
debugger
488+
.inject_plugin_into_options(None)
489+
.unwrap()
490+
.pointer("/bundles/0")
491+
.and_then(Value::as_str)
492+
.unwrap()
493+
.to_string()
494+
}
495+
496+
#[test]
497+
fn managed_debugger_bundle_is_resolved_against_extension_directory() {
498+
let plugin_path = get_curr_dir().unwrap().join("debugger/java-debug.jar");
499+
500+
assert_eq!(
501+
injected_bundle(plugin_path),
502+
get_curr_dir()
503+
.unwrap()
504+
.join("debugger/java-debug.jar")
505+
.to_string_lossy()
506+
);
507+
}
508+
509+
#[test]
510+
fn external_debugger_bundle_is_preserved() {
511+
let plugin_path = PathBuf::from(r"C:\tools\java-debug.jar");
512+
513+
assert_eq!(
514+
injected_bundle(plugin_path),
515+
r"C:\tools\java-debug.jar".to_string()
516+
);
517+
}
518+
}

‎src/jdtls.rs‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ impl Downloadable for Lombok {
158158
const INSTALL_PATH: &'static str = LOMBOK_INSTALL_PATH;
159159

160160
fn find_local(&self) -> Option<PathBuf> {
161-
let prefix = PathBuf::from(LOMBOK_INSTALL_PATH);
161+
let prefix = get_curr_dir().ok()?.join(LOMBOK_INSTALL_PATH);
162162
read_dir(&prefix)
163163
.map(|entries| {
164164
entries
@@ -195,17 +195,19 @@ impl Downloadable for Lombok {
195195
language_server_id: &LanguageServerId,
196196
_worktree: &Worktree,
197197
) -> zed::Result<PathBuf> {
198-
let prefix = LOMBOK_INSTALL_PATH;
198+
let prefix = get_curr_dir()
199+
.map_err(|err| format!("Failed to get extension directory for Lombok: {err}"))?
200+
.join(LOMBOK_INSTALL_PATH);
199201
let jar_name = format!("lombok-{version}.jar");
200-
let jar_path = Path::new(prefix).join(&jar_name);
202+
let jar_path = prefix.join(&jar_name);
201203

202204
if !metadata(&jar_path).is_ok_and(|stat| stat.is_file()) {
203205
set_language_server_installation_status(
204206
language_server_id,
205207
&LanguageServerInstallationStatus::Downloading,
206208
);
207-
create_path_if_not_exists(prefix)
208-
.map_err(|err| format!("Failed to create Lombok directory '{prefix}': {err}"))?;
209+
create_path_if_not_exists(&prefix)
210+
.map_err(|err| format!("Failed to create Lombok directory '{prefix:?}': {err}"))?;
209211
let download_url = format!("https://projectlombok.org/downloads/{jar_name}");
210212
download_file(
211213
&download_url,
@@ -215,7 +217,7 @@ impl Downloadable for Lombok {
215217
DownloadedFileType::Uncompressed,
216218
)
217219
.map_err(|err| format!("Failed to download Lombok from {download_url}: {err}"))?;
218-
let _ = remove_all_files_except(prefix, jar_name.as_str());
220+
let _ = remove_all_files_except(&prefix, jar_name.as_str());
219221
}
220222

221223
self.cached_path = Some(jar_path.clone());

‎src/jdtls_server.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ impl LanguageServer for JdtlsServer {
7474
.lombok
7575
.get_or_download(language_server_id, &configuration, worktree)
7676
.map_err(|err| format!("Failed to get Lombok jar path: {err}"))?;
77-
let canonical_lombok_jar_path = path_to_string(current_dir.join(lombok_jar_path))
77+
let lombok_jar_path = path_to_string(lombok_jar_path)
7878
.map_err(|err| format!("Failed to convert Lombok jar path to string: {err}"))?;
7979

80-
Some(format!("-javaagent:{canonical_lombok_jar_path}"))
80+
Some(format!("-javaagent:{lombok_jar_path}"))
8181
} else {
8282
None
8383
};

0 commit comments

Comments
 (0)