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) {
23 if p.at(DOTDOTDOT) || p.at(DOTDOTEQ) || p.at(DOTDOT) {
24 let m = lhs.precede(p);
26 atom_pat(p, recovery_set);
27 m.complete(p, RANGE_PAT);
32 const PAT_RECOVERY_SET: TokenSet =
33 token_set![LET_KW, IF_KW, WHILE_KW, LOOP_KW, MATCH_KW, R_PAREN, COMMA];
35 fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
40 || (la0 == IDENT && !(la1 == COLONCOLON || la1 == L_PAREN || la1 == L_CURLY))
42 return Some(bind_pat(p, true));
44 if paths::is_path_start(p) {
45 return Some(path_pat(p));
48 // test literal_pattern
56 if let Some(m) = expressions::literal(p) {
61 UNDERSCORE => placeholder_pat(p),
63 L_PAREN => tuple_pat(p),
64 L_BRACK => slice_pat(p),
66 p.err_recover("expected pattern", recovery_set);
77 // let Bar { .. } = ();
80 fn path_pat(p: &mut Parser) -> CompletedMarker {
81 assert!(paths::is_path_start(p));
84 let kind = match p.current() {
98 // test tuple_pat_fields
103 // let S(_, .. , x) = ();
105 fn tuple_pat_fields(p: &mut Parser) {
106 assert!(p.at(L_PAREN));
108 pat_list(p, R_PAREN);
112 // test field_pat_list
115 // let S { f, ref mut g } = ();
116 // let S { h: _, ..} = ();
117 // let S { h: _, } = ();
119 fn field_pat_list(p: &mut Parser) {
120 assert!(p.at(L_CURLY));
123 while !p.at(EOF) && !p.at(R_CURLY) {
126 IDENT if p.nth(1) == COLON => {
131 L_CURLY => error_block(p, "expected ident"),
141 m.complete(p, FIELD_PAT_LIST);
144 // test placeholder_pat
145 // fn main() { let _ = (); }
146 fn placeholder_pat(p: &mut Parser) -> CompletedMarker {
147 assert!(p.at(UNDERSCORE));
150 m.complete(p, PLACEHOLDER_PAT)
158 fn ref_pat(p: &mut Parser) -> CompletedMarker {
164 m.complete(p, REF_PAT)
169 // let (a, b, ..) = ();
171 fn tuple_pat(p: &mut Parser) -> CompletedMarker {
172 assert!(p.at(L_PAREN));
175 m.complete(p, TUPLE_PAT)
180 // let [a, b, ..] = [];
182 fn slice_pat(p: &mut Parser) -> CompletedMarker {
183 assert!(p.at(L_BRACK));
186 pat_list(p, R_BRACK);
188 m.complete(p, SLICE_PAT)
191 fn pat_list(p: &mut Parser, ket: SyntaxKind) {
192 while !p.at(EOF) && !p.at(ket) {
196 if !p.at_ts(PATTERN_FIRST) {
197 p.error("expected a pattern");
214 // let ref mut d = ();
216 // let ref mut f @ g @ _ = ();
218 fn bind_pat(p: &mut Parser, with_at: bool) -> CompletedMarker {
223 if with_at && p.eat(AT) {
226 m.complete(p, BIND_PAT)