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;
}
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) {
}
}
- 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);
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 \
--- /dev/null
+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 ();
+}