@@ -188,28 +188,7 @@ impl HirDisplay for Struct {
188188 StructKind :: Record => {
189189 let has_where_clause = write_where_clause ( def_id, f) ?;
190190 if let Some ( limit) = f. entity_limit {
191- let fields = self . fields ( f. db ) ;
192- let count = fields. len ( ) . min ( limit) ;
193- f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
194- if count == 0 {
195- if fields. is_empty ( ) {
196- f. write_str ( "{}" ) ?;
197- } else {
198- f. write_str ( "{ /* … */ }" ) ?;
199- }
200- } else {
201- f. write_str ( " {\n " ) ?;
202- for field in & fields[ ..count] {
203- f. write_str ( " " ) ?;
204- field. hir_fmt ( f) ?;
205- f. write_str ( ",\n " ) ?;
206- }
207-
208- if fields. len ( ) > count {
209- f. write_str ( " /* … */\n " ) ?;
210- }
211- f. write_str ( "}" ) ?;
212- }
191+ display_fields ( & self . fields ( f. db ) , has_where_clause, limit, false , f) ?;
213192 }
214193 }
215194 StructKind :: Unit => _ = write_where_clause ( def_id, f) ?,
@@ -226,18 +205,10 @@ impl HirDisplay for Enum {
226205 write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
227206 let def_id = GenericDefId :: AdtId ( AdtId :: EnumId ( self . id ) ) ;
228207 write_generic_params ( def_id, f) ?;
229- let has_where_clause = write_where_clause ( def_id, f) ?;
230208
231- let variants = self . variants ( f. db ) ;
232- if !variants. is_empty ( ) {
233- f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
234- f. write_str ( "{\n " ) ?;
235- for variant in variants {
236- f. write_str ( " " ) ?;
237- variant. hir_fmt ( f) ?;
238- f. write_str ( ",\n " ) ?;
239- }
240- f. write_str ( "}" ) ?;
209+ let has_where_clause = write_where_clause ( def_id, f) ?;
210+ if let Some ( limit) = f. entity_limit {
211+ display_variants ( & self . variants ( f. db ) , has_where_clause, limit, f) ?;
241212 }
242213
243214 Ok ( ( ) )
@@ -251,22 +222,102 @@ impl HirDisplay for Union {
251222 write ! ( f, "{}" , self . name( f. db) . display( f. db. upcast( ) ) ) ?;
252223 let def_id = GenericDefId :: AdtId ( AdtId :: UnionId ( self . id ) ) ;
253224 write_generic_params ( def_id, f) ?;
225+
254226 let has_where_clause = write_where_clause ( def_id, f) ?;
227+ if let Some ( limit) = f. entity_limit {
228+ display_fields ( & self . fields ( f. db ) , has_where_clause, limit, false , f) ?;
229+ }
230+ Ok ( ( ) )
231+ }
232+ }
233+
234+ fn display_fields (
235+ fields : & [ Field ] ,
236+ has_where_clause : bool ,
237+ limit : usize ,
238+ in_line : bool ,
239+ f : & mut HirFormatter < ' _ > ,
240+ ) -> Result < ( ) , HirDisplayError > {
241+ let count = fields. len ( ) . min ( limit) ;
242+ let ( indent, separator) = if in_line { ( "" , ' ' ) } else { ( " " , '\n' ) } ;
243+ f. write_char ( if !has_where_clause { ' ' } else { separator } ) ?;
244+ if count == 0 {
245+ if fields. is_empty ( ) {
246+ f. write_str ( "{}" ) ?;
247+ } else {
248+ f. write_str ( "{ /* … */ }" ) ?;
249+ }
250+ } else {
251+ f. write_char ( '{' ) ?;
255252
256- let fields = self . fields ( f. db ) ;
257253 if !fields. is_empty ( ) {
258- f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
259- f. write_str ( "{\n " ) ?;
260- for field in self . fields ( f. db ) {
261- f. write_str ( " " ) ?;
254+ f. write_char ( separator) ?;
255+ for field in & fields[ ..count] {
256+ f. write_str ( indent) ?;
262257 field. hir_fmt ( f) ?;
263- f. write_str ( ",\n " ) ?;
258+ f. write_char ( ',' ) ?;
259+ f. write_char ( separator) ?;
260+ }
261+
262+ if fields. len ( ) > count {
263+ f. write_str ( indent) ?;
264+ f. write_str ( "/* … */" ) ?;
265+ f. write_char ( separator) ?;
264266 }
265- f. write_str ( "}" ) ?;
266267 }
267268
268- Ok ( ( ) )
269+ f. write_str ( "}" ) ?;
270+ }
271+
272+ Ok ( ( ) )
273+ }
274+
275+ fn display_variants (
276+ variants : & [ Variant ] ,
277+ has_where_clause : bool ,
278+ limit : usize ,
279+ f : & mut HirFormatter < ' _ > ,
280+ ) -> Result < ( ) , HirDisplayError > {
281+ let count = variants. len ( ) . min ( limit) ;
282+ f. write_char ( if !has_where_clause { ' ' } else { '\n' } ) ?;
283+ if count == 0 {
284+ if variants. is_empty ( ) {
285+ f. write_str ( "{}" ) ?;
286+ } else {
287+ f. write_str ( "{ /* … */ }" ) ?;
288+ }
289+ } else {
290+ f. write_str ( "{\n " ) ?;
291+ for variant in & variants[ ..count] {
292+ f. write_str ( " " ) ?;
293+ write ! ( f, "{}" , variant. name( f. db) . display( f. db. upcast( ) ) ) ?;
294+ match variant. kind ( f. db ) {
295+ StructKind :: Tuple => {
296+ if variant. fields ( f. db ) . is_empty ( ) {
297+ f. write_str ( "()" ) ?;
298+ } else {
299+ f. write_str ( "( /* … */ )" ) ?;
300+ }
301+ }
302+ StructKind :: Record => {
303+ if variant. fields ( f. db ) . is_empty ( ) {
304+ f. write_str ( " {}" ) ?;
305+ } else {
306+ f. write_str ( " { /* … */ }" ) ?;
307+ }
308+ }
309+ StructKind :: Unit => { }
310+ }
311+ f. write_str ( ",\n " ) ?;
312+ }
313+
314+ if variants. len ( ) > count {
315+ f. write_str ( " /* … */\n " ) ?;
316+ }
317+ f. write_str ( "}" ) ?;
269318 }
319+
320+ Ok ( ( ) )
270321}
271322
272323impl HirDisplay for Field {
@@ -304,21 +355,10 @@ impl HirDisplay for Variant {
304355 }
305356 f. write_char ( ')' ) ?;
306357 }
307- VariantData :: Record ( fields) => {
308- f. write_str ( " {" ) ?;
309- let mut first = true ;
310- for ( _, field) in fields. iter ( ) {
311- if first {
312- first = false ;
313- f. write_char ( ' ' ) ?;
314- } else {
315- f. write_str ( ", " ) ?;
316- }
317- // Enum variant fields must be pub.
318- write ! ( f, "{}: " , field. name. display( f. db. upcast( ) ) ) ?;
319- field. type_ref . hir_fmt ( f) ?;
358+ VariantData :: Record ( _) => {
359+ if let Some ( limit) = f. entity_limit {
360+ display_fields ( & self . fields ( f. db ) , false , limit, true , f) ?;
320361 }
321- f. write_str ( " }" ) ?;
322362 }
323363 }
324364 Ok ( ( ) )
0 commit comments