[vala] girwriter: Write accessor methods for interface properties



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]