Trim the indentation on macros which heuristically appear to use block-style indentation (#3178)
This commit is contained in:
parent
16d5f507b6
commit
cd8bb50aea
@ -332,7 +332,7 @@ fn identify_comment(
|
||||
let (first_group, rest) = orig.split_at(first_group_ending);
|
||||
let rewritten_first_group =
|
||||
if !config.normalize_comments() && has_bare_lines && style.is_block_comment() {
|
||||
trim_left_preserve_layout(first_group, &shape.indent, config)?
|
||||
trim_left_preserve_layout(first_group, shape.indent, config)?
|
||||
} else if !config.normalize_comments()
|
||||
&& !config.wrap_comments()
|
||||
&& !config.format_doc_comments()
|
||||
|
@ -144,11 +144,32 @@ fn rewrite_macro_name(
|
||||
}
|
||||
|
||||
// Use this on failing to format the macro call.
|
||||
fn return_original_snippet_with_failure_marked(
|
||||
fn return_macro_parse_failure_fallback(
|
||||
context: &RewriteContext,
|
||||
indent: Indent,
|
||||
span: Span,
|
||||
) -> Option<String> {
|
||||
// Mark this as a failure however we format it
|
||||
context.macro_rewrite_failure.replace(true);
|
||||
|
||||
// Heuristically determine whether the last line of the macro uses "Block" style
|
||||
// rather than using "Visual" style, or another indentation style.
|
||||
let is_like_block_indent_style = context
|
||||
.snippet(span)
|
||||
.lines()
|
||||
.last()
|
||||
.map(|closing_line| {
|
||||
closing_line.trim().chars().all(|ch| match ch {
|
||||
'}' | ')' | ']' => true,
|
||||
_ => false,
|
||||
})
|
||||
})
|
||||
.unwrap_or(false);
|
||||
if is_like_block_indent_style {
|
||||
return trim_left_preserve_layout(context.snippet(span), indent, &context.config);
|
||||
}
|
||||
|
||||
// Return the snippet unmodified if the macro is not block-like
|
||||
Some(context.snippet(span).to_owned())
|
||||
}
|
||||
|
||||
@ -239,7 +260,9 @@ pub fn rewrite_macro_inner(
|
||||
loop {
|
||||
match parse_macro_arg(&mut parser) {
|
||||
Some(arg) => arg_vec.push(arg),
|
||||
None => return return_original_snippet_with_failure_marked(context, mac.span),
|
||||
None => {
|
||||
return return_macro_parse_failure_fallback(context, shape.indent, mac.span);
|
||||
}
|
||||
}
|
||||
|
||||
match parser.token {
|
||||
@ -260,17 +283,19 @@ pub fn rewrite_macro_inner(
|
||||
}
|
||||
}
|
||||
None => {
|
||||
return return_original_snippet_with_failure_marked(
|
||||
context, mac.span,
|
||||
)
|
||||
return return_macro_parse_failure_fallback(
|
||||
context,
|
||||
shape.indent,
|
||||
mac.span,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return return_original_snippet_with_failure_marked(context, mac.span);
|
||||
return return_macro_parse_failure_fallback(context, shape.indent, mac.span);
|
||||
}
|
||||
_ if arg_vec.last().map_or(false, MacroArg::is_item) => continue,
|
||||
_ => return return_original_snippet_with_failure_marked(context, mac.span),
|
||||
_ => return return_macro_parse_failure_fallback(context, shape.indent, mac.span),
|
||||
}
|
||||
|
||||
parser.bump();
|
||||
@ -376,7 +401,7 @@ pub fn rewrite_macro_inner(
|
||||
}
|
||||
DelimToken::Brace => {
|
||||
// Skip macro invocations with braces, for now.
|
||||
trim_left_preserve_layout(context.snippet(mac.span), &shape.indent, &context.config)
|
||||
trim_left_preserve_layout(context.snippet(mac.span), shape.indent, &context.config)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
@ -749,7 +749,7 @@ impl ConfigCodeBlock {
|
||||
.code_block
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.split('\n')
|
||||
.lines()
|
||||
.nth(0)
|
||||
.unwrap_or("")
|
||||
== "#![rustfmt::skip]";
|
||||
|
@ -511,7 +511,7 @@ pub fn remove_trailing_white_spaces(text: &str) -> String {
|
||||
/// ),
|
||||
/// }
|
||||
/// ```
|
||||
pub fn trim_left_preserve_layout(orig: &str, indent: &Indent, config: &Config) -> Option<String> {
|
||||
pub fn trim_left_preserve_layout(orig: &str, indent: Indent, config: &Config) -> Option<String> {
|
||||
let mut lines = LineClasses::new(orig);
|
||||
let first_line = lines.next().map(|(_, s)| s.trim_right().to_owned())?;
|
||||
let mut trimmed_lines = Vec::with_capacity(16);
|
||||
@ -598,7 +598,7 @@ mod test {
|
||||
let config = Config::default();
|
||||
let indent = Indent::new(4, 0);
|
||||
assert_eq!(
|
||||
trim_left_preserve_layout(&s, &indent, &config),
|
||||
trim_left_preserve_layout(&s, indent, &config),
|
||||
Some("aaa\n bbb\n ccc".to_string())
|
||||
);
|
||||
}
|
||||
|
@ -184,6 +184,19 @@ fn issue1577() {
|
||||
});
|
||||
}
|
||||
|
||||
// #3174
|
||||
fn issue_3174() {
|
||||
let data =
|
||||
if let Some(debug) = error.debug_info() {
|
||||
json!({
|
||||
"errorKind": format!("{:?}", error.err_kind()),
|
||||
"debugMessage": debug.message,
|
||||
})
|
||||
} else {
|
||||
json!({"errorKind": format!("{:?}", error.err_kind())})
|
||||
};
|
||||
}
|
||||
|
||||
gfx_pipeline!(pipe {
|
||||
vbuf: gfx::VertexBuffer<Vertex> = (),
|
||||
out: gfx::RenderTarget<ColorFormat> = "Target0",
|
||||
|
@ -225,6 +225,18 @@ fn issue1577() {
|
||||
});
|
||||
}
|
||||
|
||||
// #3174
|
||||
fn issue_3174() {
|
||||
let data = if let Some(debug) = error.debug_info() {
|
||||
json!({
|
||||
"errorKind": format!("{:?}", error.err_kind()),
|
||||
"debugMessage": debug.message,
|
||||
})
|
||||
} else {
|
||||
json!({ "errorKind": format!("{:?}", error.err_kind()) })
|
||||
};
|
||||
}
|
||||
|
||||
gfx_pipeline!(pipe {
|
||||
vbuf: gfx::VertexBuffer<Vertex> = (),
|
||||
out: gfx::RenderTarget<ColorFormat> = "Target0",
|
||||
|
Loading…
x
Reference in New Issue
Block a user