diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-01-10 11:24:36 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-01-10 13:35:05 +0100 |
commit | e69bbb71c1b548023e6a0994f414280857dce714 (patch) | |
tree | 2059b2b9e8c8c814f62b75879563d3e8317fb55d | |
parent | b2fd797bdfc8ee825c64b80b70d1c526472758ac (diff) | |
download | vala-e69bbb71c1b548023e6a0994f414280857dce714.tar.gz |
girparser: Recognize error parameter before delegate target parameter
Fixes https://gitlab.gnome.org/GNOME/vala/issues/265
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/gir/delegate-error-pos.test | 29 | ||||
-rw-r--r-- | vala/valagirparser.vala | 17 |
3 files changed, 46 insertions, 1 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 3144f9c4b..364e3b32c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -449,6 +449,7 @@ TESTS = \ gir/class.test \ gir/delegate-alias-without-target.test \ gir/delegate-closure-destroy-index-conflict.test \ + gir/delegate-error-pos.test \ gir/enum.test \ gir/errordomain.test \ gir/parameter-nullable-out-simple-type.test \ diff --git a/tests/gir/delegate-error-pos.test b/tests/gir/delegate-error-pos.test new file mode 100644 index 000000000..37f943d50 --- /dev/null +++ b/tests/gir/delegate-error-pos.test @@ -0,0 +1,29 @@ +GIR + +Input: + +<callback name="Foo" c:type="TestFoo"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="s" transfer-ownership="none"> + <type name="utf8" c:type="const gchar*"/> + </parameter> + <parameter name="error" direction="out" transfer-ownership="full"> + <type name="GLib.Error" c:type="GError**"/> + </parameter> + <parameter name="user_data" + transfer-ownership="none" + nullable="1" + allow-none="1" + closure="2"> + <type name="gpointer" c:type="gpointer"/> + </parameter> + </parameters> +</callback> + +Output: + +[CCode (cheader_filename = "test.h", error_pos = 1.8, instance_pos = 1.9)] +public delegate void Foo (string s) throws GLib.Error; diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index e522d3029..2aed50f2f 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -3060,6 +3060,7 @@ public class Vala.GirParser : CodeVisitor { public int destroy_idx; public bool keep; public bool is_async; + public bool is_error; } void parse_function (string element_name) { @@ -3201,6 +3202,7 @@ public class Vala.GirParser : CodeVisitor { ((Delegate) s).add_error_type (error_type); } } + throws_string = "1"; } else if (throws_string == "1") { if (s is Method) { ((Method) s).add_error_type (new ErrorType (null, null)); @@ -3317,9 +3319,9 @@ public class Vala.GirParser : CodeVisitor { } var info = new ParameterInfo (param, array_length_idx, closure_idx, destroy_idx, scope == "async"); + unowned UnresolvedType? unresolved_type = param.variable_type as UnresolvedType; if (s is Method && scope == "async") { - var unresolved_type = param.variable_type as UnresolvedType; if (unresolved_type != null && unresolved_type.unresolved_symbol.name == "AsyncReadyCallback") { // GAsync-style method ((Method) s).coroutine = true; @@ -3327,6 +3329,14 @@ public class Vala.GirParser : CodeVisitor { } } + if (s is Delegate && throws_string != "1" && param.direction == ParameterDirection.OUT) { + if (unresolved_type != null && unresolved_type.unresolved_symbol.to_string () == "GLib.Error") { + ((Delegate) s).add_error_type (new ErrorType (null, null)); + info.is_error = true; + info.keep = false; + } + } + parameters.add (info); pop_metadata (); } @@ -3896,6 +3906,11 @@ public class Vala.GirParser : CodeVisitor { s.set_attribute_double ("CCode", "async_result_pos", i + shift); } } + if (s is Delegate && info.is_error) { + if (!s.has_attribute_argument ("CCode", "instance_pos")) { + s.set_attribute_double ("CCode", "error_pos", j - 0.2); + } + } i++; } |