@@ -36,7 +36,7 @@ const VALID_FRAGMENT_NAMES_MSG: &str = "valid fragment specifiers are \
36
36
///
37
37
/// A collection of `self::TokenTree`. There may also be some errors emitted to `sess`.
38
38
pub ( super ) fn parse (
39
- input : tokenstream:: TokenStream ,
39
+ input : & tokenstream:: TokenStream ,
40
40
parsing_patterns : bool ,
41
41
sess : & ParseSess ,
42
42
node_id : NodeId ,
@@ -48,15 +48,15 @@ pub(super) fn parse(
48
48
49
49
// For each token tree in `input`, parse the token into a `self::TokenTree`, consuming
50
50
// additional trees if need be.
51
- let mut trees = input. into_trees ( ) ;
51
+ let mut trees = input. trees ( ) ;
52
52
while let Some ( tree) = trees. next ( ) {
53
53
// Given the parsed tree, if there is a metavar and we are expecting matchers, actually
54
54
// parse out the matcher (i.e., in `$id:ident` this would parse the `:` and `ident`).
55
55
let tree = parse_tree ( tree, & mut trees, parsing_patterns, sess, node_id, features, edition) ;
56
56
match tree {
57
57
TokenTree :: MetaVar ( start_sp, ident) if parsing_patterns => {
58
58
let span = match trees. next ( ) {
59
- Some ( tokenstream:: TokenTree :: Token ( Token { kind : token:: Colon , span } , _) ) => {
59
+ Some ( & tokenstream:: TokenTree :: Token ( Token { kind : token:: Colon , span } , _) ) => {
60
60
match trees. next ( ) {
61
61
Some ( tokenstream:: TokenTree :: Token ( token, _) ) => match token. ident ( ) {
62
62
Some ( ( frag, _) ) => {
@@ -96,10 +96,10 @@ pub(super) fn parse(
96
96
}
97
97
_ => token. span ,
98
98
} ,
99
- tree => tree. as_ref ( ) . map_or ( span, tokenstream:: TokenTree :: span) ,
99
+ tree => tree. map_or ( span, tokenstream:: TokenTree :: span) ,
100
100
}
101
101
}
102
- tree => tree. as_ref ( ) . map_or ( start_sp, tokenstream:: TokenTree :: span) ,
102
+ tree => tree. map_or ( start_sp, tokenstream:: TokenTree :: span) ,
103
103
} ;
104
104
105
105
result. push ( TokenTree :: MetaVarDecl ( span, ident, None ) ) ;
@@ -134,9 +134,9 @@ fn maybe_emit_macro_metavar_expr_feature(features: &Features, sess: &ParseSess,
134
134
/// - `parsing_patterns`: same as [parse].
135
135
/// - `sess`: the parsing session. Any errors will be emitted to this session.
136
136
/// - `features`: language features so we can do feature gating.
137
- fn parse_tree (
138
- tree : tokenstream:: TokenTree ,
139
- outer_trees : & mut impl Iterator < Item = tokenstream:: TokenTree > ,
137
+ fn parse_tree < ' a > (
138
+ tree : & ' a tokenstream:: TokenTree ,
139
+ outer_trees : & mut impl Iterator < Item = & ' a tokenstream:: TokenTree > ,
140
140
parsing_patterns : bool ,
141
141
sess : & ParseSess ,
142
142
node_id : NodeId ,
@@ -146,21 +146,21 @@ fn parse_tree(
146
146
// Depending on what `tree` is, we could be parsing different parts of a macro
147
147
match tree {
148
148
// `tree` is a `$` token. Look at the next token in `trees`
149
- tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span } , _) => {
149
+ & tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span } , _) => {
150
150
// FIXME: Handle `Invisible`-delimited groups in a more systematic way
151
151
// during parsing.
152
152
let mut next = outer_trees. next ( ) ;
153
- let mut trees: Box < dyn Iterator < Item = tokenstream:: TokenTree > > ;
153
+ let mut trees: Box < dyn Iterator < Item = & tokenstream:: TokenTree > > ;
154
154
if let Some ( tokenstream:: TokenTree :: Delimited ( _, Delimiter :: Invisible , tts) ) = next {
155
- trees = Box :: new ( tts. into_trees ( ) ) ;
155
+ trees = Box :: new ( tts. trees ( ) ) ;
156
156
next = trees. next ( ) ;
157
157
} else {
158
158
trees = Box :: new ( outer_trees) ;
159
159
}
160
160
161
161
match next {
162
162
// `tree` is followed by a delimited set of token trees.
163
- Some ( tokenstream:: TokenTree :: Delimited ( delim_span, delim, tts) ) => {
163
+ Some ( & tokenstream:: TokenTree :: Delimited ( delim_span, delim, ref tts) ) => {
164
164
if parsing_patterns {
165
165
if delim != Delimiter :: Parenthesis {
166
166
span_dollar_dollar_or_metavar_in_the_lhs_err (
@@ -228,7 +228,7 @@ fn parse_tree(
228
228
}
229
229
230
230
// `tree` is followed by another `$`. This is an escaped `$`.
231
- Some ( tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span } , _) ) => {
231
+ Some ( & tokenstream:: TokenTree :: Token ( Token { kind : token:: Dollar , span } , _) ) => {
232
232
if parsing_patterns {
233
233
span_dollar_dollar_or_metavar_in_the_lhs_err (
234
234
sess,
@@ -256,11 +256,11 @@ fn parse_tree(
256
256
}
257
257
258
258
// `tree` is an arbitrary token. Keep it.
259
- tokenstream:: TokenTree :: Token ( token, _) => TokenTree :: Token ( token) ,
259
+ tokenstream:: TokenTree :: Token ( token, _) => TokenTree :: Token ( token. clone ( ) ) ,
260
260
261
261
// `tree` is the beginning of a delimited set of tokens (e.g., `(` or `{`). We need to
262
262
// descend into the delimited set and further parse it.
263
- tokenstream:: TokenTree :: Delimited ( span, delim, tts) => TokenTree :: Delimited (
263
+ & tokenstream:: TokenTree :: Delimited ( span, delim, ref tts) => TokenTree :: Delimited (
264
264
span,
265
265
Delimited {
266
266
delim,
@@ -286,16 +286,16 @@ fn kleene_op(token: &Token) -> Option<KleeneOp> {
286
286
/// - Ok(Ok((op, span))) if the next token tree is a KleeneOp
287
287
/// - Ok(Err(tok, span)) if the next token tree is a token but not a KleeneOp
288
288
/// - Err(span) if the next token tree is not a token
289
- fn parse_kleene_op (
290
- input : & mut impl Iterator < Item = tokenstream:: TokenTree > ,
289
+ fn parse_kleene_op < ' a > (
290
+ input : & mut impl Iterator < Item = & ' a tokenstream:: TokenTree > ,
291
291
span : Span ,
292
292
) -> Result < Result < ( KleeneOp , Span ) , Token > , Span > {
293
293
match input. next ( ) {
294
294
Some ( tokenstream:: TokenTree :: Token ( token, _) ) => match kleene_op ( & token) {
295
295
Some ( op) => Ok ( Ok ( ( op, token. span ) ) ) ,
296
- None => Ok ( Err ( token) ) ,
296
+ None => Ok ( Err ( token. clone ( ) ) ) ,
297
297
} ,
298
- tree => Err ( tree. as_ref ( ) . map_or ( span, tokenstream:: TokenTree :: span) ) ,
298
+ tree => Err ( tree. map_or ( span, tokenstream:: TokenTree :: span) ) ,
299
299
}
300
300
}
301
301
@@ -311,8 +311,8 @@ fn parse_kleene_op(
311
311
/// session `sess`. If the next one (or possibly two) tokens in `input` correspond to a Kleene
312
312
/// operator and separator, then a tuple with `(separator, KleeneOp)` is returned. Otherwise, an
313
313
/// error with the appropriate span is emitted to `sess` and a dummy value is returned.
314
- fn parse_sep_and_kleene_op (
315
- input : & mut impl Iterator < Item = tokenstream:: TokenTree > ,
314
+ fn parse_sep_and_kleene_op < ' a > (
315
+ input : & mut impl Iterator < Item = & ' a tokenstream:: TokenTree > ,
316
316
span : Span ,
317
317
sess : & ParseSess ,
318
318
) -> ( Option < Token > , KleeneToken ) {
0 commit comments