diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index be8a813429..0140dadc10 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -12,7 +12,7 @@ pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | CharLitera FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | MatchExpr | CastExpr | EnumVal | Assoc | SizeOf | None | MapInit | IfGuardExpr | ParExpr | OrExpr | -ConcatExpr +ConcatExpr | TypeName pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt | @@ -27,6 +27,12 @@ pub struct StructType { pub struct ArrayType {} +pub struct TypeName { +pub: + name string + typ table.Type +} + // | IncDecStmt k // Stand-alone expression in a statement list. pub struct ExprStmt { diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index f4ac07ed73..fefed75801 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -175,6 +175,10 @@ fn (c mut Checker) check_assign_expr(assign_expr ast.AssignExpr) { pub fn (c mut Checker) call_expr(call_expr ast.CallExpr) table.Type { fn_name := call_expr.name + // TODO: impl typeof properly (probably not going to be a fn call) + if fn_name == 'typeof' { + return table.string_type + } mut found := false // start hack: until v1 is fixed and c definitions are added for these if fn_name == 'C.calloc' { @@ -553,6 +557,9 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type { ast.StructInit { return c.check_struct_init(it) } + ast.TypeName { + return it.typ + } /* ast.UnaryExpr { c.expr(it.left) @@ -656,7 +663,12 @@ pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type { if i < node.match_exprs.len { match_expr := node.match_exprs[i] c.expected_type = t - c.expr(match_expr) + typ := c.expr(match_expr) + typ_sym := c.table.get_type_symbol(typ) + // TODO: + if typ_sym.kind == .sum_type { + + } } c.stmts(block.stmts) // If the last statement is an expression, return its type diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index a109376ea7..37dfe5c870 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -1732,16 +1732,21 @@ fn (p mut Parser) match_expr() ast.Expr { mut match_exprs := []ast.Expr // mut return_type := table.void_type for { + p.open_scope() // Sum type match if p.tok.kind == .name && (p.tok.lit[0].is_capital() || p.peek_tok.kind == .dot) { // if sym.kind == .sum_type { // p.warn('is sum') - // p.parse_type() - p.check_name() - if p.tok.kind == .dot { - p.check(.dot) - p.check_name() + typ := p.parse_type() + typ_sym := p.table.get_type_symbol(typ) + match_exprs << ast.TypeName{ + name: typ_sym.name + typ: typ } + p.scope.register_var(ast.VarDecl{ + name: 'it' + typ: typ + }) } else { // Expression match @@ -1778,7 +1783,7 @@ fn (p mut Parser) match_expr() ast.Expr { } } */ - + p.close_scope() if p.tok.kind == .rcbr { break }