diff options
-rw-r--r-- | tests/Makefile.am | 5 | ||||
-rw-r--r-- | tests/gtktemplate/gtkchild-field-assignment.test | 14 | ||||
-rw-r--r-- | tests/gtktemplate/gtkchild-field-out-assignment.test | 17 | ||||
-rw-r--r-- | tests/gtktemplate/gtkchild-field-ref-assignment.test | 17 | ||||
-rw-r--r-- | tests/gtktemplate/gtkchild-property-assignment.test | 14 | ||||
-rw-r--r-- | tests/gtktemplate/tests-extra-environment.sh | 2 | ||||
-rw-r--r-- | vala/valaassignment.vala | 6 | ||||
-rw-r--r-- | vala/valaproperty.vala | 3 | ||||
-rw-r--r-- | vala/valaunaryexpression.vala | 5 |
9 files changed, 83 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index bca714521..8c001a099 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -709,6 +709,10 @@ TESTS = \ gir/property-non-readable.test \ gir/symbol-type-csuffix.test \ gir/union.test \ + gtktemplate/gtkchild-field-assignment.test \ + gtktemplate/gtkchild-field-out-assignment.test \ + gtktemplate/gtkchild-field-ref-assignment.test \ + gtktemplate/gtkchild-property-assignment.test \ annotations/deprecated.vala \ annotations/description.vala \ annotations/noaccessormethod.test \ @@ -1152,6 +1156,7 @@ LINUX_TESTS += \ endif EXTRA_DIST = \ + gtktemplate/tests-extra-environment.sh \ linux/tests-extra-environment.sh \ nullability/tests-extra-environment.sh \ posix/tests-extra-environment.sh \ diff --git a/tests/gtktemplate/gtkchild-field-assignment.test b/tests/gtktemplate/gtkchild-field-assignment.test new file mode 100644 index 000000000..4fc71f1d9 --- /dev/null +++ b/tests/gtktemplate/gtkchild-field-assignment.test @@ -0,0 +1,14 @@ +Invalid Code + +[GtkTemplate (ui = "/org/example/gtktemplate.ui")] +public class GtkTemplate : Gtk.ApplicationWindow { + [GtkChild] + public unowned Gtk.Button button0; + + void foo () { + button0 = new Gtk.Button (); + } +} + +void main () { +} diff --git a/tests/gtktemplate/gtkchild-field-out-assignment.test b/tests/gtktemplate/gtkchild-field-out-assignment.test new file mode 100644 index 000000000..3f82f4251 --- /dev/null +++ b/tests/gtktemplate/gtkchild-field-out-assignment.test @@ -0,0 +1,17 @@ +Invalid Code + +[GtkTemplate (ui = "/org/example/gtktemplate.ui")] +public class GtkTemplate : Gtk.ApplicationWindow { + [GtkChild] + public unowned Gtk.Button button0; + + void foo () { + bar (out button0); + } + + void bar (out unowned Gtk.Button b) { + } +} + +void main () { +} diff --git a/tests/gtktemplate/gtkchild-field-ref-assignment.test b/tests/gtktemplate/gtkchild-field-ref-assignment.test new file mode 100644 index 000000000..e8dab2e1c --- /dev/null +++ b/tests/gtktemplate/gtkchild-field-ref-assignment.test @@ -0,0 +1,17 @@ +Invalid Code + +[GtkTemplate (ui = "/org/example/gtktemplate.ui")] +public class GtkTemplate : Gtk.ApplicationWindow { + [GtkChild] + public unowned Gtk.Button button0; + + void foo () { + bar (ref button0); + } + + void bar (ref unowned Gtk.Button b) { + } +} + +void main () { +} diff --git a/tests/gtktemplate/gtkchild-property-assignment.test b/tests/gtktemplate/gtkchild-property-assignment.test new file mode 100644 index 000000000..4905ea87c --- /dev/null +++ b/tests/gtktemplate/gtkchild-property-assignment.test @@ -0,0 +1,14 @@ +Invalid Code + +[GtkTemplate (ui = "/org/example/gtktemplate.ui")] +public class GtkTemplate : Gtk.ApplicationWindow { + [GtkChild] + public unowned Gtk.Button button0 { get; set; } + + void foo () { + button0 = new Gtk.Button (); + } +} + +void main () { +} diff --git a/tests/gtktemplate/tests-extra-environment.sh b/tests/gtktemplate/tests-extra-environment.sh new file mode 100644 index 000000000..6c805e648 --- /dev/null +++ b/tests/gtktemplate/tests-extra-environment.sh @@ -0,0 +1,2 @@ +PACKAGES="gtk+-3.0" +VALAFLAGS="--gresources ${abs_srcdir}/gtktemplate/gtktemplate.gresource.xml" diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala index 79090ad9b..4ffc75735 100644 --- a/vala/valaassignment.vala +++ b/vala/valaassignment.vala @@ -178,6 +178,12 @@ public class Vala.Assignment : Expression { return false; } + if (ma.symbol_reference.get_attribute ("GtkChild") != null) { + error = true; + Report.error (source_reference, "Assignment of [GtkChild] `%s' is not allowed", ma.symbol_reference.get_full_name ()); + return false; + } + if (ma.symbol_reference is DynamicProperty) { // target_type not available for dynamic properties } else { diff --git a/vala/valaproperty.vala b/vala/valaproperty.vala index 2fc1b4d60..0a2e437d5 100644 --- a/vala/valaproperty.vala +++ b/vala/valaproperty.vala @@ -492,6 +492,9 @@ public class Vala.Property : Symbol, Lockable { get_accessor.check (context); } if (set_accessor != null) { + if (get_attribute ("GtkChild") != null) { + Report.warning (set_accessor.source_reference, "[GtkChild] property `%s' is not allowed to have `set' accessor", get_full_name ()); + } set_accessor.check (context); } diff --git a/vala/valaunaryexpression.vala b/vala/valaunaryexpression.vala index 76c31cd7a..4bf6d4bc4 100644 --- a/vala/valaunaryexpression.vala +++ b/vala/valaunaryexpression.vala @@ -229,6 +229,11 @@ public class Vala.UnaryExpression : Expression { Report.error (source_reference, "ref and out method arguments can only be used with fields, parameters, local variables, and array element access"); return false; } + if (inner.symbol_reference.get_attribute ("GtkChild") != null) { + error = true; + Report.error (source_reference, "Assignment of [GtkChild] `%s' is not allowed", inner.symbol_reference.get_full_name ()); + return false; + } break; default: error = true; |