]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Respect finish[_vfunc]_name attributes defined in vala sources
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 27 Feb 2019 13:29:47 +0000 (14:29 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 27 Feb 2019 13:29:47 +0000 (14:29 +0100)
codegen/valaccodeattribute.vala
codegen/valaccodemethodmodule.vala
tests/Makefile.am
tests/asynchronous/finish-name.vala [new file with mode: 0644]

index d6399e4595f9b40093299c0e959767238b1a166b..e41a75ca0697763f178bc64b1465e6b258dd120e 100644 (file)
@@ -503,7 +503,12 @@ public class Vala.CCodeAttribute : AttributeCache {
        public string finish_real_name {
                get {
                        if (_finish_real_name == null) {
-                               _finish_real_name = get_finish_name_for_basename (real_name);
+                               unowned Method? m = node as Method;
+                               if (m != null && !(m is CreationMethod) && !(m.is_abstract || m.is_virtual)) {
+                                       _finish_real_name = finish_name;
+                               } else {
+                                       _finish_real_name = get_finish_name_for_basename (real_name);
+                               }
                        }
                        return _finish_real_name;
                }
index bc7a3b2a1d8f0669836689df131b05b7394c9a7c..2269742e9615dae8087ddcfd9488ea9d7df3752c 100644 (file)
@@ -1094,11 +1094,12 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
        public void generate_vfunc (Method m, DataType return_type, Map<int,CCodeParameter> cparam_map, Map<int,CCodeExpression> carg_map, string suffix = "", int direction = 3) {
                push_context (new EmitContext ());
 
-               string cname = get_ccode_name (m);
-               if (suffix == "_finish" && cname.has_suffix ("_async")) {
-                       cname = cname.substring (0, cname.length - "_async".length);
+               CCodeFunction vfunc;
+               if (suffix == "_finish") {
+                       vfunc = new CCodeFunction (get_ccode_finish_name (m));
+               } else {
+                       vfunc = new CCodeFunction (get_ccode_name (m));
                }
-               var vfunc = new CCodeFunction (cname + suffix);
 
                CCodeExpression vcast;
                if (m.parent_symbol is Interface) {
@@ -1116,11 +1117,13 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                        }
                }
 
-               cname = get_ccode_vfunc_name (m);
-               if (suffix == "_finish" && cname.has_suffix ("_async")) {
-                       cname = cname.substring (0, cname.length - "_async".length);
+               CCodeFunctionCall vcall;
+               if (suffix == "_finish") {
+                       vcall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, get_ccode_finish_vfunc_name (m)));
+               } else {
+                       vcall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, get_ccode_vfunc_name (m)));
                }
-               var vcall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, cname + suffix));
+
                carg_map.set (get_param_pos (get_ccode_instance_pos (m)), new CCodeIdentifier ("self"));
 
                generate_cparameters (m, cfile, cparam_map, vfunc, null, carg_map, vcall, direction);
index a3334240317600e10ef6ee3ff50c852a04b56391..76b93f2c34845b5ce99846eec784b6e972d0a528 100644 (file)
@@ -426,6 +426,7 @@ TESTS = \
        asynchronous/catch-error-scope.vala \
        asynchronous/catch-in-finally.vala \
        asynchronous/closures.vala \
+       asynchronous/finish-name.vala \
        asynchronous/generator.vala \
        asynchronous/out-parameter-invalid.test \
        asynchronous/result-pos.vala \
diff --git a/tests/asynchronous/finish-name.vala b/tests/asynchronous/finish-name.vala
new file mode 100644 (file)
index 0000000..bea4c3f
--- /dev/null
@@ -0,0 +1,56 @@
+public class Foo {
+       [CCode (finish_name = "foo_new_end")]
+       public async Foo.async () {
+       }
+
+       [CCode (finish_name = "foo_bar_end")]
+       public async string bar () {
+               return "bar";
+       }
+       [CCode (finish_name = "foo_baz_end", finish_vfunc_name = "baz_end")]
+       public virtual async string baz () {
+               return "baz";
+       }
+}
+
+public class Bar : Foo {
+       [CCode (finish_name = "bar_baz_end")]
+       public override async string baz () {
+               return "baz_bar";
+       }
+}
+
+[CCode (finish_name = "manam_end")]
+public async string manam () {
+       return "manam";
+}
+
+MainLoop loop;
+
+void main () {
+       loop = new MainLoop ();
+
+       var foo = new Foo ();
+       foo.bar.begin ((o,r) => {
+               var res = foo.bar.end (r);
+               assert (res == "bar");
+       });
+       foo.baz.begin ((o,r) => {
+               var res = foo.baz.end (r);
+               assert (res == "baz");
+       });
+
+       var bar = new Bar ();
+       bar.baz.begin ((o,r) => {
+               var res = bar.baz.end (r);
+               assert (res == "baz_bar");
+       });
+
+       manam.begin ((o,r) => {
+               var res = manam.end (r);
+               assert (res == "manam");
+               loop.quit ();
+       });
+
+       loop.run ();
+}