mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: fix error messages and add checker tests
* checker: fix error messages * tests: fix command and ignore defect output
This commit is contained in:
parent
74ac9ef195
commit
0f11d883fa
4
.gitignore
vendored
4
.gitignore
vendored
@ -84,3 +84,7 @@ cachegrind.out.*
|
|||||||
/thirdparty/pg
|
/thirdparty/pg
|
||||||
exe
|
exe
|
||||||
vlib/v/tests/inout/*.v
|
vlib/v/tests/inout/*.v
|
||||||
|
!vlib/v/tests/inout/*_test.v
|
||||||
|
vlib/v/checker/tests/inout/*.v
|
||||||
|
vlib/v/checker/tests/inout/*.c
|
||||||
|
!vlib/v/checker/tests/inout/*_test.v
|
||||||
|
@ -56,6 +56,7 @@ pub:
|
|||||||
val string
|
val string
|
||||||
is_raw bool
|
is_raw bool
|
||||||
is_c bool
|
is_c bool
|
||||||
|
pos token.Position
|
||||||
}
|
}
|
||||||
|
|
||||||
// 'name: $name'
|
// 'name: $name'
|
||||||
@ -64,6 +65,7 @@ pub:
|
|||||||
vals []string
|
vals []string
|
||||||
exprs []Expr
|
exprs []Expr
|
||||||
expr_fmts []string
|
expr_fmts []string
|
||||||
|
pos token.Position
|
||||||
mut:
|
mut:
|
||||||
expr_types []table.Type
|
expr_types []table.Type
|
||||||
}
|
}
|
||||||
|
@ -1067,8 +1067,8 @@ fn expr_pos(node ast.Expr) token.Position {
|
|||||||
// ast.ParExpr { }
|
// ast.ParExpr { }
|
||||||
ast.SelectorExpr { return it.pos }
|
ast.SelectorExpr { return it.pos }
|
||||||
// ast.SizeOf { }
|
// ast.SizeOf { }
|
||||||
// ast.StringLiteral { }
|
ast.StringLiteral { return it.pos }
|
||||||
// ast.StringInterLiteral { }
|
ast.StringInterLiteral { return it.pos }
|
||||||
ast.StructInit { return it.pos }
|
ast.StructInit { return it.pos }
|
||||||
// ast.Type { }
|
// ast.Type { }
|
||||||
// ast.TypeOf { }
|
// ast.TypeOf { }
|
||||||
|
51
vlib/v/checker/tests/inout/checker_error_test.v
Normal file
51
vlib/v/checker/tests/inout/checker_error_test.v
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import os
|
||||||
|
import term
|
||||||
|
|
||||||
|
fn test_all() {
|
||||||
|
$if windows {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mut total_errors := 0
|
||||||
|
vexe := os.getenv('VEXE')
|
||||||
|
vroot := os.dir(vexe)
|
||||||
|
dir := os.join_path(vroot,'vlib/v/checker/tests/inout')
|
||||||
|
files := os.ls(dir) or {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
tests := files.filter(it.ends_with('.vv'))
|
||||||
|
if tests.len == 0 {
|
||||||
|
println('no compiler tests found')
|
||||||
|
assert false
|
||||||
|
}
|
||||||
|
for test in tests {
|
||||||
|
path := os.join_path(dir,test)
|
||||||
|
print(test + ' ')
|
||||||
|
program := path.replace('.vv', '.v')
|
||||||
|
os.cp(path, program) or {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
res := os.exec('$vexe $program') or {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
mut expected := os.read_file(program.replace('.v', '') + '.out') or {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
expected = expected.trim_space().replace(' \n', '\n').replace(' \r\n', '\n').replace('\r\n', '\n').trim('\n')
|
||||||
|
found := res.output.trim_space().replace(' \n', '\n').replace(' \r\n', '\n').replace('\r\n', '\n').trim('\n')
|
||||||
|
if expected != found {
|
||||||
|
println(term.red('FAIL'))
|
||||||
|
println('============')
|
||||||
|
println('expected:')
|
||||||
|
println(expected)
|
||||||
|
println('============')
|
||||||
|
println('found:')
|
||||||
|
println(found)
|
||||||
|
println('============\n')
|
||||||
|
total_errors++
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
println(term.green('OK'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert total_errors == 0
|
||||||
|
}
|
6
vlib/v/checker/tests/inout/enum_err.out
Normal file
6
vlib/v/checker/tests/inout/enum_err.out
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
vlib/v/checker/tests/inout/enum_err.v:2:13: error: default value for enum has to be an integer
|
||||||
|
1| enum Color {
|
||||||
|
2| green = 'green',
|
||||||
|
~~~~~~~
|
||||||
|
3| blue,
|
||||||
|
4| }
|
4
vlib/v/checker/tests/inout/enum_err.vv
Normal file
4
vlib/v/checker/tests/inout/enum_err.vv
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
enum Color {
|
||||||
|
green = 'green',
|
||||||
|
blue,
|
||||||
|
}
|
@ -1226,6 +1226,7 @@ fn (p mut Parser) if_expr() ast.IfExpr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) string_expr() ast.Expr {
|
fn (p mut Parser) string_expr() ast.Expr {
|
||||||
|
first_pos := p.tok.position()
|
||||||
is_raw := p.tok.kind == .name && p.tok.lit == 'r'
|
is_raw := p.tok.kind == .name && p.tok.lit == 'r'
|
||||||
is_cstr := p.tok.kind == .name && p.tok.lit == 'c'
|
is_cstr := p.tok.kind == .name && p.tok.lit == 'c'
|
||||||
if is_raw || is_cstr {
|
if is_raw || is_cstr {
|
||||||
@ -1233,13 +1234,20 @@ fn (p mut Parser) string_expr() ast.Expr {
|
|||||||
}
|
}
|
||||||
mut node := ast.Expr{}
|
mut node := ast.Expr{}
|
||||||
val := p.tok.lit
|
val := p.tok.lit
|
||||||
|
if p.peek_tok.kind != .str_dollar {
|
||||||
|
p.next()
|
||||||
|
last_pos := p.tok.position()
|
||||||
|
pos := token.Position{
|
||||||
|
line_nr: first_pos.line_nr
|
||||||
|
pos: first_pos.pos
|
||||||
|
len: last_pos.pos - first_pos.pos
|
||||||
|
}
|
||||||
node = ast.StringLiteral{
|
node = ast.StringLiteral{
|
||||||
val: val
|
val: val
|
||||||
is_raw: is_raw
|
is_raw: is_raw
|
||||||
is_c: is_cstr
|
is_c: is_cstr
|
||||||
|
pos: pos
|
||||||
}
|
}
|
||||||
if p.peek_tok.kind != .str_dollar {
|
|
||||||
p.next()
|
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
mut exprs := []ast.Expr
|
mut exprs := []ast.Expr
|
||||||
@ -1275,10 +1283,17 @@ fn (p mut Parser) string_expr() ast.Expr {
|
|||||||
}
|
}
|
||||||
efmts << efmt.join('')
|
efmts << efmt.join('')
|
||||||
}
|
}
|
||||||
|
last_pos := p.tok.position()
|
||||||
|
pos := token.Position{
|
||||||
|
line_nr: first_pos.line_nr
|
||||||
|
pos: first_pos.pos
|
||||||
|
len: last_pos.pos - first_pos.pos
|
||||||
|
}
|
||||||
node = ast.StringInterLiteral{
|
node = ast.StringInterLiteral{
|
||||||
vals: vals
|
vals: vals
|
||||||
exprs: exprs
|
exprs: exprs
|
||||||
expr_fmts: efmts
|
expr_fmts: efmts
|
||||||
|
pos: pos
|
||||||
}
|
}
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
|
@ -95,10 +95,8 @@ pub fn formatted_error(kind string /*error or warn*/, emsg string, filepath stri
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for i in 0..pos.len {
|
|
||||||
underline := '~'.repeat(pos.len)
|
underline := '~'.repeat(pos.len)
|
||||||
pointerline << if emanager.support_color { term.bold(term.blue(underline)) } else { underline }
|
pointerline << if emanager.support_color { term.bold(term.blue(underline)) } else { underline }
|
||||||
}
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
clines << ' ' + pointerline.join('')
|
clines << ' ' + pointerline.join('')
|
||||||
|
Loading…
Reference in New Issue
Block a user