result.push_str(&where_clause_str);
+ force_new_line_for_brace |= last_line_contains_single_line_comment(&result);
return Some((result, force_new_line_for_brace));
}
}
result.push_str(&where_clause_str);
- Some((result, force_new_line_for_brace))
+ force_new_line_for_brace |= last_line_contains_single_line_comment(&result);
+ return Some((result, force_new_line_for_brace));
+}
+
+fn last_line_contains_single_line_comment(s: &str) -> bool {
+ s.lines().last().map_or(false, |l| l.contains("//"))
}
fn rewrite_args(context: &RewriteContext,
// Formatting which depends on the AST.
fn format_ast<F>(krate: &ast::Crate,
- parse_session: &ParseSess,
+ mut parse_session: &mut ParseSess,
main_file: &Path,
config: &Config,
+ codemap: &Rc<CodeMap>,
mut after_file: F)
-> Result<(FileMap, bool), io::Error>
where F: FnMut(&str, &mut StringBuffer) -> Result<bool, io::Error>
if config.verbose() {
println!("Formatting {}", path);
}
- let mut visitor = FmtVisitor::from_codemap(parse_session, config);
- visitor.format_separate_mod(module);
+ {
+ let mut visitor = FmtVisitor::from_codemap(parse_session, config);
+ visitor.format_separate_mod(module);
- has_diff |= after_file(path, &mut visitor.buffer)?;
+ has_diff |= after_file(path, &mut visitor.buffer)?;
- result.push((path.to_owned(), visitor.buffer));
+ result.push((path.to_owned(), visitor.buffer));
+ }
+ // Reset the error count.
+ if parse_session.span_diagnostic.has_errors() {
+ parse_session.span_diagnostic =
+ Handler::with_tty_emitter(ColorConfig::Auto, true, false, Some(codemap.clone()));
+ }
}
Ok((result, has_diff))
match format_ast(
&krate,
- &parse_session,
+ &mut parse_session,
&main_file,
config,
+ &codemap,
|file_name, file| {
// For some reason, the codemap does not include terminating
// newlines so we must add one on for each file. This is sad.