about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2021-01-05 15:42:43 +0100
committerJonas Schievink <jonasschievink@gmail.com>2021-01-05 15:42:43 +0100
commit3cb7c8b548883ed8dcf589193df058dcda0a5c64 (patch)
treea2e1f9d026b1a87fe79e755bc03856f78b5a1fd0
parentc8d3d5694be065ffb1d52bc33e098ff610693097 (diff)
downloadrust-3cb7c8b548883ed8dcf589193df058dcda0a5c64.tar.gz
rust-3cb7c8b548883ed8dcf589193df058dcda0a5c64.zip
Emit diagnostics for unresolved item-level macros
-rw-r--r--crates/hir_def/src/nameres/collector.rs33
1 files changed, 32 insertions, 1 deletions
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs
index a636ec77d71..77017e4ea97 100644
--- a/crates/hir_def/src/nameres/collector.rs
+++ b/crates/hir_def/src/nameres/collector.rs
@@ -13,7 +13,7 @@ use hir_expand::{
     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 @@ impl DefCollector<'_> {
     }
 
     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