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 ;
@@ -38,6 +38,7 @@ use expr::{rewrite_array, rewrite_call_inner};
3838use lists:: { itemize_list, write_list, ListFormatting } ;
3939use rewrite:: { Rewrite , RewriteContext } ;
4040use shape:: { Indent , Shape } ;
41+ use spanned:: Spanned ;
4142use utils:: { format_visibility, mk_sp, wrap_str} ;
4243
4344const FORCED_BRACKET_MACROS : & [ & str ] = & [ "vec!" ] ;
@@ -70,9 +71,21 @@ impl MacroStyle {
7071
7172#[ derive( Debug ) ]
7273pub enum MacroArg {
73- Expr ( ast:: Expr ) ,
74- Ty ( ast:: Ty ) ,
75- Pat ( ast:: Pat ) ,
74+ Expr ( ptr:: P < ast:: Expr > ) ,
75+ Ty ( ptr:: P < ast:: Ty > ) ,
76+ Pat ( ptr:: P < ast:: Pat > ) ,
77+ // `parse_item` returns `Option<ptr::P<ast::Item>>`.
78+ Item ( Option < ptr:: P < ast:: Item > > ) ,
79+ }
80+
81+ impl Rewrite for ast:: Item {
82+ fn rewrite ( & self , context : & RewriteContext , shape : Shape ) -> Option < String > {
83+ let mut visitor = :: visitor:: FmtVisitor :: from_context ( context) ;
84+ visitor. block_indent = shape. indent ;
85+ visitor. last_pos = self . span ( ) . lo ( ) ;
86+ visitor. visit_item ( self ) ;
87+ Some ( visitor. buffer )
88+ }
7689}
7790
7891impl Rewrite for MacroArg {
@@ -81,6 +94,7 @@ impl Rewrite for MacroArg {
8194 MacroArg :: Expr ( ref expr) => expr. rewrite ( context, shape) ,
8295 MacroArg :: Ty ( ref ty) => ty. rewrite ( context, shape) ,
8396 MacroArg :: Pat ( ref pat) => pat. rewrite ( context, shape) ,
97+ MacroArg :: Item ( ref item) => item. as_ref ( ) . and_then ( |item| item. rewrite ( context, shape) ) ,
8498 }
8599 }
86100}
@@ -96,7 +110,7 @@ fn parse_macro_arg(parser: &mut Parser) -> Option<MacroArg> {
96110 } else {
97111 // Parsing succeeded.
98112 * parser = cloned_parser;
99- return Some ( MacroArg :: $macro_arg( ( * x ) . clone( ) ) ) ;
113+ return Some ( MacroArg :: $macro_arg( x . clone( ) ) ) ;
100114 }
101115 }
102116 Err ( mut e) => {
@@ -110,6 +124,7 @@ fn parse_macro_arg(parser: &mut Parser) -> Option<MacroArg> {
110124 parse_macro_arg ! ( Expr , parse_expr) ;
111125 parse_macro_arg ! ( Ty , parse_ty) ;
112126 parse_macro_arg ! ( Pat , parse_pat) ;
127+ parse_macro_arg ! ( Item , parse_item) ;
113128
114129 None
115130}
0 commit comments