diff --git a/proto/ei-scanner b/proto/ei-scanner index bb7cdc8..e412a80 100755 --- a/proto/ei-scanner +++ b/proto/ei-scanner @@ -108,6 +108,8 @@ class Message: arguments: list[Argument] = attr.ib(init=False, factory=list) def add_argument(self, arg: Argument) -> None: + if arg.name in [a.name for a in self.arguments]: + raise ValueError(f"Duplicate argument name '{arg.name}'") self.arguments.append(arg) @property @@ -206,8 +208,11 @@ class Enum: def add_entry(self, entry: Entry) -> None: for e in self.entries: + if e.name == entry.name: + raise ValueError(f"Duplicate enum name '{entry.name}'") + if e.value == entry.value: - raise ValueError(f"Duplicate enum value {entry.value}") + raise ValueError(f"Duplicate enum value '{entry.value}'") if self.is_bitmask: if e.value < 0: @@ -238,12 +243,18 @@ class Interface: mode: str = attr.ib() # "ei" or "eis" def add_request(self, request: Request) -> None: + if request.name in [r.name for r in self.requests]: + raise ValueError(f"Duplicate request name '{request.name}'") self.requests.append(request) def add_event(self, event: Event) -> None: + if event.name in [r.name for r in self.events]: + raise ValueError(f"Duplicate event name '{event.name}'") self.events.append(event) def add_enum(self, enum: Enum) -> None: + if enum.name in [r.name for r in self.enums]: + raise ValueError(f"Duplicate enum name '{enum.name}'") self.enums.append(enum) @property @@ -388,7 +399,10 @@ class Protocol(xml.sax.handler.ContentHandler): interface=self.current_interface, is_destructor=is_destructor, ) - self.current_interface.add_request(request) + try: + self.current_interface.add_request(request) + except ValueError as e: + raise XmlError(*self.location, str(e)) self.current_message = request elif element == "event": if self.current_interface is None: @@ -418,7 +432,10 @@ class Protocol(xml.sax.handler.ContentHandler): interface=self.current_interface, is_destructor=is_destructor, ) - self.current_interface.add_event(event) + try: + self.current_interface.add_event(event) + except ValueError as e: + raise XmlError(*self.location, str(e)) self.current_message = event elif element == "enum": if self.current_interface is None: @@ -453,7 +470,10 @@ class Protocol(xml.sax.handler.ContentHandler): interface=self.current_interface, is_bitmask=is_bitmask, ) - self.current_interface.add_enum(enum) + try: + self.current_interface.add_enum(enum) + except ValueError as e: + raise XmlError(*self.location, str(e)) self.current_message = enum elif element == "arg": if self.current_interface is None: