v2: more work on AssignStmt & multi ret & initial blank ident
parent
cfbd8ab7e7
commit
237d83b2ee
|
@ -388,6 +388,7 @@ pub:
|
||||||
left []Ident
|
left []Ident
|
||||||
right []Expr
|
right []Expr
|
||||||
op token.Kind
|
op token.Kind
|
||||||
|
pos token.Position
|
||||||
}
|
}
|
||||||
|
|
||||||
// e.g. `[unsafe_fn]`
|
// e.g. `[unsafe_fn]`
|
||||||
|
|
|
@ -44,6 +44,13 @@ pub fn (s &Scope) find_var(name string) ?VarDecl {
|
||||||
return none
|
return none
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (s &Scope) known_var(name string) bool {
|
||||||
|
if _ := s.find_var(name) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
pub fn (s mut Scope) register_var(var VarDecl) {
|
pub fn (s mut Scope) register_var(var VarDecl) {
|
||||||
if x := s.find_var(var.name) {
|
if x := s.find_var(var.name) {
|
||||||
// println('existing var: $var.name')
|
// println('existing var: $var.name')
|
||||||
|
|
|
@ -283,11 +283,28 @@ pub fn (c mut Checker) return_stmt(return_stmt ast.Return) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
pub fn (c mut Checker) assign_stmt(assign_stmt ast.AssignStmt) {
|
pub fn (c mut Checker) assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
|
// multi return
|
||||||
|
if assign_stmt.left.len > assign_stmt.right.len {
|
||||||
|
right := c.expr(assign_stmt.right[0])
|
||||||
|
right_sym := c.table.get_type_symbol(right)
|
||||||
|
info := right_sym.mr_info()
|
||||||
|
if right_sym.kind != .multi_return {
|
||||||
|
c.error('wrong number of vars', assign_stmt.pos)
|
||||||
|
}
|
||||||
|
mut scope := c.file.scope.innermost(assign_stmt.pos.pos) or {
|
||||||
|
c.file.scope
|
||||||
|
}
|
||||||
|
for i, ident in assign_stmt.left {
|
||||||
|
// TODO: check types
|
||||||
|
scope.override_var(ast.VarDecl{
|
||||||
|
name: ident.name
|
||||||
|
typ: info.types[i]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: multiple assign
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
pub fn (c mut Checker) array_init(array_init mut ast.ArrayInit) table.Type {
|
pub fn (c mut Checker) array_init(array_init mut ast.ArrayInit) table.Type {
|
||||||
mut elem_type := table.void_type
|
mut elem_type := table.void_type
|
||||||
|
@ -330,12 +347,9 @@ fn (c mut Checker) stmt(node ast.Stmt) {
|
||||||
ast.Return {
|
ast.Return {
|
||||||
c.return_stmt(it)
|
c.return_stmt(it)
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
ast.AssignStmt {
|
ast.AssignStmt {
|
||||||
c.assign_stmt(it)
|
c.assign_stmt(it)
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
ast.ConstDecl {
|
ast.ConstDecl {
|
||||||
for i, expr in it.exprs {
|
for i, expr in it.exprs {
|
||||||
mut field := it.fields[i]
|
mut field := it.fields[i]
|
||||||
|
@ -480,7 +494,6 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type {
|
||||||
mut found := true
|
mut found := true
|
||||||
mut var_scope := &ast.Scope(0)
|
mut var_scope := &ast.Scope(0)
|
||||||
mut var := ast.VarDecl{}
|
mut var := ast.VarDecl{}
|
||||||
// mut var_scope, mut var := start_scope.find_scope_and_var(ident.name) or {
|
|
||||||
var_scope,var = start_scope.find_scope_and_var(ident.name) or {
|
var_scope,var = start_scope.find_scope_and_var(ident.name) or {
|
||||||
found = false
|
found = false
|
||||||
c.error('not found: $ident.name - POS: $ident.pos.pos', ident.pos)
|
c.error('not found: $ident.name - POS: $ident.pos.pos', ident.pos)
|
||||||
|
|
|
@ -458,6 +458,12 @@ pub fn (p mut Parser) parse_ident(is_c bool) ast.Ident {
|
||||||
// p.warn('name ')
|
// p.warn('name ')
|
||||||
// left := p.parse_ident()
|
// left := p.parse_ident()
|
||||||
name := p.check_name()
|
name := p.check_name()
|
||||||
|
if name == '_' {
|
||||||
|
return ast.Ident{
|
||||||
|
kind: .blank_ident
|
||||||
|
pos: p.tok.position()
|
||||||
|
}
|
||||||
|
}
|
||||||
mut ident := ast.Ident{
|
mut ident := ast.Ident{
|
||||||
name: name
|
name: name
|
||||||
is_c: is_c
|
is_c: is_c
|
||||||
|
@ -1519,10 +1525,22 @@ pub fn (p mut Parser) assign_stmt() ast.AssignStmt {
|
||||||
op := p.tok.kind
|
op := p.tok.kind
|
||||||
p.next() // :=, =
|
p.next() // :=, =
|
||||||
expr,_ := p.expr(0)
|
expr,_ := p.expr(0)
|
||||||
|
is_decl := op == .decl_assign
|
||||||
|
for ident in idents {
|
||||||
|
if is_decl && ident.kind == .blank_ident {
|
||||||
|
if p.scope.known_var(ident.name) {
|
||||||
|
p.error('redefinition of `$ident.name`')
|
||||||
|
}
|
||||||
|
p.scope.register_var(ast.VarDecl{
|
||||||
|
name: ident.name
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
return ast.AssignStmt{
|
return ast.AssignStmt{
|
||||||
left: idents
|
left: idents
|
||||||
right: [expr]
|
right: [expr]
|
||||||
op: op
|
op: op
|
||||||
|
pos: p.tok.position()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue