]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girparser: improve support for generic type arguments
authorEvan Nemerson <evan@coeus-group.com>
Fri, 21 May 2010 08:04:48 +0000 (01:04 -0700)
committerEvan Nemerson <evan@coeus-group.com>
Fri, 18 Jun 2010 21:44:54 +0000 (14:44 -0700)
vala/valagirparser.vala

index 11a58c2ba50d26e6cb1bf019972f0e22e0cd2845..8cd241d6b4afdb2e10d47598b9e8ebb5ec5b0e68 100644 (file)
@@ -348,8 +348,9 @@ public class Vala.GirParser : CodeVisitor {
                string transfer = reader.get_attribute ("transfer-ownership");
                string allow_none = reader.get_attribute ("allow-none");
                next ();
-               var type = &ctype != null ? parse_type(out ctype) : parse_type ();
-               if (transfer == "full") {
+               var transfer_elements = transfer == "full";
+               var type = &ctype != null ? parse_type(out ctype, null, transfer_elements) : parse_type (null, null, transfer_elements);
+               if (transfer == "full" || transfer == "container") {
                        type.value_owned = true;
                }
                if (allow_none == "1") {
@@ -394,8 +395,8 @@ public class Vala.GirParser : CodeVisitor {
                        param = new FormalParameter.with_ellipsis (get_current_src ());
                        end_element ("varargs");
                } else {
-                       var type = parse_type (null, out array_length_idx);
-                       if (transfer == "full") {
+                       var type = parse_type (null, out array_length_idx, transfer == "full");
+                       if (transfer == "full" || transfer == "container") {
                                type.value_owned = true;
                        }
                        if (allow_none == "1") {
@@ -412,7 +413,7 @@ public class Vala.GirParser : CodeVisitor {
                return param;
        }
 
-       DataType parse_type (out string? ctype = null, out int array_length_index = null) {
+       DataType parse_type (out string? ctype = null, out int array_length_index = null, bool transfer_elements = false) {
                if (reader.name == "array") {
                        start_element ("array");
                        if (reader.get_attribute ("length") != null
@@ -436,7 +437,9 @@ public class Vala.GirParser : CodeVisitor {
 
                        // type arguments / element types
                        while (current_token == MarkupTokenType.START_ELEMENT) {
-                               parse_type ();
+                               var element_type = parse_type ();
+                               element_type.value_owned = transfer_elements;
+                               type.add_type_argument (element_type);
                        }
 
                        end_element ("type");