]> git.lizzy.rs Git - rust.git/commitdiff
Emit diagnostics for unresolved item-level macros
authorJonas Schievink <jonasschievink@gmail.com>
Tue, 5 Jan 2021 14:42:43 +0000 (15:42 +0100)
committerJonas Schievink <jonasschievink@gmail.com>
Tue, 5 Jan 2021 14:42:43 +0000 (15:42 +0100)
crates/hir_def/src/nameres/collector.rs

index a636ec77d71b9dac4f7c4a5e3cf84f5d24e5a291..77017e4ea97e3e5f7d338fb0695db08c79b222c2 100644 (file)
@@ -13,7 +13,7 @@
     builtin_macro::find_builtin_macro,
     name::{AsName, Name},
     proc_macro::ProcMacroExpander,
-    HirFileId, MacroCallId, MacroDefId, MacroDefKind,
+    HirFileId, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind,
 };
 use hir_expand::{InFile, MacroCallLoc};
 use rustc_hash::{FxHashMap, FxHashSet};
@@ -860,6 +860,37 @@ fn collect_macro_expansion(
     }
 
     fn finish(mut self) -> CrateDefMap {
+        // Emit diagnostics for all remaining unexpanded macros.
+
+        for directive in &self.unexpanded_macros {
+            let mut error = None;
+            directive.ast_id.as_call_id_with_errors(
+                self.db,
+                self.def_map.krate,
+                |path| {
+                    let resolved_res = self.def_map.resolve_path_fp_with_macro(
+                        self.db,
+                        ResolveMode::Other,
+                        directive.module_id,
+                        &path,
+                        BuiltinShadowMode::Module,
+                    );
+                    resolved_res.resolved_def.take_macros()
+                },
+                &mut |e| {
+                    error.get_or_insert(e);
+                },
+            );
+
+            if let Some(err) = error {
+                self.def_map.diagnostics.push(DefDiagnostic::macro_error(
+                    directive.module_id,
+                    MacroCallKind::FnLike(directive.ast_id.ast_id),
+                    err.to_string(),
+                ));
+            }
+        }
+
         // Emit diagnostics for all remaining unresolved imports.
 
         // We'd like to avoid emitting a diagnostics avalanche when some `extern crate` doesn't