(&mut self)
| 2074 | } |
| 2075 | |
| 2076 | fn match_pattern(&mut self) -> Option<MatchPattern<'gc>> { |
| 2077 | if self.match_token(TokenType::Underscore) { |
| 2078 | return Some(MatchPattern::Wildcard); |
| 2079 | } |
| 2080 | |
| 2081 | let current_kind = self.current.kind; |
| 2082 | let start = match current_kind { |
| 2083 | TokenType::Number | TokenType::True | TokenType::False => { |
| 2084 | self.advance(); |
| 2085 | if self.check(TokenType::DotDot) || self.check(TokenType::DotDotEq) { |
| 2086 | let start_expr = Box::new(Expr::Literal { |
| 2087 | value: self.parse_literal(self.previous)?, |
| 2088 | line: self.previous.line, |
| 2089 | }); |
| 2090 | self.parse_range_pattern(Some(start_expr))? |
| 2091 | } else { |
| 2092 | MatchPattern::Literal { |
| 2093 | value: self.parse_literal(self.previous)?, |
| 2094 | } |
| 2095 | } |
| 2096 | } |
| 2097 | TokenType::String => { |
| 2098 | self.advance(); |
| 2099 | MatchPattern::Literal { |
| 2100 | value: Literal::String(self.ctx.intern(self.previous.lexeme.as_bytes())), |
| 2101 | } |
| 2102 | } |
| 2103 | TokenType::Identifier | TokenType::Error => { |
| 2104 | if self.peek_next().map(|t| t.kind) == Some(TokenType::ColonColon) { |
| 2105 | self.advance(); // consume enum name |
| 2106 | let enum_name = self.previous; |
| 2107 | self.advance(); // consume :: |
| 2108 | self.consume(TokenType::Identifier, "Expect variant name after '::'."); |
| 2109 | let variant = self.previous; |
| 2110 | |
| 2111 | MatchPattern::EnumVariant { enum_name, variant } |
| 2112 | } else { |
| 2113 | // Variable binding pattern |
| 2114 | self.advance(); // consume identifier |
| 2115 | MatchPattern::Variable { |
| 2116 | name: self.previous, |
| 2117 | } |
| 2118 | } |
| 2119 | } |
| 2120 | TokenType::DotDot | TokenType::DotDotEq => self.parse_range_pattern(None)?, |
| 2121 | _ => { |
| 2122 | self.error_at_current("Expected match pattern."); |
| 2123 | return None; |
| 2124 | } |
| 2125 | }; |
| 2126 | Some(start) |
| 2127 | } |
| 2128 | |
| 2129 | fn parse_range_pattern(&mut self, start: Option<Box<Expr<'gc>>>) -> Option<MatchPattern<'gc>> { |
| 2130 | let inclusive = self.match_token(TokenType::DotDotEq); |
no test coverage detected