diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-05-03 15:32:04 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-08-06 13:49:45 +0200 |
commit | 9070aa92c34efc742c25b465f06975b4c77e0d60 (patch) | |
tree | 9333437ab0860527a1b1f80ea2fef747b22cb533 | |
parent | 6bb15292942e56a1cfee9c369a4854f4d886637d (diff) | |
download | vala-9070aa92c34efc742c25b465f06975b4c77e0d60.tar.gz |
girwriter: Write implicit fields for arrays and delegates
-rw-r--r-- | codegen/valagirwriter.vala | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index 7c843e6af..25800212e 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -939,6 +939,50 @@ public class Vala.GIRWriter : CodeVisitor { indent--; write_indent (); buffer.append_printf ("</field>\n"); + + if (f.variable_type is ArrayType && CCodeBaseModule.get_ccode_array_length (f)) { + var array_type = (ArrayType) f.variable_type; + if (!array_type.fixed_length) { + var int_type = new IntegerType (context.root.scope.lookup ("int") as Struct); + for (var i = 0; i < array_type.rank; i++) { + write_indent (); + buffer.append_printf ("<field name=\"%s_length%i\"", CCodeBaseModule.get_ccode_name (f), i + 1); + write_symbol_attributes (f); + buffer.append_printf (">\n"); + indent++; + write_type (int_type); + indent--; + write_indent (); + buffer.append_printf ("</field>\n"); + } + } + } else if (f.variable_type is DelegateType) { + var deleg_type = (DelegateType) f.variable_type; + if (deleg_type.delegate_symbol.has_target) { + write_indent (); + buffer.append_printf ("<field name=\"%s\"", CCodeBaseModule.get_ccode_delegate_target_name (f)); + write_symbol_attributes (f); + buffer.append_printf (">\n"); + indent++; + write_indent (); + buffer.append_printf ("<type name=\"gpointer\" c:type=\"gpointer\"/>\n"); + indent--; + write_indent (); + buffer.append_printf ("</field>\n"); + if (deleg_type.is_disposable ()) { + write_indent (); + buffer.append_printf ("<field name=\"%s\"", ((CCodeBaseModule) context.codegen).get_delegate_target_destroy_notify_cname (CCodeBaseModule.get_ccode_name (f))); + write_symbol_attributes (f); + buffer.append_printf (">\n"); + indent++; + write_indent (); + buffer.append_printf ("<type name=\"GLib.DestroyNotify\" c:type=\"GDestroyNotify\"/>\n"); + indent--; + write_indent (); + buffer.append_printf ("</field>\n"); + } + } + } } private void write_implicit_params (DataType? type, ref int index, bool has_array_length, string? name, ParameterDirection direction) { |