use super::*;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Item {
pub ident: Ident,
pub vis: Visibility,
pub attrs: Vec<Attribute>,
pub node: ItemKind,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum ItemKind {
ExternCrate(Option<Ident>),
Use(Box<ViewPath>),
Static(Box<Ty>, Mutability, Box<Expr>),
Const(Box<Ty>, Box<Expr>),
Fn(Box<FnDecl>, Unsafety, Constness, Abi, Generics, Box<Block>),
Mod(Vec<Item>),
ForeignMod(ForeignMod),
Ty(Box<Ty>, Generics),
Enum(Vec<Variant>, Generics),
Struct(VariantData, Generics),
Union(VariantData, Generics),
Trait(Unsafety, Generics, Vec<TyParamBound>, Vec<TraitItem>),
DefaultImpl(Unsafety, Path),
Impl(Unsafety,
ImplPolarity,
Generics,
Option<Path>, Box<Ty>, Vec<ImplItem>),
Mac(Mac),
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum ViewPath {
Simple(Ident, Path),
Glob(Path),
List(Path, Vec<PathListItem>)
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct PathListItem {
pub name: Ident,
pub rename: Option<Ident>,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Unsafety {
Unsafe,
Normal,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Constness {
Const,
NotConst,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Defaultness {
Default,
Final,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Abi(pub String);
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct ForeignMod {
pub abi: Abi,
pub items: Vec<ForeignItem>,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct ForeignItem {
pub ident: Ident,
pub attrs: Vec<Attribute>,
pub node: ForeignItemKind,
pub vis: Visibility,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum ForeignItemKind {
Fn(Box<FnDecl>, Generics),
Static(Box<Ty>, bool),
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct TraitItem {
pub ident: Ident,
pub attrs: Vec<Attribute>,
pub node: TraitItemKind,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum TraitItemKind {
Const(Ty, Option<Expr>),
Method(MethodSig, Option<Block>),
Type(Vec<TyParamBound>, Option<Ty>),
Macro(Mac),
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum ImplPolarity {
Positive,
Negative,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct ImplItem {
pub ident: Ident,
pub vis: Visibility,
pub defaultness: Defaultness,
pub attrs: Vec<Attribute>,
pub node: ImplItemKind,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum ImplItemKind {
Const(Ty, Expr),
Method(MethodSig, Block),
Type(Ty),
Macro(Mac),
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct MethodSig {
pub unsafety: Unsafety,
pub constness: Constness,
pub abi: Abi,
pub decl: FnDecl,
pub generics: Generics,
}
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
use attr::parsing::attribute;
use data::parsing::visibility;
use ident::parsing::ident;
use macro_input::{Body, MacroInput};
use macro_input::parsing::macro_input;
use nom::multispace;
named!(pub item -> Item, alt!(
item_extern_crate
|
item_struct_or_enum
));
named!(item_extern_crate -> Item, do_parse!(
attrs: many0!(attribute) >>
vis: visibility >>
punct!("extern") >>
multispace >>
punct!("crate") >>
multispace >>
id: ident >>
rename: option!(preceded!(
tuple!(punct!("as"), multispace),
ident
)) >>
punct!(";") >>
({
let (name, original_name) = match rename {
Some(rename) => (rename, Some(id)),
None => (id, None),
};
Item {
ident: name,
vis: vis,
attrs: attrs,
node: ItemKind::ExternCrate(original_name),
}
})
));
named!(item_struct_or_enum -> Item, map!(
macro_input,
|def: MacroInput| Item {
ident: def.ident,
vis: def.vis,
attrs: def.attrs,
node: match def.body {
Body::Enum(variants) => {
ItemKind::Enum(variants, def.generics)
}
Body::Struct(variant_data) => {
ItemKind::Struct(variant_data, def.generics)
}
}
}
));
}