const FORCED_BRACKET_MACROS: &[&str] = &["vec!"];
-// FIXME: use the enum from libsyntax?
-#[derive(Clone, Copy, PartialEq, Eq, Debug)]
-enum MacroStyle {
- Parens,
- Brackets,
- Braces,
-}
-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MacroPosition {
Item,
Pat,
}
-impl MacroStyle {
- fn opener(&self) -> &'static str {
- match *self {
- MacroStyle::Parens => "(",
- MacroStyle::Brackets => "[",
- MacroStyle::Braces => "{",
- }
- }
-}
-
#[derive(Debug)]
pub enum MacroArg {
Expr(ptr::P<ast::Expr>),
let macro_name = rewrite_macro_name(&mac.node.path, extra_ident);
let style = if FORCED_BRACKET_MACROS.contains(&¯o_name[..]) {
- MacroStyle::Brackets
+ DelimToken::Bracket
} else {
original_style
};
let has_comment = contains_comment(context.snippet(mac.span));
if ts.is_empty() && !has_comment {
return match style {
- MacroStyle::Parens if position == MacroPosition::Item => {
+ DelimToken::Paren if position == MacroPosition::Item => {
Some(format!("{}();", macro_name))
}
- MacroStyle::Parens => Some(format!("{}()", macro_name)),
- MacroStyle::Brackets => Some(format!("{}[]", macro_name)),
- MacroStyle::Braces => Some(format!("{}{{}}", macro_name)),
+ DelimToken::Paren => Some(format!("{}()", macro_name)),
+ DelimToken::Bracket => Some(format!("{}[]", macro_name)),
+ DelimToken::Brace => Some(format!("{}{{}}", macro_name)),
+ _ => unreachable!(),
};
}
// Format well-known macros which cannot be parsed as a valid AST.
let mut vec_with_semi = false;
let mut trailing_comma = false;
- if MacroStyle::Braces != style {
+ if DelimToken::Brace != style {
loop {
match parse_macro_arg(&mut parser) {
Some(arg) => arg_vec.push(arg),
}
match style {
- MacroStyle::Parens => {
+ DelimToken::Paren => {
// Format macro invocation as function call, preserve the trailing
// comma because not all macros support them.
overflow::rewrite_with_parens(
_ => rw,
})
}
- MacroStyle::Brackets => {
- let mac_shape = shape.offset_left(macro_name.len())?;
+ DelimToken::Bracket => {
// Handle special case: `vec![expr; expr]`
if vec_with_semi {
+ let mac_shape = shape.offset_left(macro_name.len())?;
let (lbr, rbr) = if context.config.spaces_within_parens_and_brackets() {
("[ ", " ]")
} else {
// If we are rewriting `vec!` macro or other special macros,
// then we can rewrite this as an usual array literal.
// Otherwise, we must preserve the original existence of trailing comma.
- if FORCED_BRACKET_MACROS.contains(¯o_name.as_str()) {
+ let macro_name = ¯o_name.as_str();
+ let mut force_trailing_comma = if trailing_comma {
+ Some(SeparatorTactic::Always)
+ } else {
+ Some(SeparatorTactic::Never)
+ };
+ if FORCED_BRACKET_MACROS.contains(macro_name) {
context.inside_macro.replace(false);
- trailing_comma = false;
+ if context.use_block_indent() {
+ force_trailing_comma = Some(SeparatorTactic::Vertical);
+ };
}
// Convert `MacroArg` into `ast::Expr`, as `rewrite_array` only accepts the latter.
- let sp = mk_sp(
- context
- .snippet_provider
- .span_after(mac.span, original_style.opener()),
- mac.span.hi() - BytePos(1),
- );
let arg_vec = &arg_vec.iter().map(|e| &*e).collect::<Vec<_>>()[..];
- let rewrite = rewrite_array(arg_vec, sp, context, mac_shape, trailing_comma)?;
+ let rewrite = rewrite_array(
+ macro_name,
+ arg_vec,
+ mac.span,
+ context,
+ shape,
+ force_trailing_comma,
+ Some(original_style),
+ )?;
let comma = match position {
MacroPosition::Item => ";",
_ => "",
};
- Some(format!("{}{}{}", macro_name, rewrite, comma))
+ Some(format!("{}{}", rewrite, comma))
}
}
- MacroStyle::Braces => {
+ DelimToken::Brace => {
// Skip macro invocations with braces, for now.
indent_macro_snippet(context, context.snippet(mac.span), shape.indent)
}
+ _ => unreachable!(),
}
}
}
}
-fn macro_style(mac: &ast::Mac, context: &RewriteContext) -> MacroStyle {
+fn macro_style(mac: &ast::Mac, context: &RewriteContext) -> DelimToken {
let snippet = context.snippet(mac.span);
let paren_pos = snippet.find_uncommented("(").unwrap_or(usize::max_value());
let bracket_pos = snippet.find_uncommented("[").unwrap_or(usize::max_value());
let brace_pos = snippet.find_uncommented("{").unwrap_or(usize::max_value());
if paren_pos < bracket_pos && paren_pos < brace_pos {
- MacroStyle::Parens
+ DelimToken::Paren
} else if bracket_pos < brace_pos {
- MacroStyle::Brackets
+ DelimToken::Bracket
} else {
- MacroStyle::Braces
+ DelimToken::Brace
}
}