Skip to content

Commit

Permalink
Rollup merge of rust-lang#59079 - euclio:macro-semi, r=estebank
Browse files Browse the repository at this point in the history
add suggestions to invalid macro item error

r? @estebank
  • Loading branch information
kennytm committed Mar 15, 2019
2 parents 3463053 + 5abd6d9 commit 8a55a86
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 24 deletions.
45 changes: 25 additions & 20 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5116,12 +5116,8 @@ impl<'a> Parser<'a> {

let ident = self.parse_ident()?;
let (delim, tokens) = self.expect_delimited_token_tree()?;
if delim != MacDelimiter::Brace {
if !self.eat(&token::Semi) {
let msg = "macros that expand to items must either \
be surrounded with braces or followed by a semicolon";
self.span_err(self.prev_span, msg);
}
if delim != MacDelimiter::Brace && !self.eat(&token::Semi) {
self.report_invalid_macro_expansion_item();
}

(ident, ast::MacroDef { tokens: tokens, legacy: true })
Expand Down Expand Up @@ -5264,13 +5260,8 @@ impl<'a> Parser<'a> {
// if it has a special ident, it's definitely an item
//
// Require a semicolon or braces.
if style != MacStmtStyle::Braces {
if !self.eat(&token::Semi) {
self.span_err(self.prev_span,
"macros that expand to items must \
either be surrounded with braces or \
followed by a semicolon");
}
if style != MacStmtStyle::Braces && !self.eat(&token::Semi) {
self.report_invalid_macro_expansion_item();
}
let span = lo.to(hi);
Stmt {
Expand Down Expand Up @@ -8360,13 +8351,8 @@ impl<'a> Parser<'a> {
};
// eat a matched-delimiter token tree:
let (delim, tts) = self.expect_delimited_token_tree()?;
if delim != MacDelimiter::Brace {
if !self.eat(&token::Semi) {
self.span_err(self.prev_span,
"macros that expand to items must either \
be surrounded with braces or followed by \
a semicolon");
}
if delim != MacDelimiter::Brace && !self.eat(&token::Semi) {
self.report_invalid_macro_expansion_item();
}

let hi = self.prev_span;
Expand Down Expand Up @@ -8597,6 +8583,25 @@ impl<'a> Parser<'a> {
}
}
}

fn report_invalid_macro_expansion_item(&self) {
self.struct_span_err(
self.prev_span,
"macros that expand to items must be delimited with braces or followed by a semicolon",
).multipart_suggestion(
"change the delimiters to curly braces",
vec![
(self.prev_span.with_hi(self.prev_span.lo() + BytePos(1)), String::from(" {")),
(self.prev_span.with_lo(self.prev_span.hi() - BytePos(1)), '}'.to_string()),
],
Applicability::MaybeIncorrect,
).span_suggestion(
self.sess.source_map.next_point(self.prev_span),
"add a semicolon",
';'.to_string(),
Applicability::MaybeIncorrect,
).emit();
}
}

pub fn emit_unclosed_delims(unclosed_delims: &mut Vec<UnmatchedBrace>, handler: &errors::Handler) {
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/issues/issue-10536.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub fn main() {
foo!();

assert!({one! two()});
//~^ ERROR macros that expand to items must either be surrounded with braces or followed by a
//~^ ERROR macros that expand to items
//~| ERROR cannot find macro `one!` in this scope
//~| ERROR mismatched types

Expand Down
10 changes: 9 additions & 1 deletion src/test/ui/issues/issue-10536.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
error: macros that expand to items must either be surrounded with braces or followed by a semicolon
error: macros that expand to items must be delimited with braces or followed by a semicolon
--> $DIR/issue-10536.rs:14:22
|
LL | assert!({one! two()});
| ^^
help: change the delimiters to curly braces
|
LL | assert!({one! two {}});
| ^^
help: add a semicolon
|
LL | assert!({one! two();});
| ^

error: expected `(` or `{`, found `}`
--> $DIR/issue-10536.rs:21:22
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/parser/macros-no-semicolon-items.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
macro_rules! foo() //~ ERROR semicolon
//~| ERROR unexpected end of macro

macro_rules! bar {
($($tokens:tt)*) => {}
}

bar!( //~ ERROR semicolon
blah
blah
blah
)

fn main() {
}
41 changes: 39 additions & 2 deletions src/test/ui/parser/macros-no-semicolon-items.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,45 @@
error: macros that expand to items must either be surrounded with braces or followed by a semicolon
error: macros that expand to items must be delimited with braces or followed by a semicolon
--> $DIR/macros-no-semicolon-items.rs:1:17
|
LL | macro_rules! foo()
| ^^
help: change the delimiters to curly braces
|
LL | macro_rules! foo {}
| ^^
help: add a semicolon
|
LL | macro_rules! foo();
| ^

error: macros that expand to items must be delimited with braces or followed by a semicolon
--> $DIR/macros-no-semicolon-items.rs:8:5
|
LL | bar!(
| _____^
LL | | blah
LL | | blah
LL | | blah
LL | | )
| |_^
help: change the delimiters to curly braces
|
LL | bar! {
LL | blah
LL | blah
LL | blah
LL | }
|
help: add a semicolon
|
LL | );
| ^

error: unexpected end of macro invocation
--> $DIR/macros-no-semicolon-items.rs:1:1
|
LL | macro_rules! foo()
| ^^^^^^^^^^^^^^^^^^ missing tokens in macro arguments

error: aborting due to previous error
error: aborting due to 3 previous errors

0 comments on commit 8a55a86

Please sign in to comment.