@@ -159,44 +159,48 @@ impl HirDisplay for Adt {
159159impl HirDisplay for Struct {
160160 fn hir_fmt ( & self , f : & mut HirFormatter < ' _ > ) -> Result < ( ) , HirDisplayError > {
161161 let module_id = self . module ( f. db ) . id ;
162+ // FIXME: Render repr if its set explicitly?
162163 write_visibility ( module_id, self . visibility ( f. db ) , f) ?;
163164 f. write_str ( "struct " ) ?;
164165 write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
165166 let def_id = GenericDefId :: AdtId ( AdtId :: StructId ( self . id ) ) ;
166167 write_generic_params ( def_id, f) ?;
167168
168169 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 ( ) ;
184174
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+ }
186183
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 ( "}" ) ?;
197201 }
198- f. write_str ( "}" ) ?;
199202 }
203+ StructKind :: Unit => _ = write_where_clause ( def_id, f) ?,
200204 }
201205
202206 Ok ( ( ) )
@@ -210,11 +214,12 @@ impl HirDisplay for Enum {
210214 write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
211215 let def_id = GenericDefId :: AdtId ( AdtId :: EnumId ( self . id ) ) ;
212216 write_generic_params ( def_id, f) ?;
213- write_where_clause ( def_id, f) ?;
217+ let has_where_clause = write_where_clause ( def_id, f) ?;
214218
215219 let variants = self . variants ( f. db ) ;
216220 if !variants. is_empty ( ) {
217- f. write_str ( " {\n " ) ?;
221+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
222+ f. write_str ( "{\n " ) ?;
218223 for variant in variants {
219224 f. write_str ( " " ) ?;
220225 variant. hir_fmt ( f) ?;
@@ -234,11 +239,12 @@ impl HirDisplay for Union {
234239 write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
235240 let def_id = GenericDefId :: AdtId ( AdtId :: UnionId ( self . id ) ) ;
236241 write_generic_params ( def_id, f) ?;
237- write_where_clause ( def_id, f) ?;
242+ let has_where_clause = write_where_clause ( def_id, f) ?;
238243
239244 let fields = self . fields ( f. db ) ;
240245 if !fields. is_empty ( ) {
241- f. write_str ( " {\n " ) ?;
246+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
247+ f. write_str ( "{\n " ) ?;
242248 for field in self . fields ( f. db ) {
243249 f. write_str ( " " ) ?;
244250 field. hir_fmt ( f) ?;
@@ -446,7 +452,10 @@ fn write_generic_params(
446452 Ok ( ( ) )
447453}
448454
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 > {
450459 let params = f. db . generic_params ( def) ;
451460
452461 // 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<(),
465474 } ) ;
466475
467476 if !has_displayable_predicate {
468- return Ok ( ( ) ) ;
477+ return Ok ( false ) ;
469478 }
470479
471480 let write_target = |target : & WherePredicateTypeTarget , f : & mut HirFormatter < ' _ > | match target {
@@ -543,7 +552,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
543552 // End of final predicate. There must be at least one predicate here.
544553 f. write_char ( ',' ) ?;
545554
546- Ok ( ( ) )
555+ Ok ( true )
547556}
548557
549558impl HirDisplay for Const {
@@ -594,19 +603,20 @@ impl HirDisplay for Trait {
594603 write ! ( f, "trait {}" , data. name. display( f. db. upcast( ) ) ) ?;
595604 let def_id = GenericDefId :: TraitId ( self . id ) ;
596605 write_generic_params ( def_id, f) ?;
597- write_where_clause ( def_id, f) ?;
606+ let has_where_clause = write_where_clause ( def_id, f) ?;
598607
599608 if let Some ( limit) = f. entity_limit {
600609 let assoc_items = self . items ( f. db ) ;
601610 let count = assoc_items. len ( ) . min ( limit) ;
611+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
602612 if count == 0 {
603613 if assoc_items. is_empty ( ) {
604- f. write_str ( " {}" ) ?;
614+ f. write_str ( "{}" ) ?;
605615 } else {
606- f. write_str ( " { /* … */ }" ) ?;
616+ f. write_str ( "{ /* … */ }" ) ?;
607617 }
608618 } else {
609- f. write_str ( " {\n " ) ?;
619+ f. write_str ( "{\n " ) ?;
610620 for item in & assoc_items[ ..count] {
611621 f. write_str ( " " ) ?;
612622 match item {
@@ -651,7 +661,6 @@ impl HirDisplay for TypeAlias {
651661 write ! ( f, "type {}" , data. name. display( f. db. upcast( ) ) ) ?;
652662 let def_id = GenericDefId :: TypeAliasId ( self . id ) ;
653663 write_generic_params ( def_id, f) ?;
654- write_where_clause ( def_id, f) ?;
655664 if !data. bounds . is_empty ( ) {
656665 f. write_str ( ": " ) ?;
657666 f. write_joined ( data. bounds . iter ( ) , " + " ) ?;
@@ -660,6 +669,7 @@ impl HirDisplay for TypeAlias {
660669 f. write_str ( " = " ) ?;
661670 ty. hir_fmt ( f) ?;
662671 }
672+ write_where_clause ( def_id, f) ?;
663673 Ok ( ( ) )
664674 }
665675}
0 commit comments