// 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. use syntax; use syntax::codemap::Span; use syntax::ast; use syntax::ast::{Ident, NodeId}; pub struct Module { name: Option, attrs: ~[ast::Attribute], where: Span, structs: ~[Struct], enums: ~[Enum], fns: ~[Function], mods: ~[Module], id: NodeId, typedefs: ~[Typedef], statics: ~[Static], traits: ~[Trait], vis: ast::Visibility, impls: ~[Impl], foreigns: ~[ast::ForeignMod], view_items: ~[ast::ViewItem], macros: ~[Macro], is_crate: bool, } impl Module { pub fn new(name: Option) -> Module { Module { name : name, id: 0, vis: ast::Private, where: syntax::codemap::DUMMY_SP, attrs : ~[], structs : ~[], enums : ~[], fns : ~[], mods : ~[], typedefs : ~[], statics : ~[], traits : ~[], impls : ~[], view_items : ~[], foreigns : ~[], macros : ~[], is_crate : false, } } } #[deriving(Show, Clone, Encodable, Decodable)] 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(ast::TraitRef) } pub struct Struct { vis: ast::Visibility, id: NodeId, struct_type: StructType, name: Ident, generics: ast::Generics, attrs: ~[ast::Attribute], fields: ~[ast::StructField], where: Span, } pub struct Enum { vis: ast::Visibility, variants: ~[Variant], generics: ast::Generics, attrs: ~[ast::Attribute], id: NodeId, where: Span, name: Ident, } pub struct Variant { name: Ident, attrs: ~[ast::Attribute], kind: ast::VariantKind, id: ast::NodeId, vis: ast::Visibility, where: Span, } pub struct Function { decl: ast::FnDecl, attrs: ~[ast::Attribute], id: NodeId, name: Ident, vis: ast::Visibility, purity: ast::Purity, where: Span, generics: ast::Generics, } pub struct Typedef { ty: ast::P, gen: ast::Generics, name: Ident, id: ast::NodeId, attrs: ~[ast::Attribute], where: Span, vis: ast::Visibility, } pub struct Static { type_: ast::P, mutability: ast::Mutability, expr: @ast::Expr, name: Ident, attrs: ~[ast::Attribute], vis: ast::Visibility, id: ast::NodeId, where: Span, } pub struct Trait { name: Ident, methods: ~[ast::TraitMethod], //should be TraitMethod generics: ast::Generics, parents: ~[ast::TraitRef], attrs: ~[ast::Attribute], id: ast::NodeId, where: Span, vis: ast::Visibility, } pub struct Impl { generics: ast::Generics, trait_: Option, for_: ast::P, methods: ~[@ast::Method], attrs: ~[ast::Attribute], where: Span, vis: ast::Visibility, id: ast::NodeId, } pub struct Macro { name: Ident, id: ast::NodeId, attrs: ~[ast::Attribute], where: Span, } pub fn struct_type_from_def(sd: &ast::StructDef) -> StructType { if sd.ctor_id.is_some() { // We are in a tuple-struct match sd.fields.len() { 0 => Unit, 1 => Newtype, _ => Tuple } } else { Plain } }