From 94a10d1f74561460b763049b718223d4ff815283 Mon Sep 17 00:00:00 2001 From: Fredy Wijaya Date: Tue, 19 May 2026 19:12:00 -0500 Subject: [PATCH] refactor: replace potential panics with safe error handling --- src/java.rs | 10 +++++++--- src/jdtls.rs | 17 ++++++++++------- src/util.rs | 6 ++---- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/java.rs b/src/java.rs index 98394f7..29061d5 100644 --- a/src/java.rs +++ b/src/java.rs @@ -386,7 +386,9 @@ impl Extension for Java { .unwrap_or_else(|| json!({})); // Inject workspaceFolders default if not already set by the user - let options_obj = options.as_object_mut().unwrap(); + let options_obj = options + .as_object_mut() + .ok_or_else(|| "initialization_options is not a JSON object".to_string())?; if !options_obj.contains_key("workspaceFolders") { let uri = util::path_to_file_uri(&worktree.root_path()); options_obj.insert("workspaceFolders".to_string(), json!([uri])); @@ -396,7 +398,9 @@ impl Extension for Java { let caps = options_obj .entry("extendedClientCapabilities") .or_insert_with(|| json!({})); - let caps_obj = caps.as_object_mut().unwrap(); + let caps_obj = caps + .as_object_mut() + .ok_or_else(|| "extendedClientCapabilities is not a JSON object".to_string())?; caps_obj .entry("classFileContentsSupport") .or_insert(json!(true)); @@ -575,7 +579,7 @@ impl Extension for Java { SymbolKind::Class => "class ", SymbolKind::Interface => "interface ", SymbolKind::Enum => "enum ", - _ => unreachable!(), + _ => return None, }; let code = format!("{keyword}{name} {{}}"); diff --git a/src/jdtls.rs b/src/jdtls.rs index 5bcb23a..d4442cf 100644 --- a/src/jdtls.rs +++ b/src/jdtls.rs @@ -106,8 +106,9 @@ pub fn build_jdtls_launch_args( && let (Some(min_bytes), Some(max_bytes)) = (parse_memory_value(&min), parse_memory_value(max_val)) && min_bytes > max_bytes + && let Some(max) = max.as_mut() { - std::mem::swap(&mut min, max.as_mut().unwrap()); + std::mem::swap(&mut min, max); } args.push(format!("-Xms{min}")); if let Some(max_val) = max { @@ -214,10 +215,11 @@ pub fn try_to_fetch_and_install_latest_jdtls( .map_or_else( |_| { second_last - .as_ref() .ok_or(JDTLS_VERION_ERROR.to_string()) - .and_then(|fallback| download_jdtls_milestone(fallback)) - .map(|milestone| (second_last.unwrap(), milestone.trim_end().to_string())) + .and_then(|fallback| { + download_jdtls_milestone(&fallback) + .map(|milestone| (fallback, milestone.trim_end().to_string())) + }) }, |milestone| Ok((last, milestone.trim_end().to_string())), )?; @@ -396,11 +398,12 @@ fn get_jdtls_data_path(worktree: &Worktree) -> zed::Result { .find(|(k, _)| k == "APPDATA") .map(|(_, v)| PathBuf::from(v)), } + .map(Ok) .unwrap_or_else(|| { current_dir() - .expect("should be able to get extension workdir") - .join("caches") - }); + .map_err(|err| format!("Failed to get current directory: {err}")) + .map(|path| path.join("caches")) + })?; // caches are unique per worktree-root-path let cache_key = worktree.root_path(); diff --git a/src/util.rs b/src/util.rs index 88926b9..53841ba 100644 --- a/src/util.rs +++ b/src/util.rs @@ -275,12 +275,10 @@ pub fn get_latest_versions_from_tag(repo: &str) -> zed::Result<(String, Option