]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GIR parser: Handle anonymous unions and structs inside unions
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 15 Sep 2009 05:43:38 +0000 (07:43 +0200)
committerJürg Billeter <j@bitron.ch>
Tue, 15 Sep 2009 06:33:18 +0000 (08:33 +0200)
Fixes bug 594228.

vala/valastruct.vala
vapigen/valagirparser.vala

index 26763228747f17dd11c2d09712df3ceec775086f..95e8bf00c23bd8c3234f7f9ddd14eff3c5611fb7 100644 (file)
@@ -298,7 +298,12 @@ public class Vala.Struct : TypeSymbol {
         * @return the name to be used in C code by default
         */
        public string get_default_cname () {
-               return "%s%s".printf (parent_symbol.get_cprefix (), name);
+               // parent_symbol may be null in GIR parser
+               if (parent_symbol != null) {
+                       return "%s%s".printf (parent_symbol.get_cprefix (), name);
+               } else {
+                       return name;
+               }
        }
 
        private void set_const_cname (string cname) {
index 3a60e464316b7a629e8c00854ddf13b7a10cd422..dfecae1902d1fb3abbaadc074d3af4e1ee081efb 100644 (file)
@@ -521,6 +521,14 @@ public class Vala.GirParser : CodeVisitor {
                                parse_constructor ();
                        } else if (reader.name == "method") {
                                st.add_method (parse_method ("method"));
+                       } else if (reader.name == "union") {
+                               Struct s = parse_union ();
+                               var s_fields = s.get_fields ();
+                               foreach (var f in s_fields) {
+                                       f.set_cname (s.get_cname () + "." + f.get_cname ());
+                                       f.name = s.name + "_" + f.name;
+                                       st.add_field (f);
+                               }
                        } else {
                                // error
                                Report.error (get_current_src (), "unknown child element `%s' in `record'".printf (reader.name));
@@ -597,6 +605,14 @@ public class Vala.GirParser : CodeVisitor {
                                methods.add (parse_method ("method"));
                        } else if (reader.name == "virtual-method") {
                                vmethods.add (parse_method ("virtual-method"));
+                       } else if (reader.name == "union") {
+                               Struct s = parse_union ();
+                               var s_fields = s.get_fields ();
+                               foreach (var f in s_fields) {
+                                       f.set_cname (s.get_cname () + "." + f.get_cname ());
+                                       f.name = s.name + "_" + f.name;
+                                       fields.add (f);
+                               }
                        } else if (reader.name == "glib:signal") {
                                signals.add (parse_signal ());
                        } else {
@@ -1042,6 +1058,14 @@ public class Vala.GirParser : CodeVisitor {
                                parse_constructor ();
                        } else if (reader.name == "method") {
                                st.add_method (parse_method ("method"));
+                       } else if (reader.name == "record") {
+                               Struct s = parse_record ();
+                               var fs = s.get_fields ();
+                               foreach (var f in fs) {
+                                       f.set_cname (s.get_cname () + "." + f.get_cname ());
+                                       f.name = s.name + "_" + f.name;
+                                       st.add_field (f);
+                               }
                        } else {
                                // error
                                Report.error (get_current_src (), "unknown child element `%s' in `union'".printf (reader.name));