Some(context.snippet(span).to_owned())
}
+struct InsideMacroGuard<'a> {
+ context: &'a RewriteContext<'a>,
+ is_nested: bool,
+}
+
+impl<'a> InsideMacroGuard<'a> {
+ fn inside_macro_context(context: &'a RewriteContext) -> InsideMacroGuard<'a> {
+ let is_nested = context.inside_macro.replace(true);
+ InsideMacroGuard { context, is_nested }
+ }
+}
+
+impl<'a> Drop for InsideMacroGuard<'a> {
+ fn drop(&mut self) {
+ self.context.inside_macro.replace(self.is_nested);
+ }
+}
+
pub fn rewrite_macro(
mac: &ast::Mac,
extra_ident: Option<ast::Ident>,
shape: Shape,
position: MacroPosition,
) -> Option<String> {
- context.inside_macro.replace(true);
- let result = rewrite_macro_inner(mac, extra_ident, context, shape, position);
+ let guard = InsideMacroGuard::inside_macro_context(context);
+ let result = rewrite_macro_inner(mac, extra_ident, context, shape, position, guard.is_nested);
if result.is_none() {
context.macro_rewrite_failure.replace(true);
}
- context.inside_macro.replace(false);
result
}
context: &RewriteContext,
shape: Shape,
position: MacroPosition,
+ is_nested_macro: bool,
) -> Option<String> {
if context.config.use_try_shorthand() {
if let Some(expr) = convert_try_mac(mac, context) {
let macro_name = rewrite_macro_name(context, &mac.node.path, extra_ident);
- let style = if FORCED_BRACKET_MACROS.contains(&¯o_name[..]) {
+ let style = if FORCED_BRACKET_MACROS.contains(&¯o_name[..]) && !is_nested_macro {
DelimToken::Bracket
} else {
original_style
} else {
Some(SeparatorTactic::Never)
};
- if FORCED_BRACKET_MACROS.contains(macro_name) {
+ if FORCED_BRACKET_MACROS.contains(macro_name) && !is_nested_macro {
context.inside_macro.replace(false);
if context.use_block_indent() {
force_trailing_comma = Some(SeparatorTactic::Vertical);
false,
).collect::<Vec<_>>();
- let fmt = ListFormatting {
- tactic: DefinitiveListTactic::Vertical,
- separator: if def.legacy { ";" } else { "" },
- trailing_separator: SeparatorTactic::Always,
- separator_place: SeparatorPlace::Back,
- shape: arm_shape,
- ends_with_newline: true,
- preserve_newline: true,
- nested: false,
- config: context.config,
- };
+ let fmt = ListFormatting::new(arm_shape, context.config)
+ .separator(if def.legacy { ";" } else { "" })
+ .trailing_separator(SeparatorTactic::Always)
+ .preserve_newline(true);
if multi_branch_style {
result += " {";
}).min()?;
Some(
- first_line + "\n"
- + &trimmed_lines
- .iter()
- .map(
- |&(trimmed, ref line, prefix_space_width)| match prefix_space_width {
- _ if !trimmed => line.to_owned(),
- Some(original_indent_width) => {
- let new_indent_width = indent.width()
- + original_indent_width.saturating_sub(min_prefix_space_width);
- let new_indent = Indent::from_width(context.config, new_indent_width);
- format!("{}{}", new_indent.to_string(context.config), line.trim())
- }
- None => String::new(),
- },
- ).collect::<Vec<_>>()
- .join("\n"),
+ first_line + "\n" + &trimmed_lines
+ .iter()
+ .map(
+ |&(trimmed, ref line, prefix_space_width)| match prefix_space_width {
+ _ if !trimmed => line.to_owned(),
+ Some(original_indent_width) => {
+ let new_indent_width = indent.width() + original_indent_width
+ .saturating_sub(min_prefix_space_width);
+ let new_indent = Indent::from_width(context.config, new_indent_width);
+ format!("{}{}", new_indent.to_string(context.config), line.trim())
+ }
+ None => String::new(),
+ },
+ ).collect::<Vec<_>>()
+ .join("\n"),
)
}