Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf50b4f5

Browse files
Rollup merge of#125530 - SparrowLii:expand2, r=petrochenkov
cleanup dependence of `ExtCtxt` in transcribe when macro expansionpart of#125356We can remove `transcribe`’s dependence on `ExtCtxt` to facilitate subsequent work (such as moving macro expansion into the incremental compilation system)r? ```@petrochenkov```Thanks for the reviewing!
2 parentsad37f40 +2782123 commitf50b4f5

File tree

2 files changed

+31
-32
lines changed

2 files changed

+31
-32
lines changed

‎compiler/rustc_expand/src/mbe/macro_rules.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ fn expand_macro<'cx>(
223223
let arm_span = rhses[i].span();
224224

225225
// rhs has holes ( `$id` and `$(...)` that need filled)
226-
let tts =matchtranscribe(cx,&named_matches, rhs, rhs_span, transparency){
226+
let id = cx.current_expansion.id;
227+
let tts =matchtranscribe(psess,&named_matches, rhs, rhs_span, transparency, id){
227228
Ok(tts) => tts,
228229
Err(err) =>{
229230
let guar = err.emit();

‎compiler/rustc_expand/src/mbe/transcribe.rs‎

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
usecrate::base::ExtCtxt;
21
usecrate::errors::{
32
CountRepetitionMisplaced,MetaVarExprUnrecognizedVar,MetaVarsDifSeqMatchers,MustRepeatOnce,
43
NoSyntaxVarsExprRepeat,VarStillRepeating,
@@ -9,12 +8,13 @@ use rustc_ast::mut_visit::{self, MutVisitor};
98
use rustc_ast::token::{self,Delimiter,Token,TokenKind};
109
use rustc_ast::tokenstream::{DelimSpacing,DelimSpan,Spacing,TokenStream,TokenTree};
1110
use rustc_data_structures::fx::FxHashMap;
12-
use rustc_errors::{pluralize,Diag,PResult};
11+
use rustc_errors::{pluralize,Diag,DiagCtxt,PResult};
1312
use rustc_parse::parser::ParseNtResult;
1413
use rustc_span::hygiene::{LocalExpnId,Transparency};
1514
use rustc_span::symbol::{sym,Ident,MacroRulesNormalizedIdent};
1615
use rustc_span::{with_metavar_spans,Span,SyntaxContext};
1716

17+
use rustc_session::parse::ParseSess;
1818
use smallvec::{smallvec,SmallVec};
1919
use std::mem;
2020

@@ -99,11 +99,12 @@ impl<'a> Iterator for Frame<'a> {
9999
///
100100
/// Along the way, we do some additional error checking.
101101
pub(super)fntranscribe<'a>(
102-
cx:&ExtCtxt<'a>,
102+
psess:&'aParseSess,
103103
interp:&FxHashMap<MacroRulesNormalizedIdent,NamedMatch>,
104104
src:&mbe::Delimited,
105105
src_span:DelimSpan,
106106
transparency:Transparency,
107+
expand_id:LocalExpnId,
107108
) ->PResult<'a,TokenStream>{
108109
// Nothing for us to transcribe...
109110
if src.tts.is_empty(){
@@ -137,8 +138,9 @@ pub(super) fn transcribe<'a>(
137138
// again, and we are done transcribing.
138139
letmut result:Vec<TokenTree> =Vec::new();
139140
letmut result_stack =Vec::new();
140-
letmut marker =Marker(cx.current_expansion.id, transparency,Default::default());
141+
letmut marker =Marker(expand_id, transparency,Default::default());
141142

143+
let dcx =&psess.dcx;
142144
loop{
143145
// Look at the last frame on the stack.
144146
// If it still has a TokenTree we have not looked at yet, use that tree.
@@ -201,19 +203,17 @@ pub(super) fn transcribe<'a>(
201203
seq @ mbe::TokenTree::Sequence(_, seq_rep) =>{
202204
matchlockstep_iter_size(seq, interp,&repeats){
203205
LockstepIterSize::Unconstrained =>{
204-
returnErr(cx
205-
.dcx()
206-
.create_err(NoSyntaxVarsExprRepeat{span: seq.span()}));
206+
returnErr(dcx.create_err(NoSyntaxVarsExprRepeat{span: seq.span()}));
207207
}
208208

209209
LockstepIterSize::Contradiction(msg) =>{
210210
// FIXME: this really ought to be caught at macro definition time... It
211211
// happens when two meta-variables are used in the same repetition in a
212212
// sequence, but they come from different sequence matchers and repeat
213213
// different amounts.
214-
returnErr(cx
215-
.dcx()
216-
.create_err(MetaVarsDifSeqMatchers{span: seq.span(), msg}));
214+
returnErr(
215+
dcx.create_err(MetaVarsDifSeqMatchers{span: seq.span(), msg})
216+
);
217217
}
218218

219219
LockstepIterSize::Constraint(len, _) =>{
@@ -227,9 +227,7 @@ pub(super) fn transcribe<'a>(
227227
// FIXME: this really ought to be caught at macro definition
228228
// time... It happens when the Kleene operator in the matcher and
229229
// the body for the same meta-variable do not match.
230-
returnErr(cx
231-
.dcx()
232-
.create_err(MustRepeatOnce{span: sp.entire()}));
230+
returnErr(dcx.create_err(MustRepeatOnce{span: sp.entire()}));
233231
}
234232
}else{
235233
// 0 is the initial counter (we have done 0 repetitions so far). `len`
@@ -274,7 +272,7 @@ pub(super) fn transcribe<'a>(
274272
MatchedSingle(ParseNtResult::Tt(tt)) =>{
275273
// `tt`s are emitted into the output stream directly as "raw tokens",
276274
// without wrapping them into groups.
277-
maybe_use_metavar_location(cx,&stack, sp, tt,&mut marker)
275+
maybe_use_metavar_location(psess,&stack, sp, tt,&mut marker)
278276
}
279277
MatchedSingle(ParseNtResult::Ident(ident, is_raw)) =>{
280278
marker.visit_span(&mut sp);
@@ -295,7 +293,7 @@ pub(super) fn transcribe<'a>(
295293
}
296294
MatchedSeq(..) =>{
297295
// We were unable to descend far enough. This is an error.
298-
returnErr(cx.dcx().create_err(VarStillRepeating{span: sp, ident}));
296+
returnErr(dcx.create_err(VarStillRepeating{span: sp, ident}));
299297
}
300298
};
301299
result.push(tt)
@@ -314,7 +312,7 @@ pub(super) fn transcribe<'a>(
314312

315313
// Replace meta-variable expressions with the result of their expansion.
316314
mbe::TokenTree::MetaVarExpr(sp, expr) =>{
317-
transcribe_metavar_expr(cx, expr, interp,&mut marker,&repeats,&mut result, sp)?;
315+
transcribe_metavar_expr(dcx, expr, interp,&mut marker,&repeats,&mut result, sp)?;
318316
}
319317

320318
// If we are entering a new delimiter, we push its contents to the `stack` to be
@@ -374,7 +372,7 @@ pub(super) fn transcribe<'a>(
374372
/// combine with each other and not with tokens outside of the sequence.
375373
/// - The metavariable span comes from a different crate, then we prefer the more local span.
376374
fnmaybe_use_metavar_location(
377-
cx:&ExtCtxt<'_>,
375+
psess:&ParseSess,
378376
stack:&[Frame<'_>],
379377
mutmetavar_span:Span,
380378
orig_tt:&TokenTree,
@@ -412,7 +410,7 @@ fn maybe_use_metavar_location(
412410
&&insert(mspans, dspan.entire(), metavar_span)
413411
}),
414412
};
415-
if no_collision ||cx.source_map().is_imported(metavar_span){
413+
if no_collision ||psess.source_map().is_imported(metavar_span){
416414
return orig_tt.clone();
417415
}
418416

@@ -573,7 +571,7 @@ fn lockstep_iter_size(
573571
/// * `[ $( ${count(foo, 1)} ),* ]` will return an error because `${count(foo, 1)}` is
574572
/// declared inside a single repetition and the index `1` implies two nested repetitions.
575573
fncount_repetitions<'a>(
576-
cx:&ExtCtxt<'a>,
574+
dcx:&'aDiagCtxt,
577575
depth_user:usize,
578576
mutmatched:&NamedMatch,
579577
repeats:&[(usize,usize)],
@@ -610,7 +608,7 @@ fn count_repetitions<'a>(
610608
.and_then(|el| el.checked_sub(repeats.len()))
611609
.unwrap_or_default();
612610
if depth_user > depth_max{
613-
returnErr(out_of_bounds_err(cx, depth_max +1, sp.entire(),"count"));
611+
returnErr(out_of_bounds_err(dcx, depth_max +1, sp.entire(),"count"));
614612
}
615613

616614
// `repeats` records all of the nested levels at which we are currently
@@ -626,15 +624,15 @@ fn count_repetitions<'a>(
626624
}
627625

628626
ifletMatchedSingle(_) = matched{
629-
returnErr(cx.dcx().create_err(CountRepetitionMisplaced{span: sp.entire()}));
627+
returnErr(dcx.create_err(CountRepetitionMisplaced{span: sp.entire()}));
630628
}
631629

632630
count(depth_user, depth_max, matched)
633631
}
634632

635633
/// Returns a `NamedMatch` item declared on the LHS given an arbitrary [Ident]
636634
fnmatched_from_ident<'ctx,'interp,'rslt>(
637-
cx:&ExtCtxt<'ctx>,
635+
dcx:&'ctxDiagCtxt,
638636
ident:Ident,
639637
interp:&'interpFxHashMap<MacroRulesNormalizedIdent,NamedMatch>,
640638
) ->PResult<'ctx,&'rsltNamedMatch>
@@ -643,12 +641,12 @@ where
643641
{
644642
let span = ident.span;
645643
let key =MacroRulesNormalizedIdent::new(ident);
646-
interp.get(&key).ok_or_else(||cx.dcx().create_err(MetaVarExprUnrecognizedVar{ span, key}))
644+
interp.get(&key).ok_or_else(|| dcx.create_err(MetaVarExprUnrecognizedVar{ span, key}))
647645
}
648646

649647
/// Used by meta-variable expressions when an user input is out of the actual declared bounds. For
650648
/// example, index(999999) in an repetition of only three elements.
651-
fnout_of_bounds_err<'a>(cx:&ExtCtxt<'a>,max:usize,span:Span,ty:&str) ->Diag<'a>{
649+
fnout_of_bounds_err<'a>(dcx:&'aDiagCtxt,max:usize,span:Span,ty:&str) ->Diag<'a>{
652650
let msg =if max ==0{
653651
format!(
654652
"meta-variable expression `{ty}` with depth parameter\
@@ -660,11 +658,11 @@ fn out_of_bounds_err<'a>(cx: &ExtCtxt<'a>, max: usize, span: Span, ty: &str) ->
660658
must be less than {max}"
661659
)
662660
};
663-
cx.dcx().struct_span_err(span, msg)
661+
dcx.struct_span_err(span, msg)
664662
}
665663

666664
fntranscribe_metavar_expr<'a>(
667-
cx:&ExtCtxt<'a>,
665+
dcx:&'aDiagCtxt,
668666
expr:&MetaVarExpr,
669667
interp:&FxHashMap<MacroRulesNormalizedIdent,NamedMatch>,
670668
marker:&mutMarker,
@@ -679,8 +677,8 @@ fn transcribe_metavar_expr<'a>(
679677
};
680678
match*expr{
681679
MetaVarExpr::Count(original_ident, depth) =>{
682-
let matched =matched_from_ident(cx, original_ident, interp)?;
683-
let count =count_repetitions(cx, depth, matched, repeats, sp)?;
680+
let matched =matched_from_ident(dcx, original_ident, interp)?;
681+
let count =count_repetitions(dcx, depth, matched, repeats, sp)?;
684682
let tt =TokenTree::token_alone(
685683
TokenKind::lit(token::Integer, sym::integer(count),None),
686684
visited_span(),
@@ -689,7 +687,7 @@ fn transcribe_metavar_expr<'a>(
689687
}
690688
MetaVarExpr::Ignore(original_ident) =>{
691689
// Used to ensure that `original_ident` is present in the LHS
692-
let _ =matched_from_ident(cx, original_ident, interp)?;
690+
let _ =matched_from_ident(dcx, original_ident, interp)?;
693691
}
694692
MetaVarExpr::Index(depth) =>match repeats.iter().nth_back(depth){
695693
Some((index, _)) =>{
@@ -698,7 +696,7 @@ fn transcribe_metavar_expr<'a>(
698696
visited_span(),
699697
));
700698
}
701-
None =>returnErr(out_of_bounds_err(cx, repeats.len(), sp.entire(),"index")),
699+
None =>returnErr(out_of_bounds_err(dcx, repeats.len(), sp.entire(),"index")),
702700
},
703701
MetaVarExpr::Len(depth) =>match repeats.iter().nth_back(depth){
704702
Some((_, length)) =>{
@@ -707,7 +705,7 @@ fn transcribe_metavar_expr<'a>(
707705
visited_span(),
708706
));
709707
}
710-
None =>returnErr(out_of_bounds_err(cx, repeats.len(), sp.entire(),"len")),
708+
None =>returnErr(out_of_bounds_err(dcx, repeats.len(), sp.entire(),"len")),
711709
},
712710
}
713711
Ok(())

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp