]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girparser: Improve detection of AsyncReadyCallback/AsyncResult parameters
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 19 Apr 2020 16:20:41 +0000 (18:20 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 20 Apr 2020 20:03:58 +0000 (22:03 +0200)
vala/valagirparser.vala

index fe4e7455c07c637c3c1922f83cda7234bfcac127..f63b442bdd3a035f134ccf8d553672b4846a9ba9 100644 (file)
@@ -3111,6 +3111,7 @@ public class Vala.GirParser : CodeVisitor {
                public int destroy_idx;
                public bool keep;
                public bool is_async;
+               public bool is_async_result;
                public bool is_error;
        }
 
@@ -3891,11 +3892,26 @@ public class Vala.GirParser : CodeVisitor {
                        }
 
                        // Check and mark GAsync-style methods
-                       if (info.is_async && s is Method) {
+                       if (s is Method) {
+                               string? type_name = null;
                                unowned UnresolvedType? unresolved_type = type as UnresolvedType;
-                               if (unresolved_type != null && unresolved_type.unresolved_symbol.name == "AsyncReadyCallback") {
-                                       ((Method) s).coroutine = true;
-                                       info.keep = false;
+                               if (unresolved_type != null) {
+                                       type_name = unresolved_type.unresolved_symbol.name;
+                               } else if (type != null) {
+                                       type_name = type.to_string ();
+                               }
+                               if (info.is_async) {
+                                       if ((unresolved_type != null && type_name == "AsyncReadyCallback")
+                                           || type_name == "GLib.AsyncReadyCallback" || type_name == "Gio.AsyncReadyCallback"
+                                           || type_name == "GLib.AsyncReadyCallback?" || type_name == "Gio.AsyncReadyCallback?") {
+                                               ((Method) s).coroutine = true;
+                                               info.keep = false;
+                                       }
+                               }
+                               if ((unresolved_type != null && type_name == "AsyncResult")
+                                   || type_name == "GLib.AsyncResult" || type_name == "Gio.AsyncResult"
+                                   || type_name == "GLib.AsyncResult?" || type_name == "Gio.AsyncResult?") {
+                                       info.is_async_result = true;
                                }
                        }
 
@@ -3970,12 +3986,9 @@ public class Vala.GirParser : CodeVisitor {
                        if (first_out < 0 && info.param.direction == ParameterDirection.OUT) {
                                first_out = i;
                        }
-                       if (s is Method && first_out >= 0 && info.param.variable_type != null) {
-                               var type_name = info.param.variable_type.to_string ();
-                               if (type_name == "GLib.AsyncResult" || type_name == "Gio.AsyncResult") {
-                                       var shift = ((Method) s).binding == MemberBinding.INSTANCE ? 1.1 : 0.1;
-                                       s.set_attribute_double ("CCode", "async_result_pos", i + shift);
-                               }
+                       if (first_out >= 0 && info.is_async_result && s is Method) {
+                               var shift = ((Method) s).binding == MemberBinding.INSTANCE ? 1.1 : 0.1;
+                               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")) {