From 9b78d7d21d1c8d3736bc55aecba0e16da1781ae5 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Wed, 24 Mar 2021 12:39:09 +0200 Subject: [PATCH] tools: check formatting of more modules with `v test-cleancode`, colorize `v vet` output --- cmd/tools/vfmt.v | 19 +++-------------- cmd/tools/vtest-cleancode.v | 20 ++++++++++++++---- cmd/tools/vvet/vvet.v | 36 +++++++++++++++++++++++++++++--- vlib/gg/gg_darwin.c.v | 1 + vlib/gg/m4/vector.v | 10 ++++++--- vlib/gg/text_rendering.v | 10 ++++++--- vlib/io/reader.v | 18 +++++++--------- vlib/io/reader_test.v | 26 +++++++++-------------- vlib/runtime/runtime.c.v | 2 ++ vlib/runtime/runtime.v | 16 ++++++++++---- vlib/runtime/runtime_test.v | 12 +++++------ vlib/runtime/runtime_windows.c.v | 3 ++- vlib/v/util/util.v | 22 +++++++++++++++++++ 13 files changed, 128 insertions(+), 67 deletions(-) diff --git a/cmd/tools/vfmt.v b/cmd/tools/vfmt.v index c7883db35..1403e0294 100644 --- a/cmd/tools/vfmt.v +++ b/cmd/tools/vfmt.v @@ -77,22 +77,9 @@ fn main() { eprintln('vfmt env_vflags_and_os_args: ' + args.str()) eprintln('vfmt possible_files: ' + possible_files.str()) } - mut files := []string{} - for file in possible_files { - if os.is_dir(file) { - files << os.walk_ext(file, '.v') - files << os.walk_ext(file, '.vsh') - continue - } - if !file.ends_with('.v') && !file.ends_with('.vv') && !file.ends_with('.vsh') { - verror('v fmt can only be used on .v files.\nOffending file: "$file"') - continue - } - if !os.exists(file) { - verror('"$file" does not exist') - continue - } - files << file + files := util.find_all_v_files(possible_files) or { + verror(err.msg) + return } if is_atty(0) == 0 && files.len == 0 { foptions.format_pipe() diff --git a/cmd/tools/vtest-cleancode.v b/cmd/tools/vtest-cleancode.v index 90194192f..19982ac24 100644 --- a/cmd/tools/vtest-cleancode.v +++ b/cmd/tools/vtest-cleancode.v @@ -16,7 +16,11 @@ const ( 'examples/tetris', 'examples/term.ui', ] - verify_known_failing_exceptions = []string{} + verify_known_failing_exceptions = [ + 'vlib/gg/m4/graphic.v' /* has hand crafted meaningful formatting of matrices */, + 'vlib/gg/m4/m4_test.v' /* has hand crafted meaningful formatting of matrices */, + 'vlib/gg/m4/matrix.v' /* has hand crafted meaningful formatting of matrices */, + ] vfmt_verify_list = [ 'cmd/v/v.v', 'cmd/tools/vdoc/', @@ -30,8 +34,13 @@ const ( 'vlib/builtin/map.v', 'vlib/builtin/int.v', 'vlib/builtin/option.v', + 'vlib/cli/', + 'vlib/dl/', + 'vlib/flag/', + 'vlib/gg/', 'vlib/math/bits/bits.v', 'vlib/orm/', + 'vlib/runtime/', 'vlib/term/colors.v', 'vlib/term/term.v', 'vlib/v/ast/', @@ -88,7 +97,8 @@ fn main() { fn tsession(vargs string, tool_source string, tool_cmd string, tool_args string, flist []string, slist []string) testing.TestSession { os.chdir(vroot) - testing.eheader('Run `$tool_cmd` over most .v files') + title_message := 'running $tool_cmd over most .v files' + testing.eheader(title_message) mut test_session := testing.new_test_session('$vargs $tool_args') test_session.files << flist test_session.skip_files << slist @@ -97,14 +107,16 @@ fn tsession(vargs string, tool_source string, tool_cmd string, tool_args string, // in the VTMP from the test session too, so they will be cleaned up // at the end test_session.test() - eprintln(test_session.benchmark.total_message('running `$tool_cmd` over most .v files')) + eprintln(test_session.benchmark.total_message(title_message)) return test_session } fn v_test_vetting(vargs string) { vet_session := tsession(vargs, 'vvet', 'v vet', 'vet', vet_folders, vet_known_failing_exceptions) fmt_cmd, fmt_args := if is_fix { 'v fmt -w', 'fmt -w' } else { 'v fmt -verify', 'fmt -verify' } - verify_session := tsession(vargs, 'vfmt.v', fmt_cmd, fmt_args, vfmt_verify_list, verify_known_failing_exceptions) + expanded_vfmt_list := util.find_all_v_files(vfmt_verify_list) or { return } + verify_session := tsession(vargs, 'vfmt.v', fmt_cmd, fmt_args, expanded_vfmt_list, + verify_known_failing_exceptions) // if vet_session.benchmark.nfail > 0 || verify_session.benchmark.nfail > 0 { eprintln('\n') diff --git a/cmd/tools/vvet/vvet.v b/cmd/tools/vvet/vvet.v index 303c62ca0..468bf3b91 100644 --- a/cmd/tools/vvet/vvet.v +++ b/cmd/tools/vvet/vvet.v @@ -9,6 +9,7 @@ import v.pref import v.parser import v.table import v.token +import term struct Vet { opt Options @@ -19,6 +20,7 @@ mut: struct Options { is_verbose bool + use_color bool } fn (vet &Vet) vprintln(s string) { @@ -38,9 +40,23 @@ const is_verbose = '-verbose' in vet_options || '-v' in vet_options const show_warnings = '-hide-warnings' !in vet_options +const use_color = should_use_color() + +fn should_use_color() bool { + mut color := term.can_show_color_on_stderr() + if '-nocolor' in vet_options { + color = false + } + if '-color' in vet_options { + color = true + } + return color +} + fn main() { - opt := Options{ + mut opt := Options{ is_verbose: is_verbose + use_color: use_color } mut vet := Vet{ opt: opt @@ -97,11 +113,11 @@ fn main() { errors_vfmt := vet.errors.filter(it.kind == .error && it.fix == .vfmt) if show_warnings { for err in warnings { - eprintln('$err.file_path:$err.pos.line_nr: warning: $err.message') + eprintln(e2string(err)) } } for err in errors { - eprintln('$err.file_path:$err.pos.line_nr: error: $err.message') + eprintln(e2string(err)) } if errors_vfmt.len > 0 { eprintln('NB: You can run `v fmt -w file.v` to fix these automatically') @@ -111,6 +127,20 @@ fn main() { } } +fn e2string(err vet.Error) string { + mut kind := '$err.kind:' + mut location := '$err.file_path:$err.pos.line_nr:' + if use_color { + kind = match err.kind { + .warning { term.magenta(kind) } + .error { term.red(kind) } + } + kind = term.bold(kind) + location = term.bold(location) + } + return '$location $kind $err.message' +} + fn (mut v Vet) error(msg string, line int, fix vet.FixKind) { pos := token.Position{ line_nr: line + 1 diff --git a/vlib/gg/gg_darwin.c.v b/vlib/gg/gg_darwin.c.v index fe99b5d71..c44ccf87f 100644 --- a/vlib/gg/gg_darwin.c.v +++ b/vlib/gg/gg_darwin.c.v @@ -1,6 +1,7 @@ module gg #include "@VROOT/vlib/gg/gg_darwin.m" + fn C.gg_get_screen_size() Size fn C.darwin_draw_string(x int, y int, s string, cfg voidptr) diff --git a/vlib/gg/m4/vector.v b/vlib/gg/m4/vector.v index 1025e7912..52e4c7808 100644 --- a/vlib/gg/m4/vector.v +++ b/vlib/gg/m4/vector.v @@ -28,7 +28,9 @@ pub fn (x Vec4) str() string { // create a Vec4 function passing x,y,z as parameteres. w is set to 1 pub fn vec3(x f32, y f32, z f32) Vec4 { - return m4.Vec4{e:[x, y, z, 1]!} + return Vec4{ + e: [x, y, z, 1]! + } } // Remove all the raw zeros @@ -47,12 +49,14 @@ pub fn (a Vec4) clean() Vec4 { // Set all elements to value pub fn (mut x Vec4) copy(value f32) { - x.e = [ value, value, value, value, ]! + x.e = [value, value, value, value]! } // Scale the vector using a scalar pub fn (x Vec4) mul_scalar(value f32) Vec4 { - return Vec4{ e: [ x.e[0] * value, x.e[1] * value, x.e[2] * value, x.e[3] * value, ]! } + return Vec4{ + e: [x.e[0] * value, x.e[1] * value, x.e[2] * value, x.e[3] * value]! + } } // Reciprocal of the vector diff --git a/vlib/gg/text_rendering.v b/vlib/gg/text_rendering.v index fe58221d1..130e7dd39 100644 --- a/vlib/gg/text_rendering.v +++ b/vlib/gg/text_rendering.v @@ -261,7 +261,9 @@ pub fn system_font_path() string { mut fonts := ['Ubuntu-R.ttf', 'Arial.ttf', 'LiberationSans-Regular.ttf', 'NotoSans-Regular.ttf', 'FreeSans.ttf', 'DejaVuSans.ttf'] $if macos { - fonts = ['/System/Library/Fonts/SFNS.ttf', '/System/Library/Fonts/SFNSText.ttf', '/Library/Fonts/Arial.ttf'] + fonts = ['/System/Library/Fonts/SFNS.ttf', '/System/Library/Fonts/SFNSText.ttf', + '/Library/Fonts/Arial.ttf', + ] for font in fonts { if os.is_file(font) { return font @@ -269,8 +271,10 @@ pub fn system_font_path() string { } } $if android { - xml_files := ['/system/etc/system_fonts.xml', '/system/etc/fonts.xml', '/etc/system_fonts.xml', - '/etc/fonts.xml', '/data/fonts/fonts.xml', '/etc/fallback_fonts.xml'] + xml_files := ['/system/etc/system_fonts.xml', '/system/etc/fonts.xml', + '/etc/system_fonts.xml', '/etc/fonts.xml', '/data/fonts/fonts.xml', + '/etc/fallback_fonts.xml', + ] font_locations := ['/system/fonts', '/data/fonts'] for xml_file in xml_files { if os.is_file(xml_file) && os.is_readable(xml_file) { diff --git a/vlib/io/reader.v b/vlib/io/reader.v index 588dd5a55..3b7a25ea9 100644 --- a/vlib/io/reader.v +++ b/vlib/io/reader.v @@ -25,7 +25,7 @@ const ( // ReadAllConfig allows options to be passed for the behaviour // of read_all pub struct ReadAllConfig { - reader Reader + reader Reader read_to_end_of_stream bool } @@ -35,18 +35,16 @@ pub fn read_all(config ReadAllConfig) ?[]byte { r := config.reader read_till_eof := config.read_to_end_of_stream - mut b := []byte{len: read_all_len} + mut b := []byte{len: io.read_all_len} mut read := 0 for { - new_read := r.read(mut b[read..]) or { - break - } + new_read := r.read(mut b[read..]) or { break } read += new_read if !read_till_eof && read == 0 { break } if b.len == read { - unsafe { b.grow_len(read_all_grow_len) } + unsafe { b.grow_len(io.read_all_grow_len) } } } return b[..read] @@ -55,18 +53,16 @@ pub fn read_all(config ReadAllConfig) ?[]byte { // read_any reads any available bytes from a reader // (until the reader returns a read of 0 length) pub fn read_any(r Reader) ?[]byte { - mut b := []byte{len: read_all_len} + mut b := []byte{len: io.read_all_len} mut read := 0 for { - new_read := r.read(mut b[read..]) or { - break - } + new_read := r.read(mut b[read..]) or { break } read += new_read if new_read == 0 { break } if b.len == read { - unsafe { b.grow_len(read_all_grow_len) } + unsafe { b.grow_len(io.read_all_grow_len) } } } return b[..read] diff --git a/vlib/io/reader_test.v b/vlib/io/reader_test.v index 970295040..8622c79ba 100644 --- a/vlib/io/reader_test.v +++ b/vlib/io/reader_test.v @@ -4,7 +4,7 @@ struct Buf { pub: bytes []byte mut: - i int + i int } fn (mut b Buf) read(mut buf []byte) ?int { @@ -39,7 +39,7 @@ fn test_read_all_huge() { } struct StringReader { - text string + text string mut: place int } @@ -58,17 +58,15 @@ const ( ) fn test_stringreader() { - text := '12345\n'.repeat(newline_count) + text := '12345\n'.repeat(io.newline_count) mut s := StringReader{ text: text } - mut r := new_buffered_reader({ - reader: make_reader(s) - }) + mut r := new_buffered_reader(reader: make_reader(s)) for i := 0; true; i++ { if _ := r.read_line() { } else { - assert i == newline_count + assert i == io.newline_count break } } @@ -85,24 +83,22 @@ fn test_stringreader() { } fn test_stringreader2() { - text := '12345\r\n'.repeat(newline_count) + text := '12345\r\n'.repeat(io.newline_count) mut s := StringReader{ text: text } - mut r := new_buffered_reader({ - reader: make_reader(s) - }) + mut r := new_buffered_reader(reader: make_reader(s)) for i := 0; true; i++ { if _ := r.read_line() { } else { - assert i == newline_count + assert i == io.newline_count break } } if _ := r.read_line() { assert false } - leftover := read_all(reader: io.make_reader(r)) or { + leftover := read_all(reader: make_reader(r)) or { assert false panic('bad') } @@ -116,9 +112,7 @@ fn test_leftover() { mut s := StringReader{ text: text } - mut r := new_buffered_reader({ - reader: make_reader(s) - }) + mut r := new_buffered_reader(reader: make_reader(s)) _ := r.read_line() or { assert false panic('bad') diff --git a/vlib/runtime/runtime.c.v b/vlib/runtime/runtime.c.v index 363071fdd..9b894087e 100644 --- a/vlib/runtime/runtime.c.v +++ b/vlib/runtime/runtime.c.v @@ -6,8 +6,10 @@ module runtime //$if linux { fn C.sysconf(name int) i64 + //} //$if windows { fn C.GetCurrentProcessorNumber() u32 + //} diff --git a/vlib/runtime/runtime.v b/vlib/runtime/runtime.v index 3cb4993e7..7079e8c2a 100644 --- a/vlib/runtime/runtime.v +++ b/vlib/runtime/runtime.v @@ -22,24 +22,32 @@ pub fn nr_jobs() int { // is_32bit returns true if the current executable is running on a 32 bit system. pub fn is_32bit() bool { - $if x32 { return true } + $if x32 { + return true + } return false } // is_64bit returns true if the current executable is running on a 64 bit system. pub fn is_64bit() bool { - $if x64 { return true } + $if x64 { + return true + } return false } // is_little_endian returns true if the current executable is running on a little-endian system. pub fn is_little_endian() bool { - $if little_endian { return true } + $if little_endian { + return true + } return false } // is_big_endian returns true if the current executable is running on a big-endian system. pub fn is_big_endian() bool { - $if big_endian { return true } + $if big_endian { + return true + } return false } diff --git a/vlib/runtime/runtime_test.v b/vlib/runtime/runtime_test.v index 766cba770..d1808905c 100644 --- a/vlib/runtime/runtime_test.v +++ b/vlib/runtime/runtime_test.v @@ -10,30 +10,30 @@ fn test_nr_jobs() { assert nr_jobs > 0 } -fn test_is_32bit(){ +fn test_is_32bit() { x := runtime.is_32bit().str() assert x == 'true' || x == 'false' } -fn test_is_64bit(){ +fn test_is_64bit() { x := runtime.is_64bit().str() assert x == 'true' || x == 'false' } -fn test_is_little_endian(){ +fn test_is_little_endian() { x := runtime.is_little_endian().str() assert x == 'true' || x == 'false' } -fn test_is_big_endian(){ +fn test_is_big_endian() { x := runtime.is_big_endian().str() assert x == 'true' || x == 'false' } -fn test_is_big_endian_different_than_is_little_endian(){ +fn test_is_big_endian_different_than_is_little_endian() { assert runtime.is_big_endian() != runtime.is_little_endian() } -fn test_is_32bit_different_than_is_64bit(){ +fn test_is_32bit_different_than_is_64bit() { assert runtime.is_32bit() != runtime.is_64bit() } diff --git a/vlib/runtime/runtime_windows.c.v b/vlib/runtime/runtime_windows.c.v index 52098201e..de5b2ce5e 100644 --- a/vlib/runtime/runtime_windows.c.v +++ b/vlib/runtime/runtime_windows.c.v @@ -4,8 +4,9 @@ import os [typedef] struct C.SYSTEM_INFO { - dwNumberOfProcessors u32 + dwNumberOfProcessors u32 } + fn C.GetSystemInfo(&C.SYSTEM_INFO) // nr_cpus returns the number of virtual CPU cores found on the system. diff --git a/vlib/v/util/util.v b/vlib/v/util/util.v index 897bb6d2b..a33bae70d 100644 --- a/vlib/v/util/util.v +++ b/vlib/v/util/util.v @@ -556,3 +556,25 @@ pub fn should_bundle_module(mod string) bool { return mod in util.bundle_modules || (mod.contains('.') && mod.all_before('.') in util.bundle_modules) } + +// find_all_v_files - given a list of files/folders, finds all .v/.vsh files +// if some of the files/folders on the list does not exist, or a file is not +// a .v or .vsh file, returns an error instead. +pub fn find_all_v_files(roots []string) ?[]string { + mut files := []string{} + for file in roots { + if os.is_dir(file) { + files << os.walk_ext(file, '.v') + files << os.walk_ext(file, '.vsh') + continue + } + if !file.ends_with('.v') && !file.ends_with('.vv') && !file.ends_with('.vsh') { + return error('v fmt can only be used on .v files.\nOffending file: "$file"') + } + if !os.exists(file) { + return error('"$file" does not exist') + } + files << file + } + return files +} -- 2.30.2