File tree Expand file tree Collapse file tree 2 files changed +35
-0
lines changed Expand file tree Collapse file tree 2 files changed +35
-0
lines changed Original file line number Diff line number Diff line change @@ -114,6 +114,10 @@ pub trait MacResult {
114114 fn make_items ( & self ) -> Option < SmallVector < @ast:: Item > > {
115115 None
116116 }
117+ /// Create a pattern.
118+ fn make_pat ( & self ) -> Option < @ast:: Pat > {
119+ None
120+ }
117121
118122 /// Create a statement.
119123 ///
@@ -139,6 +143,20 @@ impl MacResult for MacExpr {
139143 Some ( self . e )
140144 }
141145}
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+ }
142160/// A convenience type for macros that return a single item.
143161pub struct MacItem {
144162 i : @ast:: Item
@@ -194,12 +212,24 @@ impl DummyResult {
194212 span : sp,
195213 }
196214 }
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+ }
197224}
198225
199226impl MacResult for DummyResult {
200227 fn make_expr ( & self ) -> Option < @ast:: Expr > {
201228 Some ( DummyResult :: raw_expr ( self . span ) )
202229 }
230+ fn make_pat ( & self ) -> Option < @ast:: Pat > {
231+ Some ( DummyResult :: raw_pat ( self . span ) )
232+ }
203233 fn make_items ( & self ) -> Option < SmallVector < @ast:: Item > > {
204234 if self . expr_only {
205235 None
Original file line number Diff line number Diff line change @@ -63,6 +63,11 @@ impl<'a> MacResult for ParserAnyMacro<'a> {
6363 self . ensure_complete_parse ( true ) ;
6464 Some ( ret)
6565 }
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+ }
6671 fn make_items ( & self ) -> Option < SmallVector < @ast:: Item > > {
6772 let mut ret = SmallVector :: zero ( ) ;
6873 loop {
You can’t perform that action at this time.
0 commit comments