Skip to content

Commit 6a9248f

Browse files
committed
Clean up ext::tt::transcribe.
1 parent debcbf0 commit 6a9248f

File tree

2 files changed

+35
-74
lines changed

2 files changed

+35
-74
lines changed

src/libsyntax/ext/tt/macro_rules.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use ext::expand::{Expansion, ExpansionKind};
1616
use ext::tt::macro_parser::{Success, Error, Failure};
1717
use ext::tt::macro_parser::{MatchedSeq, MatchedNonterminal};
1818
use ext::tt::macro_parser::{parse, parse_failure_msg};
19-
use ext::tt::transcribe::new_tt_reader;
19+
use ext::tt::transcribe::transcribe;
2020
use parse::{Directory, ParseSess};
2121
use parse::parser::Parser;
2222
use parse::token::{self, NtTT, Token};
@@ -113,16 +113,7 @@ fn generic_extension<'cx>(cx: &'cx ExtCtxt,
113113
_ => cx.span_bug(sp, "malformed macro rhs"),
114114
};
115115
// rhs has holes ( `$id` and `$(...)` that need filled)
116-
let mut trncbr =
117-
new_tt_reader(&cx.parse_sess.span_diagnostic, Some(named_matches), rhs);
118-
let mut tts = Vec::new();
119-
loop {
120-
let tok = trncbr.real_token();
121-
if tok.tok == token::Eof {
122-
break
123-
}
124-
tts.push(TokenTree::Token(tok.sp, tok.tok));
125-
}
116+
let tts = transcribe(&cx.parse_sess.span_diagnostic, Some(named_matches), rhs);
126117
let directory = Directory {
127118
path: cx.current_expansion.module.directory.clone(),
128119
ownership: cx.current_expansion.directory_ownership,

src/libsyntax/ext/tt/transcribe.rs

Lines changed: 33 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use ast::Ident;
1313
use errors::Handler;
1414
use ext::tt::macro_parser::{NamedMatch, MatchedSeq, MatchedNonterminal};
1515
use parse::token::{self, MatchNt, SubstNt, Token, NtIdent};
16-
use parse::lexer::TokenAndSpan;
1716
use syntax_pos::{Span, DUMMY_SP};
1817
use tokenstream::{self, TokenTree};
1918
use util::small_vector::SmallVector;
@@ -32,33 +31,24 @@ struct TtFrame {
3231
}
3332

3433
#[derive(Clone)]
35-
pub struct TtReader<'a> {
36-
pub sp_diag: &'a Handler,
34+
struct TtReader<'a> {
35+
sp_diag: &'a Handler,
3736
/// the unzipped tree:
3837
stack: SmallVector<TtFrame>,
3938
/* for MBE-style macro transcription */
4039
interpolations: HashMap<Ident, Rc<NamedMatch>>,
4140

4241
repeat_idx: Vec<usize>,
4342
repeat_len: Vec<usize>,
44-
/* cached: */
45-
pub cur_tok: Token,
46-
pub cur_span: Span,
47-
}
48-
49-
impl<'a> TtReader<'a> {
50-
pub fn real_token(&mut self) -> TokenAndSpan {
51-
tt_next_token(self)
52-
}
5343
}
5444

5545
/// This can do Macro-By-Example transcription. On the other hand, if
5646
/// `src` contains no `TokenTree::Sequence`s, `MatchNt`s or `SubstNt`s, `interp` can
5747
/// (and should) be None.
58-
pub fn new_tt_reader(sp_diag: &Handler,
59-
interp: Option<HashMap<Ident, Rc<NamedMatch>>>,
60-
src: Vec<tokenstream::TokenTree>)
61-
-> TtReader {
48+
pub fn transcribe(sp_diag: &Handler,
49+
interp: Option<HashMap<Ident, Rc<NamedMatch>>>,
50+
src: Vec<tokenstream::TokenTree>)
51+
-> Vec<TokenTree> {
6252
let mut r = TtReader {
6353
sp_diag: sp_diag,
6454
stack: SmallVector::one(TtFrame {
@@ -77,12 +67,15 @@ pub fn new_tt_reader(sp_diag: &Handler,
7767
},
7868
repeat_idx: Vec::new(),
7969
repeat_len: Vec::new(),
80-
/* dummy values, never read: */
81-
cur_tok: token::Eof,
82-
cur_span: DUMMY_SP,
8370
};
84-
tt_next_token(&mut r); /* get cur_tok and cur_span set up */
85-
r
71+
72+
let mut tts = Vec::new();
73+
let mut prev_span = DUMMY_SP;
74+
while let Some(tt) = tt_next_token(&mut r, prev_span) {
75+
prev_span = tt.span();
76+
tts.push(tt);
77+
}
78+
tts
8679
}
8780

8881
fn lookup_cur_matched_by_matched(r: &TtReader, start: Rc<NamedMatch>) -> Rc<NamedMatch> {
@@ -156,38 +149,24 @@ fn lockstep_iter_size(t: &TokenTree, r: &TtReader) -> LockstepIterSize {
156149

157150
/// Return the next token from the TtReader.
158151
/// EFFECT: advances the reader's token field
159-
pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
160-
// FIXME(pcwalton): Bad copy?
161-
let ret_val = TokenAndSpan {
162-
tok: r.cur_tok.clone(),
163-
sp: r.cur_span.clone(),
164-
};
152+
fn tt_next_token(r: &mut TtReader, prev_span: Span) -> Option<TokenTree> {
165153
loop {
166-
let should_pop = match r.stack.last() {
167-
None => {
168-
assert_eq!(ret_val.tok, token::Eof);
169-
return ret_val;
170-
}
171-
Some(frame) => {
172-
if frame.idx < frame.forest.len() {
173-
break;
174-
}
175-
!frame.dotdotdoted ||
176-
*r.repeat_idx.last().unwrap() == *r.repeat_len.last().unwrap() - 1
154+
let should_pop = if let Some(frame) = r.stack.last() {
155+
if frame.idx < frame.forest.len() {
156+
break;
177157
}
158+
!frame.dotdotdoted || *r.repeat_idx.last().unwrap() == *r.repeat_len.last().unwrap() - 1
159+
} else {
160+
return None;
178161
};
179162

180163
/* done with this set; pop or repeat? */
181164
if should_pop {
182165
let prev = r.stack.pop().unwrap();
183-
match r.stack.last_mut() {
184-
None => {
185-
r.cur_tok = token::Eof;
186-
return ret_val;
187-
}
188-
Some(frame) => {
189-
frame.idx += 1;
190-
}
166+
if let Some(frame) = r.stack.last_mut() {
167+
frame.idx += 1;
168+
} else {
169+
return None;
191170
}
192171
if prev.dotdotdoted {
193172
r.repeat_idx.pop();
@@ -197,8 +176,7 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
197176
*r.repeat_idx.last_mut().unwrap() += 1;
198177
r.stack.last_mut().unwrap().idx = 0;
199178
if let Some(tk) = r.stack.last().unwrap().sep.clone() {
200-
r.cur_tok = tk; // repeat same span, I guess
201-
return ret_val;
179+
return Some(TokenTree::Token(prev_span, tk)); // repeat same span, I guess
202180
}
203181
}
204182
}
@@ -234,7 +212,7 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
234212
}
235213

236214
r.stack.last_mut().unwrap().idx += 1;
237-
return tt_next_token(r);
215+
return tt_next_token(r, prev_span);
238216
}
239217
r.repeat_len.push(len);
240218
r.repeat_idx.push(0);
@@ -252,9 +230,7 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
252230
r.stack.last_mut().unwrap().idx += 1;
253231
match lookup_cur_matched(r, ident) {
254232
None => {
255-
r.cur_span = sp;
256-
r.cur_tok = SubstNt(ident);
257-
return ret_val;
233+
return Some(TokenTree::Token(sp, SubstNt(ident)));
258234
// this can't be 0 length, just like TokenTree::Delimited
259235
}
260236
Some(cur_matched) => if let MatchedNonterminal(ref nt) = *cur_matched {
@@ -263,15 +239,11 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
263239
// (a) idents can be in lots of places, so it'd be a pain
264240
// (b) we actually can, since it's a token.
265241
NtIdent(ref sn) => {
266-
r.cur_span = sn.span;
267-
r.cur_tok = token::Ident(sn.node);
268-
return ret_val;
242+
return Some(TokenTree::Token(sn.span, token::Ident(sn.node)));
269243
}
270244
_ => {
271-
// FIXME(pcwalton): Bad copy.
272-
r.cur_span = sp;
273-
r.cur_tok = token::Interpolated(nt.clone());
274-
return ret_val;
245+
// FIXME(pcwalton): Bad copy
246+
return Some(TokenTree::Token(sp, token::Interpolated(nt.clone())));
275247
}
276248
}
277249
} else {
@@ -292,11 +264,9 @@ pub fn tt_next_token(r: &mut TtReader) -> TokenAndSpan {
292264
});
293265
// if this could be 0-length, we'd need to potentially recur here
294266
}
295-
TokenTree::Token(sp, tok) => {
296-
r.cur_span = sp;
297-
r.cur_tok = tok;
267+
tt @ TokenTree::Token(..) => {
298268
r.stack.last_mut().unwrap().idx += 1;
299-
return ret_val;
269+
return Some(tt);
300270
}
301271
}
302272
}

0 commit comments

Comments
 (0)