From d91890325230f092ec965ab3846081ee0e673ed0 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 3 Feb 2020 07:44:52 +0100 Subject: [PATCH] v2: move index expr type check --- vlib/v/ast/ast.v | 9 +++++---- vlib/v/checker/checker.v | 17 +++++++++++++++-- vlib/v/gen/tests/1.c | 6 ++++++ vlib/v/gen/tests/1.vv | 5 +++++ vlib/v/parser/fn.v | 8 +++++++- vlib/v/parser/parser.v | 10 +++++----- 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 23f71dd9bf..a6820bf8bd 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -8,11 +8,11 @@ import ( v.table ) -pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | -FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | +pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | +FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr -pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | +pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr // | IncDecStmt k // Stand-alone expression in a statement list. @@ -246,9 +246,10 @@ pub: pub struct IndexExpr { pub: // op token.Kind + pos token.Position left Expr index Expr // [0], [start..end] etc - typ table.Type + typ table.Type } pub struct IfExpr { diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 23ceb6eadd..bece74171a 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -284,9 +284,22 @@ pub fn (c &Checker) expr(node ast.Expr) table.Type { return c.selector_expr(it) } 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) - return it.typ + //return it.typ } ast.IfExpr { typ := c.expr(it.cond) diff --git a/vlib/v/gen/tests/1.c b/vlib/v/gen/tests/1.c index 3cd4dd8dfe..e91b5a5856 100644 --- a/vlib/v/gen/tests/1.c +++ b/vlib/v/gen/tests/1.c @@ -1,5 +1,6 @@ void foo(int a); int get_int(string a); +bool get_bool(); int get_int2(); void myuser(); multi_return_int_string multi_return(); @@ -51,12 +52,17 @@ i < 10; i++; int n = get_int2(); bool q = true || false; bool b2 = bools[0] || true; + bool b3 = get_bool() || true; } int get_int(string a) { return 10; } +bool get_bool() { + return true; +} + int get_int2() { string a = tos3("hello"); return get_int(a); diff --git a/vlib/v/gen/tests/1.vv b/vlib/v/gen/tests/1.vv index b0690384f9..f2a11f70cc 100644 --- a/vlib/v/gen/tests/1.vv +++ b/vlib/v/gen/tests/1.vv @@ -52,12 +52,17 @@ fn foo(a int) { n := get_int2() q := true || false b2 := bools[0] || true + b3 := get_bool() || true } fn get_int(a string) int { return 10 } +fn get_bool() bool { + return true +} + fn get_int2() int { a := 'hello' //return get_int('sdf') diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 236c2ec97f..3bf0b19162 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -77,9 +77,15 @@ fn (p mut Parser) fn_decl(/*high bool*/) ast.FnDecl { } mut name := '' if p.tok.kind == .name { - // TODO + // TODO high name = p.check_name() } + // + if p.tok.kind == .lt { + p.next() + p.next() + p.check(.gt) + } // println('fn decl $name') p.check(.lpar) // Args diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 1f46225123..bbc1966c29 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -399,7 +399,7 @@ pub fn (p mut Parser) name_expr() (ast.Expr,table.Type) { typ: typ name: ident.name // expr: p.expr(0)// var.expr - + } // ident.ti = ti node = ident @@ -738,7 +738,7 @@ fn (p mut Parser) if_expr() (ast.Expr,table.Type) { ti: ti pos: p.tok.position() // left: left - + } return node,ti } @@ -901,7 +901,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { fields << table.Field{ name: field_name // type_idx: ti.idx - + ti: ti } } @@ -974,7 +974,7 @@ fn (p mut Parser) var_decl() ast.VarDecl { name: name is_mut: is_mut // expr: expr - + typ: typ }) p.warn('var decl name=$name typ=$typ.name') @@ -982,7 +982,7 @@ fn (p mut Parser) var_decl() ast.VarDecl { node := ast.VarDecl{ name: name expr: expr // p.expr(token.lowest_prec) - + is_mut: is_mut typ: typ pos: p.tok.position()