1 //! This module is used to store stuff from Rust's AST in a more convenient
2 //! manner (and with prettier names) before cleaning.
3 pub use self::StructType::*;
7 use syntax_pos::hygiene::MacroKind;
8 use syntax_pos::{self, Span};
11 use rustc::hir::def_id::CrateNum;
12 use rustc::hir::ptr::P;
14 pub struct Module<'hir> {
15 pub name: Option<Name>,
16 pub attrs: &'hir [ast::Attribute],
17 pub where_outer: Span,
18 pub where_inner: Span,
19 pub extern_crates: Vec<ExternCrate<'hir>>,
20 pub imports: Vec<Import<'hir>>,
21 pub structs: Vec<Struct<'hir>>,
22 pub unions: Vec<Union<'hir>>,
23 pub enums: Vec<Enum<'hir>>,
24 pub fns: Vec<Function<'hir>>,
25 pub mods: Vec<Module<'hir>>,
27 pub typedefs: Vec<Typedef<'hir>>,
28 pub opaque_tys: Vec<OpaqueTy<'hir>>,
29 pub statics: Vec<Static<'hir>>,
30 pub constants: Vec<Constant<'hir>>,
31 pub traits: Vec<Trait<'hir>>,
32 pub vis: &'hir hir::Visibility,
33 pub impls: Vec<Impl<'hir>>,
34 pub foreigns: Vec<ForeignItem<'hir>>,
35 pub macros: Vec<Macro<'hir>>,
36 pub proc_macros: Vec<ProcMacro<'hir>>,
37 pub trait_aliases: Vec<TraitAlias<'hir>>,
44 attrs: &'hir [ast::Attribute],
45 vis: &'hir hir::Visibility,
49 id: hir::CRATE_HIR_ID,
51 where_outer: syntax_pos::DUMMY_SP,
52 where_inner: syntax_pos::DUMMY_SP,
54 extern_crates: Vec::new(),
61 typedefs : Vec::new(),
62 opaque_tys : Vec::new(),
64 constants : Vec::new(),
67 foreigns : Vec::new(),
69 proc_macros: Vec::new(),
70 trait_aliases: Vec::new(),
76 #[derive(Debug, Clone, Copy)]
86 pub struct Struct<'hir> {
87 pub vis: &'hir hir::Visibility,
89 pub struct_type: StructType,
91 pub generics: &'hir hir::Generics,
92 pub attrs: &'hir [ast::Attribute],
93 pub fields: &'hir [hir::StructField],
97 pub struct Union<'hir> {
98 pub vis: &'hir hir::Visibility,
100 pub struct_type: StructType,
102 pub generics: &'hir hir::Generics,
103 pub attrs: &'hir [ast::Attribute],
104 pub fields: &'hir [hir::StructField],
108 pub struct Enum<'hir> {
109 pub vis: &'hir hir::Visibility,
110 pub variants: Vec<Variant<'hir>>,
111 pub generics: &'hir hir::Generics,
112 pub attrs: &'hir [ast::Attribute],
118 pub struct Variant<'hir> {
121 pub attrs: &'hir [ast::Attribute],
122 pub def: &'hir hir::VariantData,
126 pub struct Function<'hir> {
127 pub decl: &'hir hir::FnDecl,
128 pub attrs: &'hir [ast::Attribute],
131 pub vis: &'hir hir::Visibility,
132 pub header: hir::FnHeader,
134 pub generics: &'hir hir::Generics,
135 pub body: hir::BodyId,
138 pub struct Typedef<'hir> {
139 pub ty: &'hir P<hir::Ty>,
140 pub gen: &'hir hir::Generics,
143 pub attrs: &'hir [ast::Attribute],
145 pub vis: &'hir hir::Visibility,
148 pub struct OpaqueTy<'hir> {
149 pub opaque_ty: &'hir hir::OpaqueTy,
152 pub attrs: &'hir [ast::Attribute],
154 pub vis: &'hir hir::Visibility,
158 pub struct Static<'hir> {
159 pub type_: &'hir P<hir::Ty>,
160 pub mutability: hir::Mutability,
161 pub expr: hir::BodyId,
163 pub attrs: &'hir [ast::Attribute],
164 pub vis: &'hir hir::Visibility,
169 pub struct Constant<'hir> {
170 pub type_: &'hir P<hir::Ty>,
171 pub expr: hir::BodyId,
173 pub attrs: &'hir [ast::Attribute],
174 pub vis: &'hir hir::Visibility,
179 pub struct Trait<'hir> {
180 pub is_auto: hir::IsAuto,
181 pub unsafety: hir::Unsafety,
183 pub items: Vec<&'hir hir::TraitItem>,
184 pub generics: &'hir hir::Generics,
185 pub bounds: &'hir [hir::GenericBound],
186 pub attrs: &'hir [ast::Attribute],
189 pub vis: &'hir hir::Visibility,
192 pub struct TraitAlias<'hir> {
194 pub generics: &'hir hir::Generics,
195 pub bounds: &'hir [hir::GenericBound],
196 pub attrs: &'hir [ast::Attribute],
199 pub vis: &'hir hir::Visibility,
203 pub struct Impl<'hir> {
204 pub unsafety: hir::Unsafety,
205 pub polarity: hir::ImplPolarity,
206 pub defaultness: hir::Defaultness,
207 pub generics: &'hir hir::Generics,
208 pub trait_: &'hir Option<hir::TraitRef>,
209 pub for_: &'hir P<hir::Ty>,
210 pub items: Vec<&'hir hir::ImplItem>,
211 pub attrs: &'hir [ast::Attribute],
213 pub vis: &'hir hir::Visibility,
217 pub struct ForeignItem<'hir> {
218 pub vis: &'hir hir::Visibility,
221 pub kind: &'hir hir::ForeignItemKind,
222 pub attrs: &'hir [ast::Attribute],
226 // For Macro we store the DefId instead of the NodeId, since we also create
227 // these imported macro_rules (which only have a DUMMY_NODE_ID).
228 pub struct Macro<'hir> {
231 pub def_id: hir::def_id::DefId,
232 pub attrs: &'hir [ast::Attribute],
234 pub matchers: hir::HirVec<Span>,
235 pub imported_from: Option<Name>,
238 pub struct ExternCrate<'hir> {
241 pub path: Option<String>,
242 pub vis: &'hir hir::Visibility,
243 pub attrs: &'hir [ast::Attribute],
247 pub struct Import<'hir> {
250 pub vis: &'hir hir::Visibility,
251 pub attrs: &'hir [ast::Attribute],
252 pub path: &'hir hir::Path,
257 pub struct ProcMacro<'hir> {
261 pub helpers: Vec<Name>,
262 pub attrs: &'hir [ast::Attribute],
266 pub fn struct_type_from_def(vdata: &hir::VariantData) -> StructType {
268 hir::VariantData::Struct(..) => Plain,
269 hir::VariantData::Tuple(..) => Tuple,
270 hir::VariantData::Unit(..) => Unit,