objects/bug620706.vala \
objects/bug624594.vala \
objects/bug626038.vala \
+ objects/bug626038-2.vala \
objects/bug628639.vala \
objects/bug629593.vala \
objects/bug631267.vala \
--- /dev/null
+class Bar<K,V> {
+ public K k;
+ public V v;
+ public Bar (K k, V v) {
+ this.k = k;
+ this.v = v;
+ }
+}
+
+class Foo<G> {
+ public signal void bar (Bar<int,G> item);
+
+ public void fire (Bar<int,G> item) {
+ bar (item);
+ }
+}
+
+bool fired;
+
+void on_bar (Bar<int,string> item) {
+ assert (item.k == 42);
+ assert (item.v == "bar");
+ fired = true;
+}
+
+void main () {
+ Foo<string> foo = new Foo<string> ();
+ foo.bar.connect (on_bar);
+ var bar = new Bar<int,string> (42, "bar");
+ foo.fire (bar);
+ assert (fired);
+}
return result;
}
+ public bool is_generic () {
+ if (this is GenericType) {
+ return true;
+ }
+
+ if (!has_type_arguments ()) {
+ return false;
+ }
+ foreach (var type_arg in type_argument_list) {
+ if (type_arg.is_generic ()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void replace_type_parameter (TypeParameter old_type_param, TypeParameter new_type_param) {
+ if (this is GenericType) {
+ unowned GenericType generic_type = (GenericType) this;
+ if (generic_type.type_parameter == old_type_param) {
+ generic_type.type_parameter = new_type_param;
+ }
+ return;
+ }
+ if (!has_type_arguments ()) {
+ return;
+ }
+ foreach (var type_arg in type_argument_list) {
+ type_arg.replace_type_parameter (old_type_param, new_type_param);
+ }
+ }
+
/**
* Search for the type parameter in this formal type and match it in
* value_type.
actual_param.variable_type = actual_param.variable_type.get_actual_type (sender_type, null, node_reference);
generated_delegate.add_parameter (actual_param);
- if (actual_param.variable_type is GenericType) {
+ if (actual_param.variable_type.is_generic ()) {
is_generic = true;
}
}
// parameter types must refer to the delegate type parameters
// instead of to the class type parameters
foreach (var param in generated_delegate.get_parameters ()) {
- unowned GenericType? generic_type = param.variable_type as GenericType;
- if (generic_type != null) {
- generic_type.type_parameter = generated_delegate.get_type_parameters ().get (generated_delegate.get_type_parameter_index (generic_type.type_parameter.name));
+ foreach (var type_param in generated_delegate.get_type_parameters ()) {
+ param.variable_type.replace_type_parameter (cl.get_type_parameters ().get (cl.get_type_parameter_index (type_param.name)), type_param);
}
}
}