summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2014-09-14 11:19:00 +0200
committerLuca Bruno <lucabru@src.gnome.org>2014-09-14 11:43:07 +0200
commit20cb52c5ac94dc2fc1a36930f341938e91025706 (patch)
treea896af4b4efd5415bd76b90575d541a3d849b06c
parent37e0fd3508c7487620406489a490d37642c2c2e4 (diff)
downloadvala-20cb52c5ac94dc2fc1a36930f341938e91025706.tar.gz
girwriter: Write accessor methods for interface properties
Fixes bug 733115
-rw-r--r--codegen/valagirwriter.vala40
-rw-r--r--vala/valapropertyaccessor.vala29
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);
}