use std::borrow::Cow;
use std::cmp::min;
-use config::lists::*;
use syntax::parse::token::DelimToken;
use syntax::source_map::{BytePos, SourceMap, Span};
use syntax::{ast, ptr};
-use chains::rewrite_chain;
-use closures;
-use comment::{
+use crate::chains::rewrite_chain;
+use crate::closures;
+use crate::comment::{
combine_strs_with_missing_comments, contains_comment, recover_comment_removed, rewrite_comment,
rewrite_missing_comment, CharClasses, FindUncommented,
};
-use config::{Config, ControlBraceStyle, IndentStyle};
-use lists::{
+use crate::config::lists::*;
+use crate::config::{Config, ControlBraceStyle, IndentStyle, Version};
+use crate::lists::{
definitive_tactic, itemize_list, shape_for_tactic, struct_lit_formatting, struct_lit_shape,
struct_lit_tactic, write_list, ListFormatting, ListItem, Separator,
};
-use macros::{rewrite_macro, MacroPosition};
-use matches::rewrite_match;
-use overflow::{self, IntoOverflowableItem, OverflowableItem};
-use pairs::{rewrite_all_pairs, rewrite_pair, PairParts};
-use patterns::is_short_pattern;
-use rewrite::{Rewrite, RewriteContext};
-use shape::{Indent, Shape};
-use source_map::{LineRangeUtils, SpanUtils};
-use spanned::Spanned;
-use string::{rewrite_string, StringFormat};
-use types::{rewrite_path, PathContext};
-use utils::{
+use crate::macros::{rewrite_macro, MacroPosition};
+use crate::matches::rewrite_match;
+use crate::overflow::{self, IntoOverflowableItem, OverflowableItem};
+use crate::pairs::{rewrite_all_pairs, rewrite_pair, PairParts};
+use crate::patterns::is_short_pattern;
+use crate::rewrite::{Rewrite, RewriteContext};
+use crate::shape::{Indent, Shape};
+use crate::source_map::{LineRangeUtils, SpanUtils};
+use crate::spanned::Spanned;
+use crate::string::{rewrite_string, StringFormat};
+use crate::types::{rewrite_path, PathContext};
+use crate::utils::{
colon_spaces, contains_skip, count_newlines, first_line_ends_with, inner_attributes,
last_line_extendable, last_line_width, mk_sp, outer_attributes, ptr_vec_to_ref_vec,
- semicolon_for_stmt, wrap_str,
+ semicolon_for_expr, semicolon_for_stmt, wrap_str,
};
-use vertical::rewrite_with_alignment;
-use visitor::FmtVisitor;
+use crate::vertical::rewrite_with_alignment;
+use crate::visitor::FmtVisitor;
impl Rewrite for ast::Expr {
fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
if contains_skip(&*expr.attrs) {
return Some(context.snippet(expr.span()).to_owned());
}
+ let shape = if expr_type == ExprType::Statement && semicolon_for_expr(context, expr) {
+ shape.sub_width(1)?
+ } else {
+ shape
+ };
let expr_rw = match expr.node {
ast::ExprKind::Array(ref expr_vec) => rewrite_array(
prefix: &str,
shape: Shape,
) -> Option<String> {
+ if !block.stmts.is_empty() {
+ return None;
+ }
+
let label_str = rewrite_label(label);
if attrs.map_or(false, |a| !inner_attributes(a).is_empty()) {
return None;
}
- if block.stmts.is_empty()
- && !block_contains_comment(block, context.source_map)
- && shape.width >= 2
- {
+ if !block_contains_comment(block, context.source_map) && shape.width >= 2 {
return Some(format!("{}{}{{}}", prefix, label_str));
}
let mut visitor = FmtVisitor::from_context(context);
visitor.block_indent = shape.indent;
visitor.is_if_else_block = context.is_if_else_block();
- match block.rules {
- ast::BlockCheckMode::Unsafe(..) => {
+ match (block.rules, label) {
+ (ast::BlockCheckMode::Unsafe(..), _) | (ast::BlockCheckMode::Default, Some(_)) => {
let snippet = context.snippet(block.span);
let open_pos = snippet.find_uncommented("{")?;
visitor.last_pos = block.span.lo() + BytePos(open_pos as u32)
}
- ast::BlockCheckMode::Default => visitor.last_pos = block.span.lo(),
+ (ast::BlockCheckMode::Default, None) => visitor.last_pos = block.span.lo(),
}
let inner_attrs = attrs.map(inner_attributes);
format!(
"{}{}",
new_indent.to_string(context.config),
- line.trim_left()
+ line.trim_start()
)
})
.collect::<Vec<_>>()
.join("\n")
- .trim_left(),
+ .trim_start(),
);
- return wrap_str(indented_string_lit, context.config.max_width(), shape);
+ return if context.config.version() == Version::Two {
+ Some(indented_string_lit)
+ } else {
+ wrap_str(indented_string_lit, context.config.max_width(), shape)
+ };
} else {
return wrap_str(string_lit.to_owned(), context.config.max_width(), shape);
}
| ast::ExprKind::WhileLet(..) => {
context.config.combine_control_expr() && context.use_block_indent() && args_len == 1
}
- ast::ExprKind::Block(..) | ast::ExprKind::Closure(..) => {
- context.use_block_indent() || context.config.indent_style() == IndentStyle::Visual
+
+ // Handle always block-like expressions
+ ast::ExprKind::Block(..) | ast::ExprKind::Closure(..) => true,
+
+ // Handle `[]` and `{}`-like expressions
+ ast::ExprKind::Array(..) | ast::ExprKind::Struct(..) => {
+ context.config.overflow_delimited_expr()
+ || (context.use_block_indent() && args_len == 1)
+ }
+ ast::ExprKind::Mac(ref macro_) => {
+ match (macro_.node.delim, context.config.overflow_delimited_expr()) {
+ (ast::MacDelimiter::Bracket, true) | (ast::MacDelimiter::Brace, true) => true,
+ _ => context.use_block_indent() && args_len == 1,
+ }
+ }
+
+ // Handle parenthetical expressions
+ ast::ExprKind::Call(..) | ast::ExprKind::MethodCall(..) | ast::ExprKind::Tup(..) => {
+ context.use_block_indent() && args_len == 1
}
- ast::ExprKind::Array(..)
- | ast::ExprKind::Call(..)
- | ast::ExprKind::Mac(..)
- | ast::ExprKind::MethodCall(..)
- | ast::ExprKind::Struct(..)
- | ast::ExprKind::Tup(..) => context.use_block_indent() && args_len == 1,
+
+ // Handle unary-like expressions
ast::ExprKind::AddrOf(_, ref expr)
| ast::ExprKind::Box(ref expr)
| ast::ExprKind::Try(ref expr)
)?
} else {
let field_iter = fields
- .into_iter()
+ .iter()
.map(StructLitField::Regular)
.chain(base.into_iter().map(StructLitField::Base));