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, ) }