Skip to content

Commit 9746f58

Browse files
committed
Feedback
1 parent e6c1364 commit 9746f58

4 files changed

Lines changed: 42 additions & 94 deletions

File tree

crates/ty_python_semantic/src/types/class/static_literal.rs

Lines changed: 29 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -661,8 +661,7 @@ impl<'db> StaticClassLiteral<'db> {
661661
return known.is_typed_dict_subclass();
662662
}
663663

664-
self.iter_mro(db, None)
665-
.any(|base| matches!(base, ClassBase::TypedDict))
664+
self.iter_mro(db, None).contains(&ClassBase::TypedDict)
666665
}
667666

668667
/// Return `true` if this class is, or inherits from, a `NamedTuple` (inherits from
@@ -1349,6 +1348,12 @@ impl<'db> StaticClassLiteral<'db> {
13491348
Some(Type::function_like_callable(db, signature))
13501349
};
13511350

1351+
let td_fields = || {
1352+
self.fields(db, specialization, field_policy)
1353+
.iter()
1354+
.map(|(name, field)| (name, TypedDictField::from_field(field)))
1355+
};
1356+
13521357
match (field_policy, name) {
13531358
(CodeGeneratorKind::DataclassLike(_), "__init__") => {
13541359
if !self.has_dataclass_param(db, field_policy, DataclassFlags::INIT) {
@@ -1554,65 +1559,28 @@ impl<'db> StaticClassLiteral<'db> {
15541559
Type::heterogeneous_tuple(db, slots)
15551560
})
15561561
}
1557-
(
1558-
CodeGeneratorKind::TypedDict,
1559-
name @ ("__getitem__" | "__setitem__" | "__delitem__" | "get" | "pop"
1560-
| "setdefault" | "update"),
1561-
) => {
1562-
let td_fields = self.fields(db, specialization, field_policy);
1563-
1564-
Some(match name {
1565-
"__getitem__" => synthesize_typed_dict_getitem(
1566-
db,
1567-
instance_ty,
1568-
td_fields
1569-
.iter()
1570-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1571-
),
1572-
"__setitem__" => synthesize_typed_dict_setitem(
1573-
db,
1574-
instance_ty,
1575-
td_fields
1576-
.iter()
1577-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1578-
),
1579-
"__delitem__" => synthesize_typed_dict_delitem(
1580-
db,
1581-
instance_ty,
1582-
td_fields
1583-
.iter()
1584-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1585-
),
1586-
"get" => synthesize_typed_dict_get(
1587-
db,
1588-
instance_ty,
1589-
td_fields
1590-
.iter()
1591-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1592-
),
1593-
"pop" => synthesize_typed_dict_pop(
1594-
db,
1595-
instance_ty,
1596-
td_fields
1597-
.iter()
1598-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1599-
),
1600-
"setdefault" => synthesize_typed_dict_setdefault(
1601-
db,
1602-
instance_ty,
1603-
td_fields
1604-
.iter()
1605-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1606-
),
1607-
"update" => synthesize_typed_dict_update(
1608-
db,
1609-
instance_ty,
1610-
td_fields
1611-
.iter()
1612-
.map(|(name, field)| (name, TypedDictField::from_field(field))),
1613-
),
1614-
_ => unreachable!(),
1615-
})
1562+
(CodeGeneratorKind::TypedDict, "__getitem__") => {
1563+
Some(synthesize_typed_dict_getitem(db, instance_ty, td_fields()))
1564+
}
1565+
(CodeGeneratorKind::TypedDict, "__setitem__") => {
1566+
Some(synthesize_typed_dict_setitem(db, instance_ty, td_fields()))
1567+
}
1568+
(CodeGeneratorKind::TypedDict, "__delitem__") => {
1569+
Some(synthesize_typed_dict_delitem(db, instance_ty, td_fields()))
1570+
}
1571+
(CodeGeneratorKind::TypedDict, "get") => {
1572+
Some(synthesize_typed_dict_get(db, instance_ty, td_fields()))
1573+
}
1574+
(CodeGeneratorKind::TypedDict, "pop") => {
1575+
Some(synthesize_typed_dict_pop(db, instance_ty, td_fields()))
1576+
}
1577+
(CodeGeneratorKind::TypedDict, "setdefault") => Some(synthesize_typed_dict_setdefault(
1578+
db,
1579+
instance_ty,
1580+
td_fields(),
1581+
)),
1582+
(CodeGeneratorKind::TypedDict, "update") => {
1583+
Some(synthesize_typed_dict_update(db, instance_ty, td_fields()))
16161584
}
16171585
(CodeGeneratorKind::TypedDict, name @ ("__or__" | "__ror__" | "__ior__")) => {
16181586
Some(synthesize_typed_dict_merge(db, instance_ty, name))

crates/ty_python_semantic/src/types/class/typed_dict.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use crate::types::mro::Mro;
1818
use crate::types::signatures::{CallableSignature, Parameter, Parameters, Signature};
1919
use crate::types::typed_dict::{
2020
FunctionalTypedDictSpec, TypedDictField, TypedDictSchema, deferred_functional_typed_dict_spec,
21-
dynamic_typed_dict_schema,
2221
};
2322
use crate::types::{
2423
BoundTypeVarInstance, CallableType, ClassBase, ClassType, KnownClass, MemberLookupPolicy, Type,
@@ -676,26 +675,20 @@ impl<'db> DynamicTypedDictLiteral<'db> {
676675
/// Look up a class-level member defined directly on this `TypedDict` (not inherited).
677676
pub(super) fn own_class_member(self, db: &'db dyn Db, name: &str) -> Member<'db> {
678677
let instance_ty = self.to_instance(db);
679-
let schema = dynamic_typed_dict_schema(db, self);
680678

681679
let synthesized = match name {
682-
"__getitem__" => Some(synthesize_typed_dict_getitem(db, instance_ty, schema)),
683-
"__setitem__" => Some(synthesize_typed_dict_setitem(db, instance_ty, schema)),
684-
"__delitem__" => Some(synthesize_typed_dict_delitem(db, instance_ty, schema)),
685-
"get" => Some(synthesize_typed_dict_get(db, instance_ty, schema)),
686-
"update" => Some(synthesize_typed_dict_update(db, instance_ty, schema)),
687-
"pop" => Some(synthesize_typed_dict_pop(db, instance_ty, schema)),
688-
"setdefault" => Some(synthesize_typed_dict_setdefault(db, instance_ty, schema)),
689-
"__or__" | "__ror__" | "__ior__" => {
690-
Some(synthesize_typed_dict_merge(db, instance_ty, name))
691-
}
692-
_ => None,
680+
"__getitem__" => synthesize_typed_dict_getitem(db, instance_ty, self.items(db)),
681+
"__setitem__" => synthesize_typed_dict_setitem(db, instance_ty, self.items(db)),
682+
"__delitem__" => synthesize_typed_dict_delitem(db, instance_ty, self.items(db)),
683+
"get" => synthesize_typed_dict_get(db, instance_ty, self.items(db)),
684+
"update" => synthesize_typed_dict_update(db, instance_ty, self.items(db)),
685+
"pop" => synthesize_typed_dict_pop(db, instance_ty, self.items(db)),
686+
"setdefault" => synthesize_typed_dict_setdefault(db, instance_ty, self.items(db)),
687+
"__or__" | "__ror__" | "__ior__" => synthesize_typed_dict_merge(db, instance_ty, name),
688+
_ => return Member::default(),
693689
};
694690

695-
match synthesized {
696-
Some(ty) => Member::definitely_declared(ty),
697-
None => Member::default(),
698-
}
691+
Member::definitely_declared(synthesized)
699692
}
700693

701694
/// Look up a class-level member by name (including superclasses).

crates/ty_python_semantic/src/types/infer/builder.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4143,13 +4143,8 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
41434143
TypeQualifiers::REQUIRED | TypeQualifiers::NOT_REQUIRED | TypeQualifiers::READ_ONLY,
41444144
) {
41454145
let in_typed_dict = current_scope.kind() == ScopeKind::Class
4146-
&& nearest_enclosing_class(self.db(), self.index, self.scope()).is_some_and(
4147-
|class| {
4148-
class
4149-
.iter_mro(self.db(), None)
4150-
.contains(&ClassBase::TypedDict)
4151-
},
4152-
);
4146+
&& nearest_enclosing_class(self.db(), self.index, self.scope())
4147+
.is_some_and(|class| class.is_typed_dict(self.db()));
41534148
if !in_typed_dict {
41544149
for qualifier in [
41554150
TypeQualifiers::REQUIRED,

crates/ty_python_semantic/src/types/typed_dict.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use ruff_python_ast::Arguments;
1010
use ruff_python_ast::{self as ast, AnyNodeRef, StmtClassDef, name::Name};
1111
use ruff_text_size::Ranged;
1212

13-
use super::class::{ClassLiteral, ClassType, CodeGeneratorKind, DynamicTypedDictLiteral, Field};
13+
use super::class::{ClassLiteral, ClassType, CodeGeneratorKind, Field};
1414
use super::context::InferContext;
1515
use super::diagnostic::{
1616
self, INVALID_ARGUMENT_TYPE, INVALID_ASSIGNMENT, report_invalid_key_on_typed_dict,
@@ -536,14 +536,6 @@ pub(crate) fn walk_typed_dict_type<'db, V: visitor::TypeVisitor<'db> + ?Sized>(
536536
}
537537
}
538538

539-
/// Get the [`TypedDictSchema`] for a [`DynamicTypedDictLiteral`].
540-
pub(super) fn dynamic_typed_dict_schema<'db>(
541-
db: &'db dyn Db,
542-
class: DynamicTypedDictLiteral<'db>,
543-
) -> &'db TypedDictSchema<'db> {
544-
class.items(db)
545-
}
546-
547539
#[salsa::tracked(
548540
cycle_initial = deferred_functional_typed_dict_spec_initial,
549541
heap_size = ruff_memory_usage::heap_size

0 commit comments

Comments
 (0)