Skip to content

Commit 0df939c

Browse files
authored
fix(oxc_laguage_server): code actions if report range overlap request (oxc-project#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.
1 parent 2d06260 commit 0df939c

File tree

1 file changed

+6
-15
lines changed
  • crates/oxc_language_server/src

1 file changed

+6
-15
lines changed

crates/oxc_language_server/src/main.rs

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,10 @@ impl LanguageServer for Backend {
259259

260260
let mut code_actions_vec: Vec<CodeActionOrCommand> = vec![];
261261
if let Some(value) = self.diagnostics_report_map.get(&uri.to_string()) {
262-
let reports = value
263-
.iter()
264-
.filter(|r| {
265-
r.diagnostic.range == params.range
266-
|| range_includes(params.range, r.diagnostic.range)
267-
})
268-
.collect::<Vec<_>>();
262+
let reports = value.iter().filter(|r| {
263+
r.diagnostic.range == params.range
264+
|| range_overlaps(params.range, r.diagnostic.range)
265+
});
269266
for report in reports {
270267
// TODO: Would be better if we had exact rule name from the diagnostic instead of having to parse it.
271268
let mut rule_name: Option<String> = None;
@@ -579,12 +576,6 @@ async fn main() {
579576
Server::new(stdin, stdout, socket).serve(service).await;
580577
}
581578

582-
fn range_includes(range: Range, to_include: Range) -> bool {
583-
if range.start >= to_include.start {
584-
return false;
585-
}
586-
if range.end <= to_include.end {
587-
return false;
588-
}
589-
true
579+
fn range_overlaps(a: Range, b: Range) -> bool {
580+
a.start <= b.end && a.end >= b.start
590581
}

0 commit comments

Comments
 (0)