65
65
[
66
66
('node' , FuncItem ),
67
67
('context_type_name' , Optional [str ]), # Name of the surrounding class (for error messages)
68
+ ('class_type' , Optional [Type ]), # And its type (from class_context)
68
69
])
69
70
70
71
@@ -202,13 +203,20 @@ def check_second_pass(self) -> bool:
202
203
todo = self .deferred_nodes
203
204
self .deferred_nodes = []
204
205
done = set () # type: Set[FuncItem]
205
- for node , type_name in todo :
206
+ for node , type_name , class_type in todo :
206
207
if node in done :
207
208
continue
209
+ # This is useful for debugging:
210
+ # print("XXX in pass %d, class %s, function %s" %
211
+ # (self.pass_num, type_name, node.fullname() or node.name()))
208
212
done .add (node )
209
213
if type_name :
210
214
self .errors .push_type (type_name )
215
+ if class_type :
216
+ self .class_context .append (class_type )
211
217
self .accept (node )
218
+ if class_type :
219
+ self .class_context .pop ()
212
220
if type_name :
213
221
self .errors .pop_type ()
214
222
return True
@@ -221,7 +229,11 @@ def handle_cannot_determine_type(self, name: str, context: Context) -> None:
221
229
type_name = self .errors .type_name [- 1 ]
222
230
else :
223
231
type_name = None
224
- self .deferred_nodes .append (DeferredNode (node , type_name ))
232
+ if self .class_context :
233
+ class_context_top = self .class_context [- 1 ]
234
+ else :
235
+ class_context_top = None
236
+ self .deferred_nodes .append (DeferredNode (node , type_name , class_context_top ))
225
237
# Set a marker so that we won't infer additional types in this
226
238
# function. Any inferred types could be bogus, because there's at
227
239
# least one type that we don't know.
0 commit comments