blob: 9ebe7286e48eae344bab346671a2544c748c99e8 [file] [log] [blame]
David Tolnay87d0b442016-09-04 11:52:12 -07001#[cfg(feature = "printing")]
2extern crate quote;
3
David Tolnayb5a7b142016-09-13 22:46:39 -07004#[cfg(feature = "parsing")]
David Tolnayb79ee962016-09-04 09:39:20 -07005#[macro_use]
David Tolnayb5a7b142016-09-13 22:46:39 -07006mod nom;
David Tolnay6b7aaf02016-09-04 10:39:25 -07007
8#[macro_use]
David Tolnayb79ee962016-09-04 09:39:20 -07009mod helper;
David Tolnay35161ff2016-09-03 11:33:15 -070010
David Tolnay886d8ea2016-09-13 08:34:07 -070011mod escape;
12
David Tolnayb79ee962016-09-04 09:39:20 -070013mod attr;
14pub use attr::{
15 Attribute,
16 MetaItem,
17};
David Tolnay35161ff2016-09-03 11:33:15 -070018
David Tolnayf4bbbd92016-09-23 14:41:55 -070019#[cfg(feature = "full")]
20mod expr;
21#[cfg(feature = "full")]
22pub use expr::{
23 Arm,
24 BinOp,
25 BindingMode,
26 Block,
27 BlockCheckMode,
28 CaptureBy,
29 Expr,
30 FieldPat,
31 Local,
32 MacStmtStyle,
33 Pat,
34 RangeLimits,
35 Stmt,
36 UnOp,
37};
38
David Tolnayb79ee962016-09-04 09:39:20 -070039mod generics;
40pub use generics::{
41 Generics,
42 Lifetime,
43 LifetimeDef,
David Tolnay55337722016-09-11 12:58:56 -070044 TraitBoundModifier,
David Tolnayb79ee962016-09-04 09:39:20 -070045 TyParam,
46 TyParamBound,
47 WhereBoundPredicate,
David Tolnay55337722016-09-11 12:58:56 -070048 WhereClause,
David Tolnayb79ee962016-09-04 09:39:20 -070049 WherePredicate,
50 WhereRegionPredicate,
51};
David Tolnay35161ff2016-09-03 11:33:15 -070052
David Tolnay55337722016-09-11 12:58:56 -070053mod ident;
54pub use ident::{
55 Ident,
56};
57
David Tolnayb79ee962016-09-04 09:39:20 -070058mod item;
59pub use item::{
60 Body,
David Tolnayf4bbbd92016-09-23 14:41:55 -070061 Discriminant,
David Tolnayb79ee962016-09-04 09:39:20 -070062 Field,
63 Item,
David Tolnayb79ee962016-09-04 09:39:20 -070064 Variant,
David Tolnay55337722016-09-11 12:58:56 -070065 VariantData,
66 Visibility,
David Tolnayb79ee962016-09-04 09:39:20 -070067};
David Tolnay35161ff2016-09-03 11:33:15 -070068
David Tolnayf4bbbd92016-09-23 14:41:55 -070069mod lit;
70pub use lit::{
71 FloatTy,
72 IntTy,
73 Lit,
74 StrStyle,
75};
76
77#[cfg(feature = "full")]
78mod mac;
79#[cfg(feature = "full")]
80pub use mac::{
81 BinOpToken,
82 DelimToken,
83 Delimited,
84 Mac,
85 SequenceRepetition,
86 Token,
87 TokenTree,
88};
89
David Tolnayb79ee962016-09-04 09:39:20 -070090mod ty;
91pub use ty::{
92 AngleBracketedParameterData,
David Tolnayb79ee962016-09-04 09:39:20 -070093 BareFnTy,
David Tolnay66daf742016-09-07 08:21:49 -070094 FnArg,
David Tolnayb79ee962016-09-04 09:39:20 -070095 FnDecl,
96 FunctionRetTy,
97 MutTy,
98 Mutability,
99 ParenthesizedParameterData,
100 Path,
101 PathParameters,
102 PathSegment,
103 PolyTraitRef,
104 QSelf,
105 Ty,
106 TypeBinding,
107};
David Tolnay35161ff2016-09-03 11:33:15 -0700108
David Tolnay55337722016-09-11 12:58:56 -0700109#[cfg(feature = "aster")]
110pub mod aster;
David Tolnay7ebb9fb2016-09-03 12:07:47 -0700111
David Tolnay55337722016-09-11 12:58:56 -0700112#[cfg(feature = "visit")]
113pub mod visit;
114
115#[cfg(feature = "parsing")]
116pub use parsing::*;
117
118#[cfg(feature = "parsing")]
119mod parsing {
120 use super::*;
121 use {generics, item, ty};
122 use nom;
123
124 pub fn parse_item(input: &str) -> Result<Item, String> {
David Tolnayb5a7b142016-09-13 22:46:39 -0700125 unwrap("item", item::parsing::item, input)
David Tolnay55337722016-09-11 12:58:56 -0700126 }
127
David Tolnay32a112e2016-09-11 17:46:15 -0700128 pub fn parse_type(input: &str) -> Result<Ty, String> {
David Tolnayb5a7b142016-09-13 22:46:39 -0700129 unwrap("type", ty::parsing::ty, input)
David Tolnay32a112e2016-09-11 17:46:15 -0700130 }
131
David Tolnay55337722016-09-11 12:58:56 -0700132 pub fn parse_path(input: &str) -> Result<Path, String> {
David Tolnayb5a7b142016-09-13 22:46:39 -0700133 unwrap("path", ty::parsing::path, input)
David Tolnay55337722016-09-11 12:58:56 -0700134 }
135
136 pub fn parse_where_clause(input: &str) -> Result<WhereClause, String> {
David Tolnayb5a7b142016-09-13 22:46:39 -0700137 unwrap("where clause", generics::parsing::where_clause, input)
David Tolnay55337722016-09-11 12:58:56 -0700138 }
139
David Tolnayb5a7b142016-09-13 22:46:39 -0700140 fn unwrap<T>(name: &'static str, f: fn(&str) -> nom::IResult<&str, T>, input: &str) -> Result<T, String> {
141 match f(input) {
David Tolnay55337722016-09-11 12:58:56 -0700142 nom::IResult::Done(rest, t) => {
143 if rest.is_empty() {
144 Ok(t)
145 } else {
146 Err(format!("remaining tokens after {}: {:?}", name, rest))
David Tolnayc94c38a2016-09-05 17:02:03 -0700147 }
David Tolnay55337722016-09-11 12:58:56 -0700148 }
David Tolnayb5a7b142016-09-13 22:46:39 -0700149 nom::IResult::Error => Err(format!("failed to parse {}: {:?}", name, input)),
David Tolnay35161ff2016-09-03 11:33:15 -0700150 }
David Tolnay35161ff2016-09-03 11:33:15 -0700151 }
152}