]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Derive EnumValue from Constant
authorJürg Billeter <j@bitron.ch>
Sun, 25 Jul 2010 18:12:03 +0000 (20:12 +0200)
committerJürg Billeter <j@bitron.ch>
Tue, 27 Jul 2010 13:43:33 +0000 (15:43 +0200)
codegen/valaccodememberaccessmodule.vala
codegen/valadovamemberaccessmodule.vala
vala/valaconstant.vala
vala/valaenumvalue.vala
vala/valagenieparser.vala
vala/valagirparser.vala
vala/valamemberaccess.vala
vala/valaparser.vala
vala/valasemanticanalyzer.vala
vapigen/valagidlparser.vala

index 6143a4ffe0ab479223e758d1b5b71862dc7ea79b..57ddcd3f22d8f7e1494925a579cfe2c5a5949050 100644 (file)
@@ -172,6 +172,12 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 
                                expr.ccodenode = new CCodeIdentifier (f.get_cname ());
                        }
+               } else if (expr.symbol_reference is EnumValue) {
+                       var ev = (EnumValue) expr.symbol_reference;
+
+                       generate_enum_declaration ((Enum) ev.parent_symbol, source_declarations);
+
+                       expr.ccodenode = new CCodeConstant (ev.get_cname ());
                } else if (expr.symbol_reference is Constant) {
                        var c = (Constant) expr.symbol_reference;
 
@@ -346,12 +352,6 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                ccomma.append_expression (ctemp);
                                expr.ccodenode = ccomma;
                        }
-               } else if (expr.symbol_reference is EnumValue) {
-                       var ev = (EnumValue) expr.symbol_reference;
-
-                       generate_enum_declaration ((Enum) ev.parent_symbol, source_declarations);
-
-                       expr.ccodenode = new CCodeConstant (ev.get_cname ());
                } else if (expr.symbol_reference is LocalVariable) {
                        var local = (LocalVariable) expr.symbol_reference;
                        if (local.is_result) {
index 0d11f22d1b160e64e1d766ed48690cc5db1abe84..c6ef7e46f402f98c4b371bfef5f6151ad4830813 100644 (file)
@@ -131,6 +131,12 @@ internal class Vala.DovaMemberAccessModule : DovaControlFlowModule {
 
                                expr.ccodenode = new CCodeIdentifier (f.get_cname ());
                        }
+               } else if (expr.symbol_reference is EnumValue) {
+                       var ev = (EnumValue) expr.symbol_reference;
+
+                       generate_enum_declaration ((Enum) ev.parent_symbol, source_declarations);
+
+                       expr.ccodenode = new CCodeConstant (ev.get_cname ());
                } else if (expr.symbol_reference is Constant) {
                        var c = (Constant) expr.symbol_reference;
 
@@ -192,12 +198,6 @@ internal class Vala.DovaMemberAccessModule : DovaControlFlowModule {
                        }
 
                        expr.ccodenode = ccall;
-               } else if (expr.symbol_reference is EnumValue) {
-                       var ev = (EnumValue) expr.symbol_reference;
-
-                       generate_enum_declaration ((Enum) ev.parent_symbol, source_declarations);
-
-                       expr.ccodenode = new CCodeConstant (ev.get_cname ());
                } else if (expr.symbol_reference is LocalVariable) {
                        var local = (LocalVariable) expr.symbol_reference;
                        if (local.is_result) {
index 223ea45dc21c7779c3ac1a6d7b1dcf1d0f37ac42..02b815f0c0fd003dbd36c7a7296bdfe8bceeb669 100644 (file)
@@ -67,9 +67,11 @@ public class Vala.Constant : Symbol, Lockable {
         * @param source_reference reference to source code
         * @return                 newly created constant
         */
-       public Constant (string name, DataType type_reference, Expression? value, SourceReference? source_reference, Comment? comment = null) {
+       public Constant (string name, DataType? type_reference, Expression? value, SourceReference? source_reference, Comment? comment = null) {
                base (name, source_reference, comment);
-               this.type_reference = type_reference;
+               if (type_reference != null) {
+                       this.type_reference = type_reference;
+               }
                this.value = value;
        }
 
@@ -103,7 +105,7 @@ public class Vala.Constant : Symbol, Lockable {
         *
         * @return the name to be used in C code by default
         */
-       public string get_default_cname () {
+       public virtual string get_default_cname () {
                if (parent_symbol == null) {
                        // global constant
                        return name;
@@ -112,6 +114,10 @@ public class Vala.Constant : Symbol, Lockable {
                }
        }
 
+       public void set_cname (string value) {
+               this.cname = value;
+       }
+
        public bool get_lock_used () {
                return lock_used;
        }
index 0c3d0ea07265f7ded0bae38f70719e8fc45311ad..2ade411bd8b1c0d60ab5c0c82e060f49734b1c32 100644 (file)
@@ -1,6 +1,6 @@
 /* valaenumvalue.vala
  *
- * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -25,25 +25,7 @@ using GLib;
 /**
  * Represents an enum member in the source code.
  */
-public class Vala.EnumValue : Symbol {
-       /**
-        * Specifies the numerical representation of this enum value.
-        */
-       public Expression value { get; set; }
-
-       private string cname;
-
-       /**
-        * Creates a new enum value.
-        *
-        * @param name enum value name
-        * @return     newly created enum value
-        */
-       public EnumValue (string name, SourceReference? source_reference = null, Comment? comment = null) {
-               base (name, source_reference);
-               this.comment = comment;
-       }
-
+public class Vala.EnumValue : Constant {
        /**
         * Creates a new enum value with the specified numerical representation.
         *
@@ -51,9 +33,8 @@ public class Vala.EnumValue : Symbol {
         * @param value numerical representation
         * @return      newly created enum value
         */
-       public EnumValue.with_value (string name, Expression value, SourceReference? source_reference = null, Comment? comment = null) {
-               this (name, source_reference, comment);
-               this.value = value;
+       public EnumValue (string name, Expression? value, SourceReference? source_reference = null, Comment? comment = null) {
+               base (name, null, value, source_reference, comment);
        }
        
        /**
@@ -93,45 +74,11 @@ public class Vala.EnumValue : Symbol {
                }
        }
 
-       /**
-        * Process all associated attributes.
-        */
-       public void process_attributes () {
-               foreach (Attribute a in attributes) {
-                       if (a.name == "CCode" && a.has_argument("cname")) {
-                               cname = a.get_string ("cname");
-                       } else if (a.name == "Deprecated") {
-                               process_deprecated_attribute (a);
-                       }
-               }
-       }
-
-       /**
-        * Returns the name of this enum value as it is used in C code.
-        *
-        * @return the name to be used in C code
-        */
-       public string get_cname () {
-               if (cname == null) {
-                       cname = get_default_cname ();
-               }
-               return cname;
-       }
-
-       public string get_default_cname () {
+       public override string get_default_cname () {
                var en = (Enum) parent_symbol;
                return "%s%s".printf (en.get_cprefix (), name);
        }
 
-       /**
-        * Sets the name of this enum value to be used in C code.
-        *
-        * @param cname the name to be used in C code
-        */
-       public void set_cname (string cname) {
-               this.cname = cname;
-       }
-
        public override bool check (SemanticAnalyzer analyzer) {
                if (checked) {
                        return !error;
index d4d01b96cad3152690ab60ddbf8d1ffb2cde52c9..50e6e7d37aeec66392693bddc98e3a9172dc1ac4 100644 (file)
@@ -3382,12 +3382,15 @@ public class Vala.Genie.Parser : CodeVisitor {
                        var value_begin = get_location (); 
                        string id = parse_identifier ();
                        comment = scanner.pop_comment ();
-                       var ev = new EnumValue (id, get_src (value_begin), comment);
-                       set_attributes (ev, value_attrs);
-                       
+
+                       Expression value = null;
                        if (accept (TokenType.ASSIGN)) {
-                               ev.value = parse_expression ();
+                               value = parse_expression ();
                        }
+
+                       var ev = new EnumValue (id, value, get_src (value_begin), comment);
+                       set_attributes (ev, value_attrs);
+
                        en.add_value (ev);
                        expect (TokenType.EOL);
                } while (true);
index bf1d33efaf4ffae32dffe43cdf45e3a87fc0beee..67f8437f542dd1ea93dd4e469d28c557065b015b 100644 (file)
@@ -376,7 +376,7 @@ public class Vala.GirParser : CodeVisitor {
 
        EnumValue parse_enumeration_member () {
                start_element ("member");
-               var ev = new EnumValue (string.joinv ("_", reader.get_attribute ("name").up ().split ("-")));
+               var ev = new EnumValue (string.joinv ("_", reader.get_attribute ("name").up ().split ("-")), null);
                ev.set_cname (reader.get_attribute ("c:identifier"));
                next ();
                end_element ("member");
index 82570b002f150bd3fe7c9994728e48adaf0d8513..b6325f222349ae70710decde8213ba09759d6481 100644 (file)
@@ -166,7 +166,7 @@ public class Vala.MemberAccess : Expression {
        }
 
        public override bool is_constant () {
-               if (symbol_reference is Constant || symbol_reference is EnumValue) {
+               if (symbol_reference is Constant) {
                        return true;
                } else {
                        return false;
index 67366dfe5cfdc422548e8cb10fb54105d8eb4db2..2acbceef4c6ea6ea3250ee2fc7c58b4ce8c3058f 100644 (file)
@@ -3047,11 +3047,14 @@ public class Vala.Parser : CodeVisitor {
                        var value_begin = get_location ();
                        string id = parse_identifier ();
                        comment = scanner.pop_comment ();
-                       var ev = new EnumValue (id, get_src (value_begin), comment);
-                       set_attributes (ev, value_attrs);
+
+                       Expression value = null;
                        if (accept (TokenType.ASSIGN)) {
-                               ev.value = parse_expression ();
+                               value = parse_expression ();
                        }
+
+                       var ev = new EnumValue (id, value, get_src (value_begin), comment);
+                       set_attributes (ev, value_attrs);
                        en.add_value (ev);
                } while (accept (TokenType.COMMA));
                if (accept (TokenType.SEMICOLON)) {
index c2eb9c7648c3c7967a984c4e10e94536dcfcfc23..4a6ab876555fab21ddbe72c03d3e11743ca53d10 100644 (file)
@@ -261,6 +261,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                                type.value_owned = false;
                        }
                        return type;
+               } else if (sym is EnumValue) {
+                       return new EnumValueType ((Enum) sym.parent_symbol);
                } else if (sym is Constant) {
                        var c = (Constant) sym;
                        return c.type_reference;
@@ -289,8 +291,6 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                                type.value_owned = false;
                        }
                        return type;
-               } else if (sym is EnumValue) {
-                       return new EnumValueType ((Enum) sym.parent_symbol);
                } else if (sym is Method) {
                        return new MethodType ((Method) sym);
                } else if (sym is Signal) {
index a932ef23beb69da23507aa8590928bf7e38d4153..985665e205dfab8bd6fd891013061669980e6acf 100644 (file)
@@ -1084,7 +1084,7 @@ public class Vala.GIdlParser : CodeVisitor {
                        }
 
                        if (!is_hidden) {
-                               var ev = new EnumValue (value2.name.offset (common_prefix.len ()));
+                               var ev = new EnumValue (value2.name.offset (common_prefix.len ()), null);
                                en.add_value (ev);
                        }
                }