From: JCWasmx86 Date: Sat, 4 Jun 2022 07:54:22 +0000 (+0200) Subject: Fix duplicate member names X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=32d82925b592e88a02449d2ac88cd6cb899393fd;p=thirdparty%2Fvala.git Fix duplicate member names --- 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 @@ + + + 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 extensions = new HashMap (); + // Used for guarding against duplicate argument names private Set argnames = new HashSet (str_hash, str_equal); + // Used for guarding against duplicate member names (signals, properties and methods) + private Set member_names = new HashSet (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 ();