File tree 2 files changed +35
-0
lines changed
2 files changed +35
-0
lines changed Original file line number Diff line number Diff line change @@ -114,6 +114,10 @@ pub trait MacResult {
114
114
fn make_items ( & self ) -> Option < SmallVector < @ast:: Item > > {
115
115
None
116
116
}
117
+ /// Create a pattern.
118
+ fn make_pat ( & self ) -> Option < @ast:: Pat > {
119
+ None
120
+ }
117
121
118
122
/// Create a statement.
119
123
///
@@ -139,6 +143,20 @@ impl MacResult for MacExpr {
139
143
Some ( self . e )
140
144
}
141
145
}
146
+ /// A convenience type for macros that return a single pattern.
147
+ pub struct MacPat {
148
+ p : @ast:: Pat
149
+ }
150
+ impl MacPat {
151
+ pub fn new ( p : @ast:: Pat ) -> Box < MacResult > {
152
+ box MacPat { p : p } as Box < MacResult >
153
+ }
154
+ }
155
+ impl MacResult for MacPat {
156
+ fn make_pat ( & self ) -> Option < @ast:: Pat > {
157
+ Some ( self . p )
158
+ }
159
+ }
142
160
/// A convenience type for macros that return a single item.
143
161
pub struct MacItem {
144
162
i : @ast:: Item
@@ -194,12 +212,24 @@ impl DummyResult {
194
212
span : sp,
195
213
}
196
214
}
215
+
216
+ /// A plain dummy pattern.
217
+ pub fn raw_pat ( sp : Span ) -> @ast:: Pat {
218
+ @ast:: Pat {
219
+ id : ast:: DUMMY_NODE_ID ,
220
+ node : ast:: PatWild ,
221
+ span : sp,
222
+ }
223
+ }
197
224
}
198
225
199
226
impl MacResult for DummyResult {
200
227
fn make_expr ( & self ) -> Option < @ast:: Expr > {
201
228
Some ( DummyResult :: raw_expr ( self . span ) )
202
229
}
230
+ fn make_pat ( & self ) -> Option < @ast:: Pat > {
231
+ Some ( DummyResult :: raw_pat ( self . span ) )
232
+ }
203
233
fn make_items ( & self ) -> Option < SmallVector < @ast:: Item > > {
204
234
if self . expr_only {
205
235
None
Original file line number Diff line number Diff line change @@ -63,6 +63,11 @@ impl<'a> MacResult for ParserAnyMacro<'a> {
63
63
self . ensure_complete_parse ( true ) ;
64
64
Some ( ret)
65
65
}
66
+ fn make_pat ( & self ) -> Option < @ast:: Pat > {
67
+ let ret = self . parser . borrow_mut ( ) . parse_pat ( ) ;
68
+ self . ensure_complete_parse ( false ) ;
69
+ Some ( ret)
70
+ }
66
71
fn make_items ( & self ) -> Option < SmallVector < @ast:: Item > > {
67
72
let mut ret = SmallVector :: zero ( ) ;
68
73
loop {
You can’t perform that action at this time.
0 commit comments