fmt: align each contiguous field of struct. not the whole. (#7981)
							parent
							
								
									82a5300044
								
							
						
					
					
						commit
						33694665f0
					
				|  | @ -589,10 +589,56 @@ pub fn (mut f Fmt) type_decl(node ast.TypeDecl) { | ||||||
| 	f.writeln('\n') | 	f.writeln('\n') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | [inline] | ||||||
|  | fn abs(v int) int { | ||||||
|  | 	return if v >= 0 { | ||||||
|  | 		v | ||||||
|  | 	} else { | ||||||
|  | 		-v | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const ( | const ( | ||||||
| 	threshold_to_align_struct = 8 | 	threshold_to_align_struct = 8 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | struct StructFieldAlignInfo { | ||||||
|  | mut: | ||||||
|  | 	first_line   int | ||||||
|  | 	last_line    int | ||||||
|  | 	max_type_len int | ||||||
|  | 	max_len      int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn (mut list []StructFieldAlignInfo) add_new_info(len int, type_len int, line int) { | ||||||
|  | 	list << StructFieldAlignInfo{ | ||||||
|  | 		first_line: line | ||||||
|  | 		last_line: line | ||||||
|  | 		max_type_len: type_len | ||||||
|  | 		max_len: len | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | [direct_array_access] | ||||||
|  | fn (mut list []StructFieldAlignInfo) add_info(len int, type_len int, line int) { | ||||||
|  | 	if list.len == 0 { | ||||||
|  | 		list.add_new_info(len, type_len, line) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	i := list.len - 1 | ||||||
|  | 	if line - list[i].last_line > 1 { | ||||||
|  | 		list.add_new_info(len, type_len, line) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	list[i].last_line = line | ||||||
|  | 	if len > list[i].max_len { | ||||||
|  | 		list[i].max_len = len | ||||||
|  | 	} | ||||||
|  | 	if type_len > list[i].max_type_len { | ||||||
|  | 		list[i].max_type_len = type_len | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| struct CommentAndExprAlignInfo { | struct CommentAndExprAlignInfo { | ||||||
| mut: | mut: | ||||||
| 	max_attrs_len int | 	max_attrs_len int | ||||||
|  | @ -610,15 +656,6 @@ fn (mut list []CommentAndExprAlignInfo) add_new_info(attrs_len int, type_len int | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| [inline] |  | ||||||
| fn abs(v int) int { |  | ||||||
| 	return if v >= 0 { |  | ||||||
| 		v |  | ||||||
| 	} else { |  | ||||||
| 		-v |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn (mut list []CommentAndExprAlignInfo) add_info(attrs_len int, type_len int, line int) { | fn (mut list []CommentAndExprAlignInfo) add_info(attrs_len int, type_len int, line int) { | ||||||
| 	if list.len == 0 { | 	if list.len == 0 { | ||||||
| 		list.add_new_info(attrs_len, type_len, line) | 		list.add_new_info(attrs_len, type_len, line) | ||||||
|  | @ -667,8 +704,7 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	f.writeln(' {') | 	f.writeln(' {') | ||||||
| 	mut max := 0 | 	mut field_aligns := []StructFieldAlignInfo{} | ||||||
| 	mut max_type_len := 0 |  | ||||||
| 	mut comment_aligns := []CommentAndExprAlignInfo{} | 	mut comment_aligns := []CommentAndExprAlignInfo{} | ||||||
| 	mut default_expr_aligns := []CommentAndExprAlignInfo{} | 	mut default_expr_aligns := []CommentAndExprAlignInfo{} | ||||||
| 	mut field_types := []string{cap: node.fields.len} | 	mut field_types := []string{cap: node.fields.len} | ||||||
|  | @ -678,9 +714,6 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { | ||||||
| 			ft = f.short_module(ft) | 			ft = f.short_module(ft) | ||||||
| 		} | 		} | ||||||
| 		field_types << ft | 		field_types << ft | ||||||
| 		if ft.len > max_type_len { |  | ||||||
| 			max_type_len = ft.len |  | ||||||
| 		} |  | ||||||
| 		attrs_len := inline_attrs_len(field.attrs) | 		attrs_len := inline_attrs_len(field.attrs) | ||||||
| 		end_pos := field.pos.pos + field.pos.len | 		end_pos := field.pos.pos + field.pos.len | ||||||
| 		mut comments_len := 0 // Length of comments between field name and type
 | 		mut comments_len := 0 // Length of comments between field name and type
 | ||||||
|  | @ -695,9 +728,7 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { | ||||||
| 				comments_len += '/* $comment.text */ '.len | 				comments_len += '/* $comment.text */ '.len | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if comments_len + field.name.len > max { | 		field_aligns.add_info(comments_len + field.name.len, ft.len, field.pos.line_nr) | ||||||
| 			max = comments_len + field.name.len |  | ||||||
| 		} |  | ||||||
| 		if field.has_default_expr { | 		if field.has_default_expr { | ||||||
| 			default_expr_aligns.add_info(attrs_len, field_types[i].len, field.pos.line_nr) | 			default_expr_aligns.add_info(attrs_len, field_types[i].len, field.pos.line_nr) | ||||||
| 		} | 		} | ||||||
|  | @ -706,6 +737,7 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { | ||||||
| 		styp := f.table.type_to_str(embed.typ) | 		styp := f.table.type_to_str(embed.typ) | ||||||
| 		f.writeln('\t$styp') | 		f.writeln('\t$styp') | ||||||
| 	} | 	} | ||||||
|  | 	mut field_align_i := 0 | ||||||
| 	mut comment_align_i := 0 | 	mut comment_align_i := 0 | ||||||
| 	mut default_expr_align_i := 0 | 	mut default_expr_align_i := 0 | ||||||
| 	for i, field in node.fields { | 	for i, field in node.fields { | ||||||
|  | @ -737,13 +769,17 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { | ||||||
| 			f.write(comment_text) | 			f.write(comment_text) | ||||||
| 			comm_idx++ | 			comm_idx++ | ||||||
| 		} | 		} | ||||||
| 		f.write(strings.repeat(` `, max - field.name.len - comments_len)) | 		mut field_align := field_aligns[field_align_i] | ||||||
|  | 		if field_align.last_line < field.pos.line_nr { | ||||||
|  | 			field_align_i++ | ||||||
|  | 			field_align = field_aligns[field_align_i] | ||||||
|  | 		} | ||||||
|  | 		f.write(strings.repeat(` `, field_align.max_len - field.name.len - comments_len)) | ||||||
| 		f.write(field_types[i]) | 		f.write(field_types[i]) | ||||||
| 		after_type_pad_len := max_type_len - field_types[i].len |  | ||||||
| 		attrs_len := inline_attrs_len(field.attrs) | 		attrs_len := inline_attrs_len(field.attrs) | ||||||
| 		has_attrs := field.attrs.len > 0 | 		has_attrs := field.attrs.len > 0 | ||||||
| 		if has_attrs { | 		if has_attrs { | ||||||
| 			f.write(strings.repeat(` `, after_type_pad_len)) | 			f.write(strings.repeat(` `, field_align.max_type_len - field_types[i].len)) | ||||||
| 			f.inline_attrs(field.attrs) | 			f.inline_attrs(field.attrs) | ||||||
| 		} | 		} | ||||||
| 		if field.has_default_expr { | 		if field.has_default_expr { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue