Skip to content

Commit 8db33ff

Browse files
authored
Merge pull request #2284 from topecongiro/trait-aliases
Format trait aliases
2 parents c0701f5 + 3a98b5a commit 8db33ff

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

src/items.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,22 @@ pub fn format_trait(context: &RewriteContext, item: &ast::Item, offset: Indent)
10871087
}
10881088
}
10891089

1090+
pub fn format_trait_alias(
1091+
context: &RewriteContext,
1092+
ident: ast::Ident,
1093+
generics: &ast::Generics,
1094+
ty_param_bounds: &ast::TyParamBounds,
1095+
shape: Shape,
1096+
) -> Option<String> {
1097+
let alias = ident.name.as_str();
1098+
// 6 = "trait ", 2 = " ="
1099+
let g_shape = shape.offset_left(6 + alias.len())?.sub_width(2)?;
1100+
let generics_str = rewrite_generics(context, generics, g_shape, generics.span)?;
1101+
let lhs = format!("trait {}{} =", alias, generics_str);
1102+
// 1 = ";"
1103+
rewrite_assign_rhs(context, lhs, ty_param_bounds, shape.sub_width(1)?).map(|s| s + ";")
1104+
}
1105+
10901106
fn format_unit_struct(context: &RewriteContext, p: &StructParts, offset: Indent) -> Option<String> {
10911107
let header_str = format_header(p.prefix, p.ident, p.vis);
10921108
let generics_str = if let Some(generics) = p.generics {

src/visitor.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ use comment::{combine_strs_with_missing_comments, contains_comment, remove_trail
2222
CodeCharKind, CommentCodeSlices, FindUncommented};
2323
use comment::rewrite_comment;
2424
use config::{BraceStyle, Config};
25-
use items::{format_impl, format_trait, rewrite_associated_impl_type, rewrite_associated_type,
26-
rewrite_type_alias, FnSig, StaticParts, StructParts};
25+
use items::{format_impl, format_trait, format_trait_alias, rewrite_associated_impl_type,
26+
rewrite_associated_type, rewrite_type_alias, FnSig, StaticParts, StructParts};
2727
use lists::{itemize_list, write_list, DefinitiveListTactic, ListFormatting, SeparatorPlace,
2828
SeparatorTactic};
2929
use macros::{rewrite_macro, MacroPosition};
@@ -373,9 +373,16 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
373373
let rw = format_trait(&self.get_context(), item, self.block_indent);
374374
self.push_rewrite(item.span, rw);
375375
}
376-
ast::ItemKind::TraitAlias(..) => {
377-
// FIXME: #2283.
378-
self.push_rewrite(item.span, None);
376+
ast::ItemKind::TraitAlias(ref generics, ref ty_param_bounds) => {
377+
let shape = Shape::indented(self.block_indent, self.config);
378+
let rw = format_trait_alias(
379+
&self.get_context(),
380+
item.ident,
381+
generics,
382+
ty_param_bounds,
383+
shape,
384+
);
385+
self.push_rewrite(item.span, rw);
379386
}
380387
ast::ItemKind::ExternCrate(_) => {
381388
let rw = rewrite_extern_crate(&self.get_context(), item);

tests/source/trait.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,19 @@ trait Foo {
7171
type ItRev = <MergingUntypedTimeSeries<SliceSeries<SliceWindow>> as UntypedTimeSeries>::IterRev;
7272
type IteRev = <MergingUntypedTimeSeries<SliceSeries<SliceWindow>> as UntypedTimeSeries>::IterRev;
7373
}
74+
75+
// Trait aliases
76+
trait FooBar =
77+
Foo
78+
+ Bar;
79+
trait FooBar <A, B, C>=
80+
Foo
81+
+ Bar;
82+
trait AAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
83+
trait AAAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
84+
trait AAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDDD;
85+
trait AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<A, B, C, D, E> = FooBar;
86+
trait AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<A, B, C, D, E> = FooBar;
87+
#[rustfmt_skip]
88+
trait FooBar = Foo
89+
+ Bar;

tests/target/trait.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,24 @@ trait Foo {
9999
type IteRev =
100100
<MergingUntypedTimeSeries<SliceSeries<SliceWindow>> as UntypedTimeSeries>::IterRev;
101101
}
102+
103+
// Trait aliases
104+
trait FooBar = Foo + Bar;
105+
trait FooBar<A, B, C> = Foo + Bar;
106+
trait AAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
107+
trait AAAAAAAAAAAAAAAAAAA =
108+
BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
109+
trait AAAAAAAAAAAAAAAAAA =
110+
BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDDD;
111+
trait AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<A, B, C, D, E> =
112+
FooBar;
113+
trait AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<
114+
A,
115+
B,
116+
C,
117+
D,
118+
E,
119+
> = FooBar;
120+
#[rustfmt_skip]
121+
trait FooBar = Foo
122+
+ Bar;

0 commit comments

Comments
 (0)