(self, o: NameExpr)
| 637 | super().visit_starred_pattern(o) |
| 638 | |
| 639 | def visit_name_expr(self, o: NameExpr) -> None: |
| 640 | if o.name in self.builtins and self.tracker.in_scope(ScopeType.Global): |
| 641 | return |
| 642 | if ( |
| 643 | self.tracker.is_possibly_undefined(o.name) |
| 644 | and self.tracker.in_finally == self.tracker.disable_branch_skip |
| 645 | ): |
| 646 | # A variable is only defined in some branches. |
| 647 | self.variable_may_be_undefined(o.name, o) |
| 648 | # We don't want to report the error on the same variable multiple times. |
| 649 | self.tracker.record_definition(o.name) |
| 650 | elif self.tracker.is_defined_in_different_branch(o.name): |
| 651 | # A variable is defined in one branch but used in a different branch. |
| 652 | if self.loops or self.try_depth > 0: |
| 653 | # If we're in a loop or in a try, we can't be sure that this variable |
| 654 | # is undefined. Report it as "may be undefined". |
| 655 | self.variable_may_be_undefined(o.name, o) |
| 656 | else: |
| 657 | self.var_used_before_def(o.name, o) |
| 658 | elif self.tracker.is_undefined(o.name): |
| 659 | # A variable is undefined. It could be due to two things: |
| 660 | # 1. A variable is just totally undefined |
| 661 | # 2. The variable is defined later in the code. |
| 662 | # Case (1) will be caught by semantic analyzer. Case (2) is a forward ref that should |
| 663 | # be caught by this visitor. Save the ref for later, so that if we see a definition, |
| 664 | # we know it's a used-before-definition scenario. |
| 665 | self.tracker.record_undefined_ref(o) |
| 666 | super().visit_name_expr(o) |
| 667 | |
| 668 | def visit_with_stmt(self, o: WithStmt) -> None: |
| 669 | for expr, idx in zip(o.expr, o.target): |
nothing calls this directly
no test coverage detected