Skip to content

Commit 0b8ffe3

Browse files
committed
[partially defined] handle class definitions
1 parent 5795488 commit 0b8ffe3

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

mypy/partially_defined.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
AssignmentExpr,
88
AssignmentStmt,
99
BreakStmt,
10+
ClassDef,
1011
Context,
1112
ContinueStmt,
1213
DictionaryComprehension,
@@ -258,13 +259,16 @@ def variable_may_be_undefined(self, name: str, context: Context) -> None:
258259
if self.msg.errors.is_error_code_enabled(errorcodes.PARTIALLY_DEFINED):
259260
self.msg.variable_may_be_undefined(name, context)
260261

262+
def process_definition(self, name: str) -> None:
263+
# Was this name previously used? If yes, it's a use-before-definition error.
264+
refs = self.tracker.pop_undefined_ref(name)
265+
for ref in refs:
266+
self.var_used_before_def(name, ref)
267+
self.tracker.record_definition(name)
268+
261269
def process_lvalue(self, lvalue: Lvalue | None) -> None:
262270
if isinstance(lvalue, NameExpr):
263-
# Was this name previously used? If yes, it's a use-before-definition error.
264-
refs = self.tracker.pop_undefined_ref(lvalue.name)
265-
for ref in refs:
266-
self.var_used_before_def(lvalue.name, ref)
267-
self.tracker.record_definition(lvalue.name)
271+
self.process_definition(lvalue.name)
268272
elif isinstance(lvalue, StarExpr):
269273
self.process_lvalue(lvalue.expr)
270274
elif isinstance(lvalue, (ListExpr, TupleExpr)):
@@ -435,6 +439,10 @@ def visit_with_stmt(self, o: WithStmt) -> None:
435439
self.process_lvalue(idx)
436440
o.body.accept(self)
437441

442+
def visit_class_def(self, o: ClassDef) -> None:
443+
self.process_definition(o.name)
444+
super().visit_class_def(o)
445+
438446
def visit_import(self, o: Import) -> None:
439447
for mod, alias in o.ids:
440448
if alias is not None:

test-data/unit/check-partially-defined.test

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@ def f0(b: bool) -> None:
140140
fn = lambda: 2
141141
y = fn # E: Name "fn" may be undefined
142142

143+
[case testUseBeforeDefClass]
144+
# flags: --enable-error-code partially-defined --enable-error-code use-before-def
145+
def f(x: A):
146+
pass
147+
148+
y = A() # E: Name "A" is used before definition
149+
150+
class A: pass
143151
[case testGenerator]
144152
# flags: --enable-error-code partially-defined
145153
if int():

0 commit comments

Comments
 (0)