diff options
author | Aleksey Kladov <[email protected]> | 2018-09-12 09:26:52 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-09-12 09:26:52 +0100 |
commit | b6f8037a6f8fbcb4f127e1d2b518279650b1f5ea (patch) | |
tree | bf4908576fa700f2cc432cd72839c8d2eed55191 /crates/libsyntax2/src | |
parent | ccc75675b618f2ae59c77ee20064e613e74492bb (diff) |
don't get stuck in slice patterns
Diffstat (limited to 'crates/libsyntax2/src')
-rw-r--r-- | crates/libsyntax2/src/grammar/patterns.rs | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/crates/libsyntax2/src/grammar/patterns.rs b/crates/libsyntax2/src/grammar/patterns.rs index 29a55cb46..420bae7a7 100644 --- a/crates/libsyntax2/src/grammar/patterns.rs +++ b/crates/libsyntax2/src/grammar/patterns.rs | |||
@@ -102,21 +102,7 @@ fn path_pat(p: &mut Parser) -> CompletedMarker { | |||
102 | fn tuple_pat_fields(p: &mut Parser) { | 102 | fn tuple_pat_fields(p: &mut Parser) { |
103 | assert!(p.at(L_PAREN)); | 103 | assert!(p.at(L_PAREN)); |
104 | p.bump(); | 104 | p.bump(); |
105 | while !p.at(EOF) && !p.at(R_PAREN) { | 105 | pat_list(p, R_PAREN); |
106 | match p.current() { | ||
107 | DOTDOT => p.bump(), | ||
108 | _ => { | ||
109 | if !p.at_ts(PATTERN_FIRST) { | ||
110 | p.error("expected a pattern"); | ||
111 | break; | ||
112 | } | ||
113 | pattern(p) | ||
114 | } | ||
115 | } | ||
116 | if !p.at(R_PAREN) { | ||
117 | p.expect(COMMA); | ||
118 | } | ||
119 | } | ||
120 | p.expect(R_PAREN); | 106 | p.expect(R_PAREN); |
121 | } | 107 | } |
122 | 108 | ||
@@ -194,18 +180,27 @@ fn slice_pat(p: &mut Parser) -> CompletedMarker { | |||
194 | assert!(p.at(L_BRACK)); | 180 | assert!(p.at(L_BRACK)); |
195 | let m = p.start(); | 181 | let m = p.start(); |
196 | p.bump(); | 182 | p.bump(); |
197 | while !p.at(EOF) && !p.at(R_BRACK) { | 183 | pat_list(p, R_BRACK); |
184 | p.expect(R_BRACK); | ||
185 | m.complete(p, SLICE_PAT) | ||
186 | } | ||
187 | |||
188 | fn pat_list(p: &mut Parser, ket: SyntaxKind) { | ||
189 | while !p.at(EOF) && !p.at(ket) { | ||
198 | match p.current() { | 190 | match p.current() { |
199 | DOTDOT => p.bump(), | 191 | DOTDOT => p.bump(), |
200 | _ => pattern(p), | 192 | _ => { |
193 | if !p.at_ts(PATTERN_FIRST) { | ||
194 | p.error("expected a pattern"); | ||
195 | break; | ||
196 | } | ||
197 | pattern(p) | ||
198 | }, | ||
201 | } | 199 | } |
202 | if !p.at(R_BRACK) { | 200 | if !p.at(ket) { |
203 | p.expect(COMMA); | 201 | p.expect(COMMA); |
204 | } | 202 | } |
205 | } | 203 | } |
206 | p.expect(R_BRACK); | ||
207 | |||
208 | m.complete(p, SLICE_PAT) | ||
209 | } | 204 | } |
210 | 205 | ||
211 | // test bind_pat | 206 | // test bind_pat |