[vala/staging: 2/2] codegen: Handle property initializers of non-gobject classes



commit 9b3eedbe81718a7a0bd9e5a97e4796e0eaa65e7f
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sat Apr 14 12:35:53 2018 +0200

    codegen: Handle property initializers of non-gobject classes
    
    73e553ac3488d641fb08b275bcf2636e3cf0de67 introduced this for GObject classes only
    
    Add a warning for property default values in structs and compact classes.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=795225

 codegen/valagobjectmodule.vala |   21 ---------------------
 codegen/valagtypemodule.vala   |   34 ++++++++++++++++++++++++++++++++++
 tests/objects/bug701978.vala   |   13 +++++++++++++
 3 files changed, 47 insertions(+), 21 deletions(-)
---
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala
index 82eba07..11aa6e6 100644
--- a/codegen/valagobjectmodule.vala
+++ b/codegen/valagobjectmodule.vala
@@ -688,27 +688,6 @@ public class Vala.GObjectModule : GTypeModule {
 
                if (is_gobject_property (prop) && prop.parent_symbol is Class) {
                        prop_enum.add_value (new CCodeEnumValue ("%s_PROPERTY".printf 
(get_ccode_upper_case_name (prop))));
-
-                       if (prop.initializer != null && prop.set_accessor != null && 
!prop.set_accessor.automatic_body) {
-                               // generate a custom initializer if it couldn't be done at class_init time
-                               bool has_spec_initializer = prop.property_type.data_type is Enum;
-                               if (!has_spec_initializer && prop.property_type.data_type is Struct) {
-                                       var param_spec_func = get_ccode_param_spec_function 
(prop.property_type.data_type);
-                                       has_spec_initializer = param_spec_func != "g_param_spec_boxed";
-                               }
-                               if (!has_spec_initializer) {
-                                       push_context (instance_init_context);
-
-                                       prop.initializer.emit (this);
-
-                                       var inst_ma = new MemberAccess.simple ("this");
-                                       inst_ma.target_value = new GLibValue (get_data_type_for_symbol 
((Class) prop.parent_symbol), new CCodeIdentifier ("self"), true);
-                                       store_property (prop, inst_ma, prop.initializer.target_value);
-
-                                       temp_ref_values.clear ();
-                                       pop_context ();
-                               }
-                       }
                }
        }
 
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index daad49c..c227ac1 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -2392,6 +2392,40 @@ public class Vala.GTypeModule : GErrorModule {
                        Report.error (prop.source_reference, "Property 'type' not allowed");
                        return;
                }
+
+               if (prop.initializer != null) {
+                       if (cl == null || cl.is_compact) {
+                               Report.warning (prop.source_reference, "Only properties in non-compact 
classes are allowed to have initializers");
+                       } else if (prop.set_accessor != null && !prop.set_accessor.automatic_body) {
+                               // generate a custom initializer if it couldn't be done at class_init time
+                               bool has_spec_initializer = prop.property_type.data_type is Enum;
+                               if (!has_spec_initializer && prop.property_type.data_type is Struct) {
+                                       var param_spec_func = get_ccode_param_spec_function 
(prop.property_type.data_type);
+                                       has_spec_initializer = param_spec_func != "g_param_spec_boxed";
+                               }
+                               if (!has_spec_initializer) {
+                                       push_context (instance_init_context);
+
+                                       prop.initializer.emit (this);
+
+                                       var inst_ma = new MemberAccess.simple ("this");
+                                       inst_ma.target_value = new GLibValue (get_data_type_for_symbol (cl), 
new CCodeIdentifier ("self"), true);
+
+                                       var prop_init_value = (GLibValue) prop.initializer.target_value;
+                                       if (prop_init_value.delegate_target_cvalue == null) {
+                                               prop_init_value.delegate_target_cvalue = new CCodeConstant 
("NULL");
+                                       }
+                                       if (prop_init_value.delegate_target_destroy_notify_cvalue == null) {
+                                               prop_init_value.delegate_target_destroy_notify_cvalue = new 
CCodeConstant ("NULL");
+                                       }
+                                       store_property (prop, inst_ma, prop_init_value);
+
+                                       temp_ref_values.clear ();
+                                       pop_context ();
+                               }
+                       }
+               }
+
                base.visit_property (prop);
        }
 
diff --git a/tests/objects/bug701978.vala b/tests/objects/bug701978.vala
index 22fcfaf..aa809c1 100644
--- a/tests/objects/bug701978.vala
+++ b/tests/objects/bug701978.vala
@@ -16,7 +16,20 @@ public class Bar : Object {
        }
 }
 
+public class Baz {
+       private Foo _foo;
+
+       public Foo foo {
+               get { return _foo; }
+               set { _foo = value; }
+               default = Foo ();
+       }
+}
+
 void main () {
        var bar = new Bar();
        assert (bar.foo.val == 55);
+
+       var baz = new Baz();
+       assert (baz.foo.val == 55);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]