// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! 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::*; pub use self::TypeBound::*; use syntax; use syntax::codemap::Span; use syntax::abi; use syntax::ast; use syntax::ast::{Name, NodeId}; use syntax::attr; use syntax::ptr::P; use rustc_front::hir; pub struct Module { pub name: Option, pub attrs: Vec, pub where_outer: Span, pub where_inner: Span, pub extern_crates: Vec, pub imports: Vec, pub structs: Vec, pub enums: Vec, pub fns: Vec, pub mods: Vec, pub id: NodeId, pub typedefs: Vec, pub statics: Vec, pub constants: Vec, pub traits: Vec, pub vis: hir::Visibility, pub stab: Option, pub impls: Vec, pub def_traits: Vec, pub foreigns: Vec, pub macros: Vec, pub is_crate: bool, } impl Module { pub fn new(name: Option) -> Module { Module { name : name, id: 0, vis: hir::Inherited, stab: None, where_outer: syntax::codemap::DUMMY_SP, where_inner: syntax::codemap::DUMMY_SP, attrs : Vec::new(), extern_crates: Vec::new(), imports : Vec::new(), structs : Vec::new(), enums : Vec::new(), fns : Vec::new(), mods : Vec::new(), typedefs : Vec::new(), statics : Vec::new(), constants : Vec::new(), traits : Vec::new(), impls : Vec::new(), def_traits : Vec::new(), foreigns : Vec::new(), macros : Vec::new(), is_crate : false, } } } #[derive(Debug, Clone, RustcEncodable, RustcDecodable, Copy)] pub enum StructType { /// A normal struct Plain, /// A tuple struct Tuple, /// A newtype struct (tuple struct with one element) Newtype, /// A unit struct Unit } pub enum TypeBound { RegionBound, TraitBound(hir::TraitRef) } pub struct Struct { pub vis: hir::Visibility, pub stab: Option, pub id: NodeId, pub struct_type: StructType, pub name: Name, pub generics: hir::Generics, pub attrs: Vec, pub fields: Vec, pub whence: Span, } pub struct Enum { pub vis: hir::Visibility, pub stab: Option, pub variants: Vec, pub generics: hir::Generics, pub attrs: Vec, pub id: NodeId, pub whence: Span, pub name: Name, } pub struct Variant { pub name: Name, pub attrs: Vec, pub def: P, pub stab: Option, pub whence: Span, } pub struct Function { pub decl: hir::FnDecl, pub attrs: Vec, pub id: NodeId, pub name: Name, pub vis: hir::Visibility, pub stab: Option, pub unsafety: hir::Unsafety, pub constness: hir::Constness, pub whence: Span, pub generics: hir::Generics, pub abi: abi::Abi, } pub struct Typedef { pub ty: P, pub gen: hir::Generics, pub name: Name, pub id: ast::NodeId, pub attrs: Vec, pub whence: Span, pub vis: hir::Visibility, pub stab: Option, } #[derive(Debug)] pub struct Static { pub type_: P, pub mutability: hir::Mutability, pub expr: P, pub name: Name, pub attrs: Vec, pub vis: hir::Visibility, pub stab: Option, pub id: ast::NodeId, pub whence: Span, } pub struct Constant { pub type_: P, pub expr: P, pub name: Name, pub attrs: Vec, pub vis: hir::Visibility, pub stab: Option, pub id: ast::NodeId, pub whence: Span, } pub struct Trait { pub unsafety: hir::Unsafety, pub name: Name, pub items: Vec>, //should be TraitItem pub generics: hir::Generics, pub bounds: Vec, pub attrs: Vec, pub id: ast::NodeId, pub whence: Span, pub vis: hir::Visibility, pub stab: Option, } pub struct Impl { pub unsafety: hir::Unsafety, pub polarity: hir::ImplPolarity, pub generics: hir::Generics, pub trait_: Option, pub for_: P, pub items: Vec>, pub attrs: Vec, pub whence: Span, pub vis: hir::Visibility, pub stab: Option, pub id: ast::NodeId, } pub struct DefaultImpl { pub unsafety: hir::Unsafety, pub trait_: hir::TraitRef, pub id: ast::NodeId, pub attrs: Vec, pub whence: Span, } pub struct Macro { pub name: Name, pub id: ast::NodeId, pub attrs: Vec, pub whence: Span, pub stab: Option, pub imported_from: Option, } pub struct ExternCrate { pub name: Name, pub path: Option, pub vis: hir::Visibility, pub attrs: Vec, pub whence: Span, } pub struct Import { pub id: NodeId, pub vis: hir::Visibility, pub attrs: Vec, pub node: hir::ViewPath_, pub whence: Span, } pub fn struct_type_from_def(sd: &hir::VariantData) -> StructType { if !sd.is_struct() { // We are in a tuple-struct match sd.fields().count() { 0 => Unit, 1 => Newtype, _ => Tuple } } else { Plain } }