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

vet: give notice for replacing const dynamic arrays with const fixed ones (#18960)

This commit is contained in:
Swastik Baranwal 2023-07-25 00:43:38 +05:30 committed by GitHub
parent d4bedebace
commit c6ddbd308e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 6 deletions

View File

@ -0,0 +1 @@
cmd/tools/vvet/tests/const_dynamic_array_notice.vv:1: notice: use a fixed array, instead of a dynamic one

View File

@ -0,0 +1 @@
const a = [1, 2, 3]

View File

@ -14,9 +14,10 @@ import term
struct Vet { struct Vet {
opt Options opt Options
mut: mut:
errors []vet.Error errors []vet.Error
warns []vet.Error warns []vet.Error
file string notices []vet.Error
file string
} }
struct Options { struct Options {
@ -69,6 +70,9 @@ fn main() {
} }
} }
vfmt_err_count := vt.errors.filter(it.fix == .vfmt).len vfmt_err_count := vt.errors.filter(it.fix == .vfmt).len
for n in vt.notices {
eprintln(vt.e2string(n))
}
if vt.opt.show_warnings { if vt.opt.show_warnings {
for w in vt.warns { for w in vt.warns {
eprintln(vt.e2string(w)) eprintln(vt.e2string(w))
@ -100,9 +104,10 @@ fn (mut vt Vet) vet_file(path string) {
prefs.is_vsh = path.ends_with('.vsh') prefs.is_vsh = path.ends_with('.vsh')
table := ast.new_table() table := ast.new_table()
vt.vprintln("vetting file '${path}'...") vt.vprintln("vetting file '${path}'...")
_, errors := parser.parse_vet_file(path, table, prefs) _, errors, notices := parser.parse_vet_file(path, table, prefs)
// Transfer errors from scanner and parser // Transfer errors from scanner and parser
vt.errors << errors vt.errors << errors
vt.notices << notices
// Scan each line in file for things to improve // Scan each line in file for things to improve
source_lines := os.read_lines(vt.file) or { []string{} } source_lines := os.read_lines(vt.file) or { []string{} }
for lnumber, line in source_lines { for lnumber, line in source_lines {
@ -235,6 +240,7 @@ fn (vt &Vet) e2string(err vet.Error) string {
kind = match err.kind { kind = match err.kind {
.warning { term.magenta(kind) } .warning { term.magenta(kind) }
.error { term.red(kind) } .error { term.red(kind) }
.notice { term.yellow(kind) }
} }
kind = term.bold(kind) kind = term.bold(kind)
location = term.bold(location) location = term.bold(location)
@ -275,3 +281,17 @@ fn (mut vt Vet) warn(msg string, line int, fix vet.FixKind) {
vt.warns << w vt.warns << w
} }
} }
fn (mut vt Vet) notice(msg string, line int, fix vet.FixKind) {
pos := token.Pos{
line_nr: line + 1
}
vt.notices << vet.Error{
message: msg
file_path: vt.file
pos: pos
kind: .notice
fix: fix
typ: .default
}
}

View File

@ -106,6 +106,7 @@ pub mut:
warnings []errors.Warning warnings []errors.Warning
notices []errors.Notice notices []errors.Notice
vet_errors []vet.Error vet_errors []vet.Error
vet_notices []vet.Error
template_paths []string // record all compiled $tmpl files; needed for `v watch run webserver.v` template_paths []string // record all compiled $tmpl files; needed for `v watch run webserver.v`
} }
@ -254,7 +255,7 @@ pub fn parse_file(path string, table &ast.Table, comments_mode scanner.CommentsM
return res return res
} }
pub fn parse_vet_file(path string, table_ &ast.Table, pref_ &pref.Preferences) (&ast.File, []vet.Error) { pub fn parse_vet_file(path string, table_ &ast.Table, pref_ &pref.Preferences) (&ast.File, []vet.Error, []vet.Error) {
$if trace_parse_vet_file ? { $if trace_parse_vet_file ? {
eprintln('> ${@MOD}.${@FN} path: ${path}') eprintln('> ${@MOD}.${@FN} path: ${path}')
} }
@ -290,7 +291,7 @@ pub fn parse_vet_file(path string, table_ &ast.Table, pref_ &pref.Preferences) (
p.vet_errors << p.scanner.vet_errors p.vet_errors << p.scanner.vet_errors
file := p.parse() file := p.parse()
unsafe { p.free_scanner() } unsafe { p.free_scanner() }
return file, p.vet_errors return file, p.vet_errors, p.vet_notices
} }
pub fn (mut p Parser) parse() &ast.File { pub fn (mut p Parser) parse() &ast.File {
@ -2068,6 +2069,20 @@ fn (mut p Parser) vet_error(msg string, line int, fix vet.FixKind, typ vet.Error
} }
} }
fn (mut p Parser) vet_notice(msg string, line int, fix vet.FixKind, typ vet.ErrorType) {
pos := token.Pos{
line_nr: line + 1
}
p.vet_notices << vet.Error{
message: msg
file_path: p.scanner.file_path
pos: pos
kind: .notice
fix: fix
typ: typ
}
}
fn (mut p Parser) parse_multi_expr(is_top_level bool) ast.Stmt { fn (mut p Parser) parse_multi_expr(is_top_level bool) ast.Stmt {
// in here might be 1) multi-expr 2) multi-assign // in here might be 1) multi-expr 2) multi-assign
// 1, a, c ... } // multi-expression // 1, a, c ... } // multi-expression
@ -3712,6 +3727,10 @@ fn (mut p Parser) const_decl() ast.ConstDecl {
return ast.ConstDecl{} return ast.ConstDecl{}
} }
expr := p.expr(0) expr := p.expr(0)
if expr is ast.ArrayInit && !expr.is_fixed && p.pref.is_vet {
p.vet_notice('use a fixed array, instead of a dynamic one', pos.line_nr, vet.FixKind.unknown,
.default)
}
field := ast.ConstField{ field := ast.ConstField{
name: full_name name: full_name
mod: p.mod mod: p.mod

View File

@ -7,6 +7,7 @@ import v.token
pub enum ErrorKind { pub enum ErrorKind {
error error
warning warning
notice
} }
pub enum FixKind { pub enum FixKind {