cgen: sum type cast & map str() receiver
parent
0f1371e1c9
commit
f7042e9038
|
@ -333,7 +333,7 @@ pub fn (c mut Checker) method_call_expr(method_call_expr mut ast.MethodCallExpr)
|
||||||
}
|
}
|
||||||
// TODO: str methods
|
// TODO: str methods
|
||||||
if typ_sym.kind in [.map] && name == 'str' {
|
if typ_sym.kind in [.map] && name == 'str' {
|
||||||
method_call_expr.receiver_type = typ
|
method_call_expr.receiver_type = table.new_type(c.table.type_idxs['map_string'])
|
||||||
method_call_expr.return_type = table.string_type
|
method_call_expr.return_type = table.string_type
|
||||||
return table.string_type
|
return table.string_type
|
||||||
}
|
}
|
||||||
|
@ -997,9 +997,16 @@ pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type {
|
||||||
}
|
}
|
||||||
value_type := c.table.value_type(typ)
|
value_type := c.table.value_type(typ)
|
||||||
if value_type != table.void_type {
|
if value_type != table.void_type {
|
||||||
|
if c.is_amp {
|
||||||
|
return table.type_to_ptr(value_type)
|
||||||
|
}
|
||||||
return value_type
|
return value_type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: handle these globally, not individually
|
||||||
|
if c.is_amp {
|
||||||
|
return table.type_to_ptr(typ)
|
||||||
|
}
|
||||||
return typ
|
return typ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1525,8 +1525,11 @@ fn (g mut Gen) call_args(args []ast.CallArg) {
|
||||||
}
|
}
|
||||||
if arg.expected_type != 0 {
|
if arg.expected_type != 0 {
|
||||||
g.ref_or_deref_arg(arg)
|
g.ref_or_deref_arg(arg)
|
||||||
|
g.expr_with_cast(arg.expr, arg.typ, arg.expected_type)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g.expr(arg.expr)
|
||||||
}
|
}
|
||||||
g.expr(arg.expr)
|
|
||||||
if i != args.len - 1 {
|
if i != args.len - 1 {
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
}
|
}
|
||||||
|
@ -1670,7 +1673,9 @@ void* obj;
|
||||||
int typ;
|
int typ;
|
||||||
} $name;')
|
} $name;')
|
||||||
}
|
}
|
||||||
else {}
|
else {
|
||||||
|
g.typedefs.writeln('#define _type_idx_$name $i')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1730,15 +1735,22 @@ fn (g mut Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
if i >= node.exprs.len {
|
if i >= node.exprs.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
match node.expr_types[i] {
|
// TODO: fix match, sum type false positive
|
||||||
table.string_type {
|
// match node.expr_types[i] {
|
||||||
g.write('%.*s')
|
// table.string_type {
|
||||||
}
|
// g.write('%.*s')
|
||||||
table.int_type {
|
// }
|
||||||
g.write('%d')
|
// table.int_type {
|
||||||
}
|
// g.write('%d')
|
||||||
else {}
|
// }
|
||||||
}
|
// else {}
|
||||||
|
// }
|
||||||
|
if node.expr_types[i] == table.string_type {
|
||||||
|
g.write('%.*s')
|
||||||
|
}
|
||||||
|
else if node.expr_types[i] == table.int_type {
|
||||||
|
g.write('%d')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g.write('", ')
|
g.write('", ')
|
||||||
// Build args
|
// Build args
|
||||||
|
|
|
@ -72,8 +72,8 @@ int main(int argc, char** argv) {
|
||||||
user.name = tos3("bob");
|
user.name = tos3("bob");
|
||||||
Option_int n = get_opt();
|
Option_int n = get_opt();
|
||||||
int a = /*opt*/(*(int*)n.data) + 3;
|
int a = /*opt*/(*(int*)n.data) + 3;
|
||||||
handle_expr((IfExpr){
|
handle_expr(/* sum type cast */ (Expr) {.obj = memdup(&(IfExpr[]) {(IfExpr){
|
||||||
0});
|
0}}, sizeof(IfExpr)), .typ = 25});
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1685,6 +1685,7 @@ fn (p mut Parser) global_decl() ast.GlobalDecl {
|
||||||
|
|
||||||
fn (p mut Parser) match_expr() ast.MatchExpr {
|
fn (p mut Parser) match_expr() ast.MatchExpr {
|
||||||
p.check(.key_match)
|
p.check(.key_match)
|
||||||
|
pos := p.tok.position()
|
||||||
is_mut := p.tok.kind == .key_mut
|
is_mut := p.tok.kind == .key_mut
|
||||||
mut is_sum_type := false
|
mut is_sum_type := false
|
||||||
if is_mut {
|
if is_mut {
|
||||||
|
@ -1695,6 +1696,7 @@ fn (p mut Parser) match_expr() ast.MatchExpr {
|
||||||
mut branches := []ast.MatchBranch
|
mut branches := []ast.MatchBranch
|
||||||
for {
|
for {
|
||||||
mut exprs := []ast.Expr
|
mut exprs := []ast.Expr
|
||||||
|
branch_pos := p.tok.position()
|
||||||
p.open_scope()
|
p.open_scope()
|
||||||
// final else
|
// final else
|
||||||
if p.tok.kind == .key_else {
|
if p.tok.kind == .key_else {
|
||||||
|
@ -1739,6 +1741,7 @@ fn (p mut Parser) match_expr() ast.MatchExpr {
|
||||||
branches << ast.MatchBranch{
|
branches << ast.MatchBranch{
|
||||||
exprs: exprs
|
exprs: exprs
|
||||||
stmts: stmts
|
stmts: stmts
|
||||||
|
pos: branch_pos
|
||||||
}
|
}
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
if p.tok.kind == .rcbr {
|
if p.tok.kind == .rcbr {
|
||||||
|
@ -1750,6 +1753,7 @@ fn (p mut Parser) match_expr() ast.MatchExpr {
|
||||||
branches: branches
|
branches: branches
|
||||||
cond: cond
|
cond: cond
|
||||||
is_sum_type: is_sum_type
|
is_sum_type: is_sum_type
|
||||||
|
pos: pos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue