fmt: reset const field align after multi line exprs (#9916)

pull/9908/head^2
Lukas Neubert 2021-04-29 01:17:37 +02:00 committed by GitHub
parent c82c8059cf
commit dee733aae4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 101 additions and 53 deletions

View File

@ -37,9 +37,9 @@ const (
'vlib/v/tests/generics_test.v', /* multi_generic_args<Foo<int>, Foo<int> >(...) becomes .... Foo<int>>(...) which does not parse */
'vlib/v/tests/string_interpolation_test.v' /* TODO byteptr: &byte.str() behaves differently than byteptr.str() */,
'vlib/v/gen/js/tests/js.v', /* local `hello` fn, gets replaced with module `hello` aliased as `hl` */
'vlib/v/gen/c/cheaders.v' /* the preprocessor directives are formated to the V standard, even though they are in a string literal */,
'examples/c_interop_wkhtmltopdf.v', /* &charptr --> &&char */
'examples/path_tracing.v', /* block --> line comments corrupts code */
'vlib/v/gen/c/cheaders.v' /* infix wrapping error */,
]
vfmt_verify_list = [
'cmd/',

View File

@ -657,6 +657,9 @@ fn expr_is_single_line(expr ast.Expr) bool {
}
}
}
ast.StringLiteral {
return expr.pos.line_nr == expr.pos.last_line
}
else {}
}
return true
@ -888,6 +891,12 @@ pub fn (mut f Fmt) comp_for(node ast.CompFor) {
f.writeln('}')
}
struct ConstAlignInfo {
mut:
max int
last_idx int
}
pub fn (mut f Fmt) const_decl(node ast.ConstDecl) {
if node.is_pub {
f.write('pub ')
@ -901,22 +910,36 @@ pub fn (mut f Fmt) const_decl(node ast.ConstDecl) {
f.inside_const = false
}
f.write('const ')
mut max := 0
mut align_infos := []ConstAlignInfo{}
if node.is_block {
f.writeln('(')
for field in node.fields {
if field.name.len > max {
max = field.name.len
mut info := ConstAlignInfo{}
for i, field in node.fields {
if field.name.len > info.max {
info.max = field.name.len
}
if !expr_is_single_line(field.expr) {
info.last_idx = i
align_infos << info
info = ConstAlignInfo{}
}
}
info.last_idx = node.fields.len
align_infos << info
f.indent++
} else {
align_infos << ConstAlignInfo{0, 1}
}
mut prev_field := if node.fields.len > 0 {
ast.Node(node.fields[0])
} else {
ast.Node(ast.NodeError{})
}
for field in node.fields {
mut align_idx := 0
for i, field in node.fields {
if i > align_infos[align_idx].last_idx {
align_idx++
}
if field.comments.len > 0 {
if f.should_insert_newline_before_node(ast.Expr(field.comments[0]), prev_field) {
f.writeln('')
@ -929,7 +952,7 @@ pub fn (mut f Fmt) const_decl(node ast.ConstDecl) {
}
name := field.name.after('.')
f.write('$name ')
f.write(strings.repeat(` `, max - field.name.len))
f.write(strings.repeat(` `, align_infos[align_idx].max - field.name.len))
f.write('= ')
f.expr(field.expr)
f.writeln('')

View File

@ -1 +1,27 @@
const font = $embed_file('../assets/fonts/RobotoMono-Regular.ttf')
const (
test_alignment = 123
foo = Foo{
f: 'foo'
}
spam = 456
egg = 'lorem ipsum'
spameggs = true
)
const (
bar = 'A string
spanning multiple
lines'
baz = 'short'
some_long_name = MyStruct{
x: 42
}
)
const (
a = 123
abc = 123
b = 123
)

View File

@ -498,8 +498,8 @@ static inline void make_secret(uint64_t seed, uint64_t *secret){
#define _PUSH_MANY(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push_many(arr, tmp.data, tmp.len);}
#define _IN_MAP(val, m) map_exists(m, val)
'
c_headers =
c_helper_macros + c_unsigned_comparison_functions + c_common_macros + r'
c_headers = c_helper_macros + c_unsigned_comparison_functions + c_common_macros +
r'
// c_headers
typedef int (*qsort_callback_func)(const void*, const void*);
#include <stdio.h> // TODO remove all these includes, define all function signatures and types manually
@ -728,8 +728,7 @@ typedef bool (*MapEqFn)(voidptr, voidptr);
typedef void (*MapCloneFn)(voidptr, voidptr);
typedef void (*MapFreeFn)(voidptr);
'
bare_c_headers = c_helper_macros + c_unsigned_comparison_functions +
c_common_macros +
bare_c_headers = c_helper_macros + c_unsigned_comparison_functions + c_common_macros +
'
#define _VFREESTANDING