[vala] girwriter: Write accessor methods for interface properties
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] girwriter: Write accessor methods for interface properties
- Date: Sun, 14 Sep 2014 10:03:56 +0000 (UTC)
commit 20cb52c5ac94dc2fc1a36930f341938e91025706
Author: Luca Bruno <lucabru src gnome org>
Date: Sun Sep 14 11:19:00 2014 +0200
girwriter: Write accessor methods for interface properties
Fixes bug 733115
codegen/valagirwriter.vala | 40 ++++++++++++++++++++++++++++++++++++++++
vala/valapropertyaccessor.vala | 29 ++++++++++++++++++++++++++++-
2 files changed, 68 insertions(+), 1 deletions(-)
---
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala
index 3aff8c6..e855e1e 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 466fe6c..057e442 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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]