CCodeFunctionCall fc;
- if (return_type.type_symbol != null || return_type is ArrayType) {
+ if (return_type.type_symbol != null || return_type is ArrayType || return_type is GenericType) {
ccode.add_declaration (get_value_type_name_from_type_reference (return_type), new CCodeVariableDeclarator ("v_return"));
fc = new CCodeFunctionCall (new CCodeIdentifier ("g_return_if_fail"));
}
fc.add_argument (new CCodeIdentifier ("data2"));
- if (return_type.type_symbol != null || return_type is ArrayType) {
+ if (return_type.type_symbol != null || return_type is ArrayType || return_type is GenericType) {
ccode.add_assignment (new CCodeIdentifier ("v_return"), fc);
CCodeFunctionCall set_fc;
objects/signals-dynamic-lambda-handler.test \
objects/signals-error-marshal.vala \
objects/signals-fundamental-return.vala \
+ objects/signals-generic-return.vala \
objects/signals-gobject-return.vala \
objects/signals-lambda-delegate.vala \
objects/signals-prototype-access.vala \
--- /dev/null
+class Foo<G,T> : Object {
+ public signal G on_foo ();
+ public signal T on_bar ();
+}
+
+int cb_foo () {
+ return 23;
+}
+
+string cb_bar () {
+ return "foo";
+}
+
+void main () {
+ {
+ var foo = new Foo<int,string> ();
+ foo.on_foo.connect (() => {
+ return 42;
+ });
+ foo.on_bar.connect (() => {
+ return "bar";
+ });
+
+ var bar = foo.on_foo ();
+ assert (bar == 42);
+ var bar2 = foo.on_bar ();
+ assert (bar2 == "bar");
+ }
+ {
+ var foo = new Foo<int,string> ();
+ foo.on_foo.connect (cb_foo);
+ foo.on_bar.connect (cb_bar);
+
+ var bar = foo.on_foo ();
+ assert (bar == 23);
+ var bar2 = foo.on_bar ();
+ assert (bar2 == "foo");
+ }
+}
generated_delegate.sender_type = sender_param_type;
- bool is_generic = false;
+ bool is_generic = actual_return_type.is_generic ();
foreach (Parameter param in parameters) {
var actual_param = param.copy ();
generated_delegate.add_type_parameter (new TypeParameter (type_param.name, type_param.source_reference));
}
- // parameter types must refer to the delegate type parameters
+ // return type and parameter types must refer to the delegate type parameters
// instead of to the class type parameters
+ foreach (var type_param in generated_delegate.get_type_parameters ()) {
+ actual_return_type.replace_type_parameter (cl.get_type_parameters ().get (cl.get_type_parameter_index (type_param.name)), type_param);
+ }
foreach (var param in generated_delegate.get_parameters ()) {
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);