@@ -2040,23 +2040,26 @@ impl<'a> Parser<'a> {
2040
2040
2041
2041
/// Is this a possibly malformed start of a `macro_rules! foo` item definition?
2042
2042
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 ) ;
2054
2049
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 ;
2056
2054
}
2055
+
2056
+ self . sess . emit_err ( errors:: MacroRulesMissingBang {
2057
+ span : macro_rules_span,
2058
+ hi : macro_rules_span. shrink_to_hi ( ) ,
2059
+ } ) ;
2057
2060
}
2058
2061
2059
- IsMacroRulesItem :: No
2062
+ IsMacroRulesItem :: Yes { has_bang }
2060
2063
}
2061
2064
2062
2065
/// Parses a `macro_rules! foo { ... }` declarative macro.
@@ -2070,7 +2073,35 @@ impl<'a> Parser<'a> {
2070
2073
if has_bang {
2071
2074
self . expect ( & token:: Not ) ?; // `!`
2072
2075
}
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
+ } ;
2074
2105
2075
2106
if self . eat ( & token:: Not ) {
2076
2107
// Handle macro_rules! foo!
0 commit comments