From 0df939cb754198258346059f1661415b2ecb3e25 Mon Sep 17 00:00:00 2001 From: Marek Vospel <73162071+marekvospel@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:52:58 +0100 Subject: [PATCH] fix(oxc_laguage_server): code actions if report range overlap request (#8902) Requesting code actions in neovim's normal mode doesn't return any code action, as the report range isn't fully contained in the requested range - which is only the current cursor position. Filtering based on overlap seems to be done by most relevant language servers (based on my tesing) - such as `rust-analyzer` or `ts_ls`. `eslint` filters code actions based on intercepted lines. --- crates/oxc_language_server/src/main.rs | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/crates/oxc_language_server/src/main.rs b/crates/oxc_language_server/src/main.rs index 1b098648b12c7..fc89cd2ea6b06 100644 --- a/crates/oxc_language_server/src/main.rs +++ b/crates/oxc_language_server/src/main.rs @@ -259,13 +259,10 @@ impl LanguageServer for Backend { let mut code_actions_vec: Vec = vec![]; if let Some(value) = self.diagnostics_report_map.get(&uri.to_string()) { - let reports = value - .iter() - .filter(|r| { - r.diagnostic.range == params.range - || range_includes(params.range, r.diagnostic.range) - }) - .collect::>(); + let reports = value.iter().filter(|r| { + r.diagnostic.range == params.range + || range_overlaps(params.range, r.diagnostic.range) + }); for report in reports { // TODO: Would be better if we had exact rule name from the diagnostic instead of having to parse it. let mut rule_name: Option = None; @@ -579,12 +576,6 @@ async fn main() { Server::new(stdin, stdout, socket).serve(service).await; } -fn range_includes(range: Range, to_include: Range) -> bool { - if range.start >= to_include.start { - return false; - } - if range.end <= to_include.end { - return false; - } - true +fn range_overlaps(a: Range, b: Range) -> bool { + a.start <= b.end && a.end >= b.start }