Typedef parsing
diff --git a/src/generics.rs b/src/generics.rs
index c0d5c94..40025c4 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -89,8 +89,8 @@
use ident::parsing::ident;
use ty::parsing::{ty, poly_trait_ref};
- named!(pub generics -> Generics, do_parse!(
- bracketed: alt!(
+ named!(pub generics -> Generics, map!(
+ alt!(
do_parse!(
punct!("<") >>
lifetimes: separated_list!(punct!(","), lifetime_def) >>
@@ -103,13 +103,12 @@
)
|
epsilon!() => { |_| (Vec::new(), Vec::new()) }
- ) >>
- where_clause: where_clause >>
- (Generics {
- lifetimes: bracketed.0,
- ty_params: bracketed.1,
- where_clause: where_clause,
- })
+ ),
+ |(lifetimes, ty_params)| Generics {
+ lifetimes: lifetimes,
+ ty_params: ty_params,
+ where_clause: Default::default(),
+ }
));
named!(pub lifetime -> Lifetime, preceded!(
diff --git a/src/item.rs b/src/item.rs
index 011a6ff..4d646fe 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -212,6 +212,7 @@
use attr::parsing::outer_attr;
use data::parsing::visibility;
use expr::parsing::expr;
+ use generics::parsing::generics;
use ident::parsing::ident;
use macro_input::{Body, MacroInput};
use macro_input::parsing::macro_input;
@@ -227,7 +228,8 @@
// TODO: Fn
// TODO: Mod
// TODO: ForeignMod
- // TODO: Ty
+ |
+ item_ty
|
item_struct_or_enum
// TODO: Union
@@ -299,6 +301,23 @@
})
));
+ named!(item_ty -> Item, do_parse!(
+ attrs: many0!(outer_attr) >>
+ vis: visibility >>
+ keyword!("type") >>
+ id: ident >>
+ generics: generics >>
+ punct!("=") >>
+ ty: ty >>
+ punct!(";") >>
+ (Item {
+ ident: id,
+ vis: vis,
+ attrs: attrs,
+ node: ItemKind::Ty(Box::new(ty), generics),
+ })
+ ));
+
named!(item_struct_or_enum -> Item, map!(
macro_input,
|def: MacroInput| Item {
@@ -365,7 +384,15 @@
ItemKind::Fn(ref _decl, _unsafety, _constness, ref _abi, ref _generics, ref _block) => unimplemented!(),
ItemKind::Mod(ref _items) => unimplemented!(),
ItemKind::ForeignMod(ref _foreign_mod) => unimplemented!(),
- ItemKind::Ty(ref _ty, ref _generics) => unimplemented!(),
+ ItemKind::Ty(ref ty, ref generics) => {
+ self.vis.to_tokens(tokens);
+ tokens.append("type");
+ self.ident.to_tokens(tokens);
+ generics.to_tokens(tokens);
+ tokens.append("=");
+ ty.to_tokens(tokens);
+ tokens.append(";");
+ }
ItemKind::Enum(ref variants, ref generics) => {
self.vis.to_tokens(tokens);
tokens.append("enum");
diff --git a/src/macro_input.rs b/src/macro_input.rs
index 149b6d7..92a8e79 100644
--- a/src/macro_input.rs
+++ b/src/macro_input.rs
@@ -18,9 +18,10 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
+ use Generics;
use attr::parsing::outer_attr;
use data::parsing::{visibility, struct_body, enum_body};
- use generics::parsing::generics;
+ use generics::parsing::{generics, where_clause};
use space::whitespace;
use ident::parsing::ident;
@@ -30,12 +31,16 @@
which: alt!(keyword!("struct") | keyword!("enum")) >>
id: ident >>
generics: generics >>
+ where_clause: where_clause >>
item: switch!(value!(which),
"struct" => map!(struct_body, move |body| MacroInput {
ident: id,
vis: vis,
attrs: attrs,
- generics: generics,
+ generics: Generics {
+ where_clause: where_clause,
+ .. generics
+ },
body: Body::Struct(body),
})
|
@@ -43,7 +48,10 @@
ident: id,
vis: vis,
attrs: attrs,
- generics: generics,
+ generics: Generics {
+ where_clause: where_clause,
+ .. generics
+ },
body: Body::Enum(body),
})
) >>