From be73e48d649702d9f161da2ee376e2b751460323 Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Sun, 24 Feb 2008 09:00:50 +0000 Subject: [PATCH] support inner delegates 2008-02-24 Juerg Billeter * vala/parser.y, vala/valaclass.vala, vala/valainterface.vala: support inner delegates svn path=/trunk/; revision=1042 --- ChangeLog | 5 +++++ vala/parser.y | 14 ++++++++++++-- vala/valaclass.vala | 17 ++++++++++++++++- vala/valainterface.vala | 15 +++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3be6793..21fad5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-02-24 Jürg Billeter + + * vala/parser.y, vala/valaclass.vala, vala/valainterface.vala: + support inner delegates + 2008-02-23 Jürg Billeter * vala/parser.y, vala/valaclass.vala, vala/valainterface.vala: diff --git a/vala/parser.y b/vala/parser.y index c6e8321..a7500af 100644 --- a/vala/parser.y +++ b/vala/parser.y @@ -2964,6 +2964,7 @@ class_member_declaration | class_declaration | struct_declaration | enum_declaration + | delegate_declaration ; constant_declaration @@ -3933,6 +3934,7 @@ interface_member_declaration | class_declaration | struct_declaration | enum_declaration + | delegate_declaration ; enum_declaration @@ -4200,8 +4202,16 @@ delegate_declaration g_object_unref ($6); g_object_unref (src); - vala_namespace_add_delegate (VALA_NAMESPACE (parent_symbol), cb); - vala_source_file_add_node (current_source_file, VALA_CODE_NODE (cb)); + if (VALA_IS_CLASS (parent_symbol)) { + vala_class_add_delegate (VALA_CLASS (parent_symbol), cb); + } else if (VALA_IS_INTERFACE (parent_symbol)) { + vala_interface_add_delegate (VALA_INTERFACE (parent_symbol), cb); + } else if (VALA_IS_NAMESPACE (parent_symbol)) { + vala_namespace_add_delegate (VALA_NAMESPACE (parent_symbol), cb); + vala_source_file_add_node (current_source_file, VALA_CODE_NODE (cb)); + } else { + g_assert_not_reached (); + } g_object_unref (parent_symbol); if ($3 != -1) { diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 21194ce..516d81e 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -83,7 +83,8 @@ public class Vala.Class : Typesymbol { private Gee.List classes = new ArrayList (); private Gee.List structs = new ArrayList (); private Gee.List enums = new ArrayList (); - + private Gee.List delegates = new ArrayList (); + /** * Specifies the default construction method. */ @@ -325,6 +326,16 @@ public class Vala.Class : Typesymbol { scope.add (en.name, en); } + /** + * Adds the specified delegate as an inner delegate. + * + * @param d a delegate + */ + public void add_delegate (Delegate! d) { + delegates.add (d); + scope.add (d.name, d); + } + public override void accept (CodeVisitor! visitor) { visitor.visit_class (this); } @@ -377,6 +388,10 @@ public class Vala.Class : Typesymbol { foreach (Enum en in enums) { en.accept (visitor); } + + foreach (Delegate d in delegates) { + d.accept (visitor); + } } public override string! get_cprefix () { diff --git a/vala/valainterface.vala b/vala/valainterface.vala index 089e97d..e3615c1 100644 --- a/vala/valainterface.vala +++ b/vala/valainterface.vala @@ -48,6 +48,7 @@ public class Vala.Interface : Typesymbol { private Gee.List classes = new ArrayList (); private Gee.List structs = new ArrayList (); private Gee.List enums = new ArrayList (); + private Gee.List delegates = new ArrayList (); private string cname; private string lower_case_csuffix; @@ -237,6 +238,16 @@ public class Vala.Interface : Typesymbol { scope.add (en.name, en); } + /** + * Adds the specified delegate as an inner delegate. + * + * @param d a delegate + */ + public void add_delegate (Delegate! d) { + delegates.add (d); + scope.add (d.name, d); + } + public override string get_cname (bool const_type = false) { if (cname == null) { cname = "%s%s".printf (parent_symbol.get_cprefix (), name); @@ -332,6 +343,10 @@ public class Vala.Interface : Typesymbol { foreach (Enum en in enums) { en.accept (visitor); } + + foreach (Delegate d in delegates) { + d.accept (visitor); + } } public override bool is_reference_type () { -- 2.7.4