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')
|
||||
}
|
||||
|
||||
[inline]
|
||||
fn abs(v int) int {
|
||||
return if v >= 0 {
|
||||
v
|
||||
} else {
|
||||
-v
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
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 {
|
||||
mut:
|
||||
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) {
|
||||
if list.len == 0 {
|
||||
list.add_new_info(attrs_len, type_len, line)
|
||||
|
@ -667,8 +704,7 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
|||
return
|
||||
}
|
||||
f.writeln(' {')
|
||||
mut max := 0
|
||||
mut max_type_len := 0
|
||||
mut field_aligns := []StructFieldAlignInfo{}
|
||||
mut comment_aligns := []CommentAndExprAlignInfo{}
|
||||
mut default_expr_aligns := []CommentAndExprAlignInfo{}
|
||||
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)
|
||||
}
|
||||
field_types << ft
|
||||
if ft.len > max_type_len {
|
||||
max_type_len = ft.len
|
||||
}
|
||||
attrs_len := inline_attrs_len(field.attrs)
|
||||
end_pos := field.pos.pos + field.pos.len
|
||||
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
|
||||
}
|
||||
}
|
||||
if comments_len + field.name.len > max {
|
||||
max = comments_len + field.name.len
|
||||
}
|
||||
field_aligns.add_info(comments_len + field.name.len, ft.len, field.pos.line_nr)
|
||||
if field.has_default_expr {
|
||||
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)
|
||||
f.writeln('\t$styp')
|
||||
}
|
||||
mut field_align_i := 0
|
||||
mut comment_align_i := 0
|
||||
mut default_expr_align_i := 0
|
||||
for i, field in node.fields {
|
||||
|
@ -737,13 +769,17 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
|||
f.write(comment_text)
|
||||
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])
|
||||
after_type_pad_len := max_type_len - field_types[i].len
|
||||
attrs_len := inline_attrs_len(field.attrs)
|
||||
has_attrs := field.attrs.len > 0
|
||||
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)
|
||||
}
|
||||
if field.has_default_expr {
|
||||
|
|
Loading…
Reference in New Issue