MCPcopy Create free account
hub / github.com/aiscriptdev/aiscript / match_pattern

Method match_pattern

aiscript-vm/src/parser/mod.rs:2076–2127  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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);

Callers 1

match_armMethod · 0.80

Calls 10

match_tokenMethod · 0.80
advanceMethod · 0.80
checkMethod · 0.80
parse_literalMethod · 0.80
parse_range_patternMethod · 0.80
as_bytesMethod · 0.80
peek_nextMethod · 0.80
error_at_currentMethod · 0.80
internMethod · 0.45
consumeMethod · 0.45

Tested by

no test coverage detected