如何在编译器插件中获取结构字段和字段类型?
How to get struct fields and fields type in compiler plugin?
我想生成一个 HashMap
,它使用结构字段作为键,并使用 usize
整数作为值。
pub struct Article {
title: String,
content: String,
category: String,
comments: Vec<Comment>
}
pub struct Comment {
content: String
}
我的预期输出是:
{
title: 0,
content: 1,
category: 2
comments[].content: 3
}
我的解决方案是 impl
我的特点 FieldsMapping
Article
和 Comment
:
pub trait FieldsMapping {
fn get_fields_map(&self) -> HashMap<String, usize>;
}
我想为自定义派生编写一个编译器插件FieldsMapping
。
我的问题是:如何获取编译器插件中的所有字段?我怎么知道字段类型是 Vec
还是其他?
你没有。
编译器插件(即 过程宏)在此信息存在之前展开,因此您无法访问它。不,你不能延迟扩展直到类型存在。不,如果你把它变成 lint,你就不能生成代码,这就违背了拥有过程宏的目的。
我想生成一个 HashMap
,它使用结构字段作为键,并使用 usize
整数作为值。
pub struct Article {
title: String,
content: String,
category: String,
comments: Vec<Comment>
}
pub struct Comment {
content: String
}
我的预期输出是:
{
title: 0,
content: 1,
category: 2
comments[].content: 3
}
我的解决方案是 impl
我的特点 FieldsMapping
Article
和 Comment
:
pub trait FieldsMapping {
fn get_fields_map(&self) -> HashMap<String, usize>;
}
我想为自定义派生编写一个编译器插件FieldsMapping
。
我的问题是:如何获取编译器插件中的所有字段?我怎么知道字段类型是 Vec
还是其他?
你没有。
编译器插件(即 过程宏)在此信息存在之前展开,因此您无法访问它。不,你不能延迟扩展直到类型存在。不,如果你把它变成 lint,你就不能生成代码,这就违背了拥有过程宏的目的。