checker: fix first() and last(); call_args; method cgen
parent
9978fb3e2c
commit
7a499b3cd3
|
@ -166,6 +166,7 @@ pub:
|
||||||
args []Expr
|
args []Expr
|
||||||
muts []bool
|
muts []bool
|
||||||
or_block OrExpr
|
or_block OrExpr
|
||||||
|
typ table.Type
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Return {
|
pub struct Return {
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
max_nr_errors = 50
|
max_nr_errors = 150
|
||||||
)
|
)
|
||||||
|
|
||||||
pub struct Checker {
|
pub struct Checker {
|
||||||
|
@ -45,6 +45,7 @@ pub fn (c mut Checker) check(ast_file ast.File) {
|
||||||
println(t.name + ' - ' + t.kind.str())
|
println(t.name + ' - ' + t.kind.str())
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (c mut Checker) check2(ast_file ast.File) []string {
|
pub fn (c mut Checker) check2(ast_file ast.File) []string {
|
||||||
|
@ -71,7 +72,6 @@ pub fn (c mut Checker) check_files(ast_files []ast.File) {
|
||||||
for file in ast_files {
|
for file in ast_files {
|
||||||
c.check(file)
|
c.check(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.print_unhandled_nodes()
|
c.print_unhandled_nodes()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,8 +232,11 @@ pub fn (c mut Checker) check_method_call_expr(method_call_expr ast.MethodCallExp
|
||||||
return method.return_type
|
return method.return_type
|
||||||
}
|
}
|
||||||
if typ_sym.kind == .array && name in ['filter', 'clone'] {
|
if typ_sym.kind == .array && name in ['filter', 'clone'] {
|
||||||
// info := typ_sym.info as table.Array
|
return typ
|
||||||
return typ // info.elem_type
|
}
|
||||||
|
if typ_sym.kind == .array && name in ['first', 'last'] {
|
||||||
|
info := typ_sym.info as table.Array
|
||||||
|
return info.elem_type
|
||||||
}
|
}
|
||||||
// check parent
|
// check parent
|
||||||
if typ_sym.parent_idx != 0 {
|
if typ_sym.parent_idx != 0 {
|
||||||
|
@ -436,7 +439,9 @@ fn (c mut Checker) stmt(node ast.Stmt) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
node_name := typeof(node)
|
node_name := typeof(node)
|
||||||
if !(node_name) in c.unhandled_stmts { c.unhandled_stmts << node_name }
|
if !(node_name) in c.unhandled_stmts {
|
||||||
|
c.unhandled_stmts << node_name
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -538,12 +543,12 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type {
|
||||||
c.expr(it.left)
|
c.expr(it.left)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
else {
|
|
||||||
|
else {}
|
||||||
// TODO: find nil string bug triggered with typeof
|
// TODO: find nil string bug triggered with typeof
|
||||||
// node_name := typeof(node)
|
// node_name := typeof(node)
|
||||||
// if !(node_name) in c.unhandled_exprs { c.unhandled_exprs << node_name }
|
// if !(node_name) in c.unhandled_exprs { c.unhandled_exprs << node_name }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return table.void_type
|
return table.void_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -284,15 +284,28 @@ fn (g mut Gen) expr(node ast.Expr) {
|
||||||
}
|
}
|
||||||
ast.CallExpr {
|
ast.CallExpr {
|
||||||
g.write('${it.name}(')
|
g.write('${it.name}(')
|
||||||
|
g.call_args(it.args)
|
||||||
|
g.write(')')
|
||||||
|
/*
|
||||||
for i, expr in it.args {
|
for i, expr in it.args {
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
if i != it.args.len - 1 {
|
if i != it.args.len - 1 {
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
|
ast.MethodCallExpr {
|
||||||
|
typ := 'TODO'
|
||||||
|
g.write('${typ}_${it.name}(')
|
||||||
|
g.expr(it.expr)
|
||||||
|
if it.args.len > 0 {
|
||||||
|
g.write(', ')
|
||||||
|
}
|
||||||
|
g.call_args(it.args)
|
||||||
g.write(')')
|
g.write(')')
|
||||||
}
|
}
|
||||||
ast.MethodCallExpr {}
|
|
||||||
ast.Ident {
|
ast.Ident {
|
||||||
g.write('$it.name')
|
g.write('$it.name')
|
||||||
}
|
}
|
||||||
|
@ -382,6 +395,15 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (g mut Gen) call_args(args []ast.Expr) {
|
||||||
|
for i, expr in args {
|
||||||
|
g.expr(expr)
|
||||||
|
if i != args.len - 1 {
|
||||||
|
g.write(', ')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn verror(s string) {
|
fn verror(s string) {
|
||||||
println(s)
|
println(s)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
|
@ -66,6 +66,7 @@ i < 10; i++;
|
||||||
bool q = true || false;
|
bool q = true || false;
|
||||||
bool b2 = bools[0] || true;
|
bool b2 = bools[0] || true;
|
||||||
bool b3 = get_bool() || true;
|
bool b3 = get_bool() || true;
|
||||||
|
int f = TODO_first(nums);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_int(string a) {
|
int get_int(string a) {
|
||||||
|
|
|
@ -72,6 +72,7 @@ fn foo(a int) {
|
||||||
q := true || false
|
q := true || false
|
||||||
b2 := bools[0] || true
|
b2 := bools[0] || true
|
||||||
b3 := get_bool() || true
|
b3 := get_bool() || true
|
||||||
|
f := nums.first()
|
||||||
//cloned = nums.clone()
|
//cloned = nums.clone()
|
||||||
//cloned1 := cloned[0]
|
//cloned1 := cloned[0]
|
||||||
//println(cloned1 == 1)
|
//println(cloned1 == 1)
|
||||||
|
|
|
@ -17,7 +17,7 @@ int main() {
|
||||||
a.a = tos3("da");
|
a.a = tos3("da");
|
||||||
a.b.a = 111;
|
a.b.a = 111;
|
||||||
string a1 = a.a;
|
string a1 = a.a;
|
||||||
int a2 = ;
|
int a2 = TODO_testa(b);
|
||||||
int c = testa();
|
int c = testa();
|
||||||
c = 1;
|
c = 1;
|
||||||
string d = testb(1);
|
string d = testb(1);
|
||||||
|
@ -56,7 +56,7 @@ int testc(int a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int testa() {
|
int testa() {
|
||||||
int a = ;
|
int a = TODO_testb(f);
|
||||||
a = 1;
|
a = 1;
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue