]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support concrete accessors for abstract properties in bindings
authorLuca Bruno <lucabru@src.gnome.org>
Mon, 22 Dec 2014 11:00:17 +0000 (12:00 +0100)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 22 Dec 2014 11:00:40 +0000 (12:00 +0100)
Fixes bug 730744

codegen/valaccodebasemodule.vala
codegen/valagtypemodule.vala
vala/valagirparser.vala
vala/valausedattr.vala

index e87b0b1309efcbd4d65487f345d42ca9a3102aa8..e1c6a6357fa74c3bd4172612c4ec25748696650c 100644 (file)
@@ -6322,6 +6322,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                return p.get_attribute ("NoAccessorMethod") != null;
        }
 
+       public static bool get_ccode_concrete_accessor (Property p) {
+               return p.get_attribute ("ConcreteAccessor") != null;
+       }
+
        public static bool get_ccode_has_type_id (TypeSymbol sym) {
                return sym.get_attribute_bool ("CCode", "has_type_id", true);
        }
index 8d547efdbd7101abe700068c3d4861f9138f2777..b25cec4c538a82943cbafdef5ec95d53ad127bea 100644 (file)
@@ -1227,7 +1227,7 @@ public class Vala.GTypeModule : GErrorModule {
                        var ccast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (get_ccode_upper_case_name (base_type))));
                        ccast.add_argument (new CCodeIdentifier ("klass"));
 
-                       if (!get_ccode_no_accessor_method (prop.base_property)) {
+                       if (!get_ccode_no_accessor_method (prop.base_property) && !get_ccode_concrete_accessor (prop.base_property)) {
                                if (prop.get_accessor != null) {
                                        string cname = CCodeBaseModule.get_ccode_real_name (prop.get_accessor);
                                        ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), new CCodeIdentifier (cname));
@@ -1393,7 +1393,7 @@ public class Vala.GTypeModule : GErrorModule {
                        
                        var ciface = new CCodeIdentifier ("iface");
 
-                       if (!get_ccode_no_accessor_method (prop.base_interface_property)) {
+                       if (!get_ccode_no_accessor_method (prop.base_interface_property) && !get_ccode_concrete_accessor (prop.base_interface_property)) {
                                if (prop.get_accessor != null) {
                                        string cname = CCodeBaseModule.get_ccode_real_name (prop.get_accessor);
                                        if (prop.is_abstract || prop.is_virtual) {
index 270bd21d88f4759bd198bf4994d3512d8cfd321a..9d8ef159c32b12390c2da223e4fae32ae928e5ad 100644 (file)
@@ -982,7 +982,7 @@ public class Vala.GirParser : CodeVisitor {
                                        if (prop.get_accessor != null) {
                                                var m = getter != null ? getter.symbol as Method : null;
                                                // ensure getter vfunc if the property is abstract
-                                               if (m != null && (m.is_abstract || m.is_virtual || !prop.is_abstract)) {
+                                               if (m != null) {
                                                        getter.process (parser);
                                                        if (m.return_type is VoidType || m.get_parameters().size != 0) {
                                                                prop.set_attribute ("NoAccessorMethod", true);
@@ -994,26 +994,39 @@ public class Vala.GirParser : CodeVisitor {
                                                                                }
                                                                        }
                                                                }
+                                                               
                                                                prop.get_accessor.value_type.value_owned = m.return_type.value_owned;
+
+                                                               if (!m.is_abstract && !m.is_virtual && prop.is_abstract) {
+                                                                       prop.set_attribute ("ConcreteAccessor", true);
+                                                               }
                                                        }
                                                } else {
                                                        prop.set_attribute ("NoAccessorMethod", true);
                                                }
                                        }
+
                                        if (prop.get_attribute ("NoAccessorMethod") == null && prop.set_accessor != null && prop.set_accessor.writable) {
                                                var m = setter != null ? setter.symbol as Method : null;
                                                // ensure setter vfunc if the property is abstract
-                                               if (m != null && (m.is_abstract || m.is_virtual || !prop.is_abstract)) {
+                                               if (m != null) {
                                                        setter.process (parser);
                                                        if (!(m.return_type is VoidType) || m.get_parameters().size != 1) {
                                                                prop.set_attribute ("NoAccessorMethod", true);
+                                                               prop.set_attribute ("ConcreteAccessor", false);
                                                        } else {
                                                                prop.set_accessor.value_type.value_owned = m.get_parameters()[0].variable_type.value_owned;
+                                                               if (prop.get_attribute ("ConcreteAccessor") != null && !m.is_abstract && !m.is_virtual && prop.is_abstract) {
+                                                                       prop.set_attribute ("ConcreteAccessor", true);
+                                                                       prop.set_attribute ("NoAccessorMethod", false);
+                                                               }
                                                        }
                                                } else {
                                                        prop.set_attribute ("NoAccessorMethod", true);
+                                                       prop.set_attribute ("ConcreteAccessor", false);
                                                }
                                        }
+
                                        if (prop.get_attribute ("NoAccessorMethod") != null) {
                                                // gobject defaults
                                                if (prop.get_accessor != null) {
index 7fc325980e9e841109022832747a62efca43a841..8d9c24ca000784932e950bd3b9297528278f2ba0 100644 (file)
@@ -53,6 +53,7 @@ public class Vala.UsedAttr : CodeVisitor {
                "GenericAccessors", "",
                "Diagnostics", "",
                "NoAccessorMethod", "",
+               "ConcreteAccessor", "",
                "HasEmitter", "",
                "ReturnsModifiedPointer", "",
                "Deprecated", "since", "replacement", "",