diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-01-13 17:21:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-01-13 17:21:39 +0100 |
| commit | b1200a29b07dddb9c05b99166c7b676b6f2dbb4b (patch) | |
| tree | 1bc3034952a0cc72a6f85a2d8218da8a7734e9cb /src/libsyntax_ext | |
| parent | d45bef9db62a0797c6dd3b06e21db1a0acd8cfe7 (diff) | |
| parent | e80a93040ffbbb7eb8013f1dcd3b594ce8a631cd (diff) | |
| download | rust-b1200a29b07dddb9c05b99166c7b676b6f2dbb4b.tar.gz rust-b1200a29b07dddb9c05b99166c7b676b6f2dbb4b.zip | |
Rollup merge of #57004 - nnethercote:TS-change-Stream, r=petrochenkov
Make `TokenStream` less recursive. `TokenStream` is currently recursive in *two* ways: - the `TokenTree` variant contains a `ThinTokenStream`, which can contain a `TokenStream`; - the `TokenStream` variant contains a `Vec<TokenStream>`. The latter is not necessary and causes significant complexity. This commit replaces it with the simpler `Vec<(TokenTree, IsJoint)>`. This reduces complexity significantly. In particular, `StreamCursor` is eliminated, and `Cursor` becomes much simpler, consisting now of just a `TokenStream` and an index. The commit also removes the `Extend` impl for `TokenStream`, because it is only used in tests. (The commit also removes those tests.) Overall, the commit reduces the number of lines of code by almost 200.
Diffstat (limited to 'src/libsyntax_ext')
| -rw-r--r-- | src/libsyntax_ext/proc_macro_server.rs | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/libsyntax_ext/proc_macro_server.rs b/src/libsyntax_ext/proc_macro_server.rs index afd86a4f746..158cbc791ef 100644 --- a/src/libsyntax_ext/proc_macro_server.rs +++ b/src/libsyntax_ext/proc_macro_server.rs @@ -11,7 +11,7 @@ use syntax::ast; use syntax::ext::base::ExtCtxt; use syntax::parse::lexer::comments; use syntax::parse::{self, token, ParseSess}; -use syntax::tokenstream::{self, DelimSpan, IsJoint::*, TokenStream}; +use syntax::tokenstream::{self, DelimSpan, IsJoint::*, TokenStream, TreeAndJoint}; use syntax_pos::hygiene::{SyntaxContext, Transparency}; use syntax_pos::symbol::{keywords, Symbol}; use syntax_pos::{BytePos, FileName, MultiSpan, Pos, SourceFile, Span}; @@ -46,13 +46,14 @@ impl ToInternal<token::DelimToken> for Delimiter { } } -impl FromInternal<(TokenStream, &'_ ParseSess, &'_ mut Vec<Self>)> +impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec<Self>)> for TokenTree<Group, Punct, Ident, Literal> { - fn from_internal((stream, sess, stack): (TokenStream, &ParseSess, &mut Vec<Self>)) -> Self { + fn from_internal(((tree, is_joint), sess, stack): (TreeAndJoint, &ParseSess, &mut Vec<Self>)) + -> Self { use syntax::parse::token::*; - let (tree, joint) = stream.as_tree(); + let joint = is_joint == Joint; let (span, token) = match tree { tokenstream::TokenTree::Delimited(span, delim, tts) => { let delimiter = Delimiter::from_internal(delim); @@ -450,7 +451,7 @@ impl server::TokenStreamIter for Rustc<'_> { ) -> Option<TokenTree<Self::Group, Self::Punct, Self::Ident, Self::Literal>> { loop { let tree = iter.stack.pop().or_else(|| { - let next = iter.cursor.next_as_stream()?; + let next = iter.cursor.next_with_joint()?; Some(TokenTree::from_internal((next, self.sess, &mut iter.stack))) })?; // HACK: The condition "dummy span + group with empty delimiter" represents an AST @@ -461,7 +462,7 @@ impl server::TokenStreamIter for Rustc<'_> { // and not doing the roundtrip through AST. if let TokenTree::Group(ref group) = tree { if group.delimiter == Delimiter::None && group.span.entire().is_dummy() { - iter.cursor.insert(group.stream.clone()); + iter.cursor.append(group.stream.clone()); continue; } } |
