Actually just three programming languages in a trenchcoat
1use super::*;
2use crate::{Parser, Spanned};
3use trilogy_scanner::{Token, TokenType::*};
4
5#[derive(Clone, Debug, PrettyPrintSExpr)]
6pub struct SetComprehension {
7 pub open_bracket_pipe: Token,
8 pub expression: Expression,
9 pub query: Query,
10 pub close_bracket_pipe: Token,
11}
12
13impl Spanned for SetComprehension {
14 fn span(&self) -> source_span::Span {
15 self.open_bracket_pipe
16 .span
17 .union(self.close_bracket_pipe.span)
18 }
19}
20
21impl SetComprehension {
22 pub(crate) fn parse_rest(
23 parser: &mut Parser,
24 open_bracket_pipe: Token,
25 expression: Expression,
26 ) -> SyntaxResult<Self> {
27 let query = Query::parse(parser)?;
28 let close_bracket_pipe = parser
29 .expect(CBrackPipe)
30 .map_err(|token| parser.expected(token, "expected `|]` to end set comprehension"))?;
31 Ok(Self {
32 open_bracket_pipe,
33 expression,
34 query,
35 close_bracket_pipe,
36 })
37 }
38}