]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Support renamed signals 9bee48897a2a77fd8be3ab77379190cd3a3ff9ba
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 6 Jun 2017 15:39:41 +0000 (17:39 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 7 Jun 2017 06:11:31 +0000 (08:11 +0200)
The CCode attribute 'cname' needs to be the canonical representation as it
is expected in C.

https://bugzilla.gnome.org/show_bug.cgi?id=731547

codegen/valaccodeattribute.vala
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valagdbusclientmodule.vala
codegen/valagdbusmodule.vala
codegen/valagdbusservermodule.vala
codegen/valagirwriter.vala
codegen/valagsignalmodule.vala
tests/Makefile.am
tests/objects/bug731547.vala [new file with mode: 0644]
vala/valagirparser.vala

index ec41f82b119ac3ab2a8f9dedf1bce1bbc282e465..491b42ac510bc136d959fe8e78d826174acf6b54 100644 (file)
@@ -408,7 +408,12 @@ public class Vala.CCodeAttribute : AttributeCache {
                                        _vfunc_name = ccode.get_string ("vfunc_name");
                                }
                                if (_vfunc_name == null) {
-                                       _vfunc_name = sym.name;
+                                       Method m = node as Method;
+                                       if (m != null && m.signal_reference != null) {
+                                               _vfunc_name = CCodeBaseModule.get_ccode_lower_case_name (m.signal_reference);
+                                       } else {
+                                               _vfunc_name = sym.name;
+                                       }
                                }
                        }
                        return _vfunc_name;
@@ -621,6 +626,9 @@ public class Vala.CCodeAttribute : AttributeCache {
                                if (m.is_async_callback) {
                                        return "%s_co".printf (CCodeBaseModule.get_ccode_real_name ((Method) m.parent_symbol));
                                }
+                               if (m.signal_reference != null) {
+                                       return "%s%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), CCodeBaseModule.get_ccode_lower_case_name (m.signal_reference));
+                               }
                                if (sym.name == "main" && sym.parent_symbol.name == null) {
                                        // avoid conflict with generated main function
                                        return "_vala_main";
@@ -639,7 +647,7 @@ public class Vala.CCodeAttribute : AttributeCache {
                                        return "%sset_%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (t), acc.prop.name);
                                }
                        } else if (sym is Signal) {
-                               return Symbol.camel_case_to_lower_case (sym.name);
+                               return Symbol.camel_case_to_lower_case (sym.name).replace ("_", "-");;
                        } else if (sym is LocalVariable || sym is Parameter) {
                                return sym.name;
                        } else {
@@ -777,6 +785,8 @@ public class Vala.CCodeAttribute : AttributeCache {
                                csuffix = csuffix.substring (0, csuffix.length - "_class".length) + "class";
                        }
                        return csuffix;
+               } else if (sym is Signal) {
+                       return CCodeBaseModule.get_ccode_attribute (sym).name.replace ("-", "_");
                } else if (sym.name != null) {
                        return Symbol.camel_case_to_lower_case (sym.name);
                }
@@ -1271,12 +1281,18 @@ public class Vala.CCodeAttribute : AttributeCache {
                } else if (sym is Method) {
                        var m = (Method) sym;
                        if (m.base_method != null || m.base_interface_method != null) {
+                               string m_name;
+                               if (m.signal_reference != null) {
+                                       m_name = CCodeBaseModule.get_ccode_lower_case_name (m.signal_reference);
+                               } else {
+                                       m_name = m.name;
+                               }
                                if (m.base_interface_type != null) {
                                        return "%sreal_%s%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol),
                                                                                                 CCodeBaseModule.get_ccode_lower_case_prefix (m.base_interface_type.data_type),
-                                                                                                m.name);
+                                                                                                m_name);
                                } else {
-                                       return "%sreal_%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), m.name);
+                                       return "%sreal_%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), m_name);
                                }
                        } else {
                                return name;
index b6bb7708f484ca23180ae5d0549a519236b1a82a..1c3bdee1d8fcc02f3e0c27b8d6f719395c12dc2e 100644 (file)
@@ -6139,6 +6139,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        }
                        if (sym is Delegate) {
                                return "%s%s%s".printf (get_ccode_lower_case_prefix (sym.parent_symbol), infix, Symbol.camel_case_to_lower_case (sym.name));
+                       } else if (sym is Signal) {
+                               return get_ccode_attribute (sym).name.replace ("-", "_");
                        } else if (sym is ErrorCode) {
                                return get_ccode_name (sym).down ();
                        } else {
@@ -6471,7 +6473,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        public CCodeConstant get_signal_canonical_constant (Signal sig, string? detail = null) {
-               return new CCodeConstant ("\"%s%s\"".printf (get_ccode_name (sig).replace ("_", "-"), (detail != null ? "::%s".printf (detail) : "")));
+               return new CCodeConstant ("\"%s%s\"".printf (get_ccode_name (sig), (detail != null ? "::%s".printf (detail) : "")));
        }
 
        public static CCodeConstant get_enum_value_canonical_cconstant (EnumValue ev) {
index 7150c4e4a34179d447873b99080dd2333ad9185a..abb88929abd52b6401ba6c3e57df106af222eb7e 100644 (file)
@@ -181,7 +181,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                if (dynamic_sig != null) {
                        delegate_name = get_dynamic_signal_cname (dynamic_sig);
                } else if (sig != null) {
-                       delegate_name = get_ccode_lower_case_prefix (sig.parent_symbol) + get_ccode_name (sig);
+                       delegate_name = get_ccode_lower_case_prefix (sig.parent_symbol) + get_ccode_lower_case_name (sig);
                } else {
                        delegate_name = Symbol.camel_case_to_lower_case (get_ccode_name (d));
                }
index dd8b405eb9045864efd5769cbe117452c4eb4dce..4d9caa1d317b3cc889e4190f34955fd1f06e5445 100644 (file)
@@ -436,7 +436,7 @@ public class Vala.GDBusClientModule : GDBusModule {
        }
 
        string generate_dbus_signal_handler (Signal sig, ObjectTypeSymbol sym) {
-               string wrapper_name = "_dbus_handle_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_name (sig));
+               string wrapper_name = "_dbus_handle_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_lower_case_name (sig));
 
                var function = new CCodeFunction (wrapper_name);
                function.modifiers = CCodeModifiers.STATIC;
index 0a6404ad89884ce9a7a5321e72eca9c5b675c26d..f8bdaa9c8ef5d4a1ae50e364d88af5f324143a83 100644 (file)
@@ -371,31 +371,31 @@ public class Vala.GDBusModule : GVariantModule {
                                info.append (new CCodeConstant ("\"%s\"".printf (get_type_signature (param.variable_type, param))));
 
                                var cdecl = new CCodeDeclaration ("const GDBusArgInfo");
-                               cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig) + "_" + param.name, info));
+                               cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig) + "_" + param.name, info));
                                cdecl.modifiers = CCodeModifiers.STATIC;
                                cfile.add_constant_declaration (cdecl);
 
-                               args_info.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig) + "_" + param.name)));
+                               args_info.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig) + "_" + param.name)));
                        }
 
                        args_info.append (new CCodeConstant ("NULL"));
 
                        var cdecl = new CCodeDeclaration ("const GDBusArgInfo * const");
-                       cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig) + "[]", args_info));
+                       cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig) + "[]", args_info));
                        cdecl.modifiers = CCodeModifiers.STATIC;
                        cfile.add_constant_declaration (cdecl);
 
                        var info = new CCodeInitializerList ();
                        info.append (new CCodeConstant ("-1"));
                        info.append (new CCodeConstant ("\"%s\"".printf (get_dbus_name_for_member (sig))));
-                       info.append (new CCodeCastExpression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig))), "GDBusArgInfo **"));
+                       info.append (new CCodeCastExpression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig))), "GDBusArgInfo **"));
 
                        cdecl = new CCodeDeclaration ("const GDBusSignalInfo");
-                       cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_name (sig), info));
+                       cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_lower_case_name (sig), info));
                        cdecl.modifiers = CCodeModifiers.STATIC;
                        cfile.add_constant_declaration (cdecl);
 
-                       infos.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_name (sig))));
+                       infos.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_lower_case_name (sig))));
                }
 
                infos.append (new CCodeConstant ("NULL"));
index d0c87fd64f403760dcf0fc87bf897959192e1e80..68909c05f038e29a1a29d48763a88b237a47d101 100644 (file)
@@ -409,7 +409,7 @@ public class Vala.GDBusServerModule : GDBusClientModule {
        }
 
        string generate_dbus_signal_wrapper (Signal sig, ObjectTypeSymbol sym, string dbus_iface_name) {
-               string wrapper_name = "_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_name (sig));
+               string wrapper_name = "_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_lower_case_name (sig));
 
                var function = new CCodeFunction (wrapper_name, "void");
                function.modifiers = CCodeModifiers.STATIC;
@@ -616,7 +616,7 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                                // disconnect the signals
                                var disconnect_call = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_handlers_disconnect_by_func"));
                                disconnect_call.add_argument (new CCodeElementAccess (new CCodeIdentifier ("data"), new CCodeConstant ("0")));
-                               disconnect_call.add_argument (new CCodeIdentifier ("_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_name (sig))));
+                               disconnect_call.add_argument (new CCodeIdentifier ("_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_lower_case_name (sig))));
                                disconnect_call.add_argument (new CCodeIdentifier ("data"));
                                ccode.add_expression (disconnect_call);
                        }
index c252b2d32b2c589cf75b4741a85825d105da98ea..ad84d3c06600dfeb0793a20f7c2896f7b31964f8 100644 (file)
@@ -417,7 +417,7 @@ public class Vala.GIRWriter : CodeVisitor {
                        foreach (Signal sig in cl.get_signals ()) {
                                if (sig.default_handler != null) {
                                        write_indent ();
-                                       buffer.append_printf ("<field name=\"%s\">\n", sig.name);
+                                       buffer.append_printf ("<field name=\"%s\">\n", CCodeBaseModule.get_ccode_lower_case_name (sig));
                                        indent++;
                                        write_signature (sig.default_handler, "callback", false, true);
                                        indent--;
index 00c06c196bb91059e5b9b757fcb89c64fa43f7b9..1c0eff476e4e908e8efd470e61e92e749b4e2be0 100644 (file)
@@ -145,7 +145,7 @@ public class Vala.GSignalModule : GObjectModule {
        private CCodeExpression get_signal_id_cexpression (Signal sig) {
                var cl = (TypeSymbol) sig.parent_symbol;
                var signal_array = new CCodeIdentifier ("%s_signals".printf (get_ccode_lower_case_name (cl)));
-               var signal_enum_value = new CCodeIdentifier ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name (cl), sig.name.ascii_up ()));
+               var signal_enum_value = new CCodeIdentifier ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name (cl), get_ccode_upper_case_name (sig)));
 
                return new CCodeElementAccess (signal_array, signal_enum_value);
        }
@@ -189,7 +189,7 @@ public class Vala.GSignalModule : GObjectModule {
                        }
                }
 
-               signal_enum.add_value (new CCodeEnumValue ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name ((TypeSymbol)sig.parent_symbol), sig.name.ascii_up ())));
+               signal_enum.add_value (new CCodeEnumValue ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name ((TypeSymbol)sig.parent_symbol), get_ccode_upper_case_name (sig))));
 
                sig.accept_children (this);
 
@@ -569,7 +569,7 @@ public class Vala.GSignalModule : GObjectModule {
                                        }
                                        emitter_func = get_ccode_lower_case_name (sig.emitter);
                                } else {
-                                       emitter_func = "%s_%s".printf (get_ccode_lower_case_name (cl), sig.name);
+                                       emitter_func = "%s_%s".printf (get_ccode_lower_case_name (cl), get_ccode_lower_case_name (sig));
                                }
                                var ccall = new CCodeFunctionCall (new CCodeIdentifier (emitter_func));
 
@@ -670,7 +670,7 @@ public class Vala.GSignalModule : GObjectModule {
                        // dynamic_signal_connect or dynamic_signal_disconnect
 
                        // second argument: signal name
-                       ccall.add_argument (new CCodeConstant ("\"%s\"".printf (sig.name)));
+                       ccall.add_argument (new CCodeConstant ("\"%s\"".printf (get_ccode_name (sig))));
                } else if (!disconnect) {
                        // g_signal_connect_object or g_signal_connect
 
index 9571dceca00ec38f2bd85f3865252a5767e51d1e..c6341307cb73e24f17fe7479a5a17985b8e8e6b9 100644 (file)
@@ -211,6 +211,7 @@ TESTS = \
        objects/bug701978.vala \
        objects/bug702736.vala \
        objects/bug702846.vala \
+       objects/bug731547.vala \
        objects/bug751338.vala \
        objects/bug758816.vala \
        objects/bug760031.test \
diff --git a/tests/objects/bug731547.vala b/tests/objects/bug731547.vala
new file mode 100644 (file)
index 0000000..a42ab73
--- /dev/null
@@ -0,0 +1,36 @@
+public class Foo : Object {
+       [CCode (cname = "baz")]
+       public signal void foo ();
+       [CCode (cname = "baz-bar")]
+       public signal void foo_bar ();
+       [CCode (cname = "baz-virt")]
+       public virtual signal void foo_virt () {
+               callback ();
+       }
+}
+
+int baz = 0;
+
+void callback () {
+       baz++;
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.foo.connect (callback);
+       foo.foo_bar.connect (callback);
+
+       foo.foo ();
+       assert (baz == 1);
+       foo.foo_bar ();
+       assert (baz == 2);
+       foo.foo_virt ();
+       assert (baz == 3);
+
+       Signal.emit_by_name (foo, "baz");
+       assert (baz == 4);
+       Signal.emit_by_name (foo, "baz-bar");
+       assert (baz == 5);
+       Signal.emit_by_name (foo, "baz-virt");
+       assert (baz == 6);
+}
index 9b4c0e8dc5ce11bb97fd9aeafdae3100f04c8a51..08573b67784ca673cede2f48b704697090e8b72a 100644 (file)
@@ -3086,6 +3086,12 @@ public class Vala.GirParser : CodeVisitor {
                s.comment = comment;
                s.external = true;
 
+               if (s is Signal) {
+                       if (current.girdata["name"] != name.replace ("_", "-")) {
+                               s.set_attribute_string ("CCode", "cname", current.girdata["name"]);
+                       }
+               }
+
                if (s is Method) {
                        var m = (Method) s;
                        if (symbol_type == "virtual-method" || symbol_type == "callback") {