checker/cgen: simplify assigning fn to var
parent
0af939c30d
commit
a73660a4c3
|
@ -1764,11 +1764,6 @@ pub fn (mut c Checker) ident(ident mut ast.Ident) table.Type {
|
|||
info := ident.info as ast.IdentFn
|
||||
return info.typ
|
||||
} else if ident.kind == .unresolved {
|
||||
// prepend mod to look for fn call or const
|
||||
mut name := ident.name
|
||||
if !name.contains('.') && ident.mod !in ['builtin', 'main'] {
|
||||
name = '${ident.mod}.$ident.name'
|
||||
}
|
||||
// first use
|
||||
start_scope := c.file.scope.innermost(ident.pos.pos)
|
||||
if obj := start_scope.find(ident.name) {
|
||||
|
@ -1778,18 +1773,6 @@ pub fn (mut c Checker) ident(ident mut ast.Ident) table.Type {
|
|||
if typ == 0 {
|
||||
typ = c.expr(it.expr)
|
||||
}
|
||||
sym := c.table.get_type_symbol(typ)
|
||||
if sym.info is table.FnType {
|
||||
// anon/local fn assigned to new variable uses this
|
||||
info := sym.info as table.FnType
|
||||
fn_type := table.new_type(c.table.find_or_register_fn_type(info.func,
|
||||
true, true))
|
||||
ident.kind = .function
|
||||
ident.info = ast.IdentFn{
|
||||
typ: fn_type
|
||||
}
|
||||
return fn_type
|
||||
} else {
|
||||
is_optional := typ.flag_is(.optional)
|
||||
ident.kind = .variable
|
||||
ident.info = ast.IdentVar{
|
||||
|
@ -1803,10 +1786,14 @@ pub fn (mut c Checker) ident(ident mut ast.Ident) table.Type {
|
|||
}
|
||||
return typ
|
||||
}
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
// prepend mod to look for fn call or const
|
||||
mut name := ident.name
|
||||
if !name.contains('.') && ident.mod !in ['builtin', 'main'] {
|
||||
name = '${ident.mod}.$ident.name'
|
||||
}
|
||||
if obj := c.file.global_scope.find(name) {
|
||||
match obj {
|
||||
ast.GlobalDecl {
|
||||
|
|
|
@ -923,23 +923,6 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
}
|
||||
continue
|
||||
}
|
||||
ast.Ident {
|
||||
if it.info is ast.IdentFn {
|
||||
thing := it.info as ast.IdentFn
|
||||
sym := g.table.get_type_symbol(thing.typ)
|
||||
info := sym.info as table.FnType
|
||||
func := info.func
|
||||
ret_styp := g.typ(func.return_type)
|
||||
g.write('$ret_styp (*$ident.name) (')
|
||||
def_pos := g.definitions.len
|
||||
g.fn_args(func.args, func.is_variadic)
|
||||
g.definitions.go_back(g.definitions.len - def_pos)
|
||||
g.write(') = ')
|
||||
g.expr(*it)
|
||||
g.writeln(';')
|
||||
continue
|
||||
}
|
||||
}
|
||||
else {}
|
||||
}
|
||||
gen_or := is_call && return_type.flag_is(.optional)
|
||||
|
@ -965,10 +948,21 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||
}
|
||||
is_decl := assign_stmt.op == .decl_assign
|
||||
// g.write('/*assign_stmt*/')
|
||||
if is_decl {
|
||||
if is_decl && right_sym.kind != .function {
|
||||
g.write('$styp ')
|
||||
}
|
||||
if right_sym.kind == .function {
|
||||
func := right_sym.info as table.FnType
|
||||
ret_styp := g.typ(func.func.return_type)
|
||||
g.write('$ret_styp (*$ident.name) (')
|
||||
def_pos := g.definitions.len
|
||||
g.fn_args(func.func.args, func.func.is_variadic)
|
||||
g.definitions.go_back(g.definitions.len - def_pos)
|
||||
g.write(')')
|
||||
}
|
||||
else {
|
||||
g.ident(ident)
|
||||
}
|
||||
if g.autofree && right_sym.kind in [.array, .string] {
|
||||
if g.gen_clone_assignment(val, right_sym, true) {
|
||||
g.writeln(';')
|
||||
|
|
Loading…
Reference in New Issue