6

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

struct X { x: i32 }

我想添加另一个字段:

struct X { x: i32, y: MARKTYPE }

当我研究 Rust 编译器插件时,我决定使用MultiModifier( 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>,
}

我计划插入 a StructField,但我不知道如何Span为该字段制作 a 。每个都Span包含 alo和 a hi BytePosStructFields 信息如下所示:

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.

4

0 回答 0