diff --git a/src/config.rs b/src/config.rs index 3e251ad1e399..7c8505e5e090 100644 --- a/src/config.rs +++ b/src/config.rs @@ -73,6 +73,13 @@ configuration_option_enum! { Density: CompressedIfEmpty, } +configuration_option_enum! { TypeDensity: + // No spaces around "=" and "+" + Compressed, + // Spaces around " = " and " + " + Wide, +} + impl Density { pub fn to_list_tactic(self) -> ListTactic { match self { @@ -279,6 +286,8 @@ create_config! { fn_args_density: Density, Density::Tall, "Argument density in functions"; fn_args_layout: StructLitStyle, StructLitStyle::Visual, "Layout of function arguments"; fn_arg_indent: BlockIndentStyle, BlockIndentStyle::Visual, "Indent on function arguments"; + type_punctuation_density: TypeDensity, TypeDensity::Wide, + "Determines if '+' or '=' are wrapped in spaces in the punctuation of types"; // Should we at least try to put the where clause on the same line as the rest of the // function decl? where_density: Density, Density::CompressedIfEmpty, "Density of a where clause"; diff --git a/src/types.rs b/src/types.rs index 82a335c30124..32ae46894145 100644 --- a/src/types.rs +++ b/src/types.rs @@ -21,6 +21,7 @@ use lists::{format_item_list, itemize_list, format_fn_args}; use rewrite::{Rewrite, RewriteContext}; use utils::{extra_offset, span_after, format_mutability, wrap_str}; use expr::{rewrite_unary_prefix, rewrite_pair, rewrite_tuple}; +use config::TypeDensity; // Does not wrap on simple segments. pub fn rewrite_path(context: &RewriteContext, @@ -424,7 +425,12 @@ impl Rewrite for ast::TyParam { result.push_str(&bounds); } if let Some(ref def) = self.default { - result.push_str(" = "); + + let eq_str = match context.config.type_punctuation_density { + TypeDensity::Compressed => "=", + TypeDensity::Wide => " = ", + }; + result.push_str(eq_str); let budget = try_opt!(width.checked_sub(result.len())); let rewrite = try_opt!(def.rewrite(context, budget, offset + result.len())); result.push_str(&rewrite); @@ -467,8 +473,13 @@ impl Rewrite for ast::Ty { ast::TyObjectSum(ref ty, ref bounds) => { let ty_str = try_opt!(ty.rewrite(context, width, offset)); let overhead = ty_str.len() + 3; - Some(format!("{} + {}", + let plus_str = match context.config.type_punctuation_density { + TypeDensity::Compressed => "+", + TypeDensity::Wide => " + ", + }; + Some(format!("{}{}{}", ty_str, + plus_str, try_opt!(bounds.rewrite(context, try_opt!(width.checked_sub(overhead)), offset + overhead)))) diff --git a/tests/source/type-punctuation.rs b/tests/source/type-punctuation.rs new file mode 100644 index 000000000000..29c2f5a4e3bf --- /dev/null +++ b/tests/source/type-punctuation.rs @@ -0,0 +1,5 @@ +// rustfmt-type_punctuation_density: Compressed + +fn Foo + Foo>() { + let i = 6; +} diff --git a/tests/target/type-punctuation.rs b/tests/target/type-punctuation.rs new file mode 100644 index 000000000000..2e5725b3db99 --- /dev/null +++ b/tests/target/type-punctuation.rs @@ -0,0 +1,5 @@ +// rustfmt-type_punctuation_density: Compressed + +fn Foo+Foo>() { + let i = 6; +}