我正在编写一个过程宏,它将接受特征的名称并生成一个新类型结构,该结构存储该特征的实现者(
T
)并通过使用T
上的实现来实现该特征。实际上,这种新型结构隔离了对象的一个特征,并将所有其他特征的实现“密封在内部”。
为了正确工作,宏需要在调用站点的范围内找到特征(这可以通过与调用相同的方式引用特征来轻松完成),根据特征名称生成新类型的名称(在我的例子中,
Only{trait_name}
,例如OnlyDisplay
),获取特征中的方法和关联函数/类型/常量的列表,并使用self.{method_name}({parameters})
(对于方法)或Self::{assoc_name}
(对于关联)实现它们成员。这一步让我感到困惑:Sync crate 和 proc_macro
都没有提供通过 Ident
定位特征并在事后反思它们的方法。
那么,如何在当前范围内通过
Ident
定位特征并获取其定义中所有内容的列表?
简短回答:你不能。当执行 proc-macro 时,编译器所知道的就是源代码的标记化;也就是说,它知道源解析。编译器对类型一无所知,哪些标识指代什么以及如何理解其中任何一个。
您可能想更新有关您的意图的问题:您实际上想实现什么目标?
你不能。在完成任何语义分析之前宏会被扩展,并且此时名称不会被解析。
您最好的选择是执行类似 serde 的远程属性 的操作并重复特征定义。
板条箱 enum_dispatch 执行您正在寻找的操作。看一下
中的cache_trait函数https://gitlab.com/antonok/enum_dispatch/-/blob/master/src/cache.rs?ref_type=heads
它将特征定义存储在惰性静态中,可以在定义 proc 宏时查询。