diff options
Diffstat (limited to 'crates/hir_def/src/nameres/collector.rs')
-rw-r--r-- | crates/hir_def/src/nameres/collector.rs | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index f42f92702..fb4ddff5e 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs | |||
@@ -13,7 +13,7 @@ use hir_expand::{ | |||
13 | builtin_macro::find_builtin_macro, | 13 | builtin_macro::find_builtin_macro, |
14 | name::{AsName, Name}, | 14 | name::{AsName, Name}, |
15 | proc_macro::ProcMacroExpander, | 15 | proc_macro::ProcMacroExpander, |
16 | HirFileId, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, | 16 | AttrId, HirFileId, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, |
17 | }; | 17 | }; |
18 | use hir_expand::{InFile, MacroCallLoc}; | 18 | use hir_expand::{InFile, MacroCallLoc}; |
19 | use rustc_hash::{FxHashMap, FxHashSet}; | 19 | use rustc_hash::{FxHashMap, FxHashSet}; |
@@ -216,7 +216,7 @@ struct MacroDirective { | |||
216 | #[derive(Clone, Debug, Eq, PartialEq)] | 216 | #[derive(Clone, Debug, Eq, PartialEq)] |
217 | enum MacroDirectiveKind { | 217 | enum MacroDirectiveKind { |
218 | FnLike { ast_id: AstIdWithPath<ast::MacroCall> }, | 218 | FnLike { ast_id: AstIdWithPath<ast::MacroCall> }, |
219 | Derive { ast_id: AstIdWithPath<ast::Item> }, | 219 | Derive { ast_id: AstIdWithPath<ast::Item>, derive_attr: AttrId }, |
220 | } | 220 | } |
221 | 221 | ||
222 | struct DefData<'a> { | 222 | struct DefData<'a> { |
@@ -478,7 +478,7 @@ impl DefCollector<'_> { | |||
478 | self.def_map.edition, | 478 | self.def_map.edition, |
479 | ); | 479 | ); |
480 | 480 | ||
481 | let res = self.def_map.resolve_name_in_extern_prelude(&extern_crate.name); | 481 | let res = self.def_map.resolve_name_in_extern_prelude(self.db, &extern_crate.name); |
482 | 482 | ||
483 | if let Some(ModuleDefId::ModuleId(m)) = res.take_types() { | 483 | if let Some(ModuleDefId::ModuleId(m)) = res.take_types() { |
484 | cov_mark::hit!(macro_rules_from_other_crates_are_visible_with_macro_use); | 484 | cov_mark::hit!(macro_rules_from_other_crates_are_visible_with_macro_use); |
@@ -534,6 +534,7 @@ impl DefCollector<'_> { | |||
534 | log::debug!("resolving import: {:?} ({:?})", import, self.def_map.edition); | 534 | log::debug!("resolving import: {:?} ({:?})", import, self.def_map.edition); |
535 | if import.is_extern_crate { | 535 | if import.is_extern_crate { |
536 | let res = self.def_map.resolve_name_in_extern_prelude( | 536 | let res = self.def_map.resolve_name_in_extern_prelude( |
537 | self.db, | ||
537 | &import | 538 | &import |
538 | .path | 539 | .path |
539 | .as_ident() | 540 | .as_ident() |
@@ -831,12 +832,16 @@ impl DefCollector<'_> { | |||
831 | Err(UnresolvedMacro) | Ok(Err(_)) => {} | 832 | Err(UnresolvedMacro) | Ok(Err(_)) => {} |
832 | } | 833 | } |
833 | } | 834 | } |
834 | MacroDirectiveKind::Derive { ast_id } => { | 835 | MacroDirectiveKind::Derive { ast_id, derive_attr } => { |
835 | match derive_macro_as_call_id(ast_id, self.db, self.def_map.krate, |path| { | 836 | match derive_macro_as_call_id( |
836 | self.resolve_derive_macro(directive.module_id, &path) | 837 | ast_id, |
837 | }) { | 838 | *derive_attr, |
839 | self.db, | ||
840 | self.def_map.krate, | ||
841 | |path| self.resolve_derive_macro(directive.module_id, &path), | ||
842 | ) { | ||
838 | Ok(call_id) => { | 843 | Ok(call_id) => { |
839 | resolved.push((directive.module_id, call_id, 0)); | 844 | resolved.push((directive.module_id, call_id, directive.depth)); |
840 | res = ReachedFixedPoint::No; | 845 | res = ReachedFixedPoint::No; |
841 | return false; | 846 | return false; |
842 | } | 847 | } |
@@ -1163,19 +1168,27 @@ impl ModCollector<'_, '_> { | |||
1163 | } | 1168 | } |
1164 | ModItem::Const(id) => { | 1169 | ModItem::Const(id) => { |
1165 | let it = &self.item_tree[id]; | 1170 | let it = &self.item_tree[id]; |
1166 | 1171 | let const_id = ConstLoc { | |
1167 | if let Some(name) = &it.name { | 1172 | container: module.into(), |
1168 | def = Some(DefData { | 1173 | id: ItemTreeId::new(self.file_id, id), |
1169 | id: ConstLoc { | 1174 | } |
1170 | container: module.into(), | 1175 | .intern(self.def_collector.db); |
1171 | id: ItemTreeId::new(self.file_id, id), | 1176 | |
1172 | } | 1177 | match &it.name { |
1173 | .intern(self.def_collector.db) | 1178 | Some(name) => { |
1174 | .into(), | 1179 | def = Some(DefData { |
1175 | name, | 1180 | id: const_id.into(), |
1176 | visibility: &self.item_tree[it.visibility], | 1181 | name, |
1177 | has_constructor: false, | 1182 | visibility: &self.item_tree[it.visibility], |
1178 | }); | 1183 | has_constructor: false, |
1184 | }); | ||
1185 | } | ||
1186 | None => { | ||
1187 | // const _: T = ...; | ||
1188 | self.def_collector.def_map.modules[self.module_id] | ||
1189 | .scope | ||
1190 | .define_unnamed_const(const_id); | ||
1191 | } | ||
1179 | } | 1192 | } |
1180 | } | 1193 | } |
1181 | ModItem::Static(id) => { | 1194 | ModItem::Static(id) => { |
@@ -1360,7 +1373,7 @@ impl ModCollector<'_, '_> { | |||
1360 | self.def_collector.unexpanded_macros.push(MacroDirective { | 1373 | self.def_collector.unexpanded_macros.push(MacroDirective { |
1361 | module_id: self.module_id, | 1374 | module_id: self.module_id, |
1362 | depth: self.macro_depth + 1, | 1375 | depth: self.macro_depth + 1, |
1363 | kind: MacroDirectiveKind::Derive { ast_id }, | 1376 | kind: MacroDirectiveKind::Derive { ast_id, derive_attr: derive.id }, |
1364 | }); | 1377 | }); |
1365 | } | 1378 | } |
1366 | } | 1379 | } |
@@ -1512,7 +1525,7 @@ impl ModCollector<'_, '_> { | |||
1512 | // Built-in macro failed eager expansion. | 1525 | // Built-in macro failed eager expansion. |
1513 | self.def_collector.def_map.diagnostics.push(DefDiagnostic::macro_error( | 1526 | self.def_collector.def_map.diagnostics.push(DefDiagnostic::macro_error( |
1514 | self.module_id, | 1527 | self.module_id, |
1515 | MacroCallKind::FnLike(ast_id.ast_id), | 1528 | MacroCallKind::FnLike { ast_id: ast_id.ast_id }, |
1516 | error.unwrap().to_string(), | 1529 | error.unwrap().to_string(), |
1517 | )); | 1530 | )); |
1518 | return; | 1531 | return; |