From f6c2b3a54bed2a6b2b0a22f1806dade93d5e1471 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 25 Feb 2020 13:30:43 +0100 Subject: [PATCH] v2: enum fixes --- vlib/v/gen/cgen.v | 4 ++-- vlib/v/gen/tests/1.c | 4 ++-- vlib/v/gen/tests/1.vv | 2 ++ vlib/v/parser/parser.v | 13 +++++++++++++ vlib/v/table/atype_symbols.v | 11 ++++++++--- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index f58886a928..e94b3394cf 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -69,11 +69,11 @@ fn (g mut Gen) stmt(node ast.Stmt) { } } ast.EnumDecl { - g.writeln('enum $it.name {') + g.writeln('typedef enum {') for i, val in it.vals { g.writeln('\t${it.name}_$val, // $i') } - g.writeln('}') + g.writeln('} $it.name;') } ast.Import {} ast.FnDecl { diff --git a/vlib/v/gen/tests/1.c b/vlib/v/gen/tests/1.c index 2df6123115..372241d9a0 100644 --- a/vlib/v/gen/tests/1.c +++ b/vlib/v/gen/tests/1.c @@ -15,11 +15,11 @@ typedef struct { int age; } User; -enum Color { +typedef enum { Color_red, // 0 Color_green, // 1 Color_blue, // 2 -} +} Color; int main() { int a = 10; diff --git a/vlib/v/gen/tests/1.vv b/vlib/v/gen/tests/1.vv index baca70c79c..a7b3b59787 100644 --- a/vlib/v/gen/tests/1.vv +++ b/vlib/v/gen/tests/1.vv @@ -37,6 +37,8 @@ fn main() { foo(3) ak := 10 mypi := pi + //color := Color.red + //Color color = Color_red; } /* user := User{} diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index f2241f6fd0..09e1208b5c 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -577,6 +577,12 @@ pub fn (p mut Parser) name_expr() ast.Expr { // || p.table.known_type(p.tok.lit)) { return p.struct_init() } + /* + else if p.peek_tok.kind == .dot { + p.warn('enum val $name') + } + */ + else { mut ident := ast.Ident{} ident = p.parse_ident(is_c) @@ -1649,6 +1655,13 @@ fn (p mut Parser) enum_decl() ast.EnumDecl { } } p.check(.rcbr) + p.table.register_type_symbol(table.TypeSymbol{ + kind: .enum_ + name: name + info: table.Enum{ + vals: vals + } + }) return ast.EnumDecl{ name: name is_pub: is_pub diff --git a/vlib/v/table/atype_symbols.v b/vlib/v/table/atype_symbols.v index d09654b839..6e1f1cebad 100644 --- a/vlib/v/table/atype_symbols.v +++ b/vlib/v/table/atype_symbols.v @@ -7,8 +7,8 @@ import ( strings ) -pub type TypeInfo = Array | ArrayFixed | Map | Struct | -MultiReturn | Alias +pub type TypeInfo = Array | ArrayFixed | Map | Struct | +MultiReturn | Alias | Enum pub struct TypeSymbol { pub: @@ -86,6 +86,7 @@ pub enum Kind { multi_return sum_type alias + enum_ } [inline] @@ -364,6 +365,11 @@ pub mut: fields []Field } +pub struct Enum { +pub mut: + vals []Field +} + pub struct Alias { pub: foo string @@ -411,7 +417,6 @@ pub fn (table &Table) type_to_str(t Type) string { res += ')' return res } - mut res := sym.name.replace('array_', '[]') // mod.submod.submod2.Type => submod2.Type if res.contains('.') {