checker: fix error messages and add checker tests
* checker: fix error messages * tests: fix command and ignore defect outputpull/4329/head
							parent
							
								
									74ac9ef195
								
							
						
					
					
						commit
						0f11d883fa
					
				| 
						 | 
					@ -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 { }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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| }
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
	node = ast.StringLiteral{
 | 
					 | 
				
			||||||
		val: val
 | 
					 | 
				
			||||||
		is_raw: is_raw
 | 
					 | 
				
			||||||
		is_c: is_cstr
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if p.peek_tok.kind != .str_dollar {
 | 
						if p.peek_tok.kind != .str_dollar {
 | 
				
			||||||
		p.next()
 | 
							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{
 | 
				
			||||||
 | 
								val: val
 | 
				
			||||||
 | 
								is_raw: is_raw
 | 
				
			||||||
 | 
								is_c: is_cstr
 | 
				
			||||||
 | 
								pos: pos
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		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