Skip to content

Commit e7c5146

Browse files
committed
Remove TokenStream::JointTree.
This is done by adding a new `IsJoint` field to `TokenStream::Tree`, which simplifies a lot of `match` statements. And likewise for `CursorKind`. The commit also adds a new method `TokenTree:stream()` which can replace a choice between `.into()` and `.joint()`.
1 parent c6fb01d commit e7c5146

File tree

3 files changed

+46
-60
lines changed

3 files changed

+46
-60
lines changed

src/libsyntax/parse/lexer/tokentrees.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use print::pprust::token_to_string;
1212
use parse::lexer::StringReader;
1313
use parse::{token, PResult};
14-
use tokenstream::{DelimSpan, TokenStream, TokenTree};
14+
use tokenstream::{DelimSpan, IsJoint::*, TokenStream, TokenTree};
1515

1616
impl<'a> StringReader<'a> {
1717
// Parse a stream of tokens into a list of `TokenTree`s, up to an `Eof`.
@@ -178,8 +178,7 @@ impl<'a> StringReader<'a> {
178178
let raw = self.span_src_raw;
179179
self.real_token();
180180
let is_joint = raw.hi() == self.span_src_raw.lo() && token::is_op(&self.token);
181-
182-
Ok(if is_joint { tt.joint() } else { tt.into() })
181+
Ok(TokenStream::Tree(tt, if is_joint { Joint } else { NonJoint }))
183182
}
184183
}
185184
}

src/libsyntax/tokenstream.rs

+42-51
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ impl TokenTree {
123123
}
124124

125125
pub fn joint(self) -> TokenStream {
126-
TokenStream::JointTree(self)
126+
TokenStream::Tree(self, Joint)
127127
}
128128

129129
/// Returns the opening delimiter as a token tree.
@@ -156,15 +156,22 @@ impl TokenTree {
156156
#[derive(Clone, Debug)]
157157
pub enum TokenStream {
158158
Empty,
159-
Tree(TokenTree),
160-
JointTree(TokenTree),
159+
Tree(TokenTree, IsJoint),
161160
Stream(Lrc<Vec<TokenStream>>),
162161
}
163162

164163
// `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
165164
#[cfg(target_arch = "x86_64")]
166165
static_assert!(MEM_SIZE_OF_TOKEN_STREAM: mem::size_of::<TokenStream>() == 32);
167166

167+
#[derive(Clone, Copy, Debug, PartialEq)]
168+
pub enum IsJoint {
169+
Joint,
170+
NonJoint
171+
}
172+
173+
use self::IsJoint::*;
174+
168175
impl TokenStream {
169176
/// Given a `TokenStream` with a `Stream` of only two arguments, return a new `TokenStream`
170177
/// separating the two arguments with a comma for diagnostic suggestions.
@@ -176,16 +183,16 @@ impl TokenStream {
176183
while let Some((pos, ts)) = iter.next() {
177184
if let Some((_, next)) = iter.peek() {
178185
let sp = match (&ts, &next) {
179-
(TokenStream::Tree(TokenTree::Token(_, token::Token::Comma)), _) |
180-
(_, TokenStream::Tree(TokenTree::Token(_, token::Token::Comma))) => {
181-
continue;
182-
}
183-
(TokenStream::Tree(TokenTree::Token(sp, _)), _) => *sp,
184-
(TokenStream::Tree(TokenTree::Delimited(sp, ..)), _) => sp.entire(),
186+
(TokenStream::Tree(TokenTree::Token(_, token::Token::Comma), NonJoint), _) |
187+
(_, TokenStream::Tree(TokenTree::Token(_, token::Token::Comma), NonJoint))
188+
=> continue,
189+
(TokenStream::Tree(TokenTree::Token(sp, _), NonJoint), _) => *sp,
190+
(TokenStream::Tree(TokenTree::Delimited(sp, ..), NonJoint), _) =>
191+
sp.entire(),
185192
_ => continue,
186193
};
187194
let sp = sp.shrink_to_hi();
188-
let comma = TokenStream::Tree(TokenTree::Token(sp, token::Comma));
195+
let comma = TokenStream::Tree(TokenTree::Token(sp, token::Comma), NonJoint);
189196
suggestion = Some((pos, comma, sp));
190197
}
191198
}
@@ -204,7 +211,7 @@ impl TokenStream {
204211

205212
impl From<TokenTree> for TokenStream {
206213
fn from(tt: TokenTree) -> TokenStream {
207-
TokenStream::Tree(tt)
214+
TokenStream::Tree(tt, NonJoint)
208215
}
209216
}
210217

@@ -232,7 +239,7 @@ impl Extend<TokenStream> for TokenStream {
232239
vec.reserve(iter.size_hint().0);
233240
vec
234241
}
235-
TokenStream::Tree(_) | TokenStream::JointTree(_) => {
242+
TokenStream::Tree(..) => {
236243
let mut vec = Vec::new();
237244
vec.reserve(1 + iter.size_hint().0);
238245
vec.push(this);
@@ -367,8 +374,7 @@ impl TokenStream {
367374
/// Returns true if the token tree is a joint operation w.r.t. `proc_macro::TokenNode`.
368375
pub fn as_tree(self) -> (TokenTree, bool /* joint? */) {
369376
match self {
370-
TokenStream::Tree(tree) => (tree, false),
371-
TokenStream::JointTree(tree) => (tree, true),
377+
TokenStream::Tree(tree, is_joint) => (tree, is_joint == Joint),
372378
_ => unreachable!(),
373379
}
374380
}
@@ -379,8 +385,7 @@ impl TokenStream {
379385
let mut i = 0;
380386
while let Some(stream) = trees.next_as_stream() {
381387
result.push(match stream {
382-
TokenStream::Tree(tree) => f(i, tree).into(),
383-
TokenStream::JointTree(tree) => f(i, tree).joint(),
388+
TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(i, tree), is_joint),
384389
_ => unreachable!()
385390
});
386391
i += 1;
@@ -393,27 +398,25 @@ impl TokenStream {
393398
let mut result = Vec::new();
394399
while let Some(stream) = trees.next_as_stream() {
395400
result.push(match stream {
396-
TokenStream::Tree(tree) => f(tree).into(),
397-
TokenStream::JointTree(tree) => f(tree).joint(),
401+
TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(tree), is_joint),
398402
_ => unreachable!()
399403
});
400404
}
401405
TokenStream::new(result)
402406
}
403407

404-
fn first_tree_and_joint(&self) -> Option<(TokenTree, bool)> {
408+
fn first_tree_and_joint(&self) -> Option<(TokenTree, IsJoint)> {
405409
match self {
406410
TokenStream::Empty => None,
407-
TokenStream::Tree(ref tree) => Some((tree.clone(), false)),
408-
TokenStream::JointTree(ref tree) => Some((tree.clone(), true)),
411+
TokenStream::Tree(ref tree, is_joint) => Some((tree.clone(), *is_joint)),
409412
TokenStream::Stream(ref stream) => stream.first().unwrap().first_tree_and_joint(),
410413
}
411414
}
412415

413416
fn last_tree_if_joint(&self) -> Option<TokenTree> {
414417
match self {
415-
TokenStream::Empty | TokenStream::Tree(..) => None,
416-
TokenStream::JointTree(ref tree) => Some(tree.clone()),
418+
TokenStream::Empty | TokenStream::Tree(_, NonJoint) => None,
419+
TokenStream::Tree(ref tree, Joint) => Some(tree.clone()),
417420
TokenStream::Stream(ref stream) => stream.last().unwrap().last_tree_if_joint(),
418421
}
419422
}
@@ -437,11 +440,7 @@ impl TokenStreamBuilder {
437440
self.push_all_but_last_tree(&last_stream);
438441
let glued_span = last_span.to(span);
439442
let glued_tt = TokenTree::Token(glued_span, glued_tok);
440-
let glued_tokenstream = if is_joint {
441-
glued_tt.joint()
442-
} else {
443-
glued_tt.into()
444-
};
443+
let glued_tokenstream = TokenStream::Tree(glued_tt, is_joint);
445444
self.0.push(glued_tokenstream);
446445
self.push_all_but_first_tree(&stream);
447446
return
@@ -491,8 +490,7 @@ pub struct Cursor(CursorKind);
491490
#[derive(Clone)]
492491
enum CursorKind {
493492
Empty,
494-
Tree(TokenTree, bool /* consumed? */),
495-
JointTree(TokenTree, bool /* consumed? */),
493+
Tree(TokenTree, IsJoint, bool /* consumed? */),
496494
Stream(StreamCursor),
497495
}
498496

@@ -514,9 +512,9 @@ impl StreamCursor {
514512
self.index += 1;
515513
let next = self.stream[self.index - 1].clone();
516514
match next {
517-
TokenStream::Tree(..) | TokenStream::JointTree(..) => return Some(next),
518-
TokenStream::Stream(stream) => self.insert(stream),
519515
TokenStream::Empty => {}
516+
TokenStream::Tree(..) => return Some(next),
517+
TokenStream::Stream(stream) => self.insert(stream),
520518
}
521519
} else if let Some((stream, index)) = self.stack.pop() {
522520
self.stream = stream;
@@ -538,7 +536,7 @@ impl Iterator for Cursor {
538536

539537
fn next(&mut self) -> Option<TokenTree> {
540538
self.next_as_stream().map(|stream| match stream {
541-
TokenStream::Tree(tree) | TokenStream::JointTree(tree) => tree,
539+
TokenStream::Tree(tree, _) => tree,
542540
_ => unreachable!()
543541
})
544542
}
@@ -548,18 +546,15 @@ impl Cursor {
548546
fn new(stream: TokenStream) -> Self {
549547
Cursor(match stream {
550548
TokenStream::Empty => CursorKind::Empty,
551-
TokenStream::Tree(tree) => CursorKind::Tree(tree, false),
552-
TokenStream::JointTree(tree) => CursorKind::JointTree(tree, false),
549+
TokenStream::Tree(tree, is_joint) => CursorKind::Tree(tree, is_joint, false),
553550
TokenStream::Stream(stream) => CursorKind::Stream(StreamCursor::new(stream)),
554551
})
555552
}
556553

557554
pub fn next_as_stream(&mut self) -> Option<TokenStream> {
558555
let (stream, consumed) = match self.0 {
559-
CursorKind::Tree(ref tree, ref mut consumed @ false) =>
560-
(tree.clone().into(), consumed),
561-
CursorKind::JointTree(ref tree, ref mut consumed @ false) =>
562-
(tree.clone().joint(), consumed),
556+
CursorKind::Tree(ref tree, ref is_joint, ref mut consumed @ false) =>
557+
(TokenStream::Tree(tree.clone(), *is_joint), consumed),
563558
CursorKind::Stream(ref mut cursor) => return cursor.next_as_stream(),
564559
_ => return None,
565560
};
@@ -572,7 +567,7 @@ impl Cursor {
572567
match self.0 {
573568
_ if stream.is_empty() => return,
574569
CursorKind::Empty => *self = stream.trees(),
575-
CursorKind::Tree(_, consumed) | CursorKind::JointTree(_, consumed) => {
570+
CursorKind::Tree(_, _, consumed) => {
576571
*self = TokenStream::new(vec![self.original_stream(), stream]).trees();
577572
if consumed {
578573
self.next();
@@ -587,8 +582,8 @@ impl Cursor {
587582
pub fn original_stream(&self) -> TokenStream {
588583
match self.0 {
589584
CursorKind::Empty => TokenStream::empty(),
590-
CursorKind::Tree(ref tree, _) => tree.clone().into(),
591-
CursorKind::JointTree(ref tree, _) => tree.clone().joint(),
585+
CursorKind::Tree(ref tree, ref is_joint, _) =>
586+
TokenStream::Tree(tree.clone(), *is_joint),
592587
CursorKind::Stream(ref cursor) => TokenStream::Stream(
593588
cursor.stack.get(0).cloned().map(|(stream, _)| stream)
594589
.unwrap_or_else(|| cursor.stream.clone())
@@ -600,9 +595,8 @@ impl Cursor {
600595
fn look_ahead(streams: &[TokenStream], mut n: usize) -> Result<TokenTree, usize> {
601596
for stream in streams {
602597
n = match stream {
603-
TokenStream::Tree(ref tree) | TokenStream::JointTree(ref tree)
604-
if n == 0 => return Ok(tree.clone()),
605-
TokenStream::Tree(..) | TokenStream::JointTree(..) => n - 1,
598+
TokenStream::Tree(ref tree, _) if n == 0 => return Ok(tree.clone()),
599+
TokenStream::Tree(..) => n - 1,
606600
TokenStream::Stream(ref stream) => match look_ahead(stream, n) {
607601
Ok(tree) => return Ok(tree),
608602
Err(n) => n,
@@ -615,10 +609,8 @@ impl Cursor {
615609

616610
match self.0 {
617611
CursorKind::Empty |
618-
CursorKind::Tree(_, true) |
619-
CursorKind::JointTree(_, true) => Err(n),
620-
CursorKind::Tree(ref tree, false) |
621-
CursorKind::JointTree(ref tree, false) => look_ahead(&[tree.clone().into()], n),
612+
CursorKind::Tree(_, _, true) => Err(n),
613+
CursorKind::Tree(ref tree, _, false) => look_ahead(&[tree.clone().into()], n),
622614
CursorKind::Stream(ref cursor) => {
623615
look_ahead(&cursor.stream[cursor.index ..], n).or_else(|mut n| {
624616
for &(ref stream, index) in cursor.stack.iter().rev() {
@@ -651,8 +643,7 @@ impl From<TokenStream> for ThinTokenStream {
651643
fn from(stream: TokenStream) -> ThinTokenStream {
652644
ThinTokenStream(match stream {
653645
TokenStream::Empty => None,
654-
TokenStream::Tree(tree) => Some(Lrc::new(vec![tree.into()])),
655-
TokenStream::JointTree(tree) => Some(Lrc::new(vec![tree.joint()])),
646+
TokenStream::Tree(..) => Some(Lrc::new(vec![stream])),
656647
TokenStream::Stream(stream) => Some(stream),
657648
})
658649
}

src/libsyntax_ext/proc_macro_server.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use syntax::ast;
2121
use syntax::ext::base::ExtCtxt;
2222
use syntax::parse::lexer::comments;
2323
use syntax::parse::{self, token, ParseSess};
24-
use syntax::tokenstream::{self, DelimSpan, TokenStream};
24+
use syntax::tokenstream::{self, DelimSpan, IsJoint::*, TokenStream};
2525
use syntax_pos::hygiene::{SyntaxContext, Transparency};
2626
use syntax_pos::symbol::{keywords, Symbol};
2727
use syntax_pos::{BytePos, FileName, MultiSpan, Pos, SourceFile, Span};
@@ -297,11 +297,7 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> {
297297
};
298298

299299
let tree = tokenstream::TokenTree::Token(span, token);
300-
if joint {
301-
tree.joint()
302-
} else {
303-
tree.into()
304-
}
300+
TokenStream::Tree(tree, if joint { Joint } else { NonJoint })
305301
}
306302
}
307303

0 commit comments

Comments
 (0)