@@ -122,6 +122,7 @@ def put(self, expr: Expression, typ: Type) -> None:
122
122
if not expr .literal :
123
123
return
124
124
key = expr .literal_hash
125
+ assert key is not None , 'Internal error: binder tried to put non-literal'
125
126
if key not in self .declarations :
126
127
assert isinstance (expr , BindableTypes )
127
128
self .declarations [key ] = get_declaration (expr )
@@ -132,6 +133,7 @@ def unreachable(self) -> None:
132
133
self .frames [- 1 ].unreachable = True
133
134
134
135
def get (self , expr : Expression ) -> Optional [Type ]:
136
+ assert expr .literal_hash is not None , 'Internal error: binder tried to get non-literal'
135
137
return self ._get (expr .literal_hash )
136
138
137
139
def is_unreachable (self ) -> bool :
@@ -141,6 +143,7 @@ def is_unreachable(self) -> bool:
141
143
142
144
def cleanse (self , expr : Expression ) -> None :
143
145
"""Remove all references to a Node from the binder."""
146
+ assert expr .literal_hash is not None , 'Internal error: binder tried cleanse non-literal'
144
147
self ._cleanse_key (expr .literal_hash )
145
148
146
149
def _cleanse_key (self , key : Key ) -> None :
@@ -258,13 +261,15 @@ def invalidate_dependencies(self, expr: BindableExpression) -> None:
258
261
It is overly conservative: it invalidates globally, including
259
262
in code paths unreachable from here.
260
263
"""
264
+ assert expr .literal_hash is not None
261
265
for dep in self .dependencies .get (expr .literal_hash , set ()):
262
266
self ._cleanse_key (dep )
263
267
264
268
def most_recent_enclosing_type (self , expr : BindableExpression , type : Type ) -> Optional [Type ]:
265
269
if isinstance (type , AnyType ):
266
270
return get_declaration (expr )
267
271
key = expr .literal_hash
272
+ assert key is not None
268
273
enclosers = ([get_declaration (expr )] +
269
274
[f [key ] for f in self .frames
270
275
if key in f and is_subtype (type , f [key ])])
0 commit comments