1- use crate :: base:: ExtCtxt ;
21use crate :: errors:: {
32CountRepetitionMisplaced , MetaVarExprUnrecognizedVar , MetaVarsDifSeqMatchers , MustRepeatOnce ,
43NoSyntaxVarsExprRepeat , VarStillRepeating ,
@@ -9,12 +8,13 @@ use rustc_ast::mut_visit::{self, MutVisitor};
98use rustc_ast:: token:: { self , Delimiter , Token , TokenKind } ;
109use rustc_ast:: tokenstream:: { DelimSpacing , DelimSpan , Spacing , TokenStream , TokenTree } ;
1110use rustc_data_structures:: fx:: FxHashMap ;
12- use rustc_errors:: { pluralize, Diag , PResult } ;
11+ use rustc_errors:: { pluralize, Diag , DiagCtxt , PResult } ;
1312use rustc_parse:: parser:: ParseNtResult ;
1413use rustc_span:: hygiene:: { LocalExpnId , Transparency } ;
1514use rustc_span:: symbol:: { sym, Ident , MacroRulesNormalizedIdent } ;
1615use rustc_span:: { with_metavar_spans, Span , SyntaxContext } ;
1716
17+ use rustc_session:: parse:: ParseSess ;
1818use smallvec:: { smallvec, SmallVec } ;
1919use std:: mem;
2020
@@ -99,11 +99,12 @@ impl<'a> Iterator for Frame<'a> {
9999///
100100/// Along the way, we do some additional error checking.
101101pub ( super ) fn transcribe < ' a > (
102- cx : & ExtCtxt < ' a > ,
102+ psess : & ' a ParseSess ,
103103interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
104104src : & mbe:: Delimited ,
105105src_span : DelimSpan ,
106106transparency : Transparency ,
107+ expand_id : LocalExpnId ,
107108) ->PResult < ' a , TokenStream > {
108109// Nothing for us to transcribe...
109110if src. tts . is_empty ( ) {
@@ -137,8 +138,9 @@ pub(super) fn transcribe<'a>(
137138// again, and we are done transcribing.
138139let mut result: Vec < TokenTree > =Vec :: new ( ) ;
139140let mut result_stack =Vec :: new ( ) ;
140- let mut marker =Marker ( cx . current_expansion . id , transparency, Default :: default ( ) ) ;
141+ let mut marker =Marker ( expand_id , transparency, Default :: default ( ) ) ;
141142
143+ let dcx =& psess. dcx ;
142144loop {
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) =>{
202204match lockstep_iter_size ( seq, interp, & repeats) {
203205LockstepIterSize :: Unconstrained =>{
204- return Err ( cx
205- . dcx ( )
206- . create_err ( NoSyntaxVarsExprRepeat { span : seq. span ( ) } ) ) ;
206+ return Err ( dcx. create_err ( NoSyntaxVarsExprRepeat { span : seq. span ( ) } ) ) ;
207207}
208208
209209LockstepIterSize :: 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- return Err ( cx
215- . dcx ( )
216- . create_err ( MetaVarsDifSeqMatchers { span : seq . span ( ) , msg } ) ) ;
214+ return Err (
215+ dcx. create_err ( MetaVarsDifSeqMatchers { span : seq . span ( ) , msg } )
216+ ) ;
217217}
218218
219219LockstepIterSize :: 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- return Err ( cx
231- . dcx ( )
232- . create_err ( MustRepeatOnce { span : sp. entire ( ) } ) ) ;
230+ return Err ( 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>(
274272MatchedSingle ( 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}
279277MatchedSingle ( ParseNtResult :: Ident ( ident, is_raw) ) =>{
280278 marker. visit_span ( & mut sp) ;
@@ -295,7 +293,7 @@ pub(super) fn transcribe<'a>(
295293}
296294MatchedSeq ( ..) =>{
297295// We were unable to descend far enough. This is an error.
298- return Err ( cx . dcx ( ) . create_err ( VarStillRepeating { span : sp, ident} ) ) ;
296+ return Err ( 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.
376374fn maybe_use_metavar_location (
377- cx : & ExtCtxt < ' _ > ,
375+ psess : & ParseSess ,
378376stack : & [ Frame < ' _ > ] ,
379377mut metavar_span : Span ,
380378orig_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) {
416414return 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.
575573fn count_repetitions < ' a > (
576- cx : & ExtCtxt < ' a > ,
574+ dcx : & ' a DiagCtxt ,
577575depth_user : usize ,
578576mut matched : & NamedMatch ,
579577repeats : & [ ( usize , usize ) ] ,
@@ -610,7 +608,7 @@ fn count_repetitions<'a>(
610608. and_then ( |el| el. checked_sub ( repeats. len ( ) ) )
611609. unwrap_or_default ( ) ;
612610if depth_user > depth_max{
613- return Err ( out_of_bounds_err ( cx , depth_max +1 , sp. entire ( ) , "count" ) ) ;
611+ return Err ( 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
628626if let MatchedSingle ( _) = matched{
629- return Err ( cx . dcx ( ) . create_err ( CountRepetitionMisplaced { span : sp. entire ( ) } ) ) ;
627+ return Err ( dcx. create_err ( CountRepetitionMisplaced { span : sp. entire ( ) } ) ) ;
630628}
631629
632630count ( depth_user, depth_max, matched)
633631}
634632
635633/// Returns a `NamedMatch` item declared on the LHS given an arbitrary [Ident]
636634fn matched_from_ident < ' ctx , ' interp , ' rslt > (
637- cx : & ExtCtxt < ' ctx > ,
635+ dcx : & ' ctx DiagCtxt ,
638636ident : Ident ,
639637interp : & ' interp FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
640638) ->PResult < ' ctx , & ' rslt NamedMatch >
@@ -643,12 +641,12 @@ where
643641{
644642let span = ident. span ;
645643let 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- fn out_of_bounds_err < ' a > ( cx : & ExtCtxt < ' a > , max : usize , span : Span , ty : & str ) ->Diag < ' a > {
649+ fn out_of_bounds_err < ' a > ( dcx : & ' a DiagCtxt , max : usize , span : Span , ty : & str ) ->Diag < ' a > {
652650let msg =if max ==0 {
653651format ! (
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
666664fn transcribe_metavar_expr < ' a > (
667- cx : & ExtCtxt < ' a > ,
665+ dcx : & ' a DiagCtxt ,
668666expr : & MetaVarExpr ,
669667interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
670668marker : & mut Marker ,
@@ -679,8 +677,8 @@ fn transcribe_metavar_expr<'a>(
679677} ;
680678match * expr{
681679MetaVarExpr :: 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) ?;
684682let tt =TokenTree :: token_alone (
685683TokenKind :: lit ( token:: Integer , sym:: integer ( count) , None ) ,
686684visited_span ( ) ,
@@ -689,7 +687,7 @@ fn transcribe_metavar_expr<'a>(
689687}
690688MetaVarExpr :: 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}
694692MetaVarExpr :: Index ( depth) =>match repeats. iter ( ) . nth_back ( depth) {
695693Some ( ( index, _) ) =>{
@@ -698,7 +696,7 @@ fn transcribe_metavar_expr<'a>(
698696visited_span ( ) ,
699697) ) ;
700698}
701- None =>return Err ( out_of_bounds_err ( cx , repeats. len ( ) , sp. entire ( ) , "index" ) ) ,
699+ None =>return Err ( out_of_bounds_err ( dcx , repeats. len ( ) , sp. entire ( ) , "index" ) ) ,
702700} ,
703701MetaVarExpr :: Len ( depth) =>match repeats. iter ( ) . nth_back ( depth) {
704702Some ( ( _, length) ) =>{
@@ -707,7 +705,7 @@ fn transcribe_metavar_expr<'a>(
707705visited_span ( ) ,
708706) ) ;
709707}
710- None =>return Err ( out_of_bounds_err ( cx , repeats. len ( ) , sp. entire ( ) , "len" ) ) ,
708+ None =>return Err ( out_of_bounds_err ( dcx , repeats. len ( ) , sp. entire ( ) , "len" ) ) ,
711709} ,
712710}
713711Ok ( ( ) )