Skip to content

Commit 115c205

Browse files
committed
Include other reference to namespace collisions. #231, #235
1 parent e3be999 commit 115c205

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

src/systemrdl/core/namespace.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .parameter import Parameter
44

55
from .. import component as comp
6+
from ..messages import RDLCompileError
67

78
if TYPE_CHECKING:
89
from ..compiler import RDLEnvironment
@@ -12,11 +13,11 @@
1213

1314
TypeNSRef = Union[comp.Component, Type['rdltypes.UserEnum'], Type['rdltypes.UserStruct']]
1415
TypeNSEntry = TypeNSRef
15-
TypeNSScope = Dict[str, TypeNSEntry]
16+
TypeNSScope = Dict[str, Tuple[TypeNSEntry, Optional['SourceRefBase']]]
1617

1718
ElementNSRef = Union[comp.Component, Parameter]
1819
ElementNSEntry = Tuple[ElementNSRef, Optional[comp.Component]]
19-
ElementNSScope = Dict[str, ElementNSEntry]
20+
ElementNSScope = Dict[str, Tuple[ElementNSEntry, Optional['SourceRefBase']]]
2021

2122
DefaultNSRef = Union['ASTNode', bool, 'rdltypes.InterruptType']
2223
DefaultNSEntry = Tuple['SourceRefBase', DefaultNSRef]
@@ -37,34 +38,53 @@ def __init__(self, env: 'RDLEnvironment'):
3738

3839
def register_type(self, name: str, ref: TypeNSRef, src_ref: Optional['SourceRefBase']) -> None:
3940
if name in self.type_ns_stack[-1]:
40-
self.msg.fatal(
41-
"Multiple declarations of type '%s'" % name,
41+
other_src_ref = self.type_ns_stack[-1][name][1]
42+
self.msg.error(
43+
f"Multiple declarations of type '{name}'",
4244
src_ref
4345
)
44-
self.type_ns_stack[-1][name] = ref
46+
self.msg.warning(
47+
f"Previous declaration of '{name}' is here.",
48+
other_src_ref
49+
)
50+
raise RDLCompileError("Namespace error")
51+
52+
self.type_ns_stack[-1][name] = (ref, src_ref)
4553

4654
def register_element(self, name: str, ref: ElementNSRef, parent_comp_def: Optional[comp.Component], src_ref: Optional['SourceRefBase']) -> None:
4755
if name in self.element_ns_stack[-1]:
48-
self.msg.fatal(
56+
other_src_ref = self.element_ns_stack[-1][name][1]
57+
self.msg.error(
4958
"Multiple declarations of instance '%s'" % name,
5059
src_ref
5160
)
52-
self.element_ns_stack[-1][name] = (ref, parent_comp_def)
61+
self.msg.warning(
62+
f"Previous declaration of '{name}' is here.",
63+
other_src_ref
64+
)
65+
raise RDLCompileError("Namespace error")
66+
self.element_ns_stack[-1][name] = ((ref, parent_comp_def), src_ref)
5367

5468
def register_default_property(self, name: str, ref: DefaultNSRef, src_ref: 'SourceRefBase', overwrite_ok: bool=False) -> None:
5569
if not overwrite_ok:
5670
if name in self.default_property_ns_stack[-1]:
57-
self.msg.fatal(
71+
other_src_ref = self.default_property_ns_stack[-1][name][0]
72+
self.msg.error(
5873
"Default property '%s' was already assigned in this scope" % name,
5974
src_ref
6075
)
76+
self.msg.warning(
77+
f"Previous declaration of '{name}' is here.",
78+
other_src_ref
79+
)
80+
raise RDLCompileError("Namespace error")
6181

6282
self.default_property_ns_stack[-1][name] = (src_ref, ref)
6383

6484
def lookup_type(self, name: str) -> Optional[TypeNSEntry]:
6585
for scope in reversed(self.type_ns_stack):
6686
if name in scope:
67-
return scope[name]
87+
return scope[name][0]
6888
return None
6989

7090
def lookup_element(self, name: str) -> Union[ElementNSEntry, Tuple[None, None]]:
@@ -80,7 +100,7 @@ def lookup_element(self, name: str) -> Union[ElementNSEntry, Tuple[None, None]]:
80100
"""
81101
for i, scope in enumerate(reversed(self.element_ns_stack)):
82102
if name in scope:
83-
el, parent_def = scope[name]
103+
el, parent_def = scope[name][0]
84104
if i == 0:
85105
# Return anything from local namespace
86106
return (el, parent_def)

0 commit comments

Comments
 (0)