objects/signals-fundamental-return.vala \
objects/signals-gobject-return.vala \
objects/signals-lambda-delegate.vala \
+ objects/signals-prototype-access.vala \
+ objects/signals-prototype-access-invalid.test \
+ objects/signals-prototype-access-invalid-2.test \
objects/signals-struct-return.vala \
objects/singleton.vala \
objects/test-025.vala \
--- /dev/null
+Invalid Code
+
+delegate void FooFunc ();
+
+class Foo {
+ public signal int bar ();
+}
+
+void main () {
+ var foo = new Foo ();
+ FooFunc func = Foo.bar;
+}
--- /dev/null
+Invalid Code
+
+[CCode (has_target = false)]
+delegate void FooFunc (Foo foo);
+
+class Foo {
+ public signal int bar ();
+
+ public void manam (FooFunc func) {
+ }
+}
+
+void main () {
+ var foo = new Foo ();
+ foo.manam (Foo.bar);
+}
--- /dev/null
+[CCode (has_target = false)]
+delegate int FooFunc (Foo foo);
+
+delegate int BarFunc ();
+
+class Foo {
+ [HasEmitter]
+ public virtual signal int bar () {
+ return 23;
+ }
+
+ public void manam (FooFunc func) {
+ assert (func (this) == 23);
+ }
+
+ public void minim (BarFunc func) {
+ assert (func () == 23);
+ }
+}
+
+void main () {
+ var foo = new Foo ();
+ {
+ foo.manam (Foo.bar);
+ foo.manam ((FooFunc) Foo.bar);
+ }
+ {
+ FooFunc func = Foo.bar;
+ assert (func (foo) == 23);
+ }
+ {
+ FooFunc func = (FooFunc) Foo.bar;
+ assert (func (foo) == 23);
+ }
+ {
+ foo.minim (foo.bar);
+ foo.minim ((BarFunc) foo.bar);
+ }
+ {
+ BarFunc func = foo.bar;
+ assert (func () == 23);
+ }
+ {
+ BarFunc func = (BarFunc) foo.bar;
+ assert (func () == 23);
+ }
+}
return false;
}
+ if (symbol_reference is Signal) {
+ unowned Signal sig = (Signal) symbol_reference;
+ unowned CodeNode? ma = this;
+ while (ma.parent_node is MemberAccess) {
+ ma = ma.parent_node;
+ }
+ unowned CodeNode? parent = ma.parent_node;
+ if (parent != null && !(parent is ElementAccess) && !(((MemberAccess) ma).inner is BaseAccess)
+ && (!(parent is MethodCall) || ((MethodCall) parent).get_argument_list ().contains (this))) {
+ if (sig.get_attribute ("HasEmitter") != null) {
+ if (!sig.check (context)) {
+ return false;
+ }
+ symbol_reference = sig.emitter;
+ } else {
+ error = true;
+ Report.error (source_reference, "Signal `%s' requires emitter in this context".printf (symbol_reference.get_full_name ()));
+ return false;
+ }
+ }
+ }
+
unowned Symbol? member = symbol_reference;
var access = SymbolAccessibility.PUBLIC;
bool instance = false;
default_handler.check (context);
}
- if (!external_package && get_attribute ("HasEmitter") != null) {
+ if (get_attribute ("HasEmitter") != null) {
emitter = new Method (name, return_type, source_reference);
emitter.owner = owner;
unowned ObjectTypeSymbol? cl = parent_symbol as ObjectTypeSymbol;
cl.add_hidden_method (emitter);
- emitter.check (context);
+ if (!external_package) {
+ emitter.check (context);
+ }
}