@@ -159,44 +159,48 @@ impl HirDisplay for Adt {
159
159
impl HirDisplay for Struct {
160
160
fn hir_fmt ( & self , f : & mut HirFormatter < ' _ > ) -> Result < ( ) , HirDisplayError > {
161
161
let module_id = self . module ( f. db ) . id ;
162
+ // FIXME: Render repr if its set explicitly?
162
163
write_visibility ( module_id, self . visibility ( f. db ) , f) ?;
163
164
f. write_str ( "struct " ) ?;
164
165
write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
165
166
let def_id = GenericDefId :: AdtId ( AdtId :: StructId ( self . id ) ) ;
166
167
write_generic_params ( def_id, f) ?;
167
168
168
169
let variant_data = self . variant_data ( f. db ) ;
169
- if let StructKind :: Tuple = variant_data. kind ( ) {
170
- f. write_char ( '(' ) ?;
171
- let mut it = variant_data. fields ( ) . iter ( ) . peekable ( ) ;
172
-
173
- while let Some ( ( id, _) ) = it. next ( ) {
174
- let field = Field { parent : ( * self ) . into ( ) , id } ;
175
- write_visibility ( module_id, field. visibility ( f. db ) , f) ?;
176
- field. ty ( f. db ) . hir_fmt ( f) ?;
177
- if it. peek ( ) . is_some ( ) {
178
- f. write_str ( ", " ) ?;
179
- }
180
- }
181
-
182
- f. write_str ( ");" ) ?;
183
- }
170
+ match variant_data. kind ( ) {
171
+ StructKind :: Tuple => {
172
+ f. write_char ( '(' ) ?;
173
+ let mut it = variant_data. fields ( ) . iter ( ) . peekable ( ) ;
184
174
185
- write_where_clause ( def_id, f) ?;
175
+ while let Some ( ( id, _) ) = it. next ( ) {
176
+ let field = Field { parent : ( * self ) . into ( ) , id } ;
177
+ write_visibility ( module_id, field. visibility ( f. db ) , f) ?;
178
+ field. ty ( f. db ) . hir_fmt ( f) ?;
179
+ if it. peek ( ) . is_some ( ) {
180
+ f. write_str ( ", " ) ?;
181
+ }
182
+ }
186
183
187
- if let StructKind :: Record = variant_data. kind ( ) {
188
- let fields = self . fields ( f. db ) ;
189
- if fields. is_empty ( ) {
190
- f. write_str ( " {}" ) ?;
191
- } else {
192
- f. write_str ( " {\n " ) ?;
193
- for field in self . fields ( f. db ) {
194
- f. write_str ( " " ) ?;
195
- field. hir_fmt ( f) ?;
196
- f. write_str ( ",\n " ) ?;
184
+ f. write_char ( ')' ) ?;
185
+ write_where_clause ( def_id, f) ?;
186
+ }
187
+ StructKind :: Record => {
188
+ let has_where_clause = write_where_clause ( def_id, f) ?;
189
+ let fields = self . fields ( f. db ) ;
190
+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
191
+ if fields. is_empty ( ) {
192
+ f. write_str ( "{}" ) ?;
193
+ } else {
194
+ f. write_str ( "{\n " ) ?;
195
+ for field in self . fields ( f. db ) {
196
+ f. write_str ( " " ) ?;
197
+ field. hir_fmt ( f) ?;
198
+ f. write_str ( ",\n " ) ?;
199
+ }
200
+ f. write_str ( "}" ) ?;
197
201
}
198
- f. write_str ( "}" ) ?;
199
202
}
203
+ StructKind :: Unit => _ = write_where_clause ( def_id, f) ?,
200
204
}
201
205
202
206
Ok ( ( ) )
@@ -210,11 +214,12 @@ impl HirDisplay for Enum {
210
214
write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
211
215
let def_id = GenericDefId :: AdtId ( AdtId :: EnumId ( self . id ) ) ;
212
216
write_generic_params ( def_id, f) ?;
213
- write_where_clause ( def_id, f) ?;
217
+ let has_where_clause = write_where_clause ( def_id, f) ?;
214
218
215
219
let variants = self . variants ( f. db ) ;
216
220
if !variants. is_empty ( ) {
217
- f. write_str ( " {\n " ) ?;
221
+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
222
+ f. write_str ( "{\n " ) ?;
218
223
for variant in variants {
219
224
f. write_str ( " " ) ?;
220
225
variant. hir_fmt ( f) ?;
@@ -234,11 +239,12 @@ impl HirDisplay for Union {
234
239
write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
235
240
let def_id = GenericDefId :: AdtId ( AdtId :: UnionId ( self . id ) ) ;
236
241
write_generic_params ( def_id, f) ?;
237
- write_where_clause ( def_id, f) ?;
242
+ let has_where_clause = write_where_clause ( def_id, f) ?;
238
243
239
244
let fields = self . fields ( f. db ) ;
240
245
if !fields. is_empty ( ) {
241
- f. write_str ( " {\n " ) ?;
246
+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
247
+ f. write_str ( "{\n " ) ?;
242
248
for field in self . fields ( f. db ) {
243
249
f. write_str ( " " ) ?;
244
250
field. hir_fmt ( f) ?;
@@ -446,7 +452,10 @@ fn write_generic_params(
446
452
Ok ( ( ) )
447
453
}
448
454
449
- fn write_where_clause ( def : GenericDefId , f : & mut HirFormatter < ' _ > ) -> Result < ( ) , HirDisplayError > {
455
+ fn write_where_clause (
456
+ def : GenericDefId ,
457
+ f : & mut HirFormatter < ' _ > ,
458
+ ) -> Result < bool , HirDisplayError > {
450
459
let params = f. db . generic_params ( def) ;
451
460
452
461
// unnamed type targets are displayed inline with the argument itself, e.g. `f: impl Y`.
@@ -465,7 +474,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
465
474
} ) ;
466
475
467
476
if !has_displayable_predicate {
468
- return Ok ( ( ) ) ;
477
+ return Ok ( false ) ;
469
478
}
470
479
471
480
let write_target = |target : & WherePredicateTypeTarget , f : & mut HirFormatter < ' _ > | match target {
@@ -543,7 +552,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
543
552
// End of final predicate. There must be at least one predicate here.
544
553
f. write_char ( ',' ) ?;
545
554
546
- Ok ( ( ) )
555
+ Ok ( true )
547
556
}
548
557
549
558
impl HirDisplay for Const {
@@ -594,19 +603,20 @@ impl HirDisplay for Trait {
594
603
write ! ( f, "trait {}" , data. name. display( f. db. upcast( ) ) ) ?;
595
604
let def_id = GenericDefId :: TraitId ( self . id ) ;
596
605
write_generic_params ( def_id, f) ?;
597
- write_where_clause ( def_id, f) ?;
606
+ let has_where_clause = write_where_clause ( def_id, f) ?;
598
607
599
608
if let Some ( limit) = f. entity_limit {
600
609
let assoc_items = self . items ( f. db ) ;
601
610
let count = assoc_items. len ( ) . min ( limit) ;
611
+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
602
612
if count == 0 {
603
613
if assoc_items. is_empty ( ) {
604
- f. write_str ( " {}" ) ?;
614
+ f. write_str ( "{}" ) ?;
605
615
} else {
606
- f. write_str ( " { /* … */ }" ) ?;
616
+ f. write_str ( "{ /* … */ }" ) ?;
607
617
}
608
618
} else {
609
- f. write_str ( " {\n " ) ?;
619
+ f. write_str ( "{\n " ) ?;
610
620
for item in & assoc_items[ ..count] {
611
621
f. write_str ( " " ) ?;
612
622
match item {
@@ -651,7 +661,6 @@ impl HirDisplay for TypeAlias {
651
661
write ! ( f, "type {}" , data. name. display( f. db. upcast( ) ) ) ?;
652
662
let def_id = GenericDefId :: TypeAliasId ( self . id ) ;
653
663
write_generic_params ( def_id, f) ?;
654
- write_where_clause ( def_id, f) ?;
655
664
if !data. bounds . is_empty ( ) {
656
665
f. write_str ( ": " ) ?;
657
666
f. write_joined ( data. bounds . iter ( ) , " + " ) ?;
@@ -660,6 +669,7 @@ impl HirDisplay for TypeAlias {
660
669
f. write_str ( " = " ) ?;
661
670
ty. hir_fmt ( f) ?;
662
671
}
672
+ write_where_clause ( def_id, f) ?;
663
673
Ok ( ( ) )
664
674
}
665
675
}
0 commit comments