[vala] codegen: Support gobject-style chainup to base class that has generics



commit a4af16f9e0f18f1ac4b33943c482de6b2bc63edd
Author: Luca Bruno <lucabru src gnome org>
Date:   Sat Jul 16 09:02:38 2011 +0200

    codegen: Support gobject-style chainup to base class that has generics
    
    Fixes bug 654702.

 codegen/valaccodebasemodule.vala       |   19 +++++++++++++------
 codegen/valaccodemethodcallmodule.vala |    7 ++++++-
 tests/Makefile.am                      |    1 +
 tests/objects/bug654702.vala           |   12 ++++++++++++
 4 files changed, 32 insertions(+), 7 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index d9b3800..e553fbc 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -4024,10 +4024,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	public virtual void generate_error_domain_declaration (ErrorDomain edomain, CCodeFile decl_space) {
 	}
 
-	public void add_generic_type_arguments (Map<int,CCodeExpression> arg_map, List<DataType> type_args, CodeNode expr, bool is_chainup = false) {
+	public void add_generic_type_arguments (Map<int,CCodeExpression> arg_map, List<DataType> type_args, CodeNode expr, bool is_chainup = false, List<TypeParameter>? type_parameters = null) {
 		int type_param_index = 0;
 		foreach (var type_arg in type_args) {
-			arg_map.set (get_param_pos (0.1 * type_param_index + 0.01), get_type_id_expression (type_arg, is_chainup));
+			if (type_parameters != null) {
+				var type_param_name = type_parameters.get (type_param_index).name.down ();
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.01), new CCodeConstant ("\"%s_type\"".printf (type_param_name)));
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), new CCodeConstant ("\"%s_dup_func\"".printf (type_param_name)));
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.05), new CCodeConstant ("\"%s_destroy_func\"".printf (type_param_name)));
+			}
+
+			arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), get_type_id_expression (type_arg, is_chainup));
 			if (requires_copy (type_arg)) {
 				var dup_func = get_dup_func_expression (type_arg, type_arg.source_reference, is_chainup);
 				if (dup_func == null) {
@@ -4035,11 +4042,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 					expr.error = true;
 					return;
 				}
-				arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), new CCodeCastExpression (dup_func, "GBoxedCopyFunc"));
-				arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), get_destroy_func_expression (type_arg, is_chainup));
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.04), new CCodeCastExpression (dup_func, "GBoxedCopyFunc"));
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.06), get_destroy_func_expression (type_arg, is_chainup));
 			} else {
-				arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), new CCodeConstant ("NULL"));
-				arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), new CCodeConstant ("NULL"));
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.04), new CCodeConstant ("NULL"));
+				arg_map.set (get_param_pos (0.1 * type_param_index + 0.06), new CCodeConstant ("NULL"));
 			}
 			type_param_index++;
 		}
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index 2d615b7..ce536bb 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -133,7 +133,12 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 					// chain up to base class
 					foreach (DataType base_type in current_class.get_base_types ()) {
 						if (base_type.data_type is Class) {
-							add_generic_type_arguments (in_arg_map, base_type.get_type_arguments (), expr, true);
+							List<TypeParameter> type_parameters = null;
+							if (m.get_real_cname () == "g_object_new") {
+								// gobject-style chainup
+								type_parameters = ((Class) base_type.data_type).get_type_parameters ();
+							}
+							add_generic_type_arguments (in_arg_map, base_type.get_type_arguments (), expr, true, type_parameters);
 							break;
 						}
 					}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f77549b..9f750c5 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -102,6 +102,7 @@ TESTS = \
 	objects/bug642809.vala \
 	objects/bug643711.vala \
 	objects/bug653138.vala \
+	objects/bug654702.vala \
 	errors/errors.vala \
 	errors/bug567181.vala \
 	errors/bug579101.vala \
diff --git a/tests/objects/bug654702.vala b/tests/objects/bug654702.vala
new file mode 100644
index 0000000..3b98cf7
--- /dev/null
+++ b/tests/objects/bug654702.vala
@@ -0,0 +1,12 @@
+class Foo<T> : Object {
+}
+
+class Bar : Foo<string> {
+	public Bar () {
+		Object ();
+	}
+}
+
+void main () {
+	new Bar ();
+}



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