about summary refs log tree commit diff
path: root/compiler/rustc_parse/src
diff options
context:
space:
mode:
authorAaron Hill <aa1ronham@gmail.com>2021-04-12 17:26:26 -0400
committerAaron Hill <aa1ronham@gmail.com>2021-04-12 17:26:26 -0400
commitc6d67f83170adf586abc93adedc8048e325611e1 (patch)
tree131c90037a8b13386b1eef9b43e7ceef3d1ec5d9 /compiler/rustc_parse/src
parenteb7b1a150f4433241510610b25a6bca295514fb0 (diff)
downloadrust-c6d67f83170adf586abc93adedc8048e325611e1.tar.gz
rust-c6d67f83170adf586abc93adedc8048e325611e1.zip
Add fast path when None delimiters are not involved
Diffstat (limited to 'compiler/rustc_parse/src')
-rw-r--r--compiler/rustc_parse/src/parser/mod.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs
index 0aa4fc4a139..ed95a5661b1 100644
--- a/compiler/rustc_parse/src/parser/mod.rs
+++ b/compiler/rustc_parse/src/parser/mod.rs
@@ -929,6 +929,25 @@ impl<'a> Parser<'a> {
             return looker(&self.token);
         }
 
+        let frame = &self.token_cursor.frame;
+        if frame.delim != DelimToken::NoDelim {
+            let all_normal = (0..dist).all(|i| {
+                let token = frame.tree_cursor.look_ahead(i);
+                !matches!(token, Some(TokenTree::Delimited(_, DelimToken::NoDelim, _)))
+            });
+            if all_normal {
+                return match frame.tree_cursor.look_ahead(dist - 1) {
+                    Some(tree) => match tree {
+                        TokenTree::Token(token) => looker(token),
+                        TokenTree::Delimited(dspan, delim, _) => {
+                            looker(&Token::new(token::OpenDelim(*delim), dspan.open))
+                        }
+                    },
+                    None => looker(&Token::new(token::CloseDelim(frame.delim), frame.span.close)),
+                };
+            }
+        }
+
         let mut cursor = self.token_cursor.clone();
         let mut i = 0;
         let mut token = Token::dummy();