aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/nameres
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/nameres')
-rw-r--r--crates/hir_def/src/nameres/collector.rs41
-rw-r--r--crates/hir_def/src/nameres/tests.rs16
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]
414fn 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]
420extern crate self as bla;
421"#,
422 expect![[r#"
423 crate
424 bla: t
425 "#]],
426 );
427}
428
429#[test]
414fn reexport_across_crates() { 430fn reexport_across_crates() {
415 check( 431 check(
416 r#" 432 r#"