From: Rico Tzschichholz Date: Sun, 21 Oct 2018 08:34:28 +0000 (+0200) Subject: girparser: Async methods don't allow out-parameters before in-parameters X-Git-Tag: 0.42.5~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b60c22e714d93e9cf30e2cd76250a8aa074352ab;p=thirdparty%2Fvala.git girparser: Async methods don't allow out-parameters before in-parameters In vala out-parameters are always handled in the *_finish implementation and therefore are asynchronous. Report a warning for GIR sources where convert them to pointer-types to create usuable signatures for bindings. See https://gitlab.gnome.org/GNOME/vala/issues/636 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index e8f49bd09..93cbe1611 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -429,6 +429,7 @@ TESTS = \ gir/bug792998.test \ gir/array-fixed-length.test \ gir/async-result-pos.test \ + gir/async-sync-out.test \ gir/class.test \ gir/delegate-alias-without-target.test \ gir/delegate-closure-destroy-index-conflict.test \ diff --git a/tests/gir/async-sync-out.test b/tests/gir/async-sync-out.test new file mode 100644 index 000000000..48956f61d --- /dev/null +++ b/tests/gir/async-sync-out.test @@ -0,0 +1,58 @@ +GIR + +Input: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Output: + +[CCode (cheader_filename = "test.h", type_id = "test_foo_get_type ()")] +public class Foo : GLib.Object { + [CCode (has_construct_function = false)] + public Foo (); + public async void method_async (string input, string* sync_output, out string output) throws GLib.Error; +} diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index 0bc1c52d2..eac90147e 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -4062,6 +4062,20 @@ public class Vala.GirParser : CodeVisitor { void process_async_method (Node node) { var m = (Method) node.symbol; + + // TODO: async methods with out-parameters before in-parameters are not supported + bool requires_pointer = false; + foreach (var param in m.get_parameters ()) { + if (param.direction == ParameterDirection.IN) { + requires_pointer = true; + } else if (requires_pointer) { + param.direction = ParameterDirection.IN; + param.variable_type.nullable = false; + param.variable_type = new PointerType (param.variable_type); + Report.warning (param.source_reference, "Synchronous out-parameters are not supported in async methods"); + } + } + string finish_method_base; if (m.name == null) { assert (m is CreationMethod);