1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

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

This commit is contained in:
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

@ -11,17 +11,17 @@ import vhelp
import v.vmod
const (
default_vpm_server_urls = ['https://vpm.vlang.io']
valid_vpm_commands = ['help', 'search', 'install', 'update', 'upgrade', 'outdated',
default_vpm_server_urls = ['https://vpm.vlang.io']
valid_vpm_commands = ['help', 'search', 'install', 'update', 'upgrade', 'outdated',
'list', 'remove']
excluded_dirs = ['cache', 'vlib']
supported_vcs_systems = ['git', 'hg']
supported_vcs_folders = ['.git', '.hg']
supported_vcs_update_cmds = map{
excluded_dirs = ['cache', 'vlib']
supported_vcs_systems = ['git', 'hg']
supported_vcs_folders = ['.git', '.hg']
supported_vcs_update_cmds = map{
'git': 'git pull'
'hg': 'hg pull --update'
}
supported_vcs_install_cmds = map{
supported_vcs_install_cmds = map{
'git': 'git clone --depth=1'
'hg': 'hg clone'
}

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

@ -1384,7 +1384,7 @@ fn read_log() {
```
If the function returns a value the `defer` block is executed *after* the return
expression is evaluated:
expression is evaluated:
```v
import os
@ -1946,7 +1946,7 @@ const (
b: 0
}
// evaluate function call at compile-time*
blue = rgb(0, 0, 255)
blue = rgb(0, 0, 255)
)
println(numbers)
@ -3122,7 +3122,7 @@ each object.
### Control
You can take advantage of V's autofree engine and define a `free()` method on custom
You can take advantage of V's autofree engine and define a `free()` method on custom
data types:
```v
@ -3134,7 +3134,7 @@ fn (data &MyType) free() {
}
```
Just as the compiler frees C data types with C's `free()`, it will statically insert
Just as the compiler frees C data types with C's `free()`, it will statically insert
`free()` calls for your data type at the end of each variable's lifetime.
For developers willing to have more low level control, autofree can be disabled with
@ -3358,7 +3358,7 @@ You will get:
[factorial.v:5] n * factorial(n - 1): 120
120
```
Note that `dump(expr)` will trace both the source location,
Note that `dump(expr)` will trace both the source location,
the expression itself, and the expression value.
## Memory-unsafe code
@ -3648,9 +3648,9 @@ To cast a `voidptr` to a V reference, use `user := &User(user_void_ptr)`.
### C Declarations
C identifiers are accessed with the `C` prefix similarly to how module-specific
identifiers are accessed. Functions must be redeclared in V before they can be used.
Any C types may be used behind the `C` prefix, but types must be redeclared in V in
C identifiers are accessed with the `C` prefix similarly to how module-specific
identifiers are accessed. Functions must be redeclared in V before they can be used.
Any C types may be used behind the `C` prefix, but types must be redeclared in V in
order to access type members.
To redeclare complex types, such as in the following C code:
@ -3688,10 +3688,10 @@ struct C.SomeCStruct {
}
```
The existence of the data members is made known to V, and they may be used without
The existence of the data members is made known to V, and they may be used without
re-creating the original structure exactly.
Alternatively, you may [embed](#embedded-structs) the sub-data-structures to maintain
Alternatively, you may [embed](#embedded-structs) the sub-data-structures to maintain
a parallel code structure.
## Debugging generated C code
@ -3930,7 +3930,7 @@ If you do need a custom flag file, that has platform dependent code, use the
postfix `_d_customflag.v`, and then use plaftorm dependent compile time
conditional blocks inside it, i.e. `$if linux {}` etc.
- `_notd_customflag.v` => similar to _d_customflag.v, but will be used
- `_notd_customflag.v` => similar to _d_customflag.v, but will be used
*only* if you do NOT pass `-d customflag` to V.
## Compile time pseudo variables
@ -4085,7 +4085,7 @@ To improve safety and maintainability, operator overloading is limited:
are auto generated when the operators are defined though they must return the same type.
## Inline assembly
<!-- ignore because it doesn't pass fmt test (why?) -->
<!-- ignore because it doesn't pass fmt test (why?) -->
```v ignore
a := 100
b := 20
@ -4094,12 +4094,12 @@ asm amd64 {
mov eax, a
add eax, b
mov c, eax
; =r (c) as c // output
; r (a) as a // input
; =r (c) as c // output
; r (a) as a // input
r (b) as b
}
println('a: $a') // 100
println('b: $b') // 20
println('a: $a') // 100
println('b: $b') // 20
println('c: $c') // 120
```

View File

@ -12,7 +12,7 @@ const (
)
const (
text = '
text = '
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore
While I nodded, nearly napping, suddenly there came a tapping,

View File

@ -7,7 +7,7 @@ import os
import time
const (
text = '
text = '
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore
While I nodded, nearly napping, suddenly there came a tapping,

View File

@ -4,12 +4,12 @@ import os
const (
help_text = ' Usage:\t./VCasino\n
Description:\n VCasino is a little game only made to learn V.\n'
g_desc = " The object of Roulette is to pick the number where the spinning ball will land on the wheel.
g_desc = " The object of Roulette is to pick the number where the spinning ball will land on the wheel.
If your number is the good one, you'll get your bet x3.
If your number is the same color as the ball one, you'll get your bet /2.
Otherwise, you will lose your bet.\n"
odd = 'red'
even = 'black'
odd = 'red'
even = 'black'
)
struct Options {

View File

@ -1189,7 +1189,7 @@ pub:
pub const (
// reference: https://en.wikipedia.org/wiki/X86#/media/File:Table_of_x86_Registers_svg.svg
// map register size -> register name
x86_no_number_register_list = map{
x86_no_number_register_list = map{
8: ['al', 'ah', 'bl', 'bh', 'cl', 'ch', 'dl', 'dh', 'bpl', 'sil', 'dil', 'spl']
16: ['ax', 'bx', 'cx', 'dx', 'bp', 'si', 'di', 'sp', /* segment registers */ 'cs', 'ss',
'ds', 'es', 'fs', 'gs', 'flags', 'ip', /* task registers */ 'gdtr', 'idtr', 'tr', 'ldtr',

View File

@ -22,7 +22,7 @@ https://github.com/vlang/v/issues/new/choose
You can also use #help on Discord: https://discord.gg/vlang
'
no_compiler_error = '
no_compiler_error = '
==================
Error: no C compiler detected.

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

@ -5,18 +5,18 @@ module c
// for each constant, during C code generation.
const (
// V_COMMIT_HASH is generated by cmd/tools/gen_vc.v .
c_commit_hash_default = '
c_commit_hash_default = '
#ifndef V_COMMIT_HASH
#define V_COMMIT_HASH "@@@"
#endif
'
// V_CURRENT_COMMIT_HASH is updated, when V is rebuilt inside a git repo.
c_current_commit_hash_default = '
c_current_commit_hash_default = '
#ifndef V_CURRENT_COMMIT_HASH
#define V_CURRENT_COMMIT_HASH "@@@"
#endif
'
c_concurrency_helpers = '
c_concurrency_helpers = '
typedef struct __shared_map __shared_map;
struct __shared_map { map val; sync__RwMutex mtx; };
static inline voidptr __dup_shared_map(voidptr src, int sz) {
@ -47,7 +47,7 @@ static inline void __sort_ptr(uintptr_t a[], bool b[], int l)
}
}
'
c_str_fn_defs = '
c_str_fn_defs = '
void _STR_PRINT_ARG(const char *fmt, char** refbufp, int *nbytes, int *memsize, int guess, ...) {
va_list args;
va_start(args, guess);
@ -176,7 +176,7 @@ string _STR_TMP(const char *fmt, ...) {
} // endof _STR_TMP
'
c_common_macros = '
c_common_macros = '
#define EMPTY_VARG_INITIALIZATION 0
#define EMPTY_STRUCT_DECLARATION
#define EMPTY_STRUCT_INITIALIZATION
@ -306,7 +306,7 @@ static inline bool _us64_ne(uint64_t a, int64_t b) { return a > INT64_MAX || (in
static inline bool _us64_le(uint64_t a, int64_t b) { return a <= INT64_MAX && (int64_t)a <= b; }
static inline bool _us64_lt(uint64_t a, int64_t b) { return a < INT64_MAX && (int64_t)a < b; }
'
c_wyhash = '
c_wyhash = '
// ============== wyhash ==============
#ifndef wyhash_final_version_3
#define wyhash_final_version_3
@ -487,7 +487,7 @@ static inline void make_secret(uint64_t seed, uint64_t *secret){
}
#endif
'
c_helper_macros = '//============================== HELPER C MACROS =============================*/
c_helper_macros = '//============================== HELPER C MACROS =============================*/
//#define tos4(s, slen) ((string){.str=(s), .len=(slen)})
// `"" s` is used to enforce a string literal argument
#define _SLIT(s) ((string){.str=(byteptr)("" s), .len=(sizeof(s)-1), .is_lit=1})
@ -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
@ -694,7 +694,7 @@ static void* g_live_info = NULL;
#undef _VFREESTANDING
#endif
' + c_wyhash
c_builtin_types = '
c_builtin_types = '
//================================== builtin types ================================*/
typedef int64_t i64;
typedef int16_t i16;
@ -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

View File

@ -54,7 +54,7 @@ fn (mut g Gen) generate_hotcode_reloader_code() {
}
const (
posix_hotcode_definitions_1 = '
posix_hotcode_definitions_1 = '
void v_bind_live_symbols(void* live_lib){
@LOAD_FNS@
}

View File

@ -36,8 +36,8 @@ pub const (
'.wasm': 'application/wasm'
'.xml': 'text/xml; charset=utf-8'
}
max_http_post_size = 1024 * 1024
default_port = 8080
max_http_post_size = 1024 * 1024
default_port = 8080
)
pub struct Context {

View File

@ -60,7 +60,7 @@ const (
34: `"`
47: `/`
}
exp_signs = [byte(`-`), `+`]
exp_signs = [byte(`-`), `+`]
)
// move_pos proceeds to the next position.