v2: move index expr type check
parent
2d5c70832c
commit
d918903252
|
@ -246,6 +246,7 @@ pub:
|
||||||
pub struct IndexExpr {
|
pub struct IndexExpr {
|
||||||
pub:
|
pub:
|
||||||
// op token.Kind
|
// op token.Kind
|
||||||
|
pos token.Position
|
||||||
left Expr
|
left Expr
|
||||||
index Expr // [0], [start..end] etc
|
index Expr // [0], [start..end] etc
|
||||||
typ table.Type
|
typ table.Type
|
||||||
|
|
|
@ -284,9 +284,22 @@ pub fn (c &Checker) expr(node ast.Expr) table.Type {
|
||||||
return c.selector_expr(it)
|
return c.selector_expr(it)
|
||||||
}
|
}
|
||||||
ast.IndexExpr {
|
ast.IndexExpr {
|
||||||
// c.expr(it.left)
|
mut typ := c.expr(it.left)
|
||||||
|
if typ.name.starts_with('array_') {
|
||||||
|
elm_typ := typ.name[6..]
|
||||||
|
// TODO `typ = ... or ...`
|
||||||
|
x := c.table.find_type(elm_typ) or {
|
||||||
|
c.error(elm_typ, it.pos)
|
||||||
|
exit(0)
|
||||||
|
}
|
||||||
|
typ = x
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
typ = table.int_type
|
||||||
|
}
|
||||||
|
return typ
|
||||||
// c.expr(it.index)
|
// c.expr(it.index)
|
||||||
return it.typ
|
//return it.typ
|
||||||
}
|
}
|
||||||
ast.IfExpr {
|
ast.IfExpr {
|
||||||
typ := c.expr(it.cond)
|
typ := c.expr(it.cond)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
void foo(int a);
|
void foo(int a);
|
||||||
int get_int(string a);
|
int get_int(string a);
|
||||||
|
bool get_bool();
|
||||||
int get_int2();
|
int get_int2();
|
||||||
void myuser();
|
void myuser();
|
||||||
multi_return_int_string multi_return();
|
multi_return_int_string multi_return();
|
||||||
|
@ -51,12 +52,17 @@ i < 10; i++;
|
||||||
int n = get_int2();
|
int n = get_int2();
|
||||||
bool q = true || false;
|
bool q = true || false;
|
||||||
bool b2 = bools[0] || true;
|
bool b2 = bools[0] || true;
|
||||||
|
bool b3 = get_bool() || true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_int(string a) {
|
int get_int(string a) {
|
||||||
return 10;
|
return 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_bool() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int get_int2() {
|
int get_int2() {
|
||||||
string a = tos3("hello");
|
string a = tos3("hello");
|
||||||
return get_int(a);
|
return get_int(a);
|
||||||
|
|
|
@ -52,12 +52,17 @@ fn foo(a int) {
|
||||||
n := get_int2()
|
n := get_int2()
|
||||||
q := true || false
|
q := true || false
|
||||||
b2 := bools[0] || true
|
b2 := bools[0] || true
|
||||||
|
b3 := get_bool() || true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_int(a string) int {
|
fn get_int(a string) int {
|
||||||
return 10
|
return 10
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_bool() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
fn get_int2() int {
|
fn get_int2() int {
|
||||||
a := 'hello'
|
a := 'hello'
|
||||||
//return get_int('sdf')
|
//return get_int('sdf')
|
||||||
|
|
|
@ -77,9 +77,15 @@ fn (p mut Parser) fn_decl(/*high bool*/) ast.FnDecl {
|
||||||
}
|
}
|
||||||
mut name := ''
|
mut name := ''
|
||||||
if p.tok.kind == .name {
|
if p.tok.kind == .name {
|
||||||
// TODO
|
// TODO high
|
||||||
name = p.check_name()
|
name = p.check_name()
|
||||||
}
|
}
|
||||||
|
// <T>
|
||||||
|
if p.tok.kind == .lt {
|
||||||
|
p.next()
|
||||||
|
p.next()
|
||||||
|
p.check(.gt)
|
||||||
|
}
|
||||||
// println('fn decl $name')
|
// println('fn decl $name')
|
||||||
p.check(.lpar)
|
p.check(.lpar)
|
||||||
// Args
|
// Args
|
||||||
|
|
Loading…
Reference in New Issue