Skip to content

Commit 914e1f4

Browse files
committed
glue tokens when building token stream
1 parent 8b932df commit 914e1f4

File tree

3 files changed

+34
-10
lines changed

3 files changed

+34
-10
lines changed

src/libsyntax/parse/lexer/tokentrees.rs

+32-8
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,29 @@ struct TokenTreesReader<'a> {
3939
impl<'a> TokenTreesReader<'a> {
4040
// Parse a stream of tokens into a list of `TokenTree`s, up to an `Eof`.
4141
fn parse_all_token_trees(&mut self) -> PResult<'a, TokenStream> {
42-
let mut tts = Vec::new();
42+
let mut buf = TokenStreamBuilder::default();
4343

4444
self.real_token();
4545
while self.token != token::Eof {
46-
tts.push(self.parse_token_tree()?);
46+
buf.push(self.parse_token_tree()?);
4747
}
4848

49-
Ok(TokenStream::new(tts))
49+
Ok(buf.into_token_stream())
5050
}
5151

5252
// Parse a stream of tokens into a list of `TokenTree`s, up to a `CloseDelim`.
5353
fn parse_token_trees_until_close_delim(&mut self) -> TokenStream {
54-
let mut tts = vec![];
54+
let mut buf = TokenStreamBuilder::default();
5555
loop {
5656
if let token::CloseDelim(..) = self.token.kind {
57-
return TokenStream::new(tts);
57+
return buf.into_token_stream();
5858
}
5959

6060
match self.parse_token_tree() {
61-
Ok(tree) => tts.push(tree),
61+
Ok(tree) => buf.push(tree),
6262
Err(mut e) => {
6363
e.emit();
64-
return TokenStream::new(tts);
64+
return buf.into_token_stream();
6565
}
6666
}
6767
}
@@ -223,8 +223,32 @@ impl<'a> TokenTreesReader<'a> {
223223
_ => {
224224
self.token = token;
225225
return;
226-
},
226+
}
227+
}
228+
}
229+
}
230+
}
231+
232+
#[derive(Default)]
233+
struct TokenStreamBuilder {
234+
buf: Vec<TreeAndJoint>,
235+
}
236+
237+
impl TokenStreamBuilder {
238+
fn push(&mut self, (tree, joint): TreeAndJoint) {
239+
if let Some((TokenTree::Token(prev_token), Joint)) = self.buf.last() {
240+
if let TokenTree::Token(token) = &tree {
241+
if let Some(glued) = prev_token.glue(token) {
242+
self.buf.pop();
243+
self.buf.push((TokenTree::Token(glued), joint));
244+
return;
245+
}
227246
}
228247
}
248+
self.buf.push((tree, joint))
249+
}
250+
251+
fn into_token_stream(self) -> TokenStream {
252+
TokenStream::new(self.buf)
229253
}
230254
}

src/libsyntax/parse/token.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ impl Token {
551551
}
552552
}
553553

554-
crate fn glue(self, joint: Token) -> Option<Token> {
554+
crate fn glue(&self, joint: &Token) -> Option<Token> {
555555
let kind = match self.kind {
556556
Eq => match joint.kind {
557557
Eq => EqEq,

src/libsyntax/tokenstream.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ impl TokenStreamBuilder {
414414
let last_tree_if_joint = self.0.last().and_then(TokenStream::last_tree_if_joint);
415415
if let Some(TokenTree::Token(last_token)) = last_tree_if_joint {
416416
if let Some((TokenTree::Token(token), is_joint)) = stream.first_tree_and_joint() {
417-
if let Some(glued_tok) = last_token.glue(token) {
417+
if let Some(glued_tok) = last_token.glue(&token) {
418418
let last_stream = self.0.pop().unwrap();
419419
self.push_all_but_last_tree(&last_stream);
420420
let glued_tt = TokenTree::Token(glued_tok);

0 commit comments

Comments
 (0)