//! This module is used to store stuff from Rust's AST in a more convenient //! manner (and with prettier names) before cleaning. pub use self::StructType::*; use syntax::ast; use syntax::ast::Name; use syntax_pos::hygiene::MacroKind; use syntax_pos::{self, Span}; use rustc::hir; use rustc::hir::def_id::CrateNum; use rustc::hir::ptr::P; pub struct Module<'hir> { pub name: Option, pub attrs: &'hir [ast::Attribute], pub where_outer: Span, pub where_inner: Span, pub extern_crates: Vec>, pub imports: Vec>, pub structs: Vec>, pub unions: Vec>, pub enums: Vec>, pub fns: Vec>, pub mods: Vec>, pub id: hir::HirId, pub typedefs: Vec>, pub opaque_tys: Vec>, pub statics: Vec>, pub constants: Vec>, pub traits: Vec>, pub vis: &'hir hir::Visibility, pub impls: Vec>, pub foreigns: Vec>, pub macros: Vec>, pub proc_macros: Vec>, pub trait_aliases: Vec>, pub is_crate: bool, } impl Module<'hir> { pub fn new( name: Option, attrs: &'hir [ast::Attribute], vis: &'hir hir::Visibility, ) -> Module<'hir> { Module { name : name, id: hir::CRATE_HIR_ID, vis, where_outer: syntax_pos::DUMMY_SP, where_inner: syntax_pos::DUMMY_SP, attrs, extern_crates: Vec::new(), imports : Vec::new(), structs : Vec::new(), unions : Vec::new(), enums : Vec::new(), fns : Vec::new(), mods : Vec::new(), typedefs : Vec::new(), opaque_tys : Vec::new(), statics : Vec::new(), constants : Vec::new(), traits : Vec::new(), impls : Vec::new(), foreigns : Vec::new(), macros : Vec::new(), proc_macros: Vec::new(), trait_aliases: Vec::new(), is_crate : false, } } } #[derive(Debug, Clone, Copy)] pub enum StructType { /// A braced struct Plain, /// A tuple struct Tuple, /// A unit struct Unit, } pub struct Struct<'hir> { pub vis: &'hir hir::Visibility, pub id: hir::HirId, pub struct_type: StructType, pub name: Name, pub generics: &'hir hir::Generics, pub attrs: &'hir [ast::Attribute], pub fields: &'hir [hir::StructField], pub whence: Span, } pub struct Union<'hir> { pub vis: &'hir hir::Visibility, pub id: hir::HirId, pub struct_type: StructType, pub name: Name, pub generics: &'hir hir::Generics, pub attrs: &'hir [ast::Attribute], pub fields: &'hir [hir::StructField], pub whence: Span, } pub struct Enum<'hir> { pub vis: &'hir hir::Visibility, pub variants: Vec>, pub generics: &'hir hir::Generics, pub attrs: &'hir [ast::Attribute], pub id: hir::HirId, pub whence: Span, pub name: Name, } pub struct Variant<'hir> { pub name: Name, pub id: hir::HirId, pub attrs: &'hir [ast::Attribute], pub def: &'hir hir::VariantData, pub whence: Span, } pub struct Function<'hir> { pub decl: &'hir hir::FnDecl, pub attrs: &'hir [ast::Attribute], pub id: hir::HirId, pub name: Name, pub vis: &'hir hir::Visibility, pub header: hir::FnHeader, pub whence: Span, pub generics: &'hir hir::Generics, pub body: hir::BodyId, } pub struct Typedef<'hir> { pub ty: &'hir P, pub gen: &'hir hir::Generics, pub name: Name, pub id: hir::HirId, pub attrs: &'hir [ast::Attribute], pub whence: Span, pub vis: &'hir hir::Visibility, } pub struct OpaqueTy<'hir> { pub opaque_ty: &'hir hir::OpaqueTy, pub name: Name, pub id: hir::HirId, pub attrs: &'hir [ast::Attribute], pub whence: Span, pub vis: &'hir hir::Visibility, } #[derive(Debug)] pub struct Static<'hir> { pub type_: &'hir P, pub mutability: hir::Mutability, pub expr: hir::BodyId, pub name: Name, pub attrs: &'hir [ast::Attribute], pub vis: &'hir hir::Visibility, pub id: hir::HirId, pub whence: Span, } pub struct Constant<'hir> { pub type_: &'hir P, pub expr: hir::BodyId, pub name: Name, pub attrs: &'hir [ast::Attribute], pub vis: &'hir hir::Visibility, pub id: hir::HirId, pub whence: Span, } pub struct Trait<'hir> { pub is_auto: hir::IsAuto, pub unsafety: hir::Unsafety, pub name: Name, pub items: Vec<&'hir hir::TraitItem>, pub generics: &'hir hir::Generics, pub bounds: &'hir [hir::GenericBound], pub attrs: &'hir [ast::Attribute], pub id: hir::HirId, pub whence: Span, pub vis: &'hir hir::Visibility, } pub struct TraitAlias<'hir> { pub name: Name, pub generics: &'hir hir::Generics, pub bounds: &'hir [hir::GenericBound], pub attrs: &'hir [ast::Attribute], pub id: hir::HirId, pub whence: Span, pub vis: &'hir hir::Visibility, } #[derive(Debug)] pub struct Impl<'hir> { pub unsafety: hir::Unsafety, pub polarity: hir::ImplPolarity, pub defaultness: hir::Defaultness, pub generics: &'hir hir::Generics, pub trait_: &'hir Option, pub for_: &'hir P, pub items: Vec<&'hir hir::ImplItem>, pub attrs: &'hir [ast::Attribute], pub whence: Span, pub vis: &'hir hir::Visibility, pub id: hir::HirId, } pub struct ForeignItem<'hir> { pub vis: &'hir hir::Visibility, pub id: hir::HirId, pub name: Name, pub kind: &'hir hir::ForeignItemKind, pub attrs: &'hir [ast::Attribute], pub whence: Span, } // For Macro we store the DefId instead of the NodeId, since we also create // these imported macro_rules (which only have a DUMMY_NODE_ID). pub struct Macro<'hir> { pub name: Name, pub hid: hir::HirId, pub def_id: hir::def_id::DefId, pub attrs: &'hir [ast::Attribute], pub whence: Span, pub matchers: hir::HirVec, pub imported_from: Option, } pub struct ExternCrate<'hir> { pub name: Name, pub cnum: CrateNum, pub path: Option, pub vis: &'hir hir::Visibility, pub attrs: &'hir [ast::Attribute], pub whence: Span, } pub struct Import<'hir> { pub name: Name, pub id: hir::HirId, pub vis: &'hir hir::Visibility, pub attrs: &'hir [ast::Attribute], pub path: &'hir hir::Path, pub glob: bool, pub whence: Span, } pub struct ProcMacro<'hir> { pub name: Name, pub id: hir::HirId, pub kind: MacroKind, pub helpers: Vec, pub attrs: &'hir [ast::Attribute], pub whence: Span, } pub fn struct_type_from_def(vdata: &hir::VariantData) -> StructType { match *vdata { hir::VariantData::Struct(..) => Plain, hir::VariantData::Tuple(..) => Tuple, hir::VariantData::Unit(..) => Unit, } }