From d477db1288902ad87b702b386abc672eceecfce9 Mon Sep 17 00:00:00 2001 From: Jan Hudec Date: Sat, 26 Sep 2009 10:57:46 +0200 Subject: [PATCH] GIR writer: Fix generation of async methods GObject-Introspection does not have any special support for async methods, so we need to write them out as two entries corresponding to the .begin and .end submethods respectively. To avoid code duplication, the Vala.GirWriter.write_signature method is split in two. The inner one takes all attributes that differ between sync and async.begin/end methods as additional arguments and is called twice for the async methods. Signed-off-by: Jan Hudec --- codegen/valagirwriter.vala | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index 029a94997..8b65267ec 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -562,16 +562,30 @@ public class Vala.GIRWriter : CodeVisitor { } private void write_signature (Method m, string tag_name, bool instance = false) { + if (m.coroutine) { + string finish_name = m.name; + if (finish_name.has_suffix ("_async")) { + finish_name = finish_name.substring (0, finish_name.length - "_async".length); + } + finish_name += "_finish"; + do_write_signature (m, tag_name, instance, m.name, m.get_cname (), m.get_async_begin_parameters (), new VoidType (), false); + do_write_signature (m, tag_name, instance, finish_name, m.get_finish_cname (), m.get_async_end_parameters (), m.return_type, m.tree_can_fail); + } else { + do_write_signature (m, tag_name, instance, m.name, m.get_cname (), m.get_parameters (), m.return_type, m.tree_can_fail); + } + } + + private void do_write_signature (Method m, string tag_name, bool instance, string name, string cname, Gee.List params, DataType return_type, bool can_fail) { write_indent (); - stream.printf ("<%s name=\"%s\"", tag_name, m.name); + stream.printf ("<%s name=\"%s\"", tag_name, name); if (tag_name == "virtual-method") { - stream.printf (" invoker=\"%s\"", m.name); + stream.printf (" invoker=\"%s\"", name); } else if (tag_name == "callback") { - stream.printf (" c:type=\"%s\"", m.get_cname ()); + stream.printf (" c:type=\"%s\"", cname); } else { - stream.printf (" c:identifier=\"%s\"", m.get_cname ()); + stream.printf (" c:identifier=\"%s\"", cname); } - if (m.tree_can_fail) { + if (can_fail) { stream.printf (" throws=\"1\""); } stream.printf (">\n"); @@ -584,9 +598,9 @@ public class Vala.GIRWriter : CodeVisitor { instance_type = CCodeBaseModule.get_data_type_for_symbol ((TypeSymbol) m.parent_symbol); } - write_params (m.get_parameters (), instance_type); + write_params (params, instance_type); - write_return_type (m.return_type); + write_return_type (return_type); indent--; write_indent (); -- 2.47.3