[vala/staging] girparser: Recognize error parameter before delegate target parameter



commit e69bbb71c1b548023e6a0994f414280857dce714
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Thu Jan 10 11:24:36 2019 +0100

    girparser: Recognize error parameter before delegate target parameter
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/265

 tests/Makefile.am                 |  1 +
 tests/gir/delegate-error-pos.test | 29 +++++++++++++++++++++++++++++
 vala/valagirparser.vala           | 17 ++++++++++++++++-
 3 files changed, 46 insertions(+), 1 deletion(-)
---
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++;
                }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]