Fixes bug 628639.
objects/bug613486.vala \
objects/bug620706.vala \
objects/bug624594.vala \
+ objects/bug628639.vala \
errors/errors.vala \
errors/bug567181.vala \
errors/bug579101.vala \
--- /dev/null
+class Foo<G> {
+ public signal void bar (G item);
+
+ public void fire (G item) {
+ bar (item);
+ }
+}
+
+bool fired;
+
+void on_bar (int item) {
+ assert (item == 42);
+ fired = true;
+}
+
+void main() {
+ Foo<int> foo = new Foo<int> ();
+ foo.bar.connect (on_bar);
+ foo.fire (42);
+ assert (fired);
+}
/* valamethodcall.vala
*
- * Copyright (C) 2006-2010 Jürg Billeter
+ * Copyright (C) 2006-2011 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
if (ma.inner != null) {
target_object_type = ma.inner.value_type;
+
+ // foo is relevant instance in foo.bar.connect (on_bar)
+ if (ma.inner.symbol_reference is Signal) {
+ var sig = ma.inner as MemberAccess;
+ if (sig != null) {
+ target_object_type = sig.inner.value_type;
+ }
+ }
}
if (ma.symbol_reference != null && ma.symbol_reference.get_attribute ("Assert") != null) {
/* valasignal.vala
*
- * Copyright (C) 2006-2010 Jürg Billeter
+ * Copyright (C) 2006-2011 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
generated_delegate.sender_type = sender_param_type;
+ bool is_generic = false;
+
foreach (Parameter param in parameters) {
var actual_param = param.copy ();
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) {
+ is_generic = true;
+ }
+ }
+
+ if (is_generic) {
+ var cl = (ObjectTypeSymbol) parent_symbol;
+ foreach (var type_param in cl.get_type_parameters ()) {
+ generated_delegate.add_type_parameter (new TypeParameter (type_param.name, type_param.source_reference));
+ }
+
+ // parameter types must refer to the delegate type parameters
+ // instead of to the class type parameters
+ foreach (var param in generated_delegate.get_parameters ()) {
+ if (param.variable_type is GenericType) {
+ param.variable_type.type_parameter = generated_delegate.get_type_parameters ().get (generated_delegate.get_type_parameter_index (param.variable_type.type_parameter.name));
+ }
+ }
}
scope.add (null, generated_delegate);
/* valasignaltype.vala
*
- * Copyright (C) 2007-2009 Jürg Billeter
+ * Copyright (C) 2007-2011 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
}
DelegateType get_handler_type () {
- var sender_type = new ObjectType ((ObjectTypeSymbol) signal_symbol.parent_symbol);
+ var type_sym = (ObjectTypeSymbol) signal_symbol.parent_symbol;
+
+ var sender_type = new ObjectType (type_sym);
var result = new DelegateType (signal_symbol.get_delegate (sender_type, this));
result.value_owned = true;
+
+ if (result.delegate_symbol.get_type_parameters ().size > 0) {
+ foreach (var type_param in type_sym.get_type_parameters ()) {
+ var type_arg = new GenericType (type_param);
+ type_arg.value_owned = true;
+ result.add_type_argument (type_arg);
+ }
+ }
+
return result;
}