From: Luca Bruno Date: Sun, 14 Sep 2014 09:19:00 +0000 (+0200) Subject: girwriter: Write accessor methods for interface properties X-Git-Tag: 0.25.4~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20cb52c5ac94dc2fc1a36930f341938e91025706;p=thirdparty%2Fvala.git girwriter: Write accessor methods for interface properties Fixes bug 733115 --- diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index 3aff8c632..e855e1e71 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -578,6 +578,32 @@ public class Vala.GIRWriter : CodeVisitor { } } + foreach (var prop in iface.get_properties ()) { + if (prop.is_abstract || prop.is_virtual) { + if (prop.get_accessor != null) { + var m = prop.get_accessor.get_method (); + write_indent (); + buffer.append_printf("\n", m.name); + indent++; + do_write_signature (m, "callback", true, m.name, CCodeBaseModule.get_ccode_name (m), m.get_parameters (), m.return_type, m.tree_can_fail, false); + indent--; + write_indent (); + buffer.append_printf ("\n"); + } + + if (prop.set_accessor != null) { + var m = prop.set_accessor.get_method (); + write_indent (); + buffer.append_printf("\n", m.name); + indent++; + do_write_signature (m, "callback", true, m.name, CCodeBaseModule.get_ccode_name (m), m.get_parameters (), m.return_type, m.tree_can_fail, false); + indent--; + write_indent (); + buffer.append_printf ("\n"); + } + } + } + indent--; write_indent (); buffer.append_printf ("\n"); @@ -1128,6 +1154,20 @@ public class Vala.GIRWriter : CodeVisitor { indent--; write_indent (); buffer.append_printf ("\n"); + + if (prop.get_accessor != null) { + var m = prop.get_accessor.get_method (); + if (m != null) { + visit_method (m); + } + } + + if (prop.set_accessor != null) { + var m = prop.set_accessor.get_method (); + if (m != null) { + visit_method (m); + } + } } public override void visit_signal (Signal sig) { diff --git a/vala/valapropertyaccessor.vala b/vala/valapropertyaccessor.vala index 466fe6c18..057e44207 100644 --- a/vala/valapropertyaccessor.vala +++ b/vala/valapropertyaccessor.vala @@ -114,6 +114,30 @@ public class Vala.PropertyAccessor : Subroutine { } } + /** + * Get the method representing this property accessor + * @return null if the accessor is neither readable nor writable + */ + public Method? get_method () { + Method? m = null; + if (readable) { + m = new Method ("get_"+prop.name, value_type, source_reference, comment); + } else if (writable) { + m = new Method ("set_"+prop.name, new VoidType(), source_reference, comment); + m.add_parameter (value_parameter.copy ()); + } + + if (m != null) { + m.owner = prop.owner; + m.access = access; + m.binding = prop.binding; + m.is_abstract = prop.is_abstract; + m.is_virtual = prop.is_virtual; + } + + return m; + } + public override bool check (CodeContext context) { if (checked) { return !error; @@ -130,6 +154,10 @@ public class Vala.PropertyAccessor : Subroutine { context.analyzer.current_symbol = this; + if (writable || construction) { + value_parameter = new Parameter ("value", value_type, source_reference); + } + if (prop.source_type == SourceFileType.SOURCE) { if (body == null && !prop.interface_only && !prop.is_abstract) { /* no accessor body specified, insert default body */ @@ -157,7 +185,6 @@ public class Vala.PropertyAccessor : Subroutine { if (body != null) { if (writable || construction) { - value_parameter = new Parameter ("value", value_type, source_reference); body.scope.add (value_parameter.name, value_parameter); }