Put each nested import on its own line

while putting non-nested imports on the same line as much as possible.
This commit is contained in:
Seiichi Uchida 2018-06-05 19:58:44 +09:00
parent 35fee77d39
commit 42ab258757
3 changed files with 17 additions and 7 deletions

View File

@ -19,6 +19,8 @@ pub enum DefinitiveListTactic {
Vertical,
Horizontal,
Mixed,
/// Tactic for nested import.
NestedImport,
/// Special case tactic for `format!()`, `write!()` style macros.
SpecialMacro(usize),
}

View File

@ -706,12 +706,16 @@ fn rewrite_nested_use_tree(
shape.width.saturating_sub(2)
};
let tactic = definitive_tactic(
&list_items,
context.config.imports_layout(),
Separator::Comma,
remaining_width,
);
let tactic = if has_nested_list {
DefinitiveListTactic::NestedImport
} else {
definitive_tactic(
&list_items,
context.config.imports_layout(),
Separator::Comma,
remaining_width,
)
};
let ends_with_newline = context.config.imports_indent() == IndentStyle::Block
&& tactic != DefinitiveListTactic::Horizontal;

View File

@ -229,6 +229,7 @@ where
let sep_place =
SeparatorPlace::from_tactic(formatting.separator_place, tactic, formatting.separator);
let mut prev_item_had_post_comment = false;
let mut prev_item_is_nested_import = false;
let mut line_len = 0;
let indent_str = &formatting.shape.indent.to_string(formatting.config);
@ -281,12 +282,14 @@ where
result.push('\n');
result.push_str(indent_str);
}
DefinitiveListTactic::Mixed => {
DefinitiveListTactic::Mixed | DefinitiveListTactic::NestedImport => {
let total_width = total_item_width(item) + item_sep_len;
// 1 is space between separator and item.
if (line_len > 0 && line_len + 1 + total_width > formatting.shape.width)
|| prev_item_had_post_comment
|| (tactic == DefinitiveListTactic::NestedImport
&& (prev_item_is_nested_import || (!first && inner_item.contains("::"))))
{
result.push('\n');
result.push_str(indent_str);
@ -452,6 +455,7 @@ where
}
prev_item_had_post_comment = item.post_comment.is_some();
prev_item_is_nested_import = inner_item.contains("::");
}
Some(result)