未验证 提交 c6cd57dd 编写于 作者: K kennytm

Rollup merge of #55292 - estebank:macro-eof, r=pnkfelix

Macro diagnostics tweaks

Fix #30128, fix #10951 by adding an appropriate span to the diagnostic.
Fix #26288 by suggesting adding semicolon to macro call.
......@@ -1036,10 +1036,28 @@ pub fn ensure_complete_parse(&mut self, macro_path: &Path, kind_name: &str, span
// Avoid emitting backtrace info twice.
let def_site_span = self.span.with_ctxt(SyntaxContext::empty());
let mut err = self.diagnostic().struct_span_err(def_site_span, &msg);
let msg = format!("caused by the macro expansion here; the usage \
of `{}!` is likely invalid in {} context",
macro_path, kind_name);
err.span_note(span, &msg).emit();
err.span_label(span, "caused by the macro expansion here");
let msg = format!(
"the usage of `{}!` is likely invalid in {} context",
macro_path,
kind_name,
);
err.note(&msg);
let semi_span = self.sess.source_map().next_point(span);
let semi_full_span = semi_span.to(self.sess.source_map().next_point(semi_span));
match self.sess.source_map().span_to_snippet(semi_full_span) {
Ok(ref snippet) if &snippet[..] != ";" && kind_name == "expression" => {
err.span_suggestion_with_applicability(
semi_span,
"you might be missing a semicolon here",
";".to_owned(),
Applicability::MaybeIncorrect,
);
}
_ => {}
}
err.emit();
}
}
}
......
......@@ -50,7 +50,12 @@ pub struct ParserAnyMacro<'a> {
impl<'a> ParserAnyMacro<'a> {
pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: AstFragmentKind) -> AstFragment {
let ParserAnyMacro { site_span, macro_ident, ref mut parser } = *self;
let fragment = panictry!(parser.parse_ast_fragment(kind, true));
let fragment = panictry!(parser.parse_ast_fragment(kind, true).map_err(|mut e| {
if e.span.is_dummy() { // Get around lack of span in error (#30128)
e.set_span(site_span);
}
e
}));
// We allow semicolons at the end of expressions -- e.g. the semicolon in
// `macro_rules! m { () => { panic!(); } }` isn't parsed by `.parse_expr()`,
......
......@@ -612,6 +612,17 @@ pub fn primary_spans(&self) -> &[Span] {
&self.primary_spans
}
/// Returns `true` if this contains only a dummy primary span with any hygienic context.
pub fn is_dummy(&self) -> bool {
let mut is_dummy = true;
for span in &self.primary_spans {
if !span.is_dummy() {
is_dummy = false;
}
}
is_dummy
}
/// Replaces all occurrences of one Span with another. Used to move Spans in areas that don't
/// display well (like std macros). Returns true if replacements occurred.
pub fn replace(&mut self, before: Span, after: Span) -> bool {
......
......@@ -3,12 +3,11 @@ error: macro expansion ignores token `;` and any following
|
LL | () => ( String ; ); //~ ERROR macro expansion ignores token `;`
| ^
|
note: caused by the macro expansion here; the usage of `t!` is likely invalid in type context
--> $DIR/issue-30007.rs:16:16
|
...
LL | let i: Vec<t!()>;
| ^^^^
| ---- caused by the macro expansion here
|
= note: the usage of `t!` is likely invalid in type context
error: aborting due to previous error
......@@ -3,36 +3,33 @@ error: macro expansion ignores token `;` and any following
|
LL | () => ( i ; typeof ); //~ ERROR expected expression, found reserved keyword `typeof`
| ^
|
note: caused by the macro expansion here; the usage of `m!` is likely invalid in type context
--> $DIR/macro-context.rs:20:12
|
...
LL | let a: m!();
| ^^^^
| ---- caused by the macro expansion here
|
= note: the usage of `m!` is likely invalid in type context
error: macro expansion ignores token `typeof` and any following
--> $DIR/macro-context.rs:13:17
|
LL | () => ( i ; typeof ); //~ ERROR expected expression, found reserved keyword `typeof`
| ^^^^^^
|
note: caused by the macro expansion here; the usage of `m!` is likely invalid in expression context
--> $DIR/macro-context.rs:21:13
|
...
LL | let i = m!();
| ^^^^
| ---- caused by the macro expansion here
|
= note: the usage of `m!` is likely invalid in expression context
error: macro expansion ignores token `;` and any following
--> $DIR/macro-context.rs:13:15
|
LL | () => ( i ; typeof ); //~ ERROR expected expression, found reserved keyword `typeof`
| ^
|
note: caused by the macro expansion here; the usage of `m!` is likely invalid in pattern context
--> $DIR/macro-context.rs:23:9
|
...
LL | m!() => {}
| ^^^^
| ---- caused by the macro expansion here
|
= note: the usage of `m!` is likely invalid in pattern context
error: expected expression, found reserved keyword `typeof`
--> $DIR/macro-context.rs:13:17
......
macro_rules! empty { () => () }
fn main() {
match 42 {
_ => { empty!() }
};
}
error: expected expression, found `<eof>`
--> $DIR/macro-in-expression-context-2.rs:5:16
|
LL | _ => { empty!() }
| ^^^^^^^^
error: aborting due to previous error
// run-rustfix
macro_rules! foo {
() => {
assert_eq!("A", "A");
assert_eq!("B", "B");
}
//~^^ ERROR macro expansion ignores token `assert_eq` and any following
//~| NOTE the usage of `foo!` is likely invalid in expression context
}
fn main() {
foo!();
//~^ NOTE caused by the macro expansion here
}
// run-rustfix
macro_rules! foo {
() => {
assert_eq!("A", "A");
assert_eq!("B", "B");
}
//~^^ ERROR macro expansion ignores token `assert_eq` and any following
//~| NOTE the usage of `foo!` is likely invalid in expression context
}
fn main() {
foo!()
//~^ NOTE caused by the macro expansion here
}
error: macro expansion ignores token `assert_eq` and any following
--> $DIR/macro-in-expression-context.rs:6:9
|
LL | assert_eq!("B", "B");
| ^^^^^^^^^
...
LL | foo!()
| ------- help: you might be missing a semicolon here: `;`
| |
| caused by the macro expansion here
|
= note: the usage of `foo!` is likely invalid in expression context
error: aborting due to previous error
......@@ -3,12 +3,11 @@ error: macro expansion ignores token `,` and any following
|
LL | , //~ ERROR macro expansion ignores token `,`
| ^
|
note: caused by the macro expansion here; the usage of `ignored_item!` is likely invalid in item context
--> $DIR/macro-incomplete-parse.rs:31:1
|
...
LL | ignored_item!();
| ^^^^^^^^^^^^^^^^
| ---------------- caused by the macro expansion here
|
= note: the usage of `ignored_item!` is likely invalid in item context
error: expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
--> $DIR/macro-incomplete-parse.rs:22:14
......@@ -24,12 +23,11 @@ error: macro expansion ignores token `,` and any following
|
LL | () => ( 1, 2 ) //~ ERROR macro expansion ignores token `,`
| ^
|
note: caused by the macro expansion here; the usage of `ignored_pat!` is likely invalid in pattern context
--> $DIR/macro-incomplete-parse.rs:36:9
|
...
LL | ignored_pat!() => (),
| ^^^^^^^^^^^^^^
| -------------- caused by the macro expansion here
|
= note: the usage of `ignored_pat!` is likely invalid in pattern context
error: aborting due to 3 previous errors
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册