3 pub(super) const PATTERN_FIRST: TokenSet = token_set_union![
4 token_set![REF_KW, MUT_KW, L_PAREN, L_BRACK, AMP, UNDERSCORE],
5 expressions::LITERAL_FIRST,
9 pub(super) fn pattern(p: &mut Parser) {
10 pattern_r(p, PAT_RECOVERY_SET)
13 pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
14 if let Some(lhs) = atom_pat(p, recovery_set) {
17 // match 92 { 0 ... 100 => () }
20 let m = lhs.precede(p);
22 atom_pat(p, recovery_set);
23 m.complete(p, RANGE_PAT);
28 const PAT_RECOVERY_SET: TokenSet =
29 token_set![LET_KW, IF_KW, WHILE_KW, LOOP_KW, MATCH_KW, R_PAREN, COMMA];
31 fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
36 || (la0 == IDENT && !(la1 == COLONCOLON || la1 == L_PAREN || la1 == L_CURLY))
38 return Some(bind_pat(p, true));
40 if paths::is_path_start(p) {
41 return Some(path_pat(p));
44 // test literal_pattern
52 match expressions::literal(p) {
53 Some(m) => return Some(m),
58 UNDERSCORE => placeholder_pat(p),
60 L_PAREN => tuple_pat(p),
61 L_BRACK => slice_pat(p),
63 p.err_recover("expected pattern", recovery_set);
74 // let Bar { .. } = ();
77 fn path_pat(p: &mut Parser) -> CompletedMarker {
78 assert!(paths::is_path_start(p));
81 let kind = match p.current() {
95 // test tuple_pat_fields
100 // let S(_, .. , x) = ();
102 fn tuple_pat_fields(p: &mut Parser) {
103 assert!(p.at(L_PAREN));
105 pat_list(p, R_PAREN);
109 // test field_pat_list
112 // let S { f, ref mut g } = ();
113 // let S { h: _, ..} = ();
114 // let S { h: _, } = ();
116 fn field_pat_list(p: &mut Parser) {
117 assert!(p.at(L_CURLY));
120 while !p.at(EOF) && !p.at(R_CURLY) {
123 IDENT if p.nth(1) == COLON => {
128 L_CURLY => error_block(p, "expected ident"),
138 m.complete(p, FIELD_PAT_LIST);
141 // test placeholder_pat
142 // fn main() { let _ = (); }
143 fn placeholder_pat(p: &mut Parser) -> CompletedMarker {
144 assert!(p.at(UNDERSCORE));
147 m.complete(p, PLACEHOLDER_PAT)
155 fn ref_pat(p: &mut Parser) -> CompletedMarker {
161 m.complete(p, REF_PAT)
166 // let (a, b, ..) = ();
168 fn tuple_pat(p: &mut Parser) -> CompletedMarker {
169 assert!(p.at(L_PAREN));
172 m.complete(p, TUPLE_PAT)
177 // let [a, b, ..] = [];
179 fn slice_pat(p: &mut Parser) -> CompletedMarker {
180 assert!(p.at(L_BRACK));
183 pat_list(p, R_BRACK);
185 m.complete(p, SLICE_PAT)
188 fn pat_list(p: &mut Parser, ket: SyntaxKind) {
189 while !p.at(EOF) && !p.at(ket) {
193 if !p.at_ts(PATTERN_FIRST) {
194 p.error("expected a pattern");
211 // let ref mut d = ();
213 // let ref mut f @ g @ _ = ();
215 fn bind_pat(p: &mut Parser, with_at: bool) -> CompletedMarker {
220 if with_at && p.eat(AT) {
223 m.complete(p, BIND_PAT)