diff options
author | JCWasmx86 <JCWasmx86@t-online.de> | 2022-06-04 09:54:22 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2023-04-29 21:00:17 +0200 |
commit | 32d82925b592e88a02449d2ac88cd6cb899393fd (patch) | |
tree | c7db77139138dfe4cc3f4ca4691cf056773c1e10 | |
parent | 3c405889c2a8dbe915a0636785cbe6163bcdd25c (diff) | |
download | vala-32d82925b592e88a02449d2ac88cd6cb899393fd.tar.gz |
Fix duplicate member names
-rw-r--r-- | dbusgen/tests/test-codegen.xml | 3 | ||||
-rw-r--r-- | dbusgen/tests/test-codegen.xml.vala-expected | 2 | ||||
-rw-r--r-- | dbusgen/valadbusparser.vala | 34 |
3 files changed, 38 insertions, 1 deletions
diff --git a/dbusgen/tests/test-codegen.xml b/dbusgen/tests/test-codegen.xml index f9b8b3a2f..17576c646 100644 --- a/dbusgen/tests/test-codegen.xml +++ b/dbusgen/tests/test-codegen.xml @@ -16,6 +16,9 @@ <annotation name="org.gtk.GDBus.DocString" value="out param doc"/> </arg> </method> + <signal name="HelloWorld"> + <arg name="greeting" direction="in" type="s" /> + </signal> <method name="TestPrimitiveTypes"> <arg direction="in" type="y" name="val_byte" /> diff --git a/dbusgen/tests/test-codegen.xml.vala-expected b/dbusgen/tests/test-codegen.xml.vala-expected index 42c2f32b0..eca8e5666 100644 --- a/dbusgen/tests/test-codegen.xml.vala-expected +++ b/dbusgen/tests/test-codegen.xml.vala-expected @@ -75,6 +75,8 @@ public interface OrgProjectBar : GLib.Object { public abstract string[] unset_ag { owned get; set; } [DBus (name = "unset_struct", signature = "(idsogayasaoag)")] public abstract GLib.Variant unset_struct { owned get; set; } + [DBus (name = "HelloWorld")] + public signal void hello_world0 (string greeting); /*Signal documentation.*/ public signal void test_signal (int32 val_int32, string[] array_of_strings, string[] array_of_bytestrings, [DBus (signature = "a{s(ii)}")] GLib.Variant dict_s_to_pairs); public signal void another_signal (string word); diff --git a/dbusgen/valadbusparser.vala b/dbusgen/valadbusparser.vala index 8910852b9..5eda72861 100644 --- a/dbusgen/valadbusparser.vala +++ b/dbusgen/valadbusparser.vala @@ -53,7 +53,11 @@ public class Vala.DBusParser : CodeVisitor { private SourceLocation end; private HashMap<string, DBusExtension> extensions = new HashMap<string, DBusExtension> (); + // Used for guarding against duplicate argument names private Set<string> argnames = new HashSet<string> (str_hash, str_equal); + // Used for guarding against duplicate member names (signals, properties and methods) + private Set<string> member_names = new HashSet<string> (str_hash, str_equal); + private int duplicate_counter; public int dbus_timeout { get; set; } @@ -165,6 +169,8 @@ public class Vala.DBusParser : CodeVisitor { } private void parse_interface_body () { + member_names.clear (); + duplicate_counter = 0; while (current_token == MarkupTokenType.START_ELEMENT) { switch (reader.name) { case "annotation": @@ -306,6 +312,7 @@ public class Vala.DBusParser : CodeVisitor { } private void parse_method () { + var duplicate = false; start_element ("method"); string? name = reader.get_attribute ("name"); if (name == null) { @@ -320,16 +327,23 @@ public class Vala.DBusParser : CodeVisitor { } else { needs_name = true; } + if (name in member_names) { + duplicate = true; + name = "%s%u".printf (name, duplicate_counter++); + } current_node = current_method = new Method (name, dbus_module.void_type.copy (), get_current_src ()); ((Method)current_method).is_abstract = true; ((Method)current_method).access = SymbolAccessibility.PUBLIC; ((Method)current_method).add_error_type (dbus_module.gio_error_type); ((Method)current_method).add_error_type (dbus_module.gdbus_error_type); - + member_names.add (name); if (needs_name) { current_node.set_attribute_string ("DBus", "name", name); } + if (duplicate) { + current_node.set_attribute_string ("DBus", "name", reader.get_attribute ("name")); + } next (); @@ -362,6 +376,7 @@ public class Vala.DBusParser : CodeVisitor { } private void parse_property () { + var duplicate = false; start_element ("property"); string? name = reader.get_attribute ("name"); @@ -392,14 +407,22 @@ public class Vala.DBusParser : CodeVisitor { } else { needs_name = true; } + if (name in member_names) { + duplicate = true; + name = "%s%u".printf (name, duplicate_counter++); + } current_node = current_property = new Property (name, data_type, null, null, get_current_src ()); current_property.is_abstract = true; current_property.access = SymbolAccessibility.PUBLIC; + member_names.add (name); if (needs_name) { current_node.set_attribute_string ("DBus", "name", name); } + if (duplicate) { + current_node.set_attribute_string ("DBus", "name", reader.get_attribute ("name")); + } next (); @@ -534,6 +557,7 @@ public class Vala.DBusParser : CodeVisitor { } private void parse_signal () { + var duplicate = false; start_element ("signal"); string? name = reader.get_attribute ("name"); @@ -549,13 +573,21 @@ public class Vala.DBusParser : CodeVisitor { } else { needs_name = true; } + if (name in member_names) { + duplicate = true; + name = "%s%u".printf (name, duplicate_counter++); + } current_node = current_method = new Signal (name, dbus_module.void_type.copy ()); ((Signal)current_node).access = SymbolAccessibility.PUBLIC; + member_names.add (name); if (needs_name) { current_node.set_attribute_string ("DBus", "name", name); } + if (duplicate) { + current_node.set_attribute_string ("DBus", "name", reader.get_attribute ("name")); + } next (); |