* */
public Method default_handler { get; private set; }
+ /**
+ * Refers to the public signal emitter method, which is an anonymous
+ * function in the scope.
+ * */
+ public Method emitter { get; private set; }
+
private bool lock_used = false;
private DataType _return_type;
} else if (default_handler != null) {
default_handler.accept (visitor);
}
+ if (emitter != null) {
+ emitter.accept (visitor);
+ }
}
public bool get_lock_used () {
default_handler.check (context);
}
+ if (!external_package && get_attribute ("HasEmitter") != null) {
+ emitter = new Method (name, return_type, source_reference);
+
+ emitter.owner = owner;
+ emitter.access = access;
+
+ var body = new Block (source_reference);
+ var call = new MethodCall (new MemberAccess.simple (name, source_reference), source_reference);
+
+ foreach (Parameter param in parameters) {
+ emitter.add_parameter (param);
+ call.add_argument (new MemberAccess.simple (param.name, source_reference));
+ }
+
+ if (return_type is VoidType) {
+ body.add_statement (new ExpressionStatement (call, source_reference));
+ } else {
+ body.add_statement (new ReturnStatement (call, source_reference));
+ }
+ emitter.body = body;
+
+ var cl = parent_symbol as ObjectTypeSymbol;
+
+ cl.add_hidden_method (emitter);
+ emitter.check (context);
+ }
+
if (!external_package && !hides && get_hidden_member () != null) {
Report.warning (source_reference, "%s hides inherited signal `%s'. Use the `new' keyword if hiding was intentional".printf (get_full_name (), get_hidden_member ().get_full_name ()));