Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r--crates/hir/src/semantics.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 000daf76c2..b0435a4bac 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -148,6 +148,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> {
self.imp.expand_attr_macro(item)
}
+ pub fn expand_derive_macro(&self, derive: &ast::Attr) -> Option<SyntaxNode> {
+ self.imp.expand_derive_macro(derive)
+ }
+
pub fn is_attr_macro_call(&self, item: &ast::Item) -> bool {
self.imp.is_attr_macro_call(item)
}
@@ -385,6 +389,18 @@ impl<'db> SemanticsImpl<'db> {
Some(node)
}
+ fn expand_derive_macro(&self, attr: &ast::Attr) -> Option<SyntaxNode> {
+ let item = attr.syntax().parent().and_then(ast::Item::cast)?;
+ let sa = self.analyze(item.syntax());
+ let item = InFile::new(sa.file_id, &item);
+ let src = InFile::new(sa.file_id, attr.clone());
+ let macro_call_id = self.with_ctx(|ctx| ctx.attr_to_derive_macro_call(item, src))?;
+ let file_id = macro_call_id.as_file();
+ let node = self.db.parse_or_expand(file_id)?;
+ self.cache(node.clone(), file_id);
+ Some(node)
+ }
+
fn is_attr_macro_call(&self, item: &ast::Item) -> bool {
let sa = self.analyze(item.syntax());
let src = InFile::new(sa.file_id, item.clone());