summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJCWasmx86 <JCWasmx86@t-online.de>2022-06-04 09:54:22 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2023-04-29 21:00:17 +0200
commit32d82925b592e88a02449d2ac88cd6cb899393fd (patch)
treec7db77139138dfe4cc3f4ca4691cf056773c1e10
parent3c405889c2a8dbe915a0636785cbe6163bcdd25c (diff)
downloadvala-32d82925b592e88a02449d2ac88cd6cb899393fd.tar.gz
Fix duplicate member names
-rw-r--r--dbusgen/tests/test-codegen.xml3
-rw-r--r--dbusgen/tests/test-codegen.xml.vala-expected2
-rw-r--r--dbusgen/valadbusparser.vala34
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 ();