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