使用Rust编译器插件插入新字段时,创建Span的正确方法是什么?

时间:2017-02-02 00:30:10

标签: rust rust-compiler-plugin

我想要一个编译器插件来注释带有一些信息的结构。例如,原始结构只有一个字段:

struct X { x: i32, y: MARKTYPE }

我想添加另一个字段:

MultiModifier

当我查看Rust编译器插件时,我决定使用SyntaxExtensionenum 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都包含hiBytePos StructFieldFields 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> 来插入字段是否合理。

0 个答案:

没有答案