[vala/switch-to-gir: 21/24] girparser: Better support for arrays in return type.



commit 513ac2ffdd1a27c517e90fc769e032eec4addb8d
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat Nov 20 10:58:06 2010 +0100

    girparser: Better support for arrays in return type.

 vala/valagirparser.vala                |   61 +++++++++++++++++++++++++------
 vapi/packages/gio-2.0/Gio-2.0.metadata |    6 ++--
 2 files changed, 52 insertions(+), 15 deletions(-)
---
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index d2fdcaa..4558be0 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -1231,6 +1231,33 @@ public class Vala.GirParser : CodeVisitor {
 		return name;
 	}
 
+	void set_array_ccode (Symbol sym, ParameterInfo info) {
+		if (sym is Method) {
+			var m = (Method) sym;
+			m.carray_length_parameter_position = info.vala_idx;
+		} else if (sym is Delegate) {
+			var d = (Delegate) sym;
+			d.carray_length_parameter_position = info.vala_idx;
+		} else {
+			var param = (Parameter) sym;
+			param.carray_length_parameter_position = info.vala_idx;
+			param.set_array_length_cname (info.param.name);
+		}
+		if (info.param.variable_type.to_qualified_string () != "int") {
+			var unresolved_type = (UnresolvedType) info.param.variable_type;
+			var resolved_struct = resolve_symbol (glib_ns.scope, unresolved_type.unresolved_symbol) as Struct;
+			if (resolved_struct != null) {
+				if (sym is Method) {
+					var m = (Method) sym;
+					m.array_length_type = resolved_struct.get_cname ();
+				} else {
+					var param = (Parameter) sym;
+					param.array_length_type = resolved_struct.get_cname ();
+				}
+			}
+		}
+	}
+
 	void parse_repository () {
 		start_element ("repository");
 		if (reader.get_attribute ("version") != GIR_VERSION) {
@@ -2343,6 +2370,13 @@ public class Vala.GirParser : CodeVisitor {
 			}
 			end_element ("parameters");
 		}
+		var array_length_idx = -1;
+		if (return_type is ArrayType && metadata.has_argument (ArgumentType.ARRAY_LENGTH_IDX)) {
+			array_length_idx = metadata.get_integer (ArgumentType.ARRAY_LENGTH_IDX);
+			parameters[array_length_idx].keep = false;
+			array_length_parameters.add (array_length_idx);
+		}
+
 		int i = 0, j=1;
 
 		int last = -1;
@@ -2395,18 +2429,8 @@ public class Vala.GirParser : CodeVisitor {
 						Report.error (get_current_src (), "invalid array_length index");
 						continue;
 					}
-					info.param.carray_length_parameter_position = parameters[info.array_length_idx].vala_idx;
-					var length_param = parameters[info.array_length_idx].param;
-					info.param.set_array_length_cname (parameters[info.array_length_idx].param.name);
-					if (length_param.variable_type.to_qualified_string () != "int") {
-						var unresolved_type = (UnresolvedType) length_param.variable_type;
-						var resolved_struct = resolve_symbol (glib_ns.scope, unresolved_type.unresolved_symbol) as Struct;
-						if (resolved_struct != null) {
-							info.param.array_length_type = resolved_struct.get_cname ();
-						}
-					}
-				}
-				if (info.param.variable_type is ArrayType && info.array_length_idx == -1) {
+					set_array_ccode (info.param, parameters[info.array_length_idx]);
+				} else if (info.param.variable_type is ArrayType) {
 					info.param.no_array_length = true;
 				}
 
@@ -2426,6 +2450,19 @@ public class Vala.GirParser : CodeVisitor {
 				}
 			}
 		}
+		if (array_length_idx != -1) {
+			if (array_length_idx >= parameters.size) {
+				Report.error (get_current_src (), "invalid array_length index");
+			} else {
+				set_array_ccode (s, parameters[array_length_idx]);
+			}
+		} else if (return_type is ArrayType) {
+			if (s is Method) {
+				((Method) s).no_array_length = true;
+			} else {
+				((Delegate) s).no_array_length = true;
+			}
+		}
 
 		if (throws_string == "1") {
 			s.add_error_type (new ErrorType (null, null));
diff --git a/vapi/packages/gio-2.0/Gio-2.0.metadata b/vapi/packages/gio-2.0/Gio-2.0.metadata
index 2d34c33..95a968a 100644
--- a/vapi/packages/gio-2.0/Gio-2.0.metadata
+++ b/vapi/packages/gio-2.0/Gio-2.0.metadata
@@ -18,9 +18,9 @@ AppLaunchContext
 	.get_display.files type_arguments="File"
 	.get_startup_notify_id.files type_arguments="File"
 ApplicationCommandLine.get_platform_data nullable
-BufferedInputStream.peek.buffer type="uint8[]" array_length_idx=2
-BufferedInputStream.peek_buffer type="unowned uint8[]"
-	.count skip
+
+// Missing GI features
+BufferedInputStream.peek_buffer type="unowned uint8[]" array_length_idx=0
 
 /* OLD METADATA FOR REFERENCE
 GLib cprefix="G" lower_case_cprefix="g_" cheader_filename="gio/gio.h" gir_namespace="Gio" gir_version="2.0"



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