blob: c1951deb310e657e65c8da08ea3183fd6528cc93 [file] [log] [blame]
David Tolnay86eca752016-09-04 11:26:41 -07001#[cfg(feature = "parsing")]
David Tolnay35161ff2016-09-03 11:33:15 -07002#[macro_use]
3extern crate nom;
4
David Tolnay87d0b442016-09-04 11:52:12 -07005#[cfg(feature = "printing")]
6extern crate quote;
7
David Tolnayb79ee962016-09-04 09:39:20 -07008#[macro_use]
David Tolnay6b7aaf02016-09-04 10:39:25 -07009mod do_parse;
10
11#[macro_use]
David Tolnayb79ee962016-09-04 09:39:20 -070012mod helper;
David Tolnay35161ff2016-09-03 11:33:15 -070013
David Tolnayb79ee962016-09-04 09:39:20 -070014mod attr;
15pub use attr::{
16 Attribute,
17 MetaItem,
18};
David Tolnay35161ff2016-09-03 11:33:15 -070019
David Tolnayb79ee962016-09-04 09:39:20 -070020mod common;
21pub use common::{
22 Ident,
23 Visibility,
24};
David Tolnay35161ff2016-09-03 11:33:15 -070025
David Tolnayb79ee962016-09-04 09:39:20 -070026mod generics;
27pub use generics::{
28 Generics,
29 Lifetime,
30 LifetimeDef,
31 TyParam,
32 TyParamBound,
33 WhereBoundPredicate,
34 WherePredicate,
35 WhereRegionPredicate,
36};
David Tolnay35161ff2016-09-03 11:33:15 -070037
David Tolnayb79ee962016-09-04 09:39:20 -070038mod item;
39pub use item::{
40 Body,
41 Field,
42 Item,
43 Style,
44 Variant,
45};
David Tolnay35161ff2016-09-03 11:33:15 -070046
David Tolnayb79ee962016-09-04 09:39:20 -070047mod ty;
48pub use ty::{
49 AngleBracketedParameterData,
50 Arg,
51 BareFnTy,
52 FnDecl,
53 FunctionRetTy,
54 MutTy,
55 Mutability,
56 ParenthesizedParameterData,
57 Path,
58 PathParameters,
59 PathSegment,
60 PolyTraitRef,
61 QSelf,
62 Ty,
63 TypeBinding,
64};
David Tolnay35161ff2016-09-03 11:33:15 -070065
David Tolnay86eca752016-09-04 11:26:41 -070066#[cfg(feature = "parsing")]
David Tolnay7ebb9fb2016-09-03 12:07:47 -070067pub fn parse(input: &str) -> Item {
David Tolnayc94c38a2016-09-05 17:02:03 -070068 return match item::parsing::item(input) {
David Tolnayb79ee962016-09-04 09:39:20 -070069 nom::IResult::Done(rest, ast) => {
David Tolnay35161ff2016-09-03 11:33:15 -070070 if rest.is_empty() {
David Tolnay7ebb9fb2016-09-03 12:07:47 -070071 ast
David Tolnay35161ff2016-09-03 11:33:15 -070072 } else {
David Tolnay7ebb9fb2016-09-03 12:07:47 -070073 panic!("more than a single input item: {:?}", rest)
David Tolnay35161ff2016-09-03 11:33:15 -070074 }
75 }
David Tolnayb79ee962016-09-04 09:39:20 -070076 nom::IResult::Error(err) => raise(err),
77 nom::IResult::Incomplete(_) => panic!("incomplete input item"),
David Tolnayc94c38a2016-09-05 17:02:03 -070078 };
David Tolnay7ebb9fb2016-09-03 12:07:47 -070079
David Tolnayc94c38a2016-09-05 17:02:03 -070080 fn raise(mut err: nom::Err<&str>) -> ! {
81 loop {
82 match err {
83 nom::Err::Code(kind) => {
84 panic!("failed to parse {:?}", kind)
85 }
86 nom::Err::Position(kind, pos) => {
87 panic!("failed to parse {:?}: {:?}", kind, pos)
88 }
89 nom::Err::Node(_, next) |
90 nom::Err::NodePosition(_, _, next) => {
91 err = *next;
92 }
David Tolnay7ebb9fb2016-09-03 12:07:47 -070093 }
David Tolnay35161ff2016-09-03 11:33:15 -070094 }
David Tolnay35161ff2016-09-03 11:33:15 -070095 }
96}