scanner: detect duplicates in the XML file

This commit is contained in:
Peter Hutterer 2023-02-16 10:56:56 +10:00
parent 5ee9f738a8
commit 8a52cbbe10

View file

@ -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: