From b53271b86aa30150fd6b6e1e755cb964f8fa9050 Mon Sep 17 00:00:00 2001 From: zc he Date: Mon, 27 Jan 2025 23:13:48 +0800 Subject: [PATCH] fix(parser): span of keyword expression (#14928) # Description This PR fixes #14816 , so that expression-contains-position check won't need special treatment for keyword expressions. e.g. ```nushell overlay use foo as bar # |_______ cursor here if true { } else { } # |_______ here ``` as mentioned in #14924 # User-Facing Changes # Tests + Formatting # After Submitting --- crates/nu-lsp/src/ast.rs | 7 ------- crates/nu-lsp/src/goto.rs | 18 ++++++++++++++++++ crates/nu-parser/src/parser.rs | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/crates/nu-lsp/src/ast.rs b/crates/nu-lsp/src/ast.rs index 21c6ddc71d724..33e88d2d639af 100644 --- a/crates/nu-lsp/src/ast.rs +++ b/crates/nu-lsp/src/ast.rs @@ -444,13 +444,6 @@ fn find_id_in_expr( ) -> Option> { // skip the entire expression if the location is not in it if !expr.span.contains(*location) { - // TODO: the span of Keyword does not include its subsidiary expression - // resort to `expr_flat_map` if location found in its expr - if let Expr::Keyword(kw) = &expr.expr { - if kw.expr.span.contains(*location) { - return None; - } - } return Some(Vec::new()); } let span = expr.span; diff --git a/crates/nu-lsp/src/goto.rs b/crates/nu-lsp/src/goto.rs index ef1bcb3101536..1c761e4f82724 100644 --- a/crates/nu-lsp/src/goto.rs +++ b/crates/nu-lsp/src/goto.rs @@ -475,6 +475,24 @@ mod tests { }) ); + let resp = send_goto_definition_request(&client_connection, script.clone(), 1, 25); + let result = if let Message::Response(response) = resp { + response.result + } else { + panic!() + }; + + assert_json_include!( + actual: result, + expected: serde_json::json!({ + "uri": script.to_string().replace("use_module", "module"), + "range": { + "start": { "line": 0, "character": 0 }, + "end": { "line": 3 } + } + }) + ); + let resp = send_goto_definition_request(&client_connection, script.clone(), 2, 30); let result = if let Message::Response(response) = resp { response.result diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index ceb1b3d129e7c..8744469f5d9bc 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -919,7 +919,7 @@ pub fn parse_multispan_value( Expression::new( working_set, Expr::Keyword(Box::new(keyword.clone())), - arg_span, + keyword.span.merge(keyword.expr.span), keyword.expr.ty, ) }