Skip to content

Commit 5bf7970

Browse files
committed
Change fold_tt and fold_tts to take token trees by value (instead of by reference)
1 parent febe6a4 commit 5bf7970

File tree

8 files changed

+68
-88
lines changed

8 files changed

+68
-88
lines changed

src/libsyntax/ast.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1152,13 +1152,13 @@ pub enum TokenTree {
11521152
/// A single token
11531153
Token(Span, token::Token),
11541154
/// A delimited sequence of token trees
1155-
Delimited(Span, Rc<Delimited>),
1155+
Delimited(Span, Delimited),
11561156

11571157
// This only makes sense in MBE macros.
11581158

11591159
/// A kleene-style repetition sequence with a span
11601160
// FIXME(eddyb) #12938 Use DST.
1161-
Sequence(Span, Rc<SequenceRepetition>),
1161+
Sequence(Span, SequenceRepetition),
11621162
}
11631163

11641164
impl TokenTree {
@@ -1207,15 +1207,15 @@ impl TokenTree {
12071207
Some(*cnt)
12081208
}).max().unwrap_or(0);
12091209

1210-
TokenTree::Delimited(sp, Rc::new(Delimited {
1210+
TokenTree::Delimited(sp, Delimited {
12111211
delim: token::Bracket,
12121212
open_span: sp,
12131213
tts: vec![TokenTree::Token(sp, token::Ident(token::str_to_ident("doc"))),
12141214
TokenTree::Token(sp, token::Eq),
12151215
TokenTree::Token(sp, token::Literal(
12161216
token::StrRaw(token::intern(&stripped), num_of_hashes), None))],
12171217
close_span: sp,
1218-
}))
1218+
})
12191219
}
12201220
(&TokenTree::Delimited(_, ref delimed), _) => {
12211221
if index == 0 {

src/libsyntax/ext/expand.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ fn expand_mac_invoc<T>(mac: ast::Mac, ident: Option<Ident>, attrs: Vec<ast::Attr
236236
},
237237
});
238238

239-
let marked_tts = mark_tts(&tts[..], mark);
239+
let marked_tts = mark_tts(tts, mark);
240240
Some(expandfun.expand(fld.cx, call_site, &marked_tts))
241241
}
242242

@@ -256,7 +256,7 @@ fn expand_mac_invoc<T>(mac: ast::Mac, ident: Option<Ident>, attrs: Vec<ast::Attr
256256
}
257257
});
258258

259-
let marked_tts = mark_tts(&tts, mark);
259+
let marked_tts = mark_tts(tts, mark);
260260
Some(expander.expand(fld.cx, call_site, ident, marked_tts))
261261
}
262262

@@ -1190,7 +1190,7 @@ impl Folder for Marker {
11901190
Spanned {
11911191
node: Mac_ {
11921192
path: self.fold_path(node.path),
1193-
tts: self.fold_tts(&node.tts),
1193+
tts: self.fold_tts(node.tts),
11941194
},
11951195
span: self.new_span(span),
11961196
}
@@ -1205,7 +1205,7 @@ impl Folder for Marker {
12051205
}
12061206

12071207
// apply a given mark to the given token trees. Used prior to expansion of a macro.
1208-
fn mark_tts(tts: &[TokenTree], m: Mrk) -> Vec<TokenTree> {
1208+
fn mark_tts(tts: Vec<TokenTree>, m: Mrk) -> Vec<TokenTree> {
12091209
noop_fold_tts(tts, &mut Marker{mark:m, expn_id: None})
12101210
}
12111211

src/libsyntax/ext/quote.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ pub mod rt {
3131
use ext::base::ExtCtxt;
3232
use parse::{self, token, classify};
3333
use ptr::P;
34-
use std::rc::Rc;
3534

3635
use ast::TokenTree;
3736

@@ -214,12 +213,12 @@ pub mod rt {
214213
if self.node.style == ast::AttrStyle::Inner {
215214
r.push(TokenTree::Token(self.span, token::Not));
216215
}
217-
r.push(TokenTree::Delimited(self.span, Rc::new(ast::Delimited {
216+
r.push(TokenTree::Delimited(self.span, ast::Delimited {
218217
delim: token::Bracket,
219218
open_span: self.span,
220219
tts: self.node.value.to_tokens(cx),
221220
close_span: self.span,
222-
})));
221+
}));
223222
r
224223
}
225224
}
@@ -234,12 +233,12 @@ pub mod rt {
234233

235234
impl ToTokens for () {
236235
fn to_tokens(&self, _cx: &ExtCtxt) -> Vec<TokenTree> {
237-
vec![TokenTree::Delimited(DUMMY_SP, Rc::new(ast::Delimited {
236+
vec![TokenTree::Delimited(DUMMY_SP, ast::Delimited {
238237
delim: token::Paren,
239238
open_span: DUMMY_SP,
240239
tts: vec![],
241240
close_span: DUMMY_SP,
242-
}))]
241+
})]
243242
}
244243
}
245244

@@ -789,14 +788,9 @@ fn statements_mk_tt(cx: &ExtCtxt, tt: &TokenTree, matcher: bool) -> Vec<ast::Stm
789788
cx.expr_usize(sp, seq.num_captures))];
790789
let seq_path = vec![id_ext("syntax"), id_ext("ast"), id_ext("SequenceRepetition")];
791790
let e_seq_struct = cx.expr_struct(sp, cx.path_global(sp, seq_path), fields);
792-
let e_rc_new = cx.expr_call_global(sp, vec![id_ext("std"),
793-
id_ext("rc"),
794-
id_ext("Rc"),
795-
id_ext("new")],
796-
vec![e_seq_struct]);
797791
let e_tok = cx.expr_call(sp,
798792
mk_tt_path(cx, sp, "Sequence"),
799-
vec!(e_sp, e_rc_new));
793+
vec!(e_sp, e_seq_struct));
800794
let e_push =
801795
cx.expr_method_call(sp,
802796
cx.expr_ident(sp, id_ext("tt")),

src/libsyntax/ext/tt/macro_rules.rs

+19-21
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use util::small_vector::SmallVector;
2727
use std::cell::RefCell;
2828
use std::collections::{HashMap};
2929
use std::collections::hash_map::{Entry};
30-
use std::rc::Rc;
3130

3231
struct ParserAnyMacro<'a> {
3332
parser: RefCell<Parser<'a>>,
@@ -246,26 +245,25 @@ pub fn compile<'cx>(cx: &'cx mut ExtCtxt,
246245
// These spans won't matter, anyways
247246
let match_lhs_tok = MatchNt(lhs_nm, token::str_to_ident("tt"));
248247
let match_rhs_tok = MatchNt(rhs_nm, token::str_to_ident("tt"));
249-
let argument_gram = vec!(
250-
TokenTree::Sequence(DUMMY_SP,
251-
Rc::new(ast::SequenceRepetition {
252-
tts: vec![
253-
TokenTree::Token(DUMMY_SP, match_lhs_tok),
254-
TokenTree::Token(DUMMY_SP, token::FatArrow),
255-
TokenTree::Token(DUMMY_SP, match_rhs_tok)],
256-
separator: Some(token::Semi),
257-
op: ast::KleeneOp::OneOrMore,
258-
num_captures: 2
259-
})),
260-
//to phase into semicolon-termination instead of
261-
//semicolon-separation
262-
TokenTree::Sequence(DUMMY_SP,
263-
Rc::new(ast::SequenceRepetition {
264-
tts: vec![TokenTree::Token(DUMMY_SP, token::Semi)],
265-
separator: None,
266-
op: ast::KleeneOp::ZeroOrMore,
267-
num_captures: 0
268-
})));
248+
let argument_gram = vec![
249+
TokenTree::Sequence(DUMMY_SP, ast::SequenceRepetition {
250+
tts: vec![
251+
TokenTree::Token(DUMMY_SP, match_lhs_tok),
252+
TokenTree::Token(DUMMY_SP, token::FatArrow),
253+
TokenTree::Token(DUMMY_SP, match_rhs_tok)
254+
],
255+
separator: Some(token::Semi),
256+
op: ast::KleeneOp::OneOrMore,
257+
num_captures: 2,
258+
}),
259+
// to phase into semicolon-termination instead of semicolon-separation
260+
TokenTree::Sequence(DUMMY_SP, ast::SequenceRepetition {
261+
tts: vec![TokenTree::Token(DUMMY_SP, token::Semi)],
262+
separator: None,
263+
op: ast::KleeneOp::ZeroOrMore,
264+
num_captures: 0,
265+
}),
266+
];
269267

270268

271269
// Parse the macro_rules! invocation (`none` is for no interpolations):

src/libsyntax/ext/tt/transcribe.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ pub fn new_tt_reader_with_doc_flag(sp_diag: &Handler,
7979
let mut r = TtReader {
8080
sp_diag: sp_diag,
8181
stack: vec!(TtFrame {
82-
forest: TokenTree::Sequence(DUMMY_SP, Rc::new(ast::SequenceRepetition {
82+
forest: TokenTree::Sequence(DUMMY_SP, ast::SequenceRepetition {
8383
tts: src,
8484
// doesn't matter. This merely holds the root unzipping.
8585
separator: None, op: ast::KleeneOp::ZeroOrMore, num_captures: 0
86-
})),
86+
}),
8787
idx: 0,
8888
dotdotdoted: false,
8989
sep: None,

src/libsyntax/fold.rs

+19-29
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ use ptr::P;
2727
use util::small_vector::SmallVector;
2828
use util::move_map::MoveMap;
2929

30-
use std::rc::Rc;
31-
3230
pub trait Folder : Sized {
3331
// Any additions to this trait should happen in form
3432
// of a call to a public `noop_*` function that only calls
@@ -227,11 +225,11 @@ pub trait Folder : Sized {
227225
noop_fold_ty_params(tps, self)
228226
}
229227

230-
fn fold_tt(&mut self, tt: &TokenTree) -> TokenTree {
228+
fn fold_tt(&mut self, tt: TokenTree) -> TokenTree {
231229
noop_fold_tt(tt, self)
232230
}
233231

234-
fn fold_tts(&mut self, tts: &[TokenTree]) -> Vec<TokenTree> {
232+
fn fold_tts(&mut self, tts: Vec<TokenTree>) -> Vec<TokenTree> {
235233
noop_fold_tts(tts, self)
236234
}
237235

@@ -519,7 +517,7 @@ pub fn noop_fold_mac<T: Folder>(Spanned {node, span}: Mac, fld: &mut T) -> Mac {
519517
Spanned {
520518
node: Mac_ {
521519
path: fld.fold_path(node.path),
522-
tts: fld.fold_tts(&node.tts),
520+
tts: fld.fold_tts(node.tts),
523521
},
524522
span: fld.new_span(span)
525523
}
@@ -546,34 +544,26 @@ pub fn noop_fold_arg<T: Folder>(Arg {id, pat, ty}: Arg, fld: &mut T) -> Arg {
546544
}
547545
}
548546

549-
pub fn noop_fold_tt<T: Folder>(tt: &TokenTree, fld: &mut T) -> TokenTree {
550-
match *tt {
547+
pub fn noop_fold_tt<T: Folder>(tt: TokenTree, fld: &mut T) -> TokenTree {
548+
match tt {
551549
TokenTree::Token(span, ref tok) =>
552550
TokenTree::Token(span, fld.fold_token(tok.clone())),
553-
TokenTree::Delimited(span, ref delimed) => {
554-
TokenTree::Delimited(span, Rc::new(
555-
Delimited {
556-
delim: delimed.delim,
557-
open_span: delimed.open_span,
558-
tts: fld.fold_tts(&delimed.tts),
559-
close_span: delimed.close_span,
560-
}
561-
))
562-
},
563-
TokenTree::Sequence(span, ref seq) =>
564-
TokenTree::Sequence(span,
565-
Rc::new(SequenceRepetition {
566-
tts: fld.fold_tts(&seq.tts),
567-
separator: seq.separator.clone().map(|tok| fld.fold_token(tok)),
568-
..**seq
569-
})),
551+
TokenTree::Delimited(span, delimed) => TokenTree::Delimited(span, Delimited {
552+
delim: delimed.delim,
553+
open_span: delimed.open_span,
554+
tts: fld.fold_tts(delimed.tts),
555+
close_span: delimed.close_span,
556+
}),
557+
TokenTree::Sequence(span, seq) => TokenTree::Sequence(span, SequenceRepetition {
558+
tts: fld.fold_tts(seq.tts),
559+
separator: seq.separator.clone().map(|tok| fld.fold_token(tok)),
560+
..seq
561+
}),
570562
}
571563
}
572564

573-
pub fn noop_fold_tts<T: Folder>(tts: &[TokenTree], fld: &mut T) -> Vec<TokenTree> {
574-
// FIXME: Does this have to take a tts slice?
575-
// Could use move_map otherwise...
576-
tts.iter().map(|tt| fld.fold_tt(tt)).collect()
565+
pub fn noop_fold_tts<T: Folder>(tts: Vec<TokenTree>, fld: &mut T) -> Vec<TokenTree> {
566+
tts.move_map(|tt| fld.fold_tt(tt))
577567
}
578568

579569
// apply ident folder if it's an ident, apply other folds to interpolated nodes
@@ -631,7 +621,7 @@ pub fn noop_fold_interpolated<T: Folder>(nt: token::Nonterminal, fld: &mut T)
631621
token::NtIdent(Box::new(Spanned::<Ident>{node: fld.fold_ident(id.node), ..*id})),
632622
token::NtMeta(meta_item) => token::NtMeta(fld.fold_meta_item(meta_item)),
633623
token::NtPath(path) => token::NtPath(Box::new(fld.fold_path(*path))),
634-
token::NtTT(tt) => token::NtTT(P(fld.fold_tt(&tt))),
624+
token::NtTT(tt) => token::NtTT(tt.map(|tt| fld.fold_tt(tt))),
635625
token::NtArm(arm) => token::NtArm(fld.fold_arm(arm)),
636626
token::NtImplItem(arm) =>
637627
token::NtImplItem(arm.map(|arm| fld.fold_impl_item(arm)

src/libsyntax/parse/mod.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,6 @@ pub fn integer_lit(s: &str,
660660
#[cfg(test)]
661661
mod tests {
662662
use super::*;
663-
use std::rc::Rc;
664663
use codemap::{Span, BytePos, Pos, Spanned, NO_EXPANSION};
665664
use ast::{self, TokenTree, PatKind};
666665
use abi::Abi;
@@ -759,7 +758,7 @@ mod tests {
759758
)
760759
if first_delimed.delim == token::Paren
761760
&& ident.name.as_str() == "a" => {},
762-
_ => panic!("value 3: {:?}", **first_delimed),
761+
_ => panic!("value 3: {:?}", *first_delimed),
763762
}
764763
let tts = &second_delimed.tts[..];
765764
match (tts.len(), tts.get(0), tts.get(1)) {
@@ -770,10 +769,10 @@ mod tests {
770769
)
771770
if second_delimed.delim == token::Paren
772771
&& ident.name.as_str() == "a" => {},
773-
_ => panic!("value 4: {:?}", **second_delimed),
772+
_ => panic!("value 4: {:?}", *second_delimed),
774773
}
775774
},
776-
_ => panic!("value 2: {:?}", **macro_delimed),
775+
_ => panic!("value 2: {:?}", *macro_delimed),
777776
}
778777
},
779778
_ => panic!("value: {:?}",tts),
@@ -789,7 +788,7 @@ mod tests {
789788
TokenTree::Token(sp(3, 4), token::Ident(str_to_ident("a"))),
790789
TokenTree::Delimited(
791790
sp(5, 14),
792-
Rc::new(ast::Delimited {
791+
ast::Delimited {
793792
delim: token::DelimToken::Paren,
794793
open_span: sp(5, 6),
795794
tts: vec![
@@ -798,18 +797,18 @@ mod tests {
798797
TokenTree::Token(sp(10, 13), token::Ident(str_to_ident("i32"))),
799798
],
800799
close_span: sp(13, 14),
801-
})),
800+
}),
802801
TokenTree::Delimited(
803802
sp(15, 21),
804-
Rc::new(ast::Delimited {
803+
ast::Delimited {
805804
delim: token::DelimToken::Brace,
806805
open_span: sp(15, 16),
807806
tts: vec![
808807
TokenTree::Token(sp(17, 18), token::Ident(str_to_ident("b"))),
809808
TokenTree::Token(sp(18, 19), token::Semi),
810809
],
811810
close_span: sp(20, 21),
812-
}))
811+
})
813812
];
814813

815814
assert_eq!(tts, expected);

src/libsyntax/parse/parser.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -2671,13 +2671,12 @@ impl<'a> Parser<'a> {
26712671
)?;
26722672
let (sep, repeat) = self.parse_sep_and_kleene_op()?;
26732673
let name_num = macro_parser::count_names(&seq);
2674-
return Ok(TokenTree::Sequence(mk_sp(sp.lo, seq_span.hi),
2675-
Rc::new(SequenceRepetition {
2676-
tts: seq,
2677-
separator: sep,
2678-
op: repeat,
2679-
num_captures: name_num
2680-
})));
2674+
return Ok(TokenTree::Sequence(mk_sp(sp.lo, seq_span.hi), SequenceRepetition {
2675+
tts: seq,
2676+
separator: sep,
2677+
op: repeat,
2678+
num_captures: name_num
2679+
}));
26812680
} else if self.token.is_keyword(keywords::Crate) {
26822681
self.bump();
26832682
return Ok(TokenTree::Token(sp, SpecialVarNt(SpecialMacroVar::CrateMacroVar)));
@@ -2832,12 +2831,12 @@ impl<'a> Parser<'a> {
28322831
_ => {}
28332832
}
28342833

2835-
Ok(TokenTree::Delimited(span, Rc::new(Delimited {
2834+
Ok(TokenTree::Delimited(span, Delimited {
28362835
delim: delim,
28372836
open_span: open_span,
28382837
tts: tts,
28392838
close_span: close_span,
2840-
})))
2839+
}))
28412840
},
28422841
_ => {
28432842
// invariants: the current token is not a left-delimiter,

0 commit comments

Comments
 (0)