我想要一个编译器插件来注释带有一些信息的结构。例如,原始结构只有一个字段:
struct X { x: i32, y: MARKTYPE }
我想添加另一个字段:
MultiModifier
当我查看Rust编译器插件时,我决定使用SyntaxExtension
(enum ItemKind
)来完成我的工作。 Struct(VariantData, Generics)
定义VariantData
,#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
pub enum VariantData {
/// Struct variant.
///
/// E.g. `Bar { .. }` as in `enum Foo { Bar { .. } }`
Struct(Vec<StructField>, NodeId),
/// Tuple variant.
///
/// E.g. `Bar(..)` as in `enum Foo { Bar(..) }`
Tuple(Vec<StructField>, NodeId),
/// Unit variant.
///
/// E.g. `Bar = ..` as in `enum Foo { Bar = .. }`
Unit(NodeId),
}
存储数据字段:
StructField
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
pub struct StructField {
pub span: Span,
pub ident: Option<Ident>,
pub vis: Visibility,
pub id: NodeId,
pub ty: P<Ty>,
pub attrs: Vec<Attribute>,
}
定义为:
StructField
我计划插入Span
,但我不知道如何为该字段制作Span
。每个lo
都包含hi
和BytePos
StructField
。 Fields 0: StructField {
span: Span {
lo: BytePos(432),
hi: BytePos(437),
expn_id: ExpnId(4294967295)
},
ident: Some(x#0),
vis: Inherited,
id: NodeId(4294967295),
ty: type(i32),
attrs: []
}
的信息如下:
VariantData
插入新字段的正确方法是什么?
我知道使用宏来完成这项工作会更容易,但我想知道通过修改 <input id="type_ingd" type="text">
<button class="btn btn-primary" id="add_ingd">
Add
</button>
<div class="text-left ingd-cont">
<div class="btn-group incl-ingd">
<div type="button" class="btn btn-default">
Rooms <i class="fa fa-close"></i>
</div>
</div>
<div class="btn-group incl-ingd">
<div type="button" class="btn btn-default">
Mansions <i class="fa fa-close"></i>
</div>
</div>
</div>
来插入字段是否合理。