diff --git a/crates/red_knot_python_semantic/resources/mdtest/generics/classes.md b/crates/red_knot_python_semantic/resources/mdtest/generics/classes.md index d7944b1369..d6f78f1fed 100644 --- a/crates/red_knot_python_semantic/resources/mdtest/generics/classes.md +++ b/crates/red_knot_python_semantic/resources/mdtest/generics/classes.md @@ -183,8 +183,9 @@ In a non-stub file, without stringified forward references, this raises a `NameE ```py class Base[T]: ... -# TODO: error: [unresolved-reference] +# TODO: the unresolved-reference error is correct, the non-subscriptable is not # error: [non-subscriptable] +# error: [unresolved-reference] class Sub(Base[Sub]): ... ``` diff --git a/crates/red_knot_python_semantic/src/semantic_index/builder.rs b/crates/red_knot_python_semantic/src/semantic_index/builder.rs index d6cb15670f..0d6ecb8b00 100644 --- a/crates/red_knot_python_semantic/src/semantic_index/builder.rs +++ b/crates/red_knot_python_semantic/src/semantic_index/builder.rs @@ -926,9 +926,6 @@ where self.visit_decorator(decorator); } - let symbol = self.add_symbol(class.name.id.clone()); - self.add_definition(symbol, class); - self.with_type_params( NodeWithScopeRef::ClassTypeParameters(class), class.type_params.as_deref(), @@ -943,6 +940,10 @@ where builder.pop_scope() }, ); + + // In Python runtime semantics, a class is registered after its scope is evaluated. + let symbol = self.add_symbol(class.name.id.clone()); + self.add_definition(symbol, class); } ast::Stmt::TypeAlias(type_alias) => { let symbol = self.add_symbol(