Rollup merge of #137565 - compiler-errors:macro-ex, r=estebank
Try to point of macro expansion from resolver and method errors if it involves macro var In the case that a macro caller passes an identifier into a macro generating a path or method expression, point out that identifier in the context of the *macro* so it's a bit more clear how the macro is involved in causing the error. r? ``````````@estebank`````````` or reassign
This commit is contained in:
commit
aab7b145d0
17 changed files with 225 additions and 15 deletions
|
@ -1057,6 +1057,37 @@ impl Span {
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns the `Span` within the syntax context of "within". This is useful when
|
||||
/// "self" is an expansion from a macro variable, since this can be used for
|
||||
/// providing extra macro expansion context for certain errors.
|
||||
///
|
||||
/// ```text
|
||||
/// macro_rules! m {
|
||||
/// ($ident:ident) => { ($ident,) }
|
||||
/// }
|
||||
///
|
||||
/// m!(outer_ident);
|
||||
/// ```
|
||||
///
|
||||
/// If "self" is the span of the outer_ident, and "within" is the span of the `($ident,)`
|
||||
/// expr, then this will return the span of the `$ident` macro variable.
|
||||
pub fn within_macro(self, within: Span, sm: &SourceMap) -> Option<Span> {
|
||||
match Span::prepare_to_combine(self, within) {
|
||||
// Only return something if it doesn't overlap with the original span,
|
||||
// and the span isn't "imported" (i.e. from unavailable sources).
|
||||
// FIXME: This does limit the usefulness of the error when the macro is
|
||||
// from a foreign crate; we could also take into account `-Zmacro-backtrace`,
|
||||
// which doesn't redact this span (but that would mean passing in even more
|
||||
// args to this function, lol).
|
||||
Ok((self_, _, parent))
|
||||
if self_.hi < self.lo() || self.hi() < self_.lo && !sm.is_imported(within) =>
|
||||
{
|
||||
Some(Span::new(self_.lo, self_.hi, self_.ctxt, parent))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn from_inner(self, inner: InnerSpan) -> Span {
|
||||
let span = self.data();
|
||||
Span::new(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue