fmt: unify struct field align code (#10887)
parent
3cc54d8e81
commit
5e4cbcc1e3
|
@ -0,0 +1,56 @@
|
||||||
|
// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved.
|
||||||
|
// Use of this source code is governed by an MIT license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
module fmt
|
||||||
|
|
||||||
|
import math.mathutil
|
||||||
|
|
||||||
|
const struct_field_align_threshold = 8
|
||||||
|
|
||||||
|
struct AlignInfo {
|
||||||
|
mut:
|
||||||
|
line_nr int
|
||||||
|
max_len int
|
||||||
|
max_type_len int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct AddInfoConfig {
|
||||||
|
use_threshold bool
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut infos []AlignInfo) add_new_info(len int, type_len int, line int) {
|
||||||
|
infos << AlignInfo{
|
||||||
|
line_nr: line
|
||||||
|
max_len: len
|
||||||
|
max_type_len: type_len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[direct_array_access]
|
||||||
|
fn (mut infos []AlignInfo) add_info(len int, type_len int, line int, cfg AddInfoConfig) {
|
||||||
|
if infos.len == 0 {
|
||||||
|
infos.add_new_info(len, type_len, line)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i := infos.len - 1
|
||||||
|
if line - infos[i].line_nr > 1 {
|
||||||
|
infos.add_new_info(len, type_len, line)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if cfg.use_threshold {
|
||||||
|
len_diff := mathutil.abs(infos[i].max_len - len) +
|
||||||
|
mathutil.abs(infos[i].max_type_len - type_len)
|
||||||
|
|
||||||
|
if len_diff >= fmt.struct_field_align_threshold {
|
||||||
|
infos.add_new_info(len, type_len, line)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
infos[i].line_nr = line
|
||||||
|
if len > infos[i].max_len {
|
||||||
|
infos[i].max_len = len
|
||||||
|
}
|
||||||
|
if type_len > infos[i].max_type_len {
|
||||||
|
infos[i].max_type_len = type_len
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,88 +7,6 @@ import math.mathutil as mu
|
||||||
import strings
|
import strings
|
||||||
import v.ast
|
import v.ast
|
||||||
|
|
||||||
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
|
|
||||||
max_type_len int
|
|
||||||
first_line int
|
|
||||||
last_line int
|
|
||||||
}
|
|
||||||
|
|
||||||
fn (mut list []CommentAndExprAlignInfo) add_new_info(attrs_len int, type_len int, line int) {
|
|
||||||
list << CommentAndExprAlignInfo{
|
|
||||||
max_attrs_len: attrs_len
|
|
||||||
max_type_len: type_len
|
|
||||||
first_line: line
|
|
||||||
last_line: line
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i := list.len - 1
|
|
||||||
if line - list[i].last_line > 1 {
|
|
||||||
list.add_new_info(attrs_len, type_len, line)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
d_len := mu.abs(list[i].max_attrs_len - attrs_len) + mu.abs(list[i].max_type_len - type_len)
|
|
||||||
if !(d_len < fmt.threshold_to_align_struct) {
|
|
||||||
list.add_new_info(attrs_len, type_len, line)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
list[i].last_line = line
|
|
||||||
if attrs_len > list[i].max_attrs_len {
|
|
||||||
list[i].max_attrs_len = attrs_len
|
|
||||||
}
|
|
||||||
if type_len > list[i].max_type_len {
|
|
||||||
list[i].max_type_len = type_len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
f.attrs(node.attrs)
|
f.attrs(node.attrs)
|
||||||
if node.is_pub {
|
if node.is_pub {
|
||||||
|
@ -113,9 +31,9 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.writeln(' {')
|
f.writeln(' {')
|
||||||
mut field_aligns := []StructFieldAlignInfo{}
|
mut field_aligns := []AlignInfo{}
|
||||||
mut comment_aligns := []CommentAndExprAlignInfo{}
|
mut comment_aligns := []AlignInfo{}
|
||||||
mut default_expr_aligns := []CommentAndExprAlignInfo{}
|
mut default_expr_aligns := []AlignInfo{}
|
||||||
mut field_types := []string{cap: node.fields.len}
|
mut field_types := []string{cap: node.fields.len}
|
||||||
for i, field in node.fields {
|
for i, field in node.fields {
|
||||||
ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias))
|
ft := f.no_cur_mod(f.table.type_to_str_using_aliases(field.typ, f.mod2alias))
|
||||||
|
@ -126,7 +44,8 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
for comment in field.comments {
|
for comment in field.comments {
|
||||||
if comment.pos.pos >= end_pos {
|
if comment.pos.pos >= end_pos {
|
||||||
if comment.pos.line_nr == field.pos.line_nr {
|
if comment.pos.line_nr == field.pos.line_nr {
|
||||||
comment_aligns.add_info(attrs_len, field_types[i].len, comment.pos.line_nr)
|
comment_aligns.add_info(attrs_len, field_types[i].len, comment.pos.line_nr,
|
||||||
|
use_threshold: true)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -136,7 +55,8 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
}
|
}
|
||||||
field_aligns.add_info(comments_len + field.name.len, ft.len, field.pos.line_nr)
|
field_aligns.add_info(comments_len + field.name.len, ft.len, field.pos.line_nr)
|
||||||
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,
|
||||||
|
use_threshold: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for embed in node.embeds {
|
for embed in node.embeds {
|
||||||
|
@ -194,7 +114,7 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
f.comments(between_comments, iembed: true, has_nl: false)
|
f.comments(between_comments, iembed: true, has_nl: false)
|
||||||
comments_len := f.line_len - before_len
|
comments_len := f.line_len - before_len
|
||||||
mut field_align := field_aligns[field_align_i]
|
mut field_align := field_aligns[field_align_i]
|
||||||
if field_align.last_line < field.pos.line_nr {
|
if field_align.line_nr < field.pos.line_nr {
|
||||||
field_align_i++
|
field_align_i++
|
||||||
field_align = field_aligns[field_align_i]
|
field_align = field_aligns[field_align_i]
|
||||||
}
|
}
|
||||||
|
@ -209,11 +129,11 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
}
|
}
|
||||||
if field.has_default_expr {
|
if field.has_default_expr {
|
||||||
mut align := default_expr_aligns[default_expr_align_i]
|
mut align := default_expr_aligns[default_expr_align_i]
|
||||||
if align.last_line < field.pos.line_nr {
|
if align.line_nr < field.pos.line_nr {
|
||||||
default_expr_align_i++
|
default_expr_align_i++
|
||||||
align = default_expr_aligns[default_expr_align_i]
|
align = default_expr_aligns[default_expr_align_i]
|
||||||
}
|
}
|
||||||
pad_len := align.max_attrs_len - attrs_len + align.max_type_len - field_types[i].len
|
pad_len := align.max_len - attrs_len + align.max_type_len - field_types[i].len
|
||||||
f.write(strings.repeat(` `, pad_len))
|
f.write(strings.repeat(` `, pad_len))
|
||||||
f.write(' = ')
|
f.write(' = ')
|
||||||
if !expr_is_single_line(field.default_expr) {
|
if !expr_is_single_line(field.default_expr) {
|
||||||
|
@ -233,11 +153,11 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) {
|
||||||
} else {
|
} else {
|
||||||
if !field.has_default_expr {
|
if !field.has_default_expr {
|
||||||
mut align := comment_aligns[comment_align_i]
|
mut align := comment_aligns[comment_align_i]
|
||||||
if align.last_line < field.pos.line_nr {
|
if align.line_nr < field.pos.line_nr {
|
||||||
comment_align_i++
|
comment_align_i++
|
||||||
align = comment_aligns[comment_align_i]
|
align = comment_aligns[comment_align_i]
|
||||||
}
|
}
|
||||||
pad_len := align.max_attrs_len - attrs_len + align.max_type_len - field_types[i].len
|
pad_len := align.max_len - attrs_len + align.max_type_len - field_types[i].len
|
||||||
f.write(strings.repeat(` `, pad_len))
|
f.write(strings.repeat(` `, pad_len))
|
||||||
}
|
}
|
||||||
f.write(' ')
|
f.write(' ')
|
||||||
|
|
|
@ -14,7 +14,7 @@ const (
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
// TODO(bradfitz): users have reported seeing this in the
|
// (bradfitz): users have reported seeing this in the
|
||||||
// wild, but do browsers handle it? RFC 6265 just says "don't
|
// wild, but do browsers handle it? RFC 6265 just says "don't
|
||||||
// do that" (section 3) and then never mentions header folding
|
// do that" (section 3) and then never mentions header folding
|
||||||
// again.
|
// again.
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import v.ast
|
import v.ast
|
||||||
|
|
||||||
// TODO fix `fn foo(my_map map[string]map[string]int) []ast.FnDecl {`
|
|
||||||
fn foo(my_map map[string]map[string]int) int {
|
fn foo(my_map map[string]map[string]int) int {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ module abcde
|
||||||
|
|
||||||
pub struct Builder {
|
pub struct Builder {
|
||||||
pub mut:
|
pub mut:
|
||||||
// TODO
|
// inline before field
|
||||||
buf []byte
|
buf []byte
|
||||||
str_calls int
|
str_calls int
|
||||||
len int
|
len int
|
||||||
|
|
Loading…
Reference in New Issue