@@ -2040,23 +2040,26 @@ impl<'a> Parser<'a> {
20402040
20412041 /// Is this a possibly malformed start of a `macro_rules! foo` item definition?
20422042 fn is_macro_rules_item ( & mut self ) -> IsMacroRulesItem {
2043- if self . check_keyword ( kw:: MacroRules ) {
2044- let macro_rules_span = self . token . span ;
2045-
2046- if self . look_ahead ( 1 , |t| * t == token:: Not ) && self . look_ahead ( 2 , |t| t. is_ident ( ) ) {
2047- return IsMacroRulesItem :: Yes { has_bang : true } ;
2048- } else if self . look_ahead ( 1 , |t| ( t. is_ident ( ) ) ) {
2049- // macro_rules foo
2050- self . sess . emit_err ( errors:: MacroRulesMissingBang {
2051- span : macro_rules_span,
2052- hi : macro_rules_span. shrink_to_hi ( ) ,
2053- } ) ;
2043+ if !self . check_keyword ( kw:: MacroRules ) {
2044+ return IsMacroRulesItem :: No ;
2045+ }
2046+
2047+ let macro_rules_span = self . token . span ;
2048+ let has_bang = self . look_ahead ( 1 , |t| * t == token:: Not ) ;
20542049
2055- return IsMacroRulesItem :: Yes { has_bang : false } ;
2050+ // macro_rules foo
2051+ if !has_bang {
2052+ if !self . look_ahead ( 1 , |t| ( t. is_ident ( ) ) ) {
2053+ return IsMacroRulesItem :: No ;
20562054 }
2055+
2056+ self . sess . emit_err ( errors:: MacroRulesMissingBang {
2057+ span : macro_rules_span,
2058+ hi : macro_rules_span. shrink_to_hi ( ) ,
2059+ } ) ;
20572060 }
20582061
2059- IsMacroRulesItem :: No
2062+ IsMacroRulesItem :: Yes { has_bang }
20602063 }
20612064
20622065 /// Parses a `macro_rules! foo { ... }` declarative macro.
@@ -2070,7 +2073,39 @@ impl<'a> Parser<'a> {
20702073 if has_bang {
20712074 self . expect ( & token:: Not ) ?; // `!`
20722075 }
2073- let ident = self . parse_ident ( ) ?;
2076+
2077+ let ident = match self . parse_ident ( ) {
2078+ Ok ( ident) => ident,
2079+ Err ( mut err) => {
2080+ match (
2081+ & self . token . kind ,
2082+ self . look_ahead ( 1 , |token| token. ident ( ) ) ,
2083+ self . look_ahead ( 2 , |token| {
2084+ token. kind == TokenKind :: CloseDelim ( Delimiter :: Parenthesis )
2085+ } ) ,
2086+ ) {
2087+ (
2088+ TokenKind :: OpenDelim ( Delimiter :: Parenthesis ) ,
2089+ Some ( ( Ident { span, .. } , _) ) ,
2090+ true ,
2091+ ) => {
2092+ err. span_note (
2093+ span,
2094+ "try removing the parenthesis around the name for this `macro_rules!`" ,
2095+ ) ;
2096+ }
2097+ _ => {
2098+ err. note ( fluent:: parse_maybe_missing_macro_rules_name) ;
2099+ }
2100+ }
2101+
2102+ return Err ( err) ;
2103+ }
2104+ } ;
2105+
2106+ if ident. name == sym:: macro_rules {
2107+ self . sess . emit_err ( errors:: MacroRulesNamedMacroRules { span : ident. span } ) ;
2108+ }
20742109
20752110 if self . eat ( & token:: Not ) {
20762111 // Handle macro_rules! foo!
0 commit comments