Skip to content

Commit 34dacb8

Browse files
committed
Reduce the size of the TokenTree
1 parent dfb4163 commit 34dacb8

File tree

7 files changed

+34
-22
lines changed

7 files changed

+34
-22
lines changed

src/libsyntax/ast.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -629,8 +629,7 @@ pub enum TokenTree {
629629
/// A single token
630630
TtToken(Span, ::parse::token::Token),
631631
/// A delimited sequence of token trees
632-
// FIXME(eddyb) #6308 Use Rc<[TokenTree]> after DST.
633-
TtDelimited(Span, Delimiter, Rc<Vec<TokenTree>>, Delimiter),
632+
TtDelimited(Span, Rc<(Delimiter, Vec<TokenTree>, Delimiter)>),
634633

635634
// These only make sense for right-hand-sides of MBE macros:
636635

@@ -649,7 +648,7 @@ impl TokenTree {
649648
pub fn get_span(&self) -> Span {
650649
match *self {
651650
TtToken(span, _) => span,
652-
TtDelimited(span, _, _, _) => span,
651+
TtDelimited(span, _) => span,
653652
TtSequence(span, _, _, _) => span,
654653
TtNonterminal(span, _) => span,
655654
}

src/libsyntax/ext/quote.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,8 @@ fn mk_tt(cx: &ExtCtxt, _: Span, tt: &ast::TokenTree) -> Vec<P<ast::Stmt>> {
651651
vec!(e_tok));
652652
vec!(cx.stmt_expr(e_push))
653653
},
654-
ast::TtDelimited(sp, ref open, ref tts, ref close) => {
654+
ast::TtDelimited(sp, ref delimed) => {
655+
let (ref open, ref tts, ref close) = **delimed;
655656
mk_tt(cx, sp, &open.to_tt()).into_iter()
656657
.chain(tts.iter().flat_map(|tt| mk_tt(cx, sp, tt).into_iter()))
657658
.chain(mk_tt(cx, sp, &close.to_tt()).into_iter())

src/libsyntax/ext/tt/macro_rules.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,10 @@ fn generic_extension<'cx>(cx: &'cx ExtCtxt,
172172
MatchedNonterminal(NtTT(ref tt)) => {
173173
match **tt {
174174
// ignore delimiters
175-
TtDelimited(_, _, ref tts, _) => (**tts).clone(),
175+
TtDelimited(_, ref delimed) => {
176+
let (_, ref tts, _) = **delimed;
177+
tts.clone()
178+
},
176179
_ => cx.span_fatal(sp, "macro rhs must be delimited"),
177180
}
178181
},

src/libsyntax/ext/tt/transcribe.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,13 @@ impl Add<LockstepIterSize, LockstepIterSize> for LockstepIterSize {
128128

129129
fn lockstep_iter_size(t: &TokenTree, r: &TtReader) -> LockstepIterSize {
130130
match *t {
131-
// The opening and closing delimiters are both tokens, so they are
132-
// treated as `LisUnconstrained`.
133-
TtDelimited(_, _, ref tts, _) | TtSequence(_, ref tts, _, _) => {
131+
TtDelimited(_, ref delimed) => {
132+
let (_, ref tts, _) = **delimed;
133+
tts.iter().fold(LisUnconstrained, |size, tt| {
134+
size + lockstep_iter_size(tt, r)
135+
})
136+
},
137+
TtSequence(_, ref tts, _, _) => {
134138
tts.iter().fold(LisUnconstrained, |size, tt| {
135139
size + lockstep_iter_size(tt, r)
136140
})
@@ -202,7 +206,8 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
202206
(*frame.forest)[frame.idx].clone()
203207
};
204208
match t {
205-
TtDelimited(_, open, tts, close) => {
209+
TtDelimited(_, ref delimed) => {
210+
let (ref open, ref tts, ref close) = **delimed;
206211
let mut forest = Vec::with_capacity(1 + tts.len() + 1);
207212
forest.push(open.to_tt());
208213
forest.extend(tts.iter().map(|x| (*x).clone()));

src/libsyntax/fold.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -571,17 +571,20 @@ pub fn noop_fold_tt<T: Folder>(tt: &TokenTree, fld: &mut T) -> TokenTree {
571571
match *tt {
572572
TtToken(span, ref tok) =>
573573
TtToken(span, fld.fold_token(tok.clone())),
574-
TtDelimited(span, ref open, ref tts, ref close) =>
575-
TtDelimited(span,
576-
Delimiter {
577-
span: open.span,
578-
token: fld.fold_token(open.token.clone())
579-
},
580-
Rc::new(fld.fold_tts(tts.as_slice())),
581-
Delimiter {
582-
span: close.span,
583-
token: fld.fold_token(close.token.clone())
584-
}),
574+
TtDelimited(span, ref delimed) => {
575+
let (ref open, ref tts, ref close) = **delimed;
576+
TtDelimited(span, Rc::new((
577+
Delimiter {
578+
span: open.span,
579+
token: fld.fold_token(open.token.clone())
580+
},
581+
fld.fold_tts(tts.as_slice()),
582+
Delimiter {
583+
span: close.span,
584+
token: fld.fold_token(close.token.clone())
585+
},
586+
)))
587+
},
585588
TtSequence(span, ref pattern, ref sep, is_optional) =>
586589
TtSequence(span,
587590
Rc::new(fld.fold_tts(pattern.as_slice())),

src/libsyntax/parse/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2615,7 +2615,7 @@ impl<'a> Parser<'a> {
26152615
// Expand to cover the entire delimited token tree
26162616
let span = Span { hi: self.span.hi, ..pre_span };
26172617

2618-
TtDelimited(span, open, Rc::new(tts), close)
2618+
TtDelimited(span, Rc::new((open, tts, close)))
26192619
}
26202620
_ => parse_non_delim_tt_tok(self)
26212621
}

src/libsyntax/print/pprust.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1020,7 +1020,8 @@ impl<'a> State<'a> {
10201020
/// expression arguments as expressions). It can be done! I think.
10211021
pub fn print_tt(&mut self, tt: &ast::TokenTree) -> IoResult<()> {
10221022
match *tt {
1023-
ast::TtDelimited(_, ref open, ref tts, ref close) => {
1023+
ast::TtDelimited(_, ref delimed) => {
1024+
let (ref open, ref tts, ref close) = **delimed;
10241025
try!(word(&mut self.s, parse::token::to_string(&open.token).as_slice()));
10251026
try!(space(&mut self.s));
10261027
try!(self.print_tts(tts.as_slice()));

0 commit comments

Comments
 (0)