diff --git a/src/items.rs b/src/items.rs index 30f3d6f4be4..dcca3a77cac 100644 --- a/src/items.rs +++ b/src/items.rs @@ -937,11 +937,20 @@ pub fn format_trait(context: &RewriteContext, item: &ast::Item, offset: Indent) let body_lo = context.codemap.span_after(item.span, "{"); - let shape = Shape::indented(offset + last_line_width(&result), context.config); + let shape = Shape::indented(offset, context.config); let generics_str = rewrite_generics(context, generics, shape, mk_sp(item.span.lo(), body_lo))?; result.push_str(&generics_str); + // FIXME(#2055): rustfmt fails to format when there are comments between trait bounds. + if !type_param_bounds.is_empty() { + let ident_hi = context.codemap.span_after(item.span, &format!("{}", item.ident)); + let bound_hi = type_param_bounds.last().unwrap().span().hi(); + let snippet = context.snippet(mk_sp(ident_hi, bound_hi)); + if contains_comment(&snippet) { + return None; + } + } let trait_bound_str = rewrite_trait_bounds( context, type_param_bounds, diff --git a/tests/source/trait.rs b/tests/source/trait.rs index 7ed858a9ca6..c5b9d71c094 100644 --- a/tests/source/trait.rs +++ b/tests/source/trait.rs @@ -57,3 +57,11 @@ trait X /* comment */ {} trait Y // comment { } + +// #2055 +pub trait Foo: +// A and C +A + C +// and B + + B +{} diff --git a/tests/target/trait.rs b/tests/target/trait.rs index a2ea54e0f03..e17191ce1ef 100644 --- a/tests/target/trait.rs +++ b/tests/target/trait.rs @@ -84,3 +84,11 @@ trait X /* comment */ {} trait Y // comment { } + +// #2055 +pub trait Foo: +// A and C +A + C +// and B + + B +{}