From: Juerg Billeter Date: Sat, 23 Feb 2008 17:58:19 +0000 (+0000) Subject: support inner enums, support inner types in interfaces, fixes bug 518258 X-Git-Tag: VALA_0_1_7~50 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c6fcaba9a8097aaa264776e31a2459f29ccef832;p=platform%2Fupstream%2Fvala.git support inner enums, support inner types in interfaces, fixes bug 518258 2008-02-23 Juerg Billeter * vala/parser.y, vala/valaclass.vala, vala/valainterface.vala: support inner enums, support inner types in interfaces, fixes bug 518258 svn path=/trunk/; revision=1041 --- diff --git a/ChangeLog b/ChangeLog index 464f46c..3be6793 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-02-23 Jürg Billeter + * vala/parser.y, vala/valaclass.vala, vala/valainterface.vala: + support inner enums, support inner types in interfaces, + fixes bug 518258 + +2008-02-23 Jürg Billeter + * vapi/gconf-2.0.vapi, vapi/gdk-2.0.vapi, vapi/gdk-pixbuf-2.0.vapi, vapi/gio-2.0.vapi, vapi/gnet-2.0.vapi, vapi/gnome-vfs-2.0.vapi, vapi/gstreamer-0.10.vapi, vapi/gstreamer-audio-0.10.vapi, diff --git a/vala/parser.y b/vala/parser.y index b3d5410..c6e8321 100644 --- a/vala/parser.y +++ b/vala/parser.y @@ -2728,6 +2728,8 @@ class_declaration if (VALA_IS_CLASS (parent_symbol)) { vala_class_add_class (VALA_CLASS (parent_symbol), VALA_CLASS (current_symbol)); + } else if (VALA_IS_INTERFACE (parent_symbol)) { + vala_interface_add_class (VALA_INTERFACE (parent_symbol), VALA_CLASS (current_symbol)); } else if (VALA_IS_NAMESPACE (parent_symbol)) { vala_namespace_add_class (VALA_NAMESPACE (parent_symbol), VALA_CLASS (current_symbol)); vala_source_file_add_node (current_source_file, VALA_CODE_NODE (current_symbol)); @@ -2961,6 +2963,7 @@ class_member_declaration } | class_declaration | struct_declaration + | enum_declaration ; constant_declaration @@ -3720,6 +3723,8 @@ struct_declaration if (VALA_IS_CLASS (parent_symbol)) { vala_class_add_struct (VALA_CLASS (parent_symbol), VALA_STRUCT (current_symbol)); + } else if (VALA_IS_INTERFACE (parent_symbol)) { + vala_interface_add_struct (VALA_INTERFACE (parent_symbol), VALA_STRUCT (current_symbol)); } else if (VALA_IS_NAMESPACE (parent_symbol)) { vala_namespace_add_struct (VALA_NAMESPACE (parent_symbol), VALA_STRUCT (current_symbol)); vala_source_file_add_node (current_source_file, VALA_CODE_NODE (current_symbol)); @@ -3925,6 +3930,9 @@ interface_member_declaration g_object_unref ($1); } } + | class_declaration + | struct_declaration + | enum_declaration ; enum_declaration @@ -3965,8 +3973,16 @@ enum_declaration g_free (name); g_object_unref (src); - vala_namespace_add_enum (VALA_NAMESPACE (parent_symbol), en); - vala_source_file_add_node (current_source_file, VALA_CODE_NODE (en)); + if (VALA_IS_CLASS (parent_symbol)) { + vala_class_add_enum (VALA_CLASS (parent_symbol), en); + } else if (VALA_IS_INTERFACE (parent_symbol)) { + vala_interface_add_enum (VALA_INTERFACE (parent_symbol), en); + } else if (VALA_IS_NAMESPACE (parent_symbol)) { + vala_namespace_add_enum (VALA_NAMESPACE (parent_symbol), en); + vala_source_file_add_node (current_source_file, VALA_CODE_NODE (en)); + } else { + g_assert_not_reached (); + } g_object_unref (parent_symbol); VALA_CODE_NODE (en)->attributes = $2; diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 5f49032..21194ce 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -82,6 +82,7 @@ public class Vala.Class : Typesymbol { // inner types private Gee.List classes = new ArrayList (); private Gee.List structs = new ArrayList (); + private Gee.List enums = new ArrayList (); /** * Specifies the default construction method. @@ -314,6 +315,16 @@ public class Vala.Class : Typesymbol { scope.add (st.name, st); } + /** + * Adds the specified enum as an inner enum. + * + * @param en an enum + */ + public void add_enum (Enum en) { + enums.add (en); + scope.add (en.name, en); + } + public override void accept (CodeVisitor! visitor) { visitor.visit_class (this); } @@ -362,6 +373,10 @@ public class Vala.Class : Typesymbol { foreach (Struct st in structs) { st.accept (visitor); } + + foreach (Enum en in enums) { + en.accept (visitor); + } } public override string! get_cprefix () { diff --git a/vala/valainterface.vala b/vala/valainterface.vala index 69a5695..089e97d 100644 --- a/vala/valainterface.vala +++ b/vala/valainterface.vala @@ -43,7 +43,12 @@ public class Vala.Interface : Typesymbol { private Gee.List fields = new ArrayList (); private Gee.List properties = new ArrayList (); private Gee.List signals = new ArrayList (); - + + // inner types + private Gee.List classes = new ArrayList (); + private Gee.List structs = new ArrayList (); + private Gee.List enums = new ArrayList (); + private string cname; private string lower_case_csuffix; private string type_cname; @@ -201,7 +206,37 @@ public class Vala.Interface : Typesymbol { public Collection get_signals () { return new ReadOnlyCollection (signals); } - + + /** + * Adds the specified class as an inner class. + * + * @param cl a class + */ + public void add_class (Class! cl) { + classes.add (cl); + scope.add (cl.name, cl); + } + + /** + * Adds the specified struct as an inner struct. + * + * @param st a struct + */ + public void add_struct (Struct! st) { + structs.add (st); + scope.add (st.name, st); + } + + /** + * Adds the specified enum as an inner enum. + * + * @param en an enum + */ + public void add_enum (Enum en) { + enums.add (en); + scope.add (en.name, en); + } + public override string get_cname (bool const_type = false) { if (cname == null) { cname = "%s%s".printf (parent_symbol.get_cprefix (), name); @@ -285,6 +320,18 @@ public class Vala.Interface : Typesymbol { foreach (Signal sig in signals) { sig.accept (visitor); } + + foreach (Class cl in classes) { + cl.accept (visitor); + } + + foreach (Struct st in structs) { + st.accept (visitor); + } + + foreach (Enum en in enums) { + en.accept (visitor); + } } public override bool is_reference_type () {