aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_parser/src/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_parser/src/parser.rs')
-rw-r--r--crates/ra_parser/src/parser.rs25
1 files changed, 12 insertions, 13 deletions
diff --git a/crates/ra_parser/src/parser.rs b/crates/ra_parser/src/parser.rs
index 8eff930db..4434dfb09 100644
--- a/crates/ra_parser/src/parser.rs
+++ b/crates/ra_parser/src/parser.rs
@@ -6,6 +6,7 @@ use crate::{
6 SyntaxKind::{self, ERROR, EOF, TOMBSTONE}, 6 SyntaxKind::{self, ERROR, EOF, TOMBSTONE},
7 TokenSource, ParseError, TokenSet, 7 TokenSource, ParseError, TokenSet,
8 event::Event, 8 event::Event,
9 T
9}; 10};
10 11
11/// `Parser` struct provides the low-level API for 12/// `Parser` struct provides the low-level API for
@@ -155,10 +156,10 @@ impl<'t> Parser<'t> {
155 156
156 // Handle parser composites 157 // Handle parser composites
157 match kind { 158 match kind {
158 DOTDOTDOT | DOTDOTEQ => { 159 T![...] | T![..=] => {
159 self.bump_compound(kind, 3); 160 self.bump_compound(kind, 3);
160 } 161 }
161 DOTDOT | COLONCOLON | EQEQ | FAT_ARROW | NEQ | THIN_ARROW => { 162 T![..] | T![::] | T![==] | T![=>] | T![!=] | T![->] => {
162 self.bump_compound(kind, 2); 163 self.bump_compound(kind, 2);
163 } 164 }
164 _ => { 165 _ => {
@@ -223,7 +224,7 @@ impl<'t> Parser<'t> {
223 224
224 /// Create an error node and consume the next token. 225 /// Create an error node and consume the next token.
225 pub(crate) fn err_recover(&mut self, message: &str, recovery: TokenSet) { 226 pub(crate) fn err_recover(&mut self, message: &str, recovery: TokenSet) {
226 if self.at(SyntaxKind::L_CURLY) || self.at(SyntaxKind::R_CURLY) || self.at_ts(recovery) { 227 if self.at(T!['{']) || self.at(T!['}']) || self.at_ts(recovery) {
227 self.error(message); 228 self.error(message);
228 } else { 229 } else {
229 let m = self.start(); 230 let m = self.start();
@@ -253,19 +254,17 @@ impl<'t> Parser<'t> {
253 let jn2 = self.token_source.is_token_joint_to_next(self.token_pos + n + 1); 254 let jn2 = self.token_source.is_token_joint_to_next(self.token_pos + n + 1);
254 let la3 = self.token_source.token_kind(self.token_pos + n + 2); 255 let la3 = self.token_source.token_kind(self.token_pos + n + 2);
255 256
256 use SyntaxKind::*;
257
258 match kind { 257 match kind {
259 DOT if jn1 && la2 == DOT && jn2 && la3 == DOT => Some((DOTDOTDOT, 3)), 258 T![.] if jn1 && la2 == T![.] && jn2 && la3 == T![.] => Some((T![...], 3)),
260 DOT if jn1 && la2 == DOT && la3 == EQ => Some((DOTDOTEQ, 3)), 259 T![.] if jn1 && la2 == T![.] && la3 == T![=] => Some((T![..=], 3)),
261 DOT if jn1 && la2 == DOT => Some((DOTDOT, 2)), 260 T![.] if jn1 && la2 == T![.] => Some((T![..], 2)),
262 261
263 COLON if jn1 && la2 == COLON => Some((COLONCOLON, 2)), 262 T![:] if jn1 && la2 == T![:] => Some((T![::], 2)),
264 EQ if jn1 && la2 == EQ => Some((EQEQ, 2)), 263 T![=] if jn1 && la2 == T![=] => Some((T![==], 2)),
265 EQ if jn1 && la2 == R_ANGLE => Some((FAT_ARROW, 2)), 264 T![=] if jn1 && la2 == T![>] => Some((T![=>], 2)),
266 265
267 EXCL if la2 == EQ => Some((NEQ, 2)), 266 T![!] if la2 == T![=] => Some((T![!=], 2)),
268 MINUS if la2 == R_ANGLE => Some((THIN_ARROW, 2)), 267 T![-] if la2 == T![>] => Some((T![->], 2)),
269 _ => None, 268 _ => None,
270 } 269 }
271 } 270 }