vet: prohibit spaces after `(`

pull/5801/head
Alexander Medvednikov 2020-07-11 11:41:39 +02:00
parent a1073105e1
commit d4d552fb00
5 changed files with 32 additions and 19 deletions

View File

@ -45,6 +45,7 @@ jobs:
run: ./v build-tools
- name: v vet
run: |
./v vet vlib/v/scanner
./v vet vlib/v/parser
./v vet vlib/v/ast
./v vet vlib/v/gen/cgen.v

View File

@ -60,11 +60,12 @@ mut:
// for tests
pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt {
s := scanner.new_scanner(text, .skip_comments, false)
pref:= &pref.Preferences{}
s := scanner.new_scanner(text, .skip_comments, pref)
mut p := Parser{
scanner: s
table: table
pref: &pref.Preferences{}
pref: pref
scope: scope
global_scope: &ast.Scope{
start_pos: 0
@ -77,7 +78,7 @@ pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt {
}
pub fn parse_text(text string, b_table &table.Table, pref &pref.Preferences, scope, global_scope &ast.Scope) ast.File {
s := scanner.new_scanner(text, .skip_comments, pref.is_fmt)
s := scanner.new_scanner(text, .skip_comments, pref)
mut p := Parser{
scanner: s
table: b_table
@ -100,7 +101,7 @@ pub fn parse_file(path string, b_table &table.Table, comments_mode scanner.Comme
// panic(err)
// }
mut p := Parser{
scanner: scanner.new_scanner_file(path, comments_mode, pref.is_fmt)
scanner: scanner.new_scanner_file(path, comments_mode, pref)
comments_mode: comments_mode
table: b_table
file_name: path
@ -126,6 +127,8 @@ pub fn parse_file(path string, b_table &table.Table, comments_mode scanner.Comme
eprintln('NB: You can run `v fmt -w file.v` to fix these automatically')
exit(1)
}
//if pref.is_vet && p.scanner.text.contains('( '\n ') {
//}
return p.parse()
}

View File

@ -101,7 +101,7 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
pos := p.tok.position()
p.next() // sizeof
p.check(.lpar)
is_known_var := p.mark_var_as_used( p.tok.lit )
is_known_var := p.mark_var_as_used(p.tok.lit)
if is_known_var {
expr := p.parse_ident(table.Language.v)
node = ast.SizeOf{
@ -224,8 +224,9 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr {
}
} else if p.tok.kind.is_infix() {
// return early for deref assign `*x = 2` goes to prefix expr
if p.tok.kind == .mul && p.tok.line_nr != p.prev_tok.line_nr && p.peek_tok2.kind ==
.assign {
if p.tok.kind == .mul &&
p.tok.line_nr != p.prev_tok.line_nr &&
p.peek_tok2.kind == .assign {
return node
}
// continue on infix expr

View File

@ -48,6 +48,7 @@ pub mut:
all_tokens []token.Token // *only* used in comments_mode: .toplevel_comments, contains all tokens
tidx int
eofs int
pref &pref.Preferences
}
/*
@ -94,7 +95,8 @@ pub enum CommentsMode {
}
// new scanner from file.
pub fn new_scanner_file(file_path string, comments_mode CommentsMode, is_fmt bool) &Scanner {
pub fn new_scanner_file(file_path string, comments_mode CommentsMode, pref &pref.Preferences) &Scanner {
// is_fmt := pref.is_fmt
if !os.exists(file_path) {
verror("$file_path doesn't exist")
}
@ -102,15 +104,17 @@ pub fn new_scanner_file(file_path string, comments_mode CommentsMode, is_fmt boo
verror(err)
return voidptr(0)
}
mut s := new_scanner(raw_text, comments_mode, is_fmt) // .skip_comments)
mut s := new_scanner(raw_text, comments_mode, pref) // .skip_comments)
// s.init_fmt()
s.file_path = file_path
return s
}
// new scanner from string.
pub fn new_scanner(text string, comments_mode CommentsMode, is_fmt bool) &Scanner {
pub fn new_scanner(text string, comments_mode CommentsMode, pref &pref.Preferences) &Scanner {
is_fmt := pref.is_fmt
s := &Scanner{
pref: pref
text: text
is_print_line_on_error: true
is_print_colored_error: true
@ -768,6 +772,10 @@ fn (mut s Scanner) text_scan() token.Token {
return s.new_token(.chartoken, ident_char, ident_char.len + 2) // + two quotes
}
`(` {
// TODO `$if vet {` for performance
if s.pref.is_vet && s.text[s.pos + 1] == ` ` {
println('$s.file_path:$s.line_nr: Looks like you are adding a space after `(`')
}
return s.new_token(.lpar, '', 1)
}
`)` {

View File

@ -42,7 +42,7 @@ fn fn_name_mod_level_high_order(cb fn(int)) {
fn test_at_file() {
// Test @FILE
f := os.file_name( @FILE )
f := os.file_name(@FILE)
assert f == 'scanner_at_literals_test.v'
}