[vala/staging: 1/2] codegen: Support renamed signals



commit 714a012f3b9c37b450f45a609d30de78136320de
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Tue Jun 6 17:39:41 2017 +0200

    codegen: Support renamed signals
    
    The CCode attribute 'cname' needs to be given as canonical representation
    as it is expected in C.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=731547

 codegen/valaccodeattribute.vala      |    4 +++-
 codegen/valaccodebasemodule.vala     |    4 +++-
 codegen/valaccodedelegatemodule.vala |    2 +-
 codegen/valagdbusclientmodule.vala   |    2 +-
 codegen/valagdbusmodule.vala         |   12 ++++++------
 codegen/valagdbusservermodule.vala   |    4 ++--
 codegen/valagsignalmodule.vala       |    8 ++++----
 tests/Makefile.am                    |    1 +
 tests/objects/bug731547.vala         |   22 ++++++++++++++++++++++
 vala/valagirparser.vala              |    6 ++++++
 10 files changed, 49 insertions(+), 16 deletions(-)
---
diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala
index ec41f82..6f4d175 100644
--- a/codegen/valaccodeattribute.vala
+++ b/codegen/valaccodeattribute.vala
@@ -639,7 +639,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 +777,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);
                }
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index b6bb770..1c3bdee 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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) {
diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala
index 7150c4e..abb8892 100644
--- a/codegen/valaccodedelegatemodule.vala
+++ b/codegen/valaccodedelegatemodule.vala
@@ -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));
                }
diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala
index dd8b405..4d9caa1 100644
--- a/codegen/valagdbusclientmodule.vala
+++ b/codegen/valagdbusclientmodule.vala
@@ -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;
diff --git a/codegen/valagdbusmodule.vala b/codegen/valagdbusmodule.vala
index 0a6404a..f8bdaa9 100644
--- a/codegen/valagdbusmodule.vala
+++ b/codegen/valagdbusmodule.vala
@@ -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"));
diff --git a/codegen/valagdbusservermodule.vala b/codegen/valagdbusservermodule.vala
index d0c87fd..68909c0 100644
--- a/codegen/valagdbusservermodule.vala
+++ b/codegen/valagdbusservermodule.vala
@@ -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);
                        }
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala
index 00c06c1..1c0eff4 100644
--- a/codegen/valagsignalmodule.vala
+++ b/codegen/valagsignalmodule.vala
@@ -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
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9571dce..c634130 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 0000000..4767695
--- /dev/null
+++ b/tests/objects/bug731547.vala
@@ -0,0 +1,22 @@
+public class Foo : Object {
+       [CCode (cname = "baz")]
+       public signal void foo ();
+       [CCode (cname = "baz-bar")]
+       public signal void foo_bar ();
+}
+
+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);
+}
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 9b4c0e8..08573b6 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -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") {


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