Skip to content

Commit d2f18d7

Browse files
committed
Use default argument provided by field-specifier function
1 parent 0e66b79 commit d2f18d7

File tree

2 files changed

+8
-11
lines changed
  • crates/ty_python_semantic

2 files changed

+8
-11
lines changed

crates/ty_python_semantic/resources/mdtest/dataclasses/fields.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Member:
1111
role: str = field(default="user")
1212
tag: str | None = field(default=None, init=False)
1313

14-
# revealed: (self: Member, name: str, role: str = Literal["user"]) -> None
14+
# revealed: (self: Member, name: str, role: str = str) -> None
1515
reveal_type(Member.__init__)
1616

1717
alice = Member(name="Alice", role="admin")
@@ -37,7 +37,7 @@ class Data:
3737
content: list[int] = field(default_factory=list)
3838
timestamp: datetime = field(default_factory=datetime.now, init=False)
3939

40-
# revealed: (self: Data, content: list[int] = list[Unknown]) -> None
40+
# revealed: (self: Data, content: list[int] = list[int]) -> None
4141
reveal_type(Data.__init__)
4242

4343
data = Data([1, 2, 3])
@@ -63,7 +63,7 @@ class Person:
6363
age: int | None = field(default=None, kw_only=True)
6464
role: str = field(default="user", kw_only=True)
6565

66-
# revealed: (self: Person, name: str, *, age: int | None = None, role: str = Literal["user"]) -> None
66+
# revealed: (self: Person, name: str, *, age: int | None = int | None, role: str = str) -> None
6767
reveal_type(Person.__init__)
6868

6969
alice = Person(role="admin", name="Alice")
@@ -82,7 +82,7 @@ def get_default() -> str:
8282

8383
reveal_type(field(default=1)) # revealed: dataclasses.Field[Literal[1]]
8484
reveal_type(field(default=None)) # revealed: dataclasses.Field[None]
85-
reveal_type(field(default_factory=get_default)) # revealed: dataclasses.Field[str]
85+
reveal_type(field(default_factory=get_default)) # revealed: dataclasses.Field[Unknown]
8686
```
8787

8888
## dataclass_transform field_specifiers

crates/ty_python_semantic/src/types/call/bind.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -609,13 +609,10 @@ impl<'db> Bindings<'db> {
609609
let init = overload.parameter_type_by_name("init").unwrap_or(None);
610610
let kw_only = overload.parameter_type_by_name("kw_only").unwrap_or(None);
611611

612-
let default_ty = match (default, default_factory) {
613-
(Some(default_ty), _) => Some(default_ty),
614-
(_, Some(default_factory_ty)) => default_factory_ty
615-
.try_call(db, &CallArguments::none())
616-
.map(|binding| binding.return_type(db))
617-
.ok(),
618-
_ => None,
612+
let default_ty = if default.is_some() || default_factory.is_some() {
613+
Some(overload.return_ty)
614+
} else {
615+
None
619616
};
620617

621618
let init = init

0 commit comments

Comments
 (0)