···633 // Give a better error when there is two consecutive spreads
634 // like `[..wibble, ..wabble, woo]`. However, if there's other
635 // elements after the tail of the list
000636 if let Some((second_start, second_end)) = self.maybe_one(&Token::DotDot) {
637 let _second_tail = self.parse_expression();
638- if elements_after_tail.is_none() {
00000639 return parse_error(
640 ParseErrorType::ListSpreadWithAnotherSpread {
641 first_spread_location: SrcSpan { start, end },
···633 // Give a better error when there is two consecutive spreads
634 // like `[..wibble, ..wabble, woo]`. However, if there's other
635 // elements after the tail of the list
636+ println!("{:#?}", self.tok0);
637+ println!("{:#?}", elements_after_tail);
638+639 if let Some((second_start, second_end)) = self.maybe_one(&Token::DotDot) {
640 let _second_tail = self.parse_expression();
641+642+ if elements_after_tail.is_none()
643+ || elements_after_tail
644+ .as_ref()
645+ .is_some_and(|vec| vec.is_empty())
646+ {
647 return parse_error(
648 ParseErrorType::ListSpreadWithAnotherSpread {
649 first_spread_location: SrcSpan { start, end },
···1+---
2+source: compiler-core/src/parse/tests.rs
3+expression: "\npub fn main() -> Nil {\n let xs = [1, 2, 3]\n let ys = [5, 6, 7]\n [1, ..xs, ..ys]\n}\n"
4+---
5+----- SOURCE CODE
6+7+pub fn main() -> Nil {
8+ let xs = [1, 2, 3]
9+ let ys = [5, 6, 7]
10+ [1, ..xs, ..ys]
11+}
12+13+14+----- ERROR
15+error: Syntax error
16+ ┌─ /src/parse/error.gleam:5:13
17+ │
18+5 │ [1, ..xs, ..ys]
19+ │ -- ^^ I wasn't expecting a second spread here
20+ │ │
21+ │ You're using a spread here
22+23+Lists are immutable and singly-linked, so to join two or more lists
24+all the elements of the lists would need to be copied into a new list.
25+This would be slow, so there is no built-in syntax for it.