]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vapigen: Support declaration of enum methods in -custom.vala
authorJürg Billeter <j@bitron.ch>
Thu, 8 Apr 2010 07:09:42 +0000 (09:09 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 8 Apr 2010 07:09:42 +0000 (09:09 +0200)
Based on patch by Sebastian Drög, fixes bug 614543.

vala/valaenum.vala
vapigen/valagidlparser.vala

index f5c21489bca20d236a3e98a4d4f2ff9344cb6434..4e8c2308efa1fb78c9bf319bb490ca91ad8a661f 100644 (file)
@@ -99,6 +99,11 @@ public class Vala.Enum : TypeSymbol {
                return values;
        }
 
+       // used by vapigen
+       public void remove_all_values () {
+               values.clear ();
+       }
+
        /**
         * Returns a copy of the list of methods.
         *
index 6d3e03d6b65858e28da565f5562f7dd52a5c7971..d2e739ec32571060ef4ffb6558ccb2c0d24cae4d 100644 (file)
@@ -243,26 +243,9 @@ public class Vala.GIdlParser : CodeVisitor {
                        } else if (node.type == IdlNodeTypeId.BOXED) {
                                parse_boxed ((IdlNodeBoxed) node, ns, module);
                        } else if (node.type == IdlNodeTypeId.ENUM) {
-                               var en = parse_enum ((IdlNodeEnum) node);
-                               if (en == null) {
-                                       continue;
-                               }
-                               en.name = fix_type_name (en.name, ns);
-                               if (en is ErrorDomain) {
-                                       ns.add_error_domain (en as ErrorDomain);
-                               } else {
-                                       ns.add_enum (en as Enum);
-                               }
-                               current_source_file.add_node (en);
+                               parse_enum ((IdlNodeEnum) node, ns, module, false);
                        } else if (node.type == IdlNodeTypeId.FLAGS) {
-                               var en = parse_enum ((IdlNodeEnum) node) as Enum;
-                               if (en == null) {
-                                       continue;
-                               }
-                               en.name = fix_type_name (en.name, ns);
-                               en.is_flags = true;
-                               ns.add_enum (en);
-                               current_source_file.add_node (en);
+                               parse_enum ((IdlNodeEnum) node, ns, module, true);
                        } else if (node.type == IdlNodeTypeId.OBJECT) {
                                parse_object ((IdlNodeInterface) node, ns, module);
                        } else if (node.type == IdlNodeTypeId.INTERFACE) {
@@ -891,11 +874,22 @@ public class Vala.GIdlParser : CodeVisitor {
                }
        }
        
-       private TypeSymbol? parse_enum (IdlNodeEnum en_node) {
+       private void parse_enum (IdlNodeEnum en_node, Namespace ns, IdlModule module, bool is_flags) {
                weak IdlNode node = (IdlNode) en_node;
+               string name = fix_type_name (node.name, ns);
+               bool existing = true;
+
+               var en = ns.scope.lookup (name) as Enum;
+               if (en == null) {
+                       en = new Enum (name, current_source_reference);
+                       en.access = SymbolAccessibility.PUBLIC;
+                       existing = false;
+               } else {
+                       // ignore dummy enum values in -custom.vala files
+                       // they exist for syntactical reasons
+                       en.remove_all_values ();
+               }
 
-               var en = new Enum (node.name, current_source_reference);
-               en.access = SymbolAccessibility.PUBLIC;
                en.has_type_id = (en_node.gtype_name != null && en_node.gtype_name != "");
                
                string common_prefix = null;
@@ -949,7 +943,7 @@ public class Vala.GIdlParser : CodeVisitor {
                                        en.add_cheader_filename (eval (nv[1]));
                                } else if (nv[0] == "hidden") {
                                        if (eval (nv[1]) == "1") {
-                                               return null;
+                                               return;
                                        }
                                } else if (nv[0] == "rename_to") {
                                        en.name = eval (nv[1]);
@@ -1002,10 +996,17 @@ public class Vala.GIdlParser : CodeVisitor {
                                ed.add_code (new ErrorCode (ev.name));
                        }
 
-                       return ed;
+                       current_source_file.add_node (ed);
+                       if (!existing) {
+                               ns.add_error_domain (ed);
+                       }
+               } else {
+                       en.is_flags = is_flags;
+                       current_source_file.add_node (en);
+                       if (!existing) {
+                               ns.add_enum (en);
+                       }
                }
-
-               return en;
        }
        
        private void parse_object (IdlNodeInterface node, Namespace ns, IdlModule module) {