23
23
class TableKeyParameter (Parameter ):
24
24
25
25
odx_id : OdxLinkId
26
+
27
+ # the spec mandates that exactly one of the two attributes must
28
+ # be non-None
26
29
table_ref : Optional [OdxLinkRef ]
27
30
table_snref : Optional [str ]
28
- table_row_snref : Optional [str ]
31
+
32
+ # the spec mandates that exactly one of the two attributes must
33
+ # be non-None
29
34
table_row_ref : Optional [OdxLinkRef ]
35
+ table_row_snref : Optional [str ]
30
36
31
37
@staticmethod
32
38
@override
@@ -58,9 +64,6 @@ def from_et(et_element: ElementTree.Element,
58
64
def __post_init__ (self ) -> None :
59
65
self ._table : Table
60
66
self ._table_row : Optional [TableRow ] = None
61
- if self .table_ref is None and self .table_snref is None and \
62
- self .table_row_ref is None and self .table_row_snref is None :
63
- odxraise ("Either a table or a table row must be defined." )
64
67
65
68
@property
66
69
@override
@@ -86,17 +89,20 @@ def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
86
89
else :
87
90
self ._table = odxlinks .resolve (self .table_ref )
88
91
89
- if self .table_row_ref is not None :
92
+ elif self .table_row_ref is not None :
90
93
if TYPE_CHECKING :
91
94
self ._table_row = odxlinks .resolve (self .table_row_ref , TableRow )
92
95
else :
93
96
self ._table_row = odxlinks .resolve (self .table_row_ref )
94
97
95
- if self .table_ref is None and self .table_snref is None :
96
- if TYPE_CHECKING :
97
- self ._table = odxlinks .resolve (self ._table_row .table_ref , Table )
98
- else :
99
- self ._table = odxlinks .resolve (self ._table_row .table_ref )
98
+ # be aware that we cannot simply use
99
+ # `self._table_row.table` here because the table object
100
+ # might not have resolved its references yet because the
101
+ # order of reference resolution is undefined
102
+ if TYPE_CHECKING :
103
+ self ._table = odxlinks .resolve (self ._table_row .table_ref , Table )
104
+ else :
105
+ self ._table = odxlinks .resolve (self ._table_row .table_ref )
100
106
101
107
@override
102
108
def _resolve_snrefs (self , context : SnRefContext ) -> None :
@@ -108,16 +114,13 @@ def _resolve_snrefs(self, context: SnRefContext) -> None:
108
114
self ._table = resolve_snref (self .table_snref , tables , Table )
109
115
else :
110
116
self ._table = resolve_snref (self .table_snref , tables )
117
+
111
118
if self .table_row_snref is not None :
112
- # make sure that we know the table to which the table row
113
- # SNREF is relative to.
114
- table = odxrequire (
115
- self ._table , "If a table row is referenced via short name, a table must "
116
- "be referenced as well" )
117
119
if TYPE_CHECKING :
118
- self ._table_row = resolve_snref (self .table_row_snref , table .table_rows , TableRow )
120
+ self ._table_row = resolve_snref (self .table_row_snref , self ._table .table_rows ,
121
+ TableRow )
119
122
else :
120
- self ._table_row = resolve_snref (self .table_row_snref , table .table_rows )
123
+ self ._table_row = resolve_snref (self .table_row_snref , self . _table .table_rows )
121
124
122
125
@property
123
126
def table (self ) -> "Table" :
0 commit comments