cleanup dependence of `ExtCtxt` in transcribe when macro expansion · rust-lang/rust@2782123
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};
171617+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());
141142143+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}
208208209209LockstepIterSize::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}
218218219219LockstepIterSize::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`
@@ -259,7 +257,7 @@ pub(super) fn transcribe<'a>(
259257MatchedSingle(ParseNtResult::Tt(tt)) => {
260258// `tt`s are emitted into the output stream directly as "raw tokens",
261259// without wrapping them into groups.
262-maybe_use_metavar_location(cx, &stack, sp, tt, &mut marker)
260+maybe_use_metavar_location(psess, &stack, sp, tt, &mut marker)
263261}
264262MatchedSingle(ParseNtResult::Ident(ident, is_raw)) => {
265263 marker.visit_span(&mut sp);
@@ -280,7 +278,7 @@ pub(super) fn transcribe<'a>(
280278}
281279MatchedSeq(..) => {
282280// We were unable to descend far enough. This is an error.
283-return Err(cx.dcx().create_err(VarStillRepeating { span: sp, ident }));
281+return Err(dcx.create_err(VarStillRepeating { span: sp, ident }));
284282}
285283};
286284 result.push(tt)
@@ -299,7 +297,7 @@ pub(super) fn transcribe<'a>(
299297300298// Replace meta-variable expressions with the result of their expansion.
301299 mbe::TokenTree::MetaVarExpr(sp, expr) => {
302-transcribe_metavar_expr(cx, expr, interp, &mut marker, &repeats, &mut result, sp)?;
300+transcribe_metavar_expr(dcx, expr, interp, &mut marker, &repeats, &mut result, sp)?;
303301}
304302305303// If we are entering a new delimiter, we push its contents to the `stack` to be
@@ -359,7 +357,7 @@ pub(super) fn transcribe<'a>(
359357/// combine with each other and not with tokens outside of the sequence.
360358/// - The metavariable span comes from a different crate, then we prefer the more local span.
361359fn maybe_use_metavar_location(
362-cx: &ExtCtxt<'_>,
360+psess: &ParseSess,
363361stack: &[Frame<'_>],
364362mut metavar_span: Span,
365363orig_tt: &TokenTree,
@@ -397,7 +395,7 @@ fn maybe_use_metavar_location(
397395&& insert(mspans, dspan.entire(), metavar_span)
398396}),
399397};
400-if no_collision || cx.source_map().is_imported(metavar_span) {
398+if no_collision || psess.source_map().is_imported(metavar_span) {
401399return orig_tt.clone();
402400}
403401@@ -558,7 +556,7 @@ fn lockstep_iter_size(
558556/// * `[ $( ${count(foo, 1)} ),* ]` will return an error because `${count(foo, 1)}` is
559557/// declared inside a single repetition and the index `1` implies two nested repetitions.
560558fn count_repetitions<'a>(
561-cx: &ExtCtxt<'a>,
559+dcx: &'a DiagCtxt,
562560depth_user: usize,
563561mut matched: &NamedMatch,
564562repeats: &[(usize, usize)],
@@ -595,7 +593,7 @@ fn count_repetitions<'a>(
595593.and_then(|el| el.checked_sub(repeats.len()))
596594.unwrap_or_default();
597595if depth_user > depth_max {
598-return Err(out_of_bounds_err(cx, depth_max + 1, sp.entire(), "count"));
596+return Err(out_of_bounds_err(dcx, depth_max + 1, sp.entire(), "count"));
599597}
600598601599// `repeats` records all of the nested levels at which we are currently
@@ -611,15 +609,15 @@ fn count_repetitions<'a>(
611609}
612610613611if let MatchedSingle(_) = matched {
614-return Err(cx.dcx().create_err(CountRepetitionMisplaced { span: sp.entire() }));
612+return Err(dcx.create_err(CountRepetitionMisplaced { span: sp.entire() }));
615613}
616614617615count(depth_user, depth_max, matched)
618616}
619617620618/// Returns a `NamedMatch` item declared on the LHS given an arbitrary [Ident]
621619fn matched_from_ident<'ctx, 'interp, 'rslt>(
622-cx: &ExtCtxt<'ctx>,
620+dcx: &'ctx DiagCtxt,
623621ident: Ident,
624622interp: &'interp FxHashMap<MacroRulesNormalizedIdent, NamedMatch>,
625623) -> PResult<'ctx, &'rslt NamedMatch>
@@ -628,12 +626,12 @@ where
628626{
629627let span = ident.span;
630628let key = MacroRulesNormalizedIdent::new(ident);
631- interp.get(&key).ok_or_else(|| cx.dcx().create_err(MetaVarExprUnrecognizedVar { span, key }))
629+ interp.get(&key).ok_or_else(|| dcx.create_err(MetaVarExprUnrecognizedVar { span, key }))
632630}
633631634632/// Used by meta-variable expressions when an user input is out of the actual declared bounds. For
635633/// example, index(999999) in an repetition of only three elements.
636-fn out_of_bounds_err<'a>(cx: &ExtCtxt<'a>, max: usize, span: Span, ty: &str) -> Diag<'a> {
634+fn out_of_bounds_err<'a>(dcx: &'a DiagCtxt, max: usize, span: Span, ty: &str) -> Diag<'a> {
637635let msg = if max == 0 {
638636format!(
639637"meta-variable expression `{ty}` with depth parameter \
@@ -645,11 +643,11 @@ fn out_of_bounds_err<'a>(cx: &ExtCtxt<'a>, max: usize, span: Span, ty: &str) ->
645643 must be less than {max}"
646644)
647645};
648-cx.dcx().struct_span_err(span, msg)
646+ dcx.struct_span_err(span, msg)
649647}
650648651649fn transcribe_metavar_expr<'a>(
652-cx: &ExtCtxt<'a>,
650+dcx: &'a DiagCtxt,
653651expr: &MetaVarExpr,
654652interp: &FxHashMap<MacroRulesNormalizedIdent, NamedMatch>,
655653marker: &mut Marker,
@@ -664,8 +662,8 @@ fn transcribe_metavar_expr<'a>(
664662};
665663match *expr {
666664MetaVarExpr::Count(original_ident, depth) => {
667-let matched = matched_from_ident(cx, original_ident, interp)?;
668-let count = count_repetitions(cx, depth, matched, repeats, sp)?;
665+let matched = matched_from_ident(dcx, original_ident, interp)?;
666+let count = count_repetitions(dcx, depth, matched, repeats, sp)?;
669667let tt = TokenTree::token_alone(
670668TokenKind::lit(token::Integer, sym::integer(count), None),
671669visited_span(),
@@ -674,7 +672,7 @@ fn transcribe_metavar_expr<'a>(
674672}
675673MetaVarExpr::Ignore(original_ident) => {
676674// Used to ensure that `original_ident` is present in the LHS
677-let _ = matched_from_ident(cx, original_ident, interp)?;
675+let _ = matched_from_ident(dcx, original_ident, interp)?;
678676}
679677MetaVarExpr::Index(depth) => match repeats.iter().nth_back(depth) {
680678Some((index, _)) => {
@@ -683,7 +681,7 @@ fn transcribe_metavar_expr<'a>(
683681visited_span(),
684682));
685683}
686-None => return Err(out_of_bounds_err(cx, repeats.len(), sp.entire(), "index")),
684+None => return Err(out_of_bounds_err(dcx, repeats.len(), sp.entire(), "index")),
687685},
688686MetaVarExpr::Len(depth) => match repeats.iter().nth_back(depth) {
689687Some((_, length)) => {
@@ -692,7 +690,7 @@ fn transcribe_metavar_expr<'a>(
692690visited_span(),
693691));
694692}
695-None => return Err(out_of_bounds_err(cx, repeats.len(), sp.entire(), "len")),
693+None => return Err(out_of_bounds_err(dcx, repeats.len(), sp.entire(), "len")),
696694},
697695}
698696Ok(())