diff options
Diffstat (limited to 'lib9p/idl/__init__.py')
-rw-r--r-- | lib9p/idl/__init__.py | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib9p/idl/__init__.py b/lib9p/idl/__init__.py index 41664f1..82fa69c 100644 --- a/lib9p/idl/__init__.py +++ b/lib9p/idl/__init__.py @@ -468,6 +468,10 @@ def parse_file( for member in typ.members: if other_version in member.in_versions: member.in_versions.add(version) + if typ.name in env and env[typ.name] != typ: + raise ValueError( + f"duplicate type name {repr(typ.name)}" + ) env[typ.name] = typ if symname != "*" and not found: raise ValueError( @@ -482,6 +486,8 @@ def parse_file( assert isinstance(prim, Primitive) num.prim = prim + if num.name in env: + raise ValueError(f"duplicate type name {repr(num.name)}") env[num.name] = num prev = num elif m := re.fullmatch(re_line_bitfield, line): @@ -495,6 +501,8 @@ def parse_file( bf.bits = (prim.static_size * 8) * [""] + if bf.name in env: + raise ValueError(f"duplicate type name {repr(bf.name)}") env[bf.name] = bf prev = bf elif m := re.fullmatch(re_line_bitfield_, line): @@ -511,6 +519,8 @@ def parse_file( struct.members = [] parse_members(version, env, struct, m.group("members")) + if struct.name in env: + raise ValueError(f"duplicate type name {repr(struct.name)}") env[struct.name] = struct prev = struct case "+=": @@ -527,6 +537,8 @@ def parse_file( msg.members = [] parse_members(version, env, msg, m.group("members")) + if msg.name in env: + raise ValueError(f"duplicate type name {repr(msg.name)}") env[msg.name] = msg prev = msg case "+=": @@ -601,4 +613,10 @@ class Parser: raise ValueError(f"duplicate type name {repr(typ.name)}") else: ret_typs[typ.name] = typ + msgids: set[int] = set() + for typ in ret_typs.values(): + if isinstance(typ, Message): + if typ.msgid in msgids: + raise ValueError(f"duplicate msgid {repr(typ.msgid)}") + msgids.add(typ.msgid) return ret_versions, list(ret_typs.values()) |