MCPcopy Create free account
hub / github.com/astral-sh/ruff / parse_match_pattern

Method parse_match_pattern

crates/ruff_python_parser/src/parser/pattern.rs:90–137  ·  view source on GitHub ↗

Parses an `or_pattern` or an `as_pattern`. See:

(&mut self, allow_star_pattern: AllowStarPattern)

Source from the content-addressed store, hash-verified

88 ///
89 /// See: <https://docs.python.org/3/reference/compound_stmts.html#grammar-token-python-grammar-pattern>
90 fn parse_match_pattern(&mut self, allow_star_pattern: AllowStarPattern) -> Pattern {
91 let start = self.node_start();
92
93 // We don't yet know if it's an or pattern or an as pattern, so use whatever
94 // was passed in.
95 let mut lhs = self.parse_match_pattern_lhs(allow_star_pattern);
96
97 // Or pattern
98 if self.at(TokenKind::Vbar) {
99 // We know it's an `or` pattern now, so check for star pattern usage.
100 if lhs.is_match_star() {
101 self.add_error(ParseErrorType::InvalidStarPatternUsage, &lhs);
102 }
103
104 let mut patterns = vec![lhs];
105 let mut progress = ParserProgress::default();
106
107 while self.eat(TokenKind::Vbar) {
108 progress.assert_progressing(self);
109 let pattern = self.parse_match_pattern_lhs(AllowStarPattern::No);
110 patterns.push(pattern);
111 }
112
113 lhs = Pattern::MatchOr(ast::PatternMatchOr {
114 range: self.node_range(start),
115 patterns,
116 node_index: AtomicNodeIndex::NONE,
117 });
118 }
119
120 // As pattern
121 if self.eat(TokenKind::As) {
122 // We know it's an `as` pattern now, so check for star pattern usage.
123 if lhs.is_match_star() {
124 self.add_error(ParseErrorType::InvalidStarPatternUsage, &lhs);
125 }
126
127 let ident = self.parse_match_pattern_target();
128 lhs = Pattern::MatchAs(ast::PatternMatchAs {
129 range: self.node_range(start),
130 name: Some(ident),
131 pattern: Some(Box::new(lhs)),
132 node_index: AtomicNodeIndex::NONE,
133 });
134 }
135
136 lhs
137 }
138
139 /// Parses a pattern.
140 ///

Calls 11

node_startMethod · 0.80
is_match_starMethod · 0.80
assert_progressingMethod · 0.80
node_rangeMethod · 0.80
defaultFunction · 0.50
atMethod · 0.45
add_errorMethod · 0.45
eatMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected