Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics/source_to_def.rs')
-rw-r--r--crates/hir/src/semantics/source_to_def.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/crates/hir/src/semantics/source_to_def.rs b/crates/hir/src/semantics/source_to_def.rs
index 7f6c9af474..7dac01a268 100644
--- a/crates/hir/src/semantics/source_to_def.rs
+++ b/crates/hir/src/semantics/source_to_def.rs
@@ -108,7 +108,7 @@ use span::FileId;
use stdx::impl_from;
use syntax::{
AstNode, AstPtr, SyntaxNode,
- ast::{self, HasName},
+ ast::{self, HasAttrs, HasName},
};
use tt::TextRange;
@@ -411,10 +411,24 @@ impl SourceToDefCtx<'_, '_> {
.map(|&(attr_id, call_id, ref ids)| (attr_id, call_id, &**ids))
}
- pub(super) fn has_derives(&mut self, adt: InFile<&ast::Adt>) -> bool {
+ pub(super) fn file_of_adt_has_derives(&mut self, adt: InFile<&ast::Adt>) -> bool {
self.dyn_map(adt).as_ref().is_some_and(|map| !map[keys::DERIVE_MACRO_CALL].is_empty())
}
+ pub(super) fn derive_macro_calls<'slf>(
+ &'slf mut self,
+ adt: InFile<&ast::Adt>,
+ ) -> Option<impl Iterator<Item = (AttrId, MacroCallId, &'slf [Option<MacroCallId>])> + use<'slf>>
+ {
+ self.dyn_map(adt).as_ref().map(|&map| {
+ let dyn_map = &map[keys::DERIVE_MACRO_CALL];
+ adt.value
+ .attrs()
+ .filter_map(move |attr| dyn_map.get(&AstPtr::new(&attr)))
+ .map(|&(attr_id, call_id, ref ids)| (attr_id, call_id, &**ids))
+ })
+ }
+
fn to_def<Ast: AstNode + 'static, ID: Copy + 'static>(
&mut self,
src: InFile<&Ast>,