Auto merge of #134478 - compiler-errors:attr-span, r=oli-obk
Properly record metavar spans for other expansions other than TT This properly records metavar spans for nonterminals other than tokentree. This means that we operations like `span.to(other_span)` work correctly for macros. As you can see, other diagnostics involving metavars have improved as a result. Fixes #132908 Alternative to #133270 cc `@ehuss` cc `@petrochenkov`
This commit is contained in:
commit
dee7d0e730
12 changed files with 105 additions and 34 deletions
|
@ -282,11 +282,13 @@ pub(super) fn transcribe<'a>(
|
|||
}
|
||||
MatchedSingle(ParseNtResult::Ident(ident, is_raw)) => {
|
||||
marker.visit_span(&mut sp);
|
||||
with_metavar_spans(|mspans| mspans.insert(ident.span, sp));
|
||||
let kind = token::NtIdent(*ident, *is_raw);
|
||||
TokenTree::token_alone(kind, sp)
|
||||
}
|
||||
MatchedSingle(ParseNtResult::Lifetime(ident, is_raw)) => {
|
||||
marker.visit_span(&mut sp);
|
||||
with_metavar_spans(|mspans| mspans.insert(ident.span, sp));
|
||||
let kind = token::NtLifetime(*ident, *is_raw);
|
||||
TokenTree::token_alone(kind, sp)
|
||||
}
|
||||
|
@ -295,6 +297,8 @@ pub(super) fn transcribe<'a>(
|
|||
// `Delimiter::Invisible` to maintain parsing priorities.
|
||||
// `Interpolated` is currently used for such groups in rustc parser.
|
||||
marker.visit_span(&mut sp);
|
||||
let use_span = nt.use_span();
|
||||
with_metavar_spans(|mspans| mspans.insert(use_span, sp));
|
||||
TokenTree::token_alone(token::Interpolated(Lrc::clone(nt)), sp)
|
||||
}
|
||||
MatchedSeq(..) => {
|
||||
|
@ -410,19 +414,15 @@ fn maybe_use_metavar_location(
|
|||
return orig_tt.clone();
|
||||
}
|
||||
|
||||
let insert = |mspans: &mut FxHashMap<_, _>, s, ms| match mspans.try_insert(s, ms) {
|
||||
Ok(_) => true,
|
||||
Err(err) => *err.entry.get() == ms, // Tried to insert the same span, still success
|
||||
};
|
||||
marker.visit_span(&mut metavar_span);
|
||||
let no_collision = match orig_tt {
|
||||
TokenTree::Token(token, ..) => {
|
||||
with_metavar_spans(|mspans| insert(mspans, token.span, metavar_span))
|
||||
with_metavar_spans(|mspans| mspans.insert(token.span, metavar_span))
|
||||
}
|
||||
TokenTree::Delimited(dspan, ..) => with_metavar_spans(|mspans| {
|
||||
insert(mspans, dspan.open, metavar_span)
|
||||
&& insert(mspans, dspan.close, metavar_span)
|
||||
&& insert(mspans, dspan.entire(), metavar_span)
|
||||
mspans.insert(dspan.open, metavar_span)
|
||||
&& mspans.insert(dspan.close, metavar_span)
|
||||
&& mspans.insert(dspan.entire(), metavar_span)
|
||||
}),
|
||||
};
|
||||
if no_collision || psess.source_map().is_imported(metavar_span) {
|
||||
|
@ -434,14 +434,14 @@ fn maybe_use_metavar_location(
|
|||
match orig_tt {
|
||||
TokenTree::Token(Token { kind, span }, spacing) => {
|
||||
let span = metavar_span.with_ctxt(span.ctxt());
|
||||
with_metavar_spans(|mspans| insert(mspans, span, metavar_span));
|
||||
with_metavar_spans(|mspans| mspans.insert(span, metavar_span));
|
||||
TokenTree::Token(Token { kind: kind.clone(), span }, *spacing)
|
||||
}
|
||||
TokenTree::Delimited(dspan, dspacing, delimiter, tts) => {
|
||||
let open = metavar_span.with_ctxt(dspan.open.ctxt());
|
||||
let close = metavar_span.with_ctxt(dspan.close.ctxt());
|
||||
with_metavar_spans(|mspans| {
|
||||
insert(mspans, open, metavar_span) && insert(mspans, close, metavar_span)
|
||||
mspans.insert(open, metavar_span) && mspans.insert(close, metavar_span)
|
||||
});
|
||||
let dspan = DelimSpan::from_pair(open, close);
|
||||
TokenTree::Delimited(dspan, *dspacing, *delimiter, tts.clone())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue