parent
e3d98b1b28
commit
d8479f107f
|
@ -2968,7 +2968,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
scope: 0
|
scope: 0
|
||||||
}
|
}
|
||||||
left_sym := g.table.get_type_symbol(g.unwrap_generic(var_type))
|
left_sym := g.table.get_type_symbol(g.unwrap_generic(var_type))
|
||||||
if left is ast.Ident {
|
if mut left is ast.Ident {
|
||||||
ident = left
|
ident = left
|
||||||
// id_info := ident.var_info()
|
// id_info := ident.var_info()
|
||||||
// var_type = id_info.typ
|
// var_type = id_info.typ
|
||||||
|
@ -2984,7 +2984,16 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
var_type = var_type.set_flag(.atomic_f)
|
var_type = var_type.set_flag(.atomic_f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if left.obj is ast.Var {
|
if mut left.obj is ast.Var {
|
||||||
|
if val is ast.ComptimeSelector {
|
||||||
|
if val.field_expr is ast.SelectorExpr {
|
||||||
|
if val.field_expr.expr is ast.Ident {
|
||||||
|
key_str := '${val.field_expr.expr.name}.typ'
|
||||||
|
var_type = g.comptime_var_type_map[key_str] or { var_type }
|
||||||
|
left.obj.typ = var_type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
is_auto_heap = left.obj.is_auto_heap
|
is_auto_heap = left.obj.is_auto_heap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4098,7 +4107,18 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
|
||||||
.unknown {
|
.unknown {
|
||||||
if node.field_name == 'name' {
|
if node.field_name == 'name' {
|
||||||
// typeof(expr).name
|
// typeof(expr).name
|
||||||
g.type_name(node.name_type)
|
mut name_type := node.name_type
|
||||||
|
if node.expr is ast.TypeOf {
|
||||||
|
if node.expr.expr is ast.ComptimeSelector {
|
||||||
|
if node.expr.expr.field_expr is ast.SelectorExpr {
|
||||||
|
if node.expr.expr.field_expr.expr is ast.Ident {
|
||||||
|
key_str := '${node.expr.expr.field_expr.expr.name}.typ'
|
||||||
|
name_type = g.comptime_var_type_map[key_str] or { name_type }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g.type_name(name_type)
|
||||||
return
|
return
|
||||||
} else if node.field_name == 'idx' {
|
} else if node.field_name == 'idx' {
|
||||||
// typeof(expr).idx
|
// typeof(expr).idx
|
||||||
|
|
|
@ -819,6 +819,12 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if node.left is ast.Ident && g.comptime_var_type_map.len > 0 {
|
||||||
|
if node.left.obj is ast.Var {
|
||||||
|
rec_type = node.left.obj.typ
|
||||||
|
g.gen_expr_to_string(node.left, rec_type)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g.get_str_fn(rec_type)
|
g.get_str_fn(rec_type)
|
||||||
} else if node.name == 'free' {
|
} else if node.name == 'free' {
|
||||||
|
@ -1130,6 +1136,10 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
|
||||||
typ = g.comptime_var_type_map[key_str] or { typ }
|
typ = g.comptime_var_type_map[key_str] or { typ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if expr is ast.Ident {
|
||||||
|
if expr.obj is ast.Var {
|
||||||
|
typ = expr.obj.typ
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g.gen_expr_to_string(expr, typ)
|
g.gen_expr_to_string(expr, typ)
|
||||||
g.write(')')
|
g.write(')')
|
||||||
|
|
|
@ -1,15 +1,36 @@
|
||||||
fn print_field_values<T>(s T) {
|
fn print_field_values<T>(s T) {
|
||||||
mut value_list := []string{}
|
mut value_list := []string{}
|
||||||
|
mut value_type_list := []string{}
|
||||||
|
mut var_value_list := []string{}
|
||||||
|
|
||||||
$for field in T.fields {
|
$for field in T.fields {
|
||||||
println(s.$(field.name))
|
println(s.$(field.name))
|
||||||
value_list << s.$(field.name).str()
|
value_list << s.$(field.name).str()
|
||||||
|
|
||||||
|
println(typeof(s.$(field.name)).name)
|
||||||
|
value_type_list << typeof(s.$(field.name)).name
|
||||||
|
|
||||||
|
val := s.$(field.name)
|
||||||
|
println(val)
|
||||||
|
var_value_list << val.str()
|
||||||
}
|
}
|
||||||
assert value_list.len == 4
|
assert value_list.len == 4
|
||||||
assert value_list[0] == 'Simon'
|
assert value_list[0] == 'Simon'
|
||||||
assert value_list[1] == 'simon1234'
|
assert value_list[1] == 'simon1234'
|
||||||
assert value_list[2] == 'simon@gmail.com'
|
assert value_list[2] == 'simon@gmail.com'
|
||||||
assert value_list[3] == '15'
|
assert value_list[3] == '15'
|
||||||
|
|
||||||
|
assert value_type_list.len == 4
|
||||||
|
assert value_type_list[0] == 'string'
|
||||||
|
assert value_type_list[1] == 'string'
|
||||||
|
assert value_type_list[2] == 'string'
|
||||||
|
assert value_type_list[3] == 'int'
|
||||||
|
|
||||||
|
assert var_value_list.len == 4
|
||||||
|
assert var_value_list[0] == 'Simon'
|
||||||
|
assert var_value_list[1] == 'simon1234'
|
||||||
|
assert var_value_list[2] == 'simon@gmail.com'
|
||||||
|
assert var_value_list[3] == '15'
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
|
|
Loading…
Reference in New Issue