Как правильно создать Span при вставке нового поля с плагином компилятора Rust?
Я хочу, чтобы плагин компилятора аннотировал структуру некоторой информацией. Например, исходная структура имеет только одно поле:
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>,
}
Я планировал вставить 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
,