Actually just three programming languages in a trenchcoat
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at string-repr-callable 114 lines 3.5 kB view raw
1use super::*; 2use crate::{Parser, Spanned}; 3use source_span::Span; 4use trilogy_scanner::{Token, TokenType::*}; 5 6#[derive(Clone, Debug, PrettyPrintSExpr)] 7pub struct SetLiteral { 8 pub open_bracket_pipe: Token, 9 pub elements: Vec<SetElement>, 10 pub close_bracket_pipe: Token, 11} 12 13impl Spanned for SetLiteral { 14 fn span(&self) -> Span { 15 self.open_bracket_pipe 16 .span 17 .union(self.close_bracket_pipe.span) 18 } 19} 20 21impl SetLiteral { 22 pub(crate) fn new_empty(open_bracket_pipe: Token, close_bracket_pipe: Token) -> Self { 23 Self { 24 open_bracket_pipe, 25 elements: vec![], 26 close_bracket_pipe, 27 } 28 } 29 30 pub(crate) fn parse_rest( 31 parser: &mut Parser, 32 open_bracket_pipe: Token, 33 first: SetElement, 34 ) -> SyntaxResult<Result<Self, SetPattern>> { 35 let mut elements = vec![first]; 36 if let Ok(close_bracket_pipe) = parser.expect(CBrackPipe) { 37 return Ok(Ok(Self { 38 open_bracket_pipe, 39 elements, 40 close_bracket_pipe, 41 })); 42 }; 43 let close_bracket_pipe = loop { 44 parser.expect(OpComma).map_err(|token| { 45 parser.expected(token, "expected `|]` to end or `,` to continue set literal") 46 })?; 47 if let Ok(close_bracket_pipe) = parser.expect(CBrackPipe) { 48 break close_bracket_pipe; 49 }; 50 match SetElement::parse(parser)? { 51 Ok(element) => elements.push(element), 52 Err(next) => { 53 return Ok(Err(SetPattern::parse_from_expression( 54 parser, 55 open_bracket_pipe, 56 elements, 57 next, 58 )?)); 59 } 60 } 61 if let Ok(token) = parser.check(KwFor) { 62 let error = SyntaxError::new( 63 token.span, 64 "only one element may precede the `for` keyword in a comprehension", 65 ); 66 parser.error(error.clone()); 67 return Err(error); 68 } 69 if let Ok(close_bracket_pipe) = parser.expect(CBrackPipe) { 70 break close_bracket_pipe; 71 }; 72 }; 73 Ok(Ok(Self { 74 open_bracket_pipe, 75 elements, 76 close_bracket_pipe, 77 })) 78 } 79 80 pub fn start_token(&self) -> &Token { 81 &self.open_bracket_pipe 82 } 83 84 pub fn end_token(&self) -> &Token { 85 &self.close_bracket_pipe 86 } 87} 88 89#[derive(Clone, Debug, Spanned, PrettyPrintSExpr)] 90pub enum SetElement { 91 Element(Expression), 92 Spread(Token, Expression), 93} 94 95impl SetElement { 96 pub(crate) fn parse( 97 parser: &mut Parser, 98 ) -> SyntaxResult<Result<Self, (Option<Token>, Pattern)>> { 99 let spread = parser.expect(OpDotDot).ok(); 100 if let Some(spread) = &spread 101 && let Ok(dot) = parser.expect(OpDot) 102 { 103 parser.error(ErrorKind::TripleDot { dot: dot.span }.at(spread.span)); 104 } 105 let expression = Expression::parse_parameter_list(parser)?; 106 match expression { 107 Ok(expression) => match spread { 108 None => Ok(Ok(Self::Element(expression))), 109 Some(spread) => Ok(Ok(Self::Spread(spread, expression))), 110 }, 111 Err(pattern) => Ok(Err((spread, pattern))), 112 } 113 } 114}