Actually just three programming languages in a trenchcoat
1use super::*;
2use crate::{Parser, Spanned};
3use source_span::Span;
4use trilogy_scanner::{Token, TokenType::*};
5
6#[derive(Clone, Debug)]
7pub struct ParenthesizedQuery {
8 pub open_paren: Token,
9 pub query: Query,
10 pub close_paren: Token,
11 pub span: Span,
12}
13
14impl Spanned for ParenthesizedQuery {
15 fn span(&self) -> Span {
16 self.span
17 }
18}
19
20impl ParenthesizedQuery {
21 pub(crate) fn parse_or_pattern(parser: &mut Parser) -> SyntaxResult<Result<Self, Pattern>> {
22 let open_paren = parser
23 .expect(OParen)
24 .map_err(|token| parser.expected(token, "expected `(`"))?;
25 match Query::parse_or_pattern_parenthesized(parser)? {
26 Ok(query) => {
27 let close_paren = parser
28 .expect(CParen)
29 .map_err(|token| parser.expected(token, "expected `)`"))?;
30 Ok(Ok(Self {
31 span: open_paren.span.union(close_paren.span),
32 open_paren,
33 query,
34 close_paren,
35 }))
36 }
37 Err(pattern) => {
38 let parenthesized = Pattern::Parenthesized(Box::new(ParenthesizedPattern::finish(
39 parser, open_paren, pattern,
40 )?));
41 let pattern =
42 Pattern::parse_suffix(parser, pattern::Precedence::None, parenthesized)?;
43 Ok(Err(pattern))
44 }
45 }
46 }
47}