diff options
author | Luca Bruno <lucabru@src.gnome.org> | 2014-09-14 11:19:00 +0200 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2014-09-14 11:43:07 +0200 |
commit | 20cb52c5ac94dc2fc1a36930f341938e91025706 (patch) | |
tree | a896af4b4efd5415bd76b90575d541a3d849b06c | |
parent | 37e0fd3508c7487620406489a490d37642c2c2e4 (diff) | |
download | vala-20cb52c5ac94dc2fc1a36930f341938e91025706.tar.gz |
girwriter: Write accessor methods for interface properties
Fixes bug 733115
-rw-r--r-- | codegen/valagirwriter.vala | 40 | ||||
-rw-r--r-- | vala/valapropertyaccessor.vala | 29 |
2 files changed, 68 insertions, 1 deletions
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("<field name=\"%s\">\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 ("</field>\n"); + } + + if (prop.set_accessor != null) { + var m = prop.set_accessor.get_method (); + write_indent (); + buffer.append_printf("<field name=\"%s\">\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 ("</field>\n"); + } + } + } + indent--; write_indent (); buffer.append_printf ("</record>\n"); @@ -1128,6 +1154,20 @@ public class Vala.GIRWriter : CodeVisitor { indent--; write_indent (); buffer.append_printf ("</property>\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); } |