- /// Error if `ext` is a Macros 1.1 procedural macro being imported by `#[macro_use]`
- fn err_if_macro_use_proc_macro(&mut self, name: Name, use_span: Span,
- binding: &NameBinding<'a>) {
- let krate = match binding.def() {
- Def::NonMacroAttr(..) | Def::Err => return,
- Def::Macro(def_id, _) => def_id.krate,
- _ => unreachable!(),
- };
-
- // Plugin-based syntax extensions are exempt from this check
- if krate == CrateNum::BuiltinMacros { return; }
-
- let ext = binding.get_macro(self);
-
- match *ext {
- // If `ext` is a procedural macro, check if we've already warned about it
- SyntaxExtension::AttrProcMacro(..) | SyntaxExtension::ProcMacro { .. } =>
- if !self.warned_proc_macros.insert(name) { return; },
- _ => return,
- }
-
- let warn_msg = match *ext {
- SyntaxExtension::AttrProcMacro(..) =>
- "attribute procedural macros cannot be imported with `#[macro_use]`",
- SyntaxExtension::ProcMacro { .. } =>
- "procedural macros cannot be imported with `#[macro_use]`",
- _ => return,
- };
-
- let def_id = self.current_module.normal_ancestor_id;
- let node_id = self.definitions.as_local_node_id(def_id).unwrap();
-
- self.proc_mac_errors.push(ProcMacError {
- crate_name: self.cstore.crate_name_untracked(krate),
- name,
- module: node_id,
- use_span,
- warn_msg,
- });
- }
-
- pub fn report_proc_macro_import(&mut self, krate: &ast::Crate) {
- for err in self.proc_mac_errors.drain(..) {
- let (span, found_use) = ::UsePlacementFinder::check(krate, err.module);
-
- if let Some(span) = span {
- let found_use = if found_use { "" } else { "\n" };
- self.session.struct_span_err(err.use_span, err.warn_msg)
- .span_suggestion_with_applicability(
- span,
- "instead, import the procedural macro like any other item",
- format!("use {}::{};{}", err.crate_name, err.name, found_use),
- Applicability::MachineApplicable
- ).emit();
- } else {
- self.session.struct_span_err(err.use_span, err.warn_msg)
- .help(&format!("instead, import the procedural macro like any other item: \
- `use {}::{};`", err.crate_name, err.name))
- .emit();
- }
- }
- }
-