diff options
Diffstat (limited to 'crates/hir_def/src/nameres')
-rw-r--r-- | crates/hir_def/src/nameres/collector.rs | 33 | ||||
-rw-r--r-- | crates/hir_def/src/nameres/tests/incremental.rs | 6 |
2 files changed, 33 insertions, 6 deletions
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index 386287518..19cd713ba 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs | |||
@@ -7,7 +7,6 @@ use std::iter; | |||
7 | 7 | ||
8 | use base_db::{CrateId, FileId, ProcMacroId}; | 8 | use base_db::{CrateId, FileId, ProcMacroId}; |
9 | use cfg::{CfgExpr, CfgOptions}; | 9 | use cfg::{CfgExpr, CfgOptions}; |
10 | use hir_expand::InFile; | ||
11 | use hir_expand::{ | 10 | use hir_expand::{ |
12 | ast_id_map::FileAstId, | 11 | ast_id_map::FileAstId, |
13 | builtin_derive::find_builtin_derive, | 12 | builtin_derive::find_builtin_derive, |
@@ -16,6 +15,7 @@ use hir_expand::{ | |||
16 | proc_macro::ProcMacroExpander, | 15 | proc_macro::ProcMacroExpander, |
17 | HirFileId, MacroCallId, MacroDefId, MacroDefKind, | 16 | HirFileId, MacroCallId, MacroDefId, MacroDefKind, |
18 | }; | 17 | }; |
18 | use hir_expand::{InFile, MacroCallLoc}; | ||
19 | use rustc_hash::{FxHashMap, FxHashSet}; | 19 | use rustc_hash::{FxHashMap, FxHashSet}; |
20 | use syntax::ast; | 20 | use syntax::ast; |
21 | use test_utils::mark; | 21 | use test_utils::mark; |
@@ -812,7 +812,30 @@ impl DefCollector<'_> { | |||
812 | log::warn!("macro expansion is too deep"); | 812 | log::warn!("macro expansion is too deep"); |
813 | return; | 813 | return; |
814 | } | 814 | } |
815 | let file_id: HirFileId = macro_call_id.as_file(); | 815 | let file_id = macro_call_id.as_file(); |
816 | |||
817 | // First, fetch the raw expansion result for purposes of error reporting. This goes through | ||
818 | // `macro_expand_error` to avoid depending on the full expansion result (to improve | ||
819 | // incrementality). | ||
820 | let err = self.db.macro_expand_error(macro_call_id); | ||
821 | if let Some(err) = err { | ||
822 | if let MacroCallId::LazyMacro(id) = macro_call_id { | ||
823 | let loc: MacroCallLoc = self.db.lookup_intern_macro(id); | ||
824 | |||
825 | let diag = match err { | ||
826 | hir_expand::ExpandError::UnresolvedProcMacro => { | ||
827 | // Missing proc macros are non-fatal, so they are handled specially. | ||
828 | DefDiagnostic::unresolved_proc_macro(module_id, loc.kind) | ||
829 | } | ||
830 | _ => DefDiagnostic::macro_error(module_id, loc.kind, err.to_string()), | ||
831 | }; | ||
832 | |||
833 | self.def_map.diagnostics.push(diag); | ||
834 | } | ||
835 | // FIXME: Handle eager macros. | ||
836 | } | ||
837 | |||
838 | // Then, fetch and process the item tree. This will reuse the expansion result from above. | ||
816 | let item_tree = self.db.item_tree(file_id); | 839 | let item_tree = self.db.item_tree(file_id); |
817 | let mod_dir = self.mod_dirs[&module_id].clone(); | 840 | let mod_dir = self.mod_dirs[&module_id].clone(); |
818 | ModCollector { | 841 | ModCollector { |
@@ -1336,13 +1359,11 @@ impl ModCollector<'_, '_> { | |||
1336 | 1359 | ||
1337 | fn emit_unconfigured_diagnostic(&mut self, item: ModItem, cfg: &CfgExpr) { | 1360 | fn emit_unconfigured_diagnostic(&mut self, item: ModItem, cfg: &CfgExpr) { |
1338 | let ast_id = item.ast_id(self.item_tree); | 1361 | let ast_id = item.ast_id(self.item_tree); |
1339 | let id_map = self.def_collector.db.ast_id_map(self.file_id); | ||
1340 | let syntax_ptr = id_map.get(ast_id).syntax_node_ptr(); | ||
1341 | 1362 | ||
1342 | let ast_node = InFile::new(self.file_id, syntax_ptr); | 1363 | let ast_id = InFile::new(self.file_id, ast_id); |
1343 | self.def_collector.def_map.diagnostics.push(DefDiagnostic::unconfigured_code( | 1364 | self.def_collector.def_map.diagnostics.push(DefDiagnostic::unconfigured_code( |
1344 | self.module_id, | 1365 | self.module_id, |
1345 | ast_node, | 1366 | ast_id, |
1346 | cfg.clone(), | 1367 | cfg.clone(), |
1347 | self.def_collector.cfg_options.clone(), | 1368 | self.def_collector.cfg_options.clone(), |
1348 | )); | 1369 | )); |
diff --git a/crates/hir_def/src/nameres/tests/incremental.rs b/crates/hir_def/src/nameres/tests/incremental.rs index cfbc62cc4..8981fa7c9 100644 --- a/crates/hir_def/src/nameres/tests/incremental.rs +++ b/crates/hir_def/src/nameres/tests/incremental.rs | |||
@@ -38,6 +38,9 @@ fn typing_inside_a_function_should_not_invalidate_def_map() { | |||
38 | fn foo() -> i32 { | 38 | fn foo() -> i32 { |
39 | 1 + 1 | 39 | 1 + 1 |
40 | } | 40 | } |
41 | |||
42 | #[cfg(never)] | ||
43 | fn no() {} | ||
41 | //- /foo/mod.rs | 44 | //- /foo/mod.rs |
42 | pub mod bar; | 45 | pub mod bar; |
43 | 46 | ||
@@ -53,6 +56,9 @@ fn typing_inside_a_function_should_not_invalidate_def_map() { | |||
53 | use E::*; | 56 | use E::*; |
54 | 57 | ||
55 | fn foo() -> i32 { 92 } | 58 | fn foo() -> i32 { 92 } |
59 | |||
60 | #[cfg(never)] | ||
61 | fn no() {} | ||
56 | ", | 62 | ", |
57 | ); | 63 | ); |
58 | } | 64 | } |