summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2010-10-13 12:33:44 +0100
committerJonny Lamb <jonny.lamb@collabora.co.uk>2010-10-13 12:34:13 +0100
commitfe280e133150f6573614c597f4a50f40b07751ad (patch)
tree28dba891ffb6a1c3134d44207010b03c206ae28f /tools
parent0f4429b8436cea36027ecf73e626c4dae7925d43 (diff)
specparser: check for duplicate enum values
AND LET THE BAD SPEC WRITER KNOW... Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
Diffstat (limited to 'tools')
-rw-r--r--tools/specparser.py16
1 files changed, 16 insertions, 0 deletions
diff --git a/tools/specparser.py b/tools/specparser.py
index ed22debd..ed55b149 100644
--- a/tools/specparser.py
+++ b/tools/specparser.py
@@ -41,6 +41,7 @@ class WrongNumberOfChildren(Exception): pass
class MismatchedFlagsAndEnum(Exception): pass
class TypeMismatch(Exception): pass
class MissingVersion(Exception): pass
+class DuplicateEnumValueValue(Exception): pass
class Xzibit(Exception):
def __init__(self, parent, child):
@@ -955,6 +956,17 @@ class EnumLike(DBusType):
return str
+ def check_for_duplicates(self):
+ # make sure no two values have the same value
+ for u in self.values:
+ for v in [x for x in self.values if x is not u]:
+ if u.value == v.value:
+ raise DuplicateEnumValueValue('%s %s has two values '
+ 'with the same value: %s=%s and %s=%s' % \
+ (self.__class__.__name__, self.name, \
+ u.short_name, u.value, v.short_name, v.value))
+
+
class Enum(EnumLike):
devhelp_name = "enum"
@@ -973,6 +985,8 @@ class Enum(EnumLike):
self.values = build_list(self, EnumLike.EnumValue, self.name,
dom.getElementsByTagNameNS(XMLNS_TP, 'enumvalue'))
+ self.check_for_duplicates()
+
class Flags(EnumLike):
def __init__(self, parent, namespace, dom):
super(Flags, self).__init__(parent, namespace, dom)
@@ -985,6 +999,8 @@ class Flags(EnumLike):
dom.getElementsByTagNameNS(XMLNS_TP, 'flag'))
self.flags = self.values # in case you're looking for it
+ self.check_for_duplicates()
+
class TokenBase(Base):
devhelp_name = "macro" # it's a constant, which is near enough...