diff options
Diffstat (limited to 'crates/hir_def/src/nameres')
-rw-r--r-- | crates/hir_def/src/nameres/collector.rs | 41 | ||||
-rw-r--r-- | crates/hir_def/src/nameres/tests.rs | 16 |
2 files changed, 34 insertions, 23 deletions
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index 66d9396aa..221a5a556 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs | |||
@@ -539,6 +539,11 @@ impl DefCollector<'_> { | |||
539 | let res = self.def_map.resolve_name_in_extern_prelude(self.db, &extern_crate.name); | 539 | let res = self.def_map.resolve_name_in_extern_prelude(self.db, &extern_crate.name); |
540 | 540 | ||
541 | if let Some(ModuleDefId::ModuleId(m)) = res.take_types() { | 541 | if let Some(ModuleDefId::ModuleId(m)) = res.take_types() { |
542 | if m == self.def_map.module_id(current_module_id) { | ||
543 | cov_mark::hit!(ignore_macro_use_extern_crate_self); | ||
544 | return; | ||
545 | } | ||
546 | |||
542 | cov_mark::hit!(macro_rules_from_other_crates_are_visible_with_macro_use); | 547 | cov_mark::hit!(macro_rules_from_other_crates_are_visible_with_macro_use); |
543 | self.import_all_macros_exported(current_module_id, m.krate); | 548 | self.import_all_macros_exported(current_module_id, m.krate); |
544 | } | 549 | } |
@@ -864,6 +869,17 @@ impl DefCollector<'_> { | |||
864 | let mut resolved = Vec::new(); | 869 | let mut resolved = Vec::new(); |
865 | let mut res = ReachedFixedPoint::Yes; | 870 | let mut res = ReachedFixedPoint::Yes; |
866 | macros.retain(|directive| { | 871 | macros.retain(|directive| { |
872 | let resolver = |path| { | ||
873 | let resolved_res = self.def_map.resolve_path_fp_with_macro( | ||
874 | self.db, | ||
875 | ResolveMode::Other, | ||
876 | directive.module_id, | ||
877 | &path, | ||
878 | BuiltinShadowMode::Module, | ||
879 | ); | ||
880 | resolved_res.resolved_def.take_macros() | ||
881 | }; | ||
882 | |||
867 | match &directive.kind { | 883 | match &directive.kind { |
868 | MacroDirectiveKind::FnLike { ast_id, fragment } => { | 884 | MacroDirectiveKind::FnLike { ast_id, fragment } => { |
869 | match macro_call_as_call_id( | 885 | match macro_call_as_call_id( |
@@ -871,16 +887,7 @@ impl DefCollector<'_> { | |||
871 | *fragment, | 887 | *fragment, |
872 | self.db, | 888 | self.db, |
873 | self.def_map.krate, | 889 | self.def_map.krate, |
874 | |path| { | 890 | &resolver, |
875 | let resolved_res = self.def_map.resolve_path_fp_with_macro( | ||
876 | self.db, | ||
877 | ResolveMode::Other, | ||
878 | directive.module_id, | ||
879 | &path, | ||
880 | BuiltinShadowMode::Module, | ||
881 | ); | ||
882 | resolved_res.resolved_def.take_macros() | ||
883 | }, | ||
884 | &mut |_err| (), | 891 | &mut |_err| (), |
885 | ) { | 892 | ) { |
886 | Ok(Ok(call_id)) => { | 893 | Ok(Ok(call_id)) => { |
@@ -897,7 +904,7 @@ impl DefCollector<'_> { | |||
897 | *derive_attr, | 904 | *derive_attr, |
898 | self.db, | 905 | self.db, |
899 | self.def_map.krate, | 906 | self.def_map.krate, |
900 | |path| self.resolve_derive_macro(directive.module_id, &path), | 907 | &resolver, |
901 | ) { | 908 | ) { |
902 | Ok(call_id) => { | 909 | Ok(call_id) => { |
903 | resolved.push((directive.module_id, call_id, directive.depth)); | 910 | resolved.push((directive.module_id, call_id, directive.depth)); |
@@ -923,18 +930,6 @@ impl DefCollector<'_> { | |||
923 | res | 930 | res |
924 | } | 931 | } |
925 | 932 | ||
926 | fn resolve_derive_macro(&self, module: LocalModuleId, path: &ModPath) -> Option<MacroDefId> { | ||
927 | let resolved_res = self.def_map.resolve_path_fp_with_macro( | ||
928 | self.db, | ||
929 | ResolveMode::Other, | ||
930 | module, | ||
931 | &path, | ||
932 | BuiltinShadowMode::Module, | ||
933 | ); | ||
934 | |||
935 | resolved_res.resolved_def.take_macros() | ||
936 | } | ||
937 | |||
938 | fn collect_macro_expansion( | 933 | fn collect_macro_expansion( |
939 | &mut self, | 934 | &mut self, |
940 | module_id: LocalModuleId, | 935 | module_id: LocalModuleId, |
diff --git a/crates/hir_def/src/nameres/tests.rs b/crates/hir_def/src/nameres/tests.rs index 4f2e7a2f9..9f652731d 100644 --- a/crates/hir_def/src/nameres/tests.rs +++ b/crates/hir_def/src/nameres/tests.rs | |||
@@ -411,6 +411,22 @@ struct Arc; | |||
411 | } | 411 | } |
412 | 412 | ||
413 | #[test] | 413 | #[test] |
414 | fn macro_use_extern_crate_self() { | ||
415 | cov_mark::check!(ignore_macro_use_extern_crate_self); | ||
416 | check( | ||
417 | r#" | ||
418 | //- /main.rs crate:main | ||
419 | #[macro_use] | ||
420 | extern crate self as bla; | ||
421 | "#, | ||
422 | expect![[r#" | ||
423 | crate | ||
424 | bla: t | ||
425 | "#]], | ||
426 | ); | ||
427 | } | ||
428 | |||
429 | #[test] | ||
414 | fn reexport_across_crates() { | 430 | fn reexport_across_crates() { |
415 | check( | 431 | check( |
416 | r#" | 432 | r#" |