From 2188b464b0c5e22661bc488815f8b46b0b31cc26 Mon Sep 17 00:00:00 2001 From: topecongiro Date: Fri, 9 Mar 2018 17:17:55 +0900 Subject: [PATCH] Format macro call with item arguments --- src/expr.rs | 1 + src/macros.rs | 25 ++++++++++++++++++++----- src/spanned.rs | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index 85a2e658ef2..b4968d12a0a 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -3051,6 +3051,7 @@ impl<'a> ToExpr for MacroArg { MacroArg::Expr(ref expr) => can_be_overflowed_expr(context, expr, len), MacroArg::Ty(ref ty) => can_be_overflowed_type(context, ty, len), MacroArg::Pat(..) => false, + MacroArg::Item(..) => len == 1, } } } diff --git a/src/macros.rs b/src/macros.rs index 6be6a1f2664..ac4b0db7266 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -22,7 +22,7 @@ use std::collections::HashMap; use config::lists::*; -use syntax::ast; +use syntax::{ast, ptr}; use syntax::codemap::{BytePos, Span}; use syntax::parse::new_parser_from_tts; use syntax::parse::parser::Parser; @@ -38,6 +38,7 @@ use expr::{rewrite_array, rewrite_call_inner}; use lists::{itemize_list, write_list, ListFormatting}; use rewrite::{Rewrite, RewriteContext}; use shape::{Indent, Shape}; +use spanned::Spanned; use utils::{format_visibility, mk_sp, wrap_str}; const FORCED_BRACKET_MACROS: &[&str] = &["vec!"]; @@ -70,9 +71,21 @@ impl MacroStyle { #[derive(Debug)] pub enum MacroArg { - Expr(ast::Expr), - Ty(ast::Ty), - Pat(ast::Pat), + Expr(ptr::P), + Ty(ptr::P), + Pat(ptr::P), + // `parse_item` returns `Option>`. + Item(Option>), +} + +impl Rewrite for ast::Item { + fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option { + let mut visitor = ::visitor::FmtVisitor::from_context(context); + visitor.block_indent = shape.indent; + visitor.last_pos = self.span().lo(); + visitor.visit_item(self); + Some(visitor.buffer) + } } impl Rewrite for MacroArg { @@ -81,6 +94,7 @@ impl Rewrite for MacroArg { MacroArg::Expr(ref expr) => expr.rewrite(context, shape), MacroArg::Ty(ref ty) => ty.rewrite(context, shape), MacroArg::Pat(ref pat) => pat.rewrite(context, shape), + MacroArg::Item(ref item) => item.as_ref().and_then(|item| item.rewrite(context, shape)), } } } @@ -96,7 +110,7 @@ fn parse_macro_arg(parser: &mut Parser) -> Option { } else { // Parsing succeeded. *parser = cloned_parser; - return Some(MacroArg::$macro_arg((*x).clone())); + return Some(MacroArg::$macro_arg(x.clone())); } } Err(mut e) => { @@ -110,6 +124,7 @@ fn parse_macro_arg(parser: &mut Parser) -> Option { parse_macro_arg!(Expr, parse_expr); parse_macro_arg!(Ty, parse_ty); parse_macro_arg!(Pat, parse_pat); + parse_macro_arg!(Item, parse_item); None } diff --git a/src/spanned.rs b/src/spanned.rs index d1f4865dead..6f5a4b1721f 100644 --- a/src/spanned.rs +++ b/src/spanned.rs @@ -187,6 +187,7 @@ impl Spanned for MacroArg { MacroArg::Expr(ref expr) => expr.span(), MacroArg::Ty(ref ty) => ty.span(), MacroArg::Pat(ref pat) => pat.span(), + MacroArg::Item(ref item) => item.as_ref().unwrap().span(), } } }