parser: fix self-referenced error

pull/5021/head
yuyi 2020-05-25 17:31:04 +08:00 committed by GitHub
parent 3aeaa24df6
commit 30ca08aaa3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 31 additions and 16 deletions

View File

@ -0,0 +1,6 @@
vlib/v/checker/tests/assign_expr_undefined_err_a.v:2:7: error: undefined: `a`
1 | fn main() {
2 | a := a
| ^
3 | println(a)
4 | }

View File

@ -1,4 +1,4 @@
vlib/v/checker/tests/assign_expr_unresolved_variables_err_b.v:2:10: error: unresolved variables `a`
vlib/v/checker/tests/assign_expr_undefined_err_b.v:2:10: error: undefined: `a`
1 | fn main() {
2 | a, b := a, b
| ^

View File

@ -1,4 +1,4 @@
vlib/v/checker/tests/assign_expr_unresolved_variables_err_c.v:2:10: error: unresolved variables `a`
vlib/v/checker/tests/assign_expr_undefined_err_c.v:2:10: error: undefined: `a`
1 | fn main() {
2 | a, b := a + 1, b * 3
| ^

View File

@ -1,4 +1,4 @@
fn main() {
a, b := a + 1, b * 3
println('$a, $b')
}
}

View File

@ -0,0 +1,6 @@
vlib/v/checker/tests/assign_expr_undefined_err_d.v:2:9: error: undefined: `s`
1 | fn main() {
2 | s := '$s'
| ^
3 | println(s)
4 | }

View File

@ -0,0 +1,4 @@
fn main() {
s := '$s'
println(s)
}

View File

@ -1,6 +0,0 @@
vlib/v/checker/tests/assign_expr_unresolved_variables_err_a.v:2:7: error: unresolved variables `a`
1 | fn main() {
2 | a := a
| ^
3 | println(a)
4 | }

View File

@ -9,18 +9,23 @@ fn (mut p Parser) assign_stmt() ast.Stmt {
return p.partial_assign_stmt([])
}
fn (mut p Parser) check_unresolved_variables(idents []ast.Ident, expr ast.Expr) {
fn (mut p Parser) check_undefined_variables(idents []ast.Ident, expr ast.Expr) {
match expr {
ast.Ident {
for ident in idents {
if ident.name == it.name {
p.error_with_pos('unresolved variables `$it.name`', it.pos)
p.error_with_pos('undefined: `$it.name`', it.pos)
}
}
}
ast.InfixExpr {
p.check_unresolved_variables(idents, it.left)
p.check_unresolved_variables(idents, it.right)
p.check_undefined_variables(idents, it.left)
p.check_undefined_variables(idents, it.right)
}
ast.StringInterLiteral {
for expr_ in it.exprs {
p.check_undefined_variables(idents, expr_)
}
}
else {}
}
@ -44,7 +49,7 @@ fn (mut p Parser) partial_assign_stmt(known_lhs []ast.Ident) ast.Stmt {
if is_decl {
// a, b := a + 1, b
for expr in exprs {
p.check_unresolved_variables(idents, expr)
p.check_undefined_variables(idents, expr)
}
}
for i, ident in idents {