From c54d223ea0b14f180b1793fa539419854c2e014f Mon Sep 17 00:00:00 2001 From: Ian Manske Date: Tue, 7 May 2024 05:41:47 +0000 Subject: [PATCH] Fix list spread syntax highlighting (#12793) # Description I broke syntax highlighting for list spreads in #12529. This should fix #12792 :sweat_smile:. I just copied the code for highlighting record spreads. --- crates/nu-parser/src/flatten.rs | 23 +++++++++++++++++------ crates/nu-parser/src/parser.rs | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/crates/nu-parser/src/flatten.rs b/crates/nu-parser/src/flatten.rs index 3484c53d0f..e70a48e9f1 100644 --- a/crates/nu-parser/src/flatten.rs +++ b/crates/nu-parser/src/flatten.rs @@ -385,12 +385,23 @@ fn flatten_expression_into( output.extend(flattened); } - ListItem::Spread(_, expr) => { - output.push(( - Span::new(expr.span.start, expr.span.start + 3), - FlatShape::Operator, - )); - flatten_expression_into(working_set, expr, output); + ListItem::Spread(op_span, expr) => { + if op_span.start > last_end { + output.push((Span::new(last_end, op_span.start), FlatShape::List)); + } + output.push((*op_span, FlatShape::Operator)); + last_end = op_span.end; + + let flattened_inner = flatten_expression(working_set, expr); + if let Some(first) = flattened_inner.first() { + if first.0.start > last_end { + output.push((Span::new(last_end, first.0.start), FlatShape::List)); + } + } + if let Some(last) = flattened_inner.last() { + last_end = last.0.end; + } + output.extend(flattened_inner); } } } diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 19b84c1e75..7dfccf7bad 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -3895,7 +3895,7 @@ pub fn parse_list_expression( Type::List(elem_ty) => *elem_ty.clone(), _ => Type::Any, }; - let span = Span::new(curr_span.start, spread_arg.span.end); + let span = Span::new(curr_span.start, curr_span.start + 3); (ListItem::Spread(span, spread_arg), elem_ty) } else { let arg = parse_multispan_value(