2222use std:: collections:: HashMap ;
2323
2424use config:: lists:: * ;
25- use syntax:: ast;
25+ use syntax:: { ast, ptr } ;
2626use syntax:: codemap:: { BytePos , Span } ;
2727use syntax:: parse:: new_parser_from_tts;
2828use syntax:: parse:: parser:: Parser ;
@@ -39,6 +39,7 @@ use lists::{itemize_list, write_list, ListFormatting};
3939use overflow;
4040use rewrite:: { Rewrite , RewriteContext } ;
4141use shape:: { Indent , Shape } ;
42+ use spanned:: Spanned ;
4243use utils:: { format_visibility, mk_sp, wrap_str} ;
4344
4445const FORCED_BRACKET_MACROS : & [ & str ] = & [ "vec!" ] ;
@@ -71,9 +72,21 @@ impl MacroStyle {
7172
7273#[ derive( Debug ) ]
7374pub enum MacroArg {
74- Expr ( ast:: Expr ) ,
75- Ty ( ast:: Ty ) ,
76- Pat ( ast:: Pat ) ,
75+ Expr ( ptr:: P < ast:: Expr > ) ,
76+ Ty ( ptr:: P < ast:: Ty > ) ,
77+ Pat ( ptr:: P < ast:: Pat > ) ,
78+ // `parse_item` returns `Option<ptr::P<ast::Item>>`.
79+ Item ( Option < ptr:: P < ast:: Item > > ) ,
80+ }
81+
82+ impl Rewrite for ast:: Item {
83+ fn rewrite ( & self , context : & RewriteContext , shape : Shape ) -> Option < String > {
84+ let mut visitor = :: visitor:: FmtVisitor :: from_context ( context) ;
85+ visitor. block_indent = shape. indent ;
86+ visitor. last_pos = self . span ( ) . lo ( ) ;
87+ visitor. visit_item ( self ) ;
88+ Some ( visitor. buffer )
89+ }
7790}
7891
7992impl Rewrite for MacroArg {
@@ -82,6 +95,7 @@ impl Rewrite for MacroArg {
8295 MacroArg :: Expr ( ref expr) => expr. rewrite ( context, shape) ,
8396 MacroArg :: Ty ( ref ty) => ty. rewrite ( context, shape) ,
8497 MacroArg :: Pat ( ref pat) => pat. rewrite ( context, shape) ,
98+ MacroArg :: Item ( ref item) => item. as_ref ( ) . and_then ( |item| item. rewrite ( context, shape) ) ,
8599 }
86100 }
87101}
@@ -97,7 +111,7 @@ fn parse_macro_arg(parser: &mut Parser) -> Option<MacroArg> {
97111 } else {
98112 // Parsing succeeded.
99113 * parser = cloned_parser;
100- return Some ( MacroArg :: $macro_arg( ( * x ) . clone( ) ) ) ;
114+ return Some ( MacroArg :: $macro_arg( x . clone( ) ) ) ;
101115 }
102116 }
103117 Err ( mut e) => {
@@ -111,6 +125,7 @@ fn parse_macro_arg(parser: &mut Parser) -> Option<MacroArg> {
111125 parse_macro_arg ! ( Expr , parse_expr) ;
112126 parse_macro_arg ! ( Ty , parse_ty) ;
113127 parse_macro_arg ! ( Pat , parse_pat) ;
128+ parse_macro_arg ! ( Item , parse_item) ;
114129
115130 None
116131}
0 commit comments