diff options
| author | bors <bors@rust-lang.org> | 2021-12-09 00:55:49 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-12-09 00:55:49 +0000 |
| commit | 3c857f48ce12d1f98f3ea6d48eb9e33d8d60c985 (patch) | |
| tree | 5db0b310af238377cfbde5bdd3ac75aad19dbb06 /compiler/rustc_parse/src/parser | |
| parent | e6b883c74f49f32cb5d1cbad3457f2b8805a4a38 (diff) | |
| parent | 40c6606b789122f1584a4e06556b858d543bef6b (diff) | |
| download | rust-3c857f48ce12d1f98f3ea6d48eb9e33d8d60c985.tar.gz rust-3c857f48ce12d1f98f3ea6d48eb9e33d8d60c985.zip | |
Auto merge of #91677 - matthiaskrgr:rollup-yiczced, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #91245 (suggest casting between i/u32 and char) - #91337 (Add a suggestion if `macro_rules` is misspelled) - #91534 (Make rustdoc headings black, and markdown blue) - #91637 (Add test for packed drops in generators) - #91667 (Fix indent of itemTypes in search.js) Failed merges: - #91568 (Pretty print break and continue without redundant space) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_parse/src/parser')
| -rw-r--r-- | compiler/rustc_parse/src/parser/item.rs | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs index 831c64e3faf..516e301ec3a 100644 --- a/compiler/rustc_parse/src/parser/item.rs +++ b/compiler/rustc_parse/src/parser/item.rs @@ -15,6 +15,7 @@ use rustc_ast::{MacArgs, MacCall, MacDelimiter}; use rustc_ast_pretty::pprust; use rustc_errors::{struct_span_err, Applicability, PResult, StashKey}; use rustc_span::edition::{Edition, LATEST_STABLE_EDITION}; +use rustc_span::lev_distance::lev_distance; use rustc_span::source_map::{self, Span}; use rustc_span::symbol::{kw, sym, Ident, Symbol}; @@ -410,10 +411,30 @@ impl<'a> Parser<'a> { fn parse_item_macro(&mut self, vis: &Visibility) -> PResult<'a, MacCall> { let path = self.parse_path(PathStyle::Mod)?; // `foo::bar` self.expect(&token::Not)?; // `!` - let args = self.parse_mac_args()?; // `( .. )` or `[ .. ]` (followed by `;`), or `{ .. }`. - self.eat_semi_for_macro_if_needed(&args); - self.complain_if_pub_macro(vis, false); - Ok(MacCall { path, args, prior_type_ascription: self.last_type_ascription }) + match self.parse_mac_args() { + // `( .. )` or `[ .. ]` (followed by `;`), or `{ .. }`. + Ok(args) => { + self.eat_semi_for_macro_if_needed(&args); + self.complain_if_pub_macro(vis, false); + Ok(MacCall { path, args, prior_type_ascription: self.last_type_ascription }) + } + + Err(mut err) => { + // Maybe the user misspelled `macro_rules` (issue #91227) + if self.token.is_ident() + && path.segments.len() == 1 + && lev_distance("macro_rules", &path.segments[0].ident.to_string()) <= 3 + { + err.span_suggestion( + path.span, + "perhaps you meant to define a macro", + "macro_rules".to_string(), + Applicability::MachineApplicable, + ); + } + Err(err) + } + } } /// Recover if we parsed attributes and expected an item but there was none. |
