From 19520ccf4e4a8671adcbefbcda8cda702d455721 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 18 Feb 2020 20:47:19 +0100 Subject: [PATCH] v2: for in checker --- vlib/builtin/int.v | 1 + vlib/v/ast/ast.v | 13 +++++++------ vlib/v/parser/parser.v | 16 ++++++++-------- vlib/v/table/table.v | 11 ++++++++--- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/vlib/builtin/int.v b/vlib/builtin/int.v index 144823fe09..ae20bb4985 100644 --- a/vlib/builtin/int.v +++ b/vlib/builtin/int.v @@ -209,6 +209,7 @@ pub fn (c byte) is_capital() bool { pub fn (b []byte) clone() []byte { mut res := [byte(0)].repeat(b.len) + //mut res := make([]byte, {repeat:b.len}) for i := 0; i < b.len; i++ { res[i] = b[i] } diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 37eeb07e2b..1630d2936d 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -8,14 +8,14 @@ import ( v.table ) -pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | CharLiteral | -FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | -AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | MatchExpr | +pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | CharLiteral | +FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | +AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | MatchExpr | CastExpr | EnumVal | Assoc | SizeOf -pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | -ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt | -HashStmt | AssignStmt | EnumDecl | TypeDecl | DeferStmt | GotoLabel | GotoStmt | +pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | +ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt | +HashStmt | AssignStmt | EnumDecl | TypeDecl | DeferStmt | GotoLabel | GotoStmt | LineComment | MultiLineComment pub type Type = StructType | ArrayType @@ -348,6 +348,7 @@ pub: var string cond Expr stmts []Stmt + pos token.Position } pub struct ForCStmt { diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 34ebde3264..197b5bdc8d 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -55,7 +55,7 @@ pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt { pref: &pref.Preferences{} scope: scope // scope: &ast.Scope{start_pos: 0, parent: 0} - + } p.init_parse_fns() p.read_first_token() @@ -319,7 +319,7 @@ pub fn (p mut Parser) stmt() ast.Stmt { return ast.ExprStmt{ expr: expr // typ: typ - + } } } @@ -994,7 +994,7 @@ fn (p mut Parser) for_statement() ast.Stmt { stmts := p.parse_block() // println('nr stmts=$stmts.len') p.close_scope() - return ast.ForStmt{ + return ast.ForInStmt{ stmts: stmts pos: p.tok.position() } @@ -1061,10 +1061,10 @@ fn (p mut Parser) if_expr() ast.Expr { stmts: stmts else_stmts: else_stmts // typ: typ - + pos: p.tok.position() // left: left - + } return node } @@ -1450,10 +1450,10 @@ 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() } p.scope.register_var(node) @@ -1572,7 +1572,7 @@ fn (p mut Parser) match_expr() ast.Expr { blocks: blocks match_exprs: match_exprs // typ: typ - + cond: cond } return node diff --git a/vlib/v/table/table.v b/vlib/v/table/table.v index 3d76cfe20d..e4eb97076b 100644 --- a/vlib/v/table/table.v +++ b/vlib/v/table/table.v @@ -377,15 +377,20 @@ pub fn (t &Table) check(got, expected Type) bool { if got_type_sym.is_number() && exp_type_sym.is_number() { return true } + // TODO + // if got_type_sym.kind == .array && exp_type_sym.kind == .array { + // return true + // } if got_type_sym.kind == .array_fixed && exp_type_sym.kind == .byteptr { info := got_type_sym.info as ArrayFixed if type_idx(info.elem_type) == byte_type_idx { return true } } - // if expected.name == 'array' { - // return true - // } + // TODO + if exp_type_sym.name == 'array' || got_type_sym.name == 'array' { + return true + } if got_idx != exp_idx { // && got.typ.name != expected.typ.name*/ return false