]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girparser: Add array_length_field metadata
authorLuca Bruno <lucabru@src.gnome.org>
Tue, 24 May 2011 18:28:24 +0000 (20:28 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Tue, 24 May 2011 18:28:24 +0000 (20:28 +0200)
vala/valagirparser.vala

index a1038c2903f29dd38b0a529dd81915126d948294..41351d1f743bf8d9874e5946479c4a60162e3096 100644 (file)
@@ -63,7 +63,8 @@ public class Vala.GirParser : CodeVisitor {
                SCOPE,
                STRUCT,
                THROWS,
-               PRINTF_FORMAT;
+               PRINTF_FORMAT,
+               ARRAY_LENGTH_FIELD;
 
                public static ArgumentType? from_string (string name) {
                        var enum_class = (EnumClass) typeof(ArgumentType).class_ref ();
@@ -751,17 +752,28 @@ public class Vala.GirParser : CodeVisitor {
                                                parser.process_virtual_method_field (this, d, parser.parse_symbol_from_string (gtype_struct_for, d.source_reference));
                                                merged = true;
                                        } else if (field.variable_type is ArrayType) {
-                                               var array_length = parent.lookup ("n_%s".printf (field.name));
-                                               if (array_length == null) {
-                                                       array_length = parent.lookup ("%s_length".printf (field.name));
+                                               Node array_length;
+                                               if (metadata.has_argument (ArgumentType.ARRAY_LENGTH_FIELD)) {
+                                                       array_length = parent.lookup (metadata.get_string (ArgumentType.ARRAY_LENGTH_FIELD));
+                                               } else {
+                                                       array_length = parent.lookup ("n_%s".printf (field.name));
+                                                       if (array_length == null) {
+                                                               array_length = parent.lookup ("%s_length".printf (field.name));
+                                                       }
                                                }
-                                               if (array_length != null) {
+                                               if (array_length != null && array_length.symbol is Field) {
+                                                       var length_field = (Field) array_length.symbol;
                                                        // array has length
-                                                       field.set_array_length_cname (array_length.symbol.name);
+                                                       field.set_array_length_cname (length_field.name);
+                                                       var length_type = length_field.variable_type.to_qualified_string ();
+                                                       if (length_type != "int") {
+                                                               var st = parser.context.root.scope.lookup (length_type) as Struct;
+                                                               if (st != null) {
+                                                                       field.array_length_type = st.get_cname ();
+                                                               }
+                                                       }
                                                        field.no_array_length = false;
                                                        field.array_null_terminated = false;
-                                                       array_length.processed = true;
-                                                       array_length.merged = true;
                                                }
                                        }
                                } else if (symbol is Signal || symbol is Delegate) {