use shape::Shape;
use source_map::SpanUtils;
use utils::{
- first_line_width, last_line_extendable, last_line_width, mk_sp, rewrite_ident,
+ self, first_line_width, last_line_extendable, last_line_width, mk_sp, rewrite_ident,
trimmed_last_line_width, wrap_str,
};
impl ChainItemKind {
fn is_block_like(&self, context: &RewriteContext, reps: &str) -> bool {
match self {
- ChainItemKind::Parent(ref expr) => is_block_expr(context, expr, reps),
+ ChainItemKind::Parent(ref expr) => utils::is_block_expr(context, expr, reps),
ChainItemKind::MethodCall(..)
| ChainItemKind::StructField(..)
| ChainItemKind::TupleField(..)
// Parent is the first item in the chain, e.g., `foo` in `foo.bar.baz()`.
// Root is the parent plus any other chain items placed on the first line to
// avoid an orphan. E.g.,
- // ```
+ // ```ignore
// foo.bar
// .baz()
// ```
// know whether 'overflowing' the last child make a better formatting:
//
// A chain with overflowing the last child:
- // ```
+ // ```ignore
// parent.child1.child2.last_child(
// a,
// b,
// ```
//
// A chain without overflowing the last child (in vertical layout):
- // ```
+ // ```ignore
// parent
// .child1
// .child2
//
// In particular, overflowing is effective when the last child is a method with a multi-lined
// block-like argument (e.g. closure):
- // ```
+ // ```ignore
// parent.child1.child2.last_child(|a, b, c| {
// let x = foo(a, b, c);
// let y = bar(a, b, c);
}
}
-// States whether an expression's last line exclusively consists of closing
-// parens, braces, and brackets in its idiomatic formatting.
-fn is_block_expr(context: &RewriteContext, expr: &ast::Expr, repr: &str) -> bool {
- match expr.node {
- ast::ExprKind::Mac(..)
- | ast::ExprKind::Call(..)
- | ast::ExprKind::MethodCall(..)
- | ast::ExprKind::Struct(..)
- | ast::ExprKind::While(..)
- | ast::ExprKind::WhileLet(..)
- | ast::ExprKind::If(..)
- | ast::ExprKind::IfLet(..)
- | ast::ExprKind::Block(..)
- | ast::ExprKind::Loop(..)
- | ast::ExprKind::ForLoop(..)
- | ast::ExprKind::Match(..) => repr.contains('\n'),
- ast::ExprKind::Paren(ref expr)
- | ast::ExprKind::Binary(_, _, ref expr)
- | ast::ExprKind::Index(_, ref expr)
- | ast::ExprKind::Unary(_, ref expr)
- | ast::ExprKind::Closure(_, _, _, _, ref expr, _)
- | ast::ExprKind::Try(ref expr)
- | ast::ExprKind::Yield(Some(ref expr)) => is_block_expr(context, expr, repr),
- // This can only be a string lit
- ast::ExprKind::Lit(_) => {
- repr.contains('\n') && trimmed_last_line_width(repr) <= context.config.tab_spaces()
- }
- _ => false,
- }
-}
-
/// Remove try operators (`?`s) that appear in the given string. If removing
/// them leaves an empty line, remove that line as well unless it is the first
/// line (we need the first newline for detecting pre/post comment).