(
state: &mut ParserState<'heap, '_, '_>,
)
| 73 | } |
| 74 | |
| 75 | fn parse_list<'heap>( |
| 76 | state: &mut ParserState<'heap, '_, '_>, |
| 77 | ) -> Result<ListExpr<'heap>, ParserDiagnostic> { |
| 78 | // We do not use the `expected` of advance here, so that we're able to give the user a better |
| 79 | // error message. |
| 80 | let token = state |
| 81 | .advance(Expected::hint(SyntaxKind::LBracket)) |
| 82 | .change_category(From::from)?; |
| 83 | |
| 84 | if token.kind.syntax() != SyntaxKind::LBracket { |
| 85 | return Err( |
| 86 | list_expected_array(state.insert_range(token.span), token.kind.syntax()) |
| 87 | .map_category(From::from), |
| 88 | ); |
| 89 | } |
| 90 | |
| 91 | let mut elements = Vec::new(); |
| 92 | |
| 93 | let range = visit_array(state, token, |state| { |
| 94 | let expr = parse_expr(state)?; |
| 95 | |
| 96 | let element = ListElement { |
| 97 | id: NodeId::PLACEHOLDER, |
| 98 | span: expr.span, |
| 99 | value: Box::new_in(expr, state.heap()), |
| 100 | }; |
| 101 | |
| 102 | elements.push(element); |
| 103 | |
| 104 | Ok(()) |
| 105 | })?; |
| 106 | |
| 107 | Ok(ListExpr { |
| 108 | id: NodeId::PLACEHOLDER, |
| 109 | span: state.insert_range(range), |
| 110 | elements: elements.into_iter().collect_in(state.heap()), |
| 111 | r#type: None, |
| 112 | }) |
| 113 | } |
| 114 | |
| 115 | #[cfg(test)] |
| 116 | mod tests { |
no test coverage detected