use std::cmp::min;
use config::lists::*;
-use syntax::codemap::{BytePos, CodeMap, Span};
use syntax::parse::token::DelimToken;
+use syntax::source_map::{BytePos, SourceMap, Span};
use syntax::{ast, ptr};
use chains::rewrite_chain;
use closures;
-use codemap::{LineRangeUtils, SpanUtils};
use comment::{
combine_strs_with_missing_comments, contains_comment, recover_comment_removed, rewrite_comment,
rewrite_missing_comment, CharClasses, FindUncommented,
use patterns::{can_be_overflowed_pat, is_short_pattern, TuplePatField};
use rewrite::{Rewrite, RewriteContext};
use shape::{Indent, Shape};
+use source_map::{LineRangeUtils, SpanUtils};
use spanned::Spanned;
use string::{rewrite_string, StringFormat};
use types::{can_be_overflowed_type, rewrite_path, PathContext};
)
})
}
- ast::ExprKind::Unary(ref op, ref subexpr) => rewrite_unary_op(context, op, subexpr, shape),
+ ast::ExprKind::Unary(op, ref subexpr) => rewrite_unary_op(context, op, subexpr, shape),
ast::ExprKind::Struct(ref path, ref fields, ref base) => rewrite_struct_lit(
context,
path,
// We do not format these expressions yet, but they should still
// satisfy our width restrictions.
ast::ExprKind::InlineAsm(..) => Some(context.snippet(expr.span).to_owned()),
- ast::ExprKind::Catch(ref block) => {
+ ast::ExprKind::TryBlock(ref block) => {
+ if let rw @ Some(_) =
+ rewrite_single_line_block(context, "try ", block, Some(&expr.attrs), None, shape)
+ {
+ rw
+ } else {
+ // 9 = `try `
+ let budget = shape.width.saturating_sub(9);
+ Some(format!(
+ "{}{}",
+ "try ",
+ rewrite_block(
+ block,
+ Some(&expr.attrs),
+ None,
+ context,
+ Shape::legacy(budget, shape.indent)
+ )?
+ ))
+ }
+ }
+ ast::ExprKind::ObsoleteInPlace(ref lhs, ref rhs) => lhs
+ .rewrite(context, shape)
+ .map(|s| s + " <-")
+ .and_then(|lhs| rewrite_assign_rhs(context, lhs, &**rhs, shape)),
+ ast::ExprKind::Async(capture_by, _node_id, ref block) => {
+ let mover = if capture_by == ast::CaptureBy::Value {
+ "move "
+ } else {
+ ""
+ };
if let rw @ Some(_) = rewrite_single_line_block(
context,
- "do catch ",
+ format!("{}{}", "async ", mover).as_str(),
block,
Some(&expr.attrs),
None,
) {
rw
} else {
- // 9 = `do catch `
- let budget = shape.width.saturating_sub(9);
+ // 6 = `async `
+ let budget = shape.width.saturating_sub(6);
Some(format!(
- "{}{}",
- "do catch ",
+ "{}{}{}",
+ "async ",
+ mover,
rewrite_block(
block,
Some(&expr.attrs),
))
}
}
- // FIXME(#2743)
- ast::ExprKind::ObsoleteInPlace(..) => unimplemented!(),
- // FIXME(topecongiro) Format async block.
- ast::ExprKind::Async(..) => None,
};
expr_rw
return None;
}
- if block.stmts.is_empty() && !block_contains_comment(block, context.codemap) && shape.width >= 2
+ if block.stmts.is_empty()
+ && !block_contains_comment(block, context.source_map)
+ && shape.width >= 2
{
return Some(format!("{}{}{{}}", prefix, label_str));
}
label: Option<ast::Label>,
shape: Shape,
) -> Option<String> {
- if is_simple_block(block, attrs, context.codemap) {
+ if is_simple_block(block, attrs, context.source_map) {
let expr_shape = shape.offset_left(last_line_width(prefix))?;
let expr_str = block.stmts[0].rewrite(context, expr_shape)?;
let label_str = rewrite_label(label);
let fixed_cost = self.keyword.len() + " { } else { }".len();
if let ast::ExprKind::Block(ref else_node, _) = else_block.node {
- if !is_simple_block(self.block, None, context.codemap)
- || !is_simple_block(else_node, None, context.codemap)
+ if !is_simple_block(self.block, None, context.source_map)
+ || !is_simple_block(else_node, None, context.source_map)
|| pat_expr_str.contains('\n')
{
return None;
}
}
-pub fn block_contains_comment(block: &ast::Block, codemap: &CodeMap) -> bool {
- let snippet = codemap.span_to_snippet(block.span).unwrap();
+pub fn block_contains_comment(block: &ast::Block, source_map: &SourceMap) -> bool {
+ let snippet = source_map.span_to_snippet(block.span).unwrap();
contains_comment(&snippet)
}
pub fn is_simple_block(
block: &ast::Block,
attrs: Option<&[ast::Attribute]>,
- codemap: &CodeMap,
+ source_map: &SourceMap,
) -> bool {
(block.stmts.len() == 1
&& stmt_is_expr(&block.stmts[0])
- && !block_contains_comment(block, codemap)
+ && !block_contains_comment(block, source_map)
&& attrs.map_or(true, |a| a.is_empty()))
}
pub fn is_simple_block_stmt(
block: &ast::Block,
attrs: Option<&[ast::Attribute]>,
- codemap: &CodeMap,
+ source_map: &SourceMap,
) -> bool {
block.stmts.len() <= 1
- && !block_contains_comment(block, codemap)
+ && !block_contains_comment(block, source_map)
&& attrs.map_or(true, |a| a.is_empty())
}
pub fn is_empty_block(
block: &ast::Block,
attrs: Option<&[ast::Attribute]>,
- codemap: &CodeMap,
+ source_map: &SourceMap,
) -> bool {
block.stmts.is_empty()
- && !block_contains_comment(block, codemap)
+ && !block_contains_comment(block, source_map)
&& attrs.map_or(true, |a| inner_attributes(a).is_empty())
}
shape.width,
)
};
- let fmt = ListFormatting {
- tactic,
- separator: " |",
- trailing_separator: SeparatorTactic::Never,
- separator_place: context.config.binop_separator(),
- shape,
- ends_with_newline: false,
- preserve_newline: false,
- nested: false,
- config: context.config,
- };
+ let fmt = ListFormatting::new(shape, context.config)
+ .tactic(tactic)
+ .separator(" |")
+ .separator_place(context.config.binop_separator())
+ .ends_with_newline(false);
write_list(&items, &fmt)
}
}
}
-fn struct_lit_can_be_aligned(fields: &[ast::Field], base: &Option<&ast::Expr>) -> bool {
+fn struct_lit_can_be_aligned(fields: &[ast::Field], base: Option<&ast::Expr>) -> bool {
if base.is_some() {
return false;
}
let one_line_width = h_shape.map_or(0, |shape| shape.width);
let body_lo = context.snippet_provider.span_after(span, "{");
- let fields_str = if struct_lit_can_be_aligned(fields, &base)
+ let fields_str = if struct_lit_can_be_aligned(fields, base)
&& context.config.struct_field_align_threshold() > 0
{
rewrite_with_alignment(
if !attrs_str.is_empty() {
attrs_str.push_str(&shape.indent.to_string_with_newline(context.config));
};
- let name = &field.ident.name.to_string();
+ let name = context.snippet(field.ident.span);
if field.is_shorthand {
- Some(attrs_str + &name)
+ Some(attrs_str + name)
} else {
let mut separator = String::from(struct_lit_field_separator(context.config));
for _ in 0..prefix_max_width.saturating_sub(name.len()) {
match expr {
Some(ref e) if e.as_str() == name && context.config.use_field_init_shorthand() => {
- Some(attrs_str + &name)
+ Some(attrs_str + name)
}
Some(e) => Some(format!("{}{}{}{}", attrs_str, name, separator, e)),
None => {
Separator::Comma,
nested_shape.width,
);
- let fmt = ListFormatting {
- tactic,
- separator: ",",
- trailing_separator: SeparatorTactic::Never,
- separator_place: SeparatorPlace::Back,
- shape,
- ends_with_newline: false,
- preserve_newline: false,
- nested: false,
- config: context.config,
- };
+ let fmt = ListFormatting::new(nested_shape, context.config)
+ .tactic(tactic)
+ .ends_with_newline(false);
let list_str = write_list(&item_vec, &fmt)?;
Some(format!("({})", list_str))
fn rewrite_unary_op(
context: &RewriteContext,
- op: &ast::UnOp,
+ op: ast::UnOp,
expr: &ast::Expr,
shape: Shape,
) -> Option<String> {
// For some reason, an UnOp is not spanned like BinOp!
- let operator_str = match *op {
+ let operator_str = match op {
ast::UnOp::Deref => "*",
ast::UnOp::Not => "!",
ast::UnOp::Neg => "-",