From e5a2c6596ddd11b0d57042224ac7c1d7691ec33b Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Mon, 31 May 2021 13:37:11 +0200 Subject: Expand procedural attribute macros --- crates/hir_def/src/lib.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'crates/hir_def/src/lib.rs') diff --git a/crates/hir_def/src/lib.rs b/crates/hir_def/src/lib.rs index 9aa95720a..987485acc 100644 --- a/crates/hir_def/src/lib.rs +++ b/crates/hir_def/src/lib.rs @@ -55,6 +55,7 @@ use std::{ sync::Arc, }; +use attr::Attr; use base_db::{impl_intern_key, salsa, CrateId}; use hir_expand::{ ast_id_map::FileAstId, @@ -768,3 +769,42 @@ fn derive_macro_as_call_id( .into(); Ok(res) } + +fn attr_macro_as_call_id( + item_attr: &AstIdWithPath, + macro_attr: &Attr, + db: &dyn db::DefDatabase, + krate: CrateId, + resolver: impl Fn(path::ModPath) -> Option, +) -> Result { + let def: MacroDefId = resolver(item_attr.path.clone()) + .ok_or_else(|| UnresolvedMacro { path: item_attr.path.clone() })?; + let last_segment = item_attr + .path + .segments() + .last() + .ok_or_else(|| UnresolvedMacro { path: item_attr.path.clone() })?; + let mut arg = match ¯o_attr.input { + Some(input) => match &**input { + attr::AttrInput::Literal(_) => tt::Subtree::default(), + attr::AttrInput::TokenTree(tt) => tt.clone(), + }, + None => tt::Subtree::default(), + }; + // The parentheses are always disposed here. + arg.delimiter = None; + + let res = def + .as_lazy_macro( + db.upcast(), + krate, + MacroCallKind::Attr { + ast_id: item_attr.ast_id, + attr_name: last_segment.to_string(), + attr_args: arg, + invoc_attr_index: macro_attr.id.ast_index, + }, + ) + .into(); + Ok(res) +} -- cgit v1.2.3