|
7 | 7 | AssignmentExpr,
|
8 | 8 | AssignmentStmt,
|
9 | 9 | BreakStmt,
|
| 10 | + ClassDef, |
10 | 11 | Context,
|
11 | 12 | ContinueStmt,
|
12 | 13 | DictionaryComprehension,
|
@@ -271,13 +272,16 @@ def variable_may_be_undefined(self, name: str, context: Context) -> None:
|
271 | 272 | if self.msg.errors.is_error_code_enabled(errorcodes.PARTIALLY_DEFINED):
|
272 | 273 | self.msg.variable_may_be_undefined(name, context)
|
273 | 274 |
|
| 275 | + def process_definition(self, name: str) -> None: |
| 276 | + # Was this name previously used? If yes, it's a use-before-definition error. |
| 277 | + refs = self.tracker.pop_undefined_ref(name) |
| 278 | + for ref in refs: |
| 279 | + self.var_used_before_def(name, ref) |
| 280 | + self.tracker.record_definition(name) |
| 281 | + |
274 | 282 | def process_lvalue(self, lvalue: Lvalue | None) -> None:
|
275 | 283 | if isinstance(lvalue, NameExpr):
|
276 |
| - # Was this name previously used? If yes, it's a use-before-definition error. |
277 |
| - refs = self.tracker.pop_undefined_ref(lvalue.name) |
278 |
| - for ref in refs: |
279 |
| - self.var_used_before_def(lvalue.name, ref) |
280 |
| - self.tracker.record_definition(lvalue.name) |
| 284 | + self.process_definition(lvalue.name) |
281 | 285 | elif isinstance(lvalue, StarExpr):
|
282 | 286 | self.process_lvalue(lvalue.expr)
|
283 | 287 | elif isinstance(lvalue, (ListExpr, TupleExpr)):
|
@@ -327,7 +331,7 @@ def visit_match_stmt(self, o: MatchStmt) -> None:
|
327 | 331 | self.tracker.end_branch_statement()
|
328 | 332 |
|
329 | 333 | def visit_func_def(self, o: FuncDef) -> None:
|
330 |
| - self.tracker.record_definition(o.name) |
| 334 | + self.process_definition(o.name) |
331 | 335 | self.tracker.enter_scope()
|
332 | 336 | super().visit_func_def(o)
|
333 | 337 | self.tracker.exit_scope()
|
@@ -476,6 +480,12 @@ def visit_with_stmt(self, o: WithStmt) -> None:
|
476 | 480 | self.process_lvalue(idx)
|
477 | 481 | o.body.accept(self)
|
478 | 482 |
|
| 483 | + def visit_class_def(self, o: ClassDef) -> None: |
| 484 | + self.process_definition(o.name) |
| 485 | + self.tracker.enter_scope() |
| 486 | + super().visit_class_def(o) |
| 487 | + self.tracker.exit_scope() |
| 488 | + |
479 | 489 | def visit_import(self, o: Import) -> None:
|
480 | 490 | for mod, alias in o.ids:
|
481 | 491 | if alias is not None:
|
|
0 commit comments