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
This commit is contained in:
zc he 2025-01-27 23:13:48 +08:00 committed by GitHub
parent 5ca4e903c8
commit b53271b86a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 8 deletions

View File

@ -444,13 +444,6 @@ fn find_id_in_expr(
) -> Option<Vec<(Id, Span)>> {
// 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;

View File

@ -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

View File

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