From: Simon Werbeck Date: Wed, 5 Oct 2016 17:01:58 +0000 (+0200) Subject: Support [HasEmitter] for vala sources X-Git-Tag: 0.35.1~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1ed6ce78bfef1f7d71fd26c4523fc6c8c431bc5;p=thirdparty%2Fvala.git Support [HasEmitter] for vala sources https://bugzilla.gnome.org/show_bug.cgi?id=681356 --- diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 8e923ea7d..e323bed75 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -628,7 +628,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule { if (ma != null && ma.inner is BaseAccess && sig.is_virtual) { // normal return value for base access - } else if (!get_signal_has_emitter (sig)) { + } else if (!get_signal_has_emitter (sig) || ma.source_reference.file == sig.source_reference.file) { return_result_via_out_param = true; } } diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index 3f4d15d58..628b28c7c 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -1182,6 +1182,10 @@ public class Vala.GIRWriter : CodeVisitor { if (!check_accessibility (sig)) { return; } + + if (sig.emitter != null) { + sig.emitter.accept (this); + } write_indent (); buffer.append_printf (" i + 12); + + var res = f.bar (30); + assert (res == 42); +} diff --git a/vala/valasignal.vala b/vala/valasignal.vala index 17e858fd1..d11180fb3 100644 --- a/vala/valasignal.vala +++ b/vala/valasignal.vala @@ -59,6 +59,12 @@ public class Vala.Signal : Symbol, Lockable, Callable { * */ 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; @@ -158,6 +164,9 @@ public class Vala.Signal : Symbol, Lockable, Callable { } else if (default_handler != null) { default_handler.accept (visitor); } + if (emitter != null) { + emitter.accept (visitor); + } } public bool get_lock_used () { @@ -219,6 +228,33 @@ public class Vala.Signal : Symbol, Lockable, Callable { 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 ()));