use config::lists::*;
use syntax::ast;
-use syntax::codemap::Span;
use syntax::parse::token::DelimToken;
+use syntax::source_map::Span;
use closures;
-use codemap::SpanUtils;
use expr::{is_every_expr_simple, is_method_call, is_nested_call, maybe_get_args_offset, ToExpr};
use lists::{definitive_tactic, itemize_list, write_list, ListFormatting, ListItem, Separator};
use rewrite::{Rewrite, RewriteContext};
use shape::Shape;
+use source_map::SpanUtils;
use spanned::Spanned;
use utils::{count_newlines, extra_offset, first_line_width, last_line_width, mk_sp};
// 1 = "("
let combine_arg_with_callee = self.items.len() == 1
&& self.items[0].to_expr().is_some()
- && self.ident.len() + 1 <= self.context.config.tab_spaces();
+ && self.ident.len() < self.context.config.tab_spaces();
let overflow_last = combine_arg_with_callee || can_be_overflowed(self.context, self.items);
// Replace the last item with its first line to see if it fits with
(true, DefinitiveListTactic::Horizontal, placeholder @ Some(..)) => {
list_items[self.items.len() - 1].item = placeholder;
}
- _ if self.items.len() >= 1 => {
+ _ if !self.items.is_empty() => {
list_items[self.items.len() - 1].item = self
.items
.last()
ListTactic::HorizontalVertical,
Separator::Comma,
self.nested_shape.width,
- )
- == DefinitiveListTactic::Horizontal
+ ) == DefinitiveListTactic::Horizontal
&& definitive_tactic(
&list_items[num_args_before + 1..],
ListTactic::HorizontalVertical,
Separator::Comma,
self.nested_shape.width,
- )
- == DefinitiveListTactic::Horizontal;
+ ) == DefinitiveListTactic::Horizontal;
if one_line {
tactic = DefinitiveListTactic::SpecialMacro(num_args_before);
// indentation. If its first line fits on one line with the other arguments,
// we format the function arguments horizontally.
let tactic = self.try_overflow_last_item(&mut list_items);
-
- let fmt = ListFormatting {
- tactic,
- separator: ",",
- trailing_separator: if let Some(tactic) = self.force_separator_tactic {
- tactic
- } else if !self.context.use_block_indent() {
- SeparatorTactic::Never
- } else if tactic == DefinitiveListTactic::Mixed {
- // We are using mixed layout because everything did not fit within a single line.
- SeparatorTactic::Always
- } else {
- self.context.config.trailing_comma()
- },
- separator_place: SeparatorPlace::Back,
- shape: self.nested_shape,
- ends_with_newline: match tactic {
- DefinitiveListTactic::Vertical | DefinitiveListTactic::Mixed => {
- self.context.use_block_indent()
- }
- _ => false,
- },
- preserve_newline: false,
- config: self.context.config,
+ let trailing_separator = if let Some(tactic) = self.force_separator_tactic {
+ tactic
+ } else if !self.context.use_block_indent() {
+ SeparatorTactic::Never
+ } else if tactic == DefinitiveListTactic::Mixed {
+ // We are using mixed layout because everything did not fit within a single line.
+ SeparatorTactic::Always
+ } else {
+ self.context.config.trailing_comma()
};
+ let ends_with_newline = match tactic {
+ DefinitiveListTactic::Vertical | DefinitiveListTactic::Mixed => {
+ self.context.use_block_indent()
+ }
+ _ => false,
+ };
+
+ let fmt = ListFormatting::new(self.nested_shape, self.context.config)
+ .tactic(tactic)
+ .trailing_separator(trailing_separator)
+ .ends_with_newline(ends_with_newline);
write_list(&list_items, &fmt)
.map(|items_str| (tactic == DefinitiveListTactic::Horizontal, items_str))
overhead: usize,
offset: usize,
) -> Shape {
- if context.use_block_indent() {
- // 1 = ","
- shape
+ let (shape, overhead) = if context.use_block_indent() {
+ let shape = shape
.block()
.block_indent(context.config.tab_spaces())
- .with_max_width(context.config)
- .sub_width(1)
- .unwrap()
+ .with_max_width(context.config);
+ (shape, 1) // 1 = ","
} else {
- let shape = shape.visual_indent(offset);
- if let Some(shape) = shape.sub_width(overhead) {
- shape
- } else {
- Shape { width: 0, ..shape }
- }
+ (shape.visual_indent(offset), overhead)
+ };
+ Shape {
+ width: shape.width.saturating_sub(overhead),
+ ..shape
}
}
fn no_long_items(list: &[ListItem]) -> bool {
list.iter()
- .all(|item| !item.has_comment() && item.inner_as_ref().len() <= SHORT_ITEM_THRESHOLD)
+ .all(|item| item.inner_as_ref().len() <= SHORT_ITEM_THRESHOLD)
}