Skip to content

Commit ba4b9f6

Browse files
authored
Merge pull request #19932 from Veykril/push-skzlyntpxpsw
fix: Record macro calls in signatures in `ChildBySource` impls
2 parents 634596e + bb5e6de commit ba4b9f6

File tree

4 files changed

+77
-19
lines changed

4 files changed

+77
-19
lines changed

crates/hir/src/semantics.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1948,18 +1948,12 @@ impl<'db> SemanticsImpl<'db> {
19481948
ChildContainer::TraitId(it) => {
19491949
return Some(SourceAnalyzer::new_generic_def(self.db, it.into(), node, offset));
19501950
}
1951-
ChildContainer::TraitAliasId(it) => {
1952-
return Some(SourceAnalyzer::new_generic_def(self.db, it.into(), node, offset));
1953-
}
19541951
ChildContainer::ImplId(it) => {
19551952
return Some(SourceAnalyzer::new_generic_def(self.db, it.into(), node, offset));
19561953
}
19571954
ChildContainer::EnumId(it) => {
19581955
return Some(SourceAnalyzer::new_generic_def(self.db, it.into(), node, offset));
19591956
}
1960-
ChildContainer::TypeAliasId(it) => {
1961-
return Some(SourceAnalyzer::new_generic_def(self.db, it.into(), node, offset));
1962-
}
19631957
ChildContainer::GenericDefId(it) => {
19641958
return Some(SourceAnalyzer::new_generic_def(self.db, it, node, offset));
19651959
}

crates/hir/src/semantics/child_by_source.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use hir_def::{
1717
DynMap,
1818
keys::{self, Key},
1919
},
20+
hir::generics::GenericParams,
2021
item_scope::ItemScope,
2122
item_tree::ItemTreeNode,
2223
nameres::DefMap,
@@ -49,6 +50,12 @@ impl ChildBySource for TraitId {
4950
data.items.iter().for_each(|&(_, item)| {
5051
add_assoc_item(db, res, file_id, item);
5152
});
53+
let (_, source_map) = db.trait_signature_with_source_map(*self);
54+
source_map.expansions().filter(|(ast, _)| ast.file_id == file_id).for_each(
55+
|(ast, &exp_id)| {
56+
res[keys::MACRO_CALL].insert(ast.value, exp_id);
57+
},
58+
);
5259
}
5360
}
5461

@@ -68,6 +75,12 @@ impl ChildBySource for ImplId {
6875
data.items.iter().for_each(|&(_, item)| {
6976
add_assoc_item(db, res, file_id, item);
7077
});
78+
let (_, source_map) = db.impl_signature_with_source_map(*self);
79+
source_map.expansions().filter(|(ast, _)| ast.file_id == file_id).for_each(
80+
|(ast, &exp_id)| {
81+
res[keys::MACRO_CALL].insert(ast.value, exp_id);
82+
},
83+
);
7184
}
7285
}
7386

@@ -195,6 +208,12 @@ impl ChildBySource for EnumId {
195208
res[keys::ENUM_VARIANT]
196209
.insert(ast_id_map.get(tree[variant.lookup(db).id.value].ast_id), variant);
197210
});
211+
let (_, source_map) = db.enum_signature_with_source_map(*self);
212+
source_map.expansions().filter(|(ast, _)| ast.file_id == file_id).for_each(
213+
|(ast, &exp_id)| {
214+
res[keys::MACRO_CALL].insert(ast.value, exp_id);
215+
},
216+
);
198217
}
199218
}
200219

@@ -225,7 +244,8 @@ impl ChildBySource for GenericDefId {
225244
return;
226245
}
227246

228-
let generic_params = db.generic_params(*self);
247+
let (generic_params, _, source_map) =
248+
GenericParams::generic_params_and_store_and_source_map(db, *self);
229249
let mut toc_idx_iter = generic_params.iter_type_or_consts().map(|(idx, _)| idx);
230250
let lts_idx_iter = generic_params.iter_lt().map(|(idx, _)| idx);
231251

@@ -253,6 +273,12 @@ impl ChildBySource for GenericDefId {
253273
res[keys::LIFETIME_PARAM].insert(AstPtr::new(&ast_param), id);
254274
}
255275
}
276+
277+
source_map.expansions().filter(|(ast, _)| ast.file_id == file_id).for_each(
278+
|(ast, &exp_id)| {
279+
res[keys::MACRO_CALL].insert(ast.value, exp_id);
280+
},
281+
);
256282
}
257283
}
258284

crates/hir/src/semantics/source_to_def.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -631,14 +631,14 @@ impl SourceToDefCtx<'_, '_> {
631631
match &item {
632632
ast::Item::Module(it) => self.module_to_def(container.with_value(it))?.into(),
633633
ast::Item::Trait(it) => self.trait_to_def(container.with_value(it))?.into(),
634-
ast::Item::TraitAlias(it) => {
635-
self.trait_alias_to_def(container.with_value(it))?.into()
636-
}
637634
ast::Item::Impl(it) => self.impl_to_def(container.with_value(it))?.into(),
638635
ast::Item::Enum(it) => self.enum_to_def(container.with_value(it))?.into(),
639-
ast::Item::TypeAlias(it) => {
640-
self.type_alias_to_def(container.with_value(it))?.into()
641-
}
636+
ast::Item::TypeAlias(it) => ChildContainer::GenericDefId(
637+
self.type_alias_to_def(container.with_value(it))?.into(),
638+
),
639+
ast::Item::TraitAlias(it) => ChildContainer::GenericDefId(
640+
self.trait_alias_to_def(container.with_value(it))?.into(),
641+
),
642642
ast::Item::Struct(it) => {
643643
let def = self.struct_to_def(container.with_value(it))?;
644644
let is_in_body = it.field_list().is_some_and(|it| {
@@ -738,11 +738,9 @@ pub(crate) enum ChildContainer {
738738
DefWithBodyId(DefWithBodyId),
739739
ModuleId(ModuleId),
740740
TraitId(TraitId),
741-
TraitAliasId(TraitAliasId),
742741
ImplId(ImplId),
743742
EnumId(EnumId),
744743
VariantId(VariantId),
745-
TypeAliasId(TypeAliasId),
746744
/// XXX: this might be the same def as, for example an `EnumId`. However,
747745
/// here the children are generic parameters, and not, eg enum variants.
748746
GenericDefId(GenericDefId),
@@ -751,11 +749,9 @@ impl_from! {
751749
DefWithBodyId,
752750
ModuleId,
753751
TraitId,
754-
TraitAliasId,
755752
ImplId,
756753
EnumId,
757754
VariantId,
758-
TypeAliasId,
759755
GenericDefId
760756
for ChildContainer
761757
}
@@ -767,11 +763,9 @@ impl ChildContainer {
767763
ChildContainer::DefWithBodyId(it) => it.child_by_source(db, file_id),
768764
ChildContainer::ModuleId(it) => it.child_by_source(db, file_id),
769765
ChildContainer::TraitId(it) => it.child_by_source(db, file_id),
770-
ChildContainer::TraitAliasId(_) => DynMap::default(),
771766
ChildContainer::ImplId(it) => it.child_by_source(db, file_id),
772767
ChildContainer::EnumId(it) => it.child_by_source(db, file_id),
773768
ChildContainer::VariantId(it) => it.child_by_source(db, file_id),
774-
ChildContainer::TypeAliasId(_) => DynMap::default(),
775769
ChildContainer::GenericDefId(it) => it.child_by_source(db, file_id),
776770
}
777771
}

crates/ide/src/expand_macro.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,4 +800,48 @@ foo();
800800
foo();"#]],
801801
);
802802
}
803+
804+
#[test]
805+
fn works_in_sig() {
806+
check(
807+
r#"
808+
macro_rules! foo {
809+
() => { u32 };
810+
}
811+
fn foo() -> foo$0!() {
812+
42
813+
}
814+
"#,
815+
expect![[r#"
816+
foo!
817+
u32"#]],
818+
);
819+
check(
820+
r#"
821+
macro_rules! foo {
822+
() => { u32 };
823+
}
824+
fn foo(_: foo$0!() ) {}
825+
"#,
826+
expect![[r#"
827+
foo!
828+
u32"#]],
829+
);
830+
}
831+
832+
#[test]
833+
fn works_in_generics() {
834+
check(
835+
r#"
836+
trait Trait {}
837+
macro_rules! foo {
838+
() => { Trait };
839+
}
840+
impl<const C: foo$0!()> Trait for () {}
841+
"#,
842+
expect![[r#"
843+
foo!
844+
Trait"#]],
845+
);
846+
}
803847
}

0 commit comments

Comments
 (0)