Skip to content

Commit 05af0b3

Browse files
committed
fix remaining tests
1 parent ee01807 commit 05af0b3

File tree

3 files changed

+42
-68
lines changed

3 files changed

+42
-68
lines changed

crates/ty_python_semantic/resources/mdtest/unpacking.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ reveal_type(d) # revealed: Unknown
119119
```py
120120
[a, *b, c] = (1, 2)
121121
reveal_type(a) # revealed: Literal[1]
122-
reveal_type(b) # revealed: list[Unknown]
122+
reveal_type(b) # revealed: list[Never]
123123
reveal_type(c) # revealed: Literal[2]
124124
```
125125

@@ -312,7 +312,7 @@ reveal_type(d) # revealed: Unknown
312312
```py
313313
(a, *b, c) = "ab"
314314
reveal_type(a) # revealed: LiteralString
315-
reveal_type(b) # revealed: list[Unknown]
315+
reveal_type(b) # revealed: list[Never]
316316
reveal_type(c) # revealed: LiteralString
317317
```
318318

crates/ty_python_semantic/src/types/tuple.rs

Lines changed: 31 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,6 +1059,7 @@ impl<T> TupleElement<T> {
10591059
}
10601060

10611061
pub(crate) struct Splatter<'db> {
1062+
db: &'db dyn Db,
10621063
targets: Tuple<UnionBuilder<'db>>,
10631064
}
10641065

@@ -1075,58 +1076,29 @@ impl<'db> Splatter<'db> {
10751076
new_builders(suffix),
10761077
),
10771078
};
1078-
Self { targets }
1079+
Self { db, targets }
10791080
}
10801081

10811082
pub(crate) fn add_values(&mut self, values: &Tuple<Type<'db>>) -> Result<(), SplatterError> {
10821083
match &mut self.targets {
10831084
Tuple::Fixed(targets) => targets.add_values(values),
1084-
Tuple::Variable(targets) => targets.add_values(values),
1085+
Tuple::Variable(targets) => targets.add_values(self.db, values),
10851086
}
10861087
}
10871088

1088-
pub(crate) fn add_list_element(&mut self, element: Type<'db>) {
1089-
match &mut self.targets {
1090-
Tuple::Fixed(targets) => {
1091-
for target in &mut targets.0 {
1092-
target.add_in_place(element);
1093-
}
1094-
}
1095-
1096-
Tuple::Variable(targets) => {
1097-
for target in &mut targets.prefix {
1098-
target.add_in_place(element);
1099-
}
1100-
targets.variable.add_in_place(element);
1101-
for target in &mut targets.suffix {
1102-
target.add_in_place(element);
1103-
}
1104-
}
1105-
}
1106-
}
1107-
1108-
pub(crate) fn add_unknown(&mut self) {
1109-
match &mut self.targets {
1110-
Tuple::Fixed(targets) => {
1111-
for target in &mut targets.0 {
1112-
target.add_in_place(Type::unknown());
1113-
}
1114-
}
1115-
1116-
Tuple::Variable(targets) => {
1117-
for target in &mut targets.prefix {
1118-
target.add_in_place(Type::unknown());
1119-
}
1120-
targets.variable.add_in_place(Type::unknown());
1121-
for target in &mut targets.suffix {
1122-
target.add_in_place(Type::unknown());
1089+
pub(crate) fn into_types(self) -> impl Iterator<Item = Type<'db>> {
1090+
self.targets
1091+
.into_all_elements()
1092+
.map(|builder| match builder {
1093+
TupleElement::Variable(builder) => builder.try_build().unwrap_or_else(|| {
1094+
KnownClass::List.to_specialized_instance(self.db, [Type::unknown()])
1095+
}),
1096+
TupleElement::Fixed(builder)
1097+
| TupleElement::Prefix(builder)
1098+
| TupleElement::Suffix(builder) => {
1099+
builder.try_build().unwrap_or_else(Type::unknown)
11231100
}
1124-
}
1125-
}
1126-
}
1127-
1128-
pub(crate) fn into_all_elements(self) -> impl Iterator<Item = TupleElement<UnionBuilder<'db>>> {
1129-
self.targets.into_all_elements()
1101+
})
11301102
}
11311103
}
11321104

@@ -1162,7 +1134,11 @@ impl<'db> FixedLengthTuple<UnionBuilder<'db>> {
11621134
}
11631135

11641136
impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
1165-
fn add_values(&mut self, values: &Tuple<Type<'db>>) -> Result<(), SplatterError> {
1137+
fn add_values(
1138+
&mut self,
1139+
db: &'db dyn Db,
1140+
values: &Tuple<Type<'db>>,
1141+
) -> Result<(), SplatterError> {
11661142
match values {
11671143
Tuple::Fixed(values) => {
11681144
let Some(variable_count) = values.len().checked_sub(self.len().minimum()) else {
@@ -1172,16 +1148,18 @@ impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
11721148
for (target, value) in self.prefix.iter_mut().zip(values.by_ref()) {
11731149
target.add_in_place(value);
11741150
}
1175-
for value in values.by_ref().take(variable_count) {
1176-
self.variable.add_in_place(value);
1177-
}
1151+
let variable_element =
1152+
UnionType::from_elements(db, values.by_ref().take(variable_count));
1153+
self.variable
1154+
.add_in_place(KnownClass::List.to_specialized_instance(db, [variable_element]));
11781155
for (target, value) in self.suffix.iter_mut().zip(values) {
11791156
target.add_in_place(value);
11801157
}
11811158
Ok(())
11821159
}
11831160

11841161
Tuple::Variable(values) => {
1162+
let mut variable_element = UnionBuilder::new(db);
11851163
for pair in (self.prefix.iter_mut()).zip_longest(values.prefix_elements().copied())
11861164
{
11871165
match pair {
@@ -1192,11 +1170,11 @@ impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
11921170
target.add_in_place(values.variable);
11931171
}
11941172
EitherOrBoth::Right(value) => {
1195-
self.variable.add_in_place(value);
1173+
variable_element.add_in_place(value);
11961174
}
11971175
}
11981176
}
1199-
self.variable.add_in_place(values.variable);
1177+
variable_element.add_in_place(values.variable);
12001178
for pair in (self.suffix.iter_mut().rev())
12011179
.zip_longest(values.suffix_elements().copied().rev())
12021180
{
@@ -1208,10 +1186,13 @@ impl<'db> VariableLengthTuple<UnionBuilder<'db>> {
12081186
target.add_in_place(values.variable);
12091187
}
12101188
EitherOrBoth::Right(value) => {
1211-
self.variable.add_in_place(value);
1189+
variable_element.add_in_place(value);
12121190
}
12131191
}
12141192
}
1193+
self.variable.add_in_place(
1194+
KnownClass::List.to_specialized_instance(db, [variable_element.build()]),
1195+
);
12151196
Ok(())
12161197
}
12171198
}

crates/ty_python_semantic/src/types/unpacker.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use ruff_python_ast::{self as ast, AnyNodeRef};
66
use crate::Db;
77
use crate::semantic_index::ast_ids::{HasScopedExpressionId, ScopedExpressionId};
88
use crate::semantic_index::place::ScopeId;
9-
use crate::types::tuple::{Splatter, SplatterError, TupleElement, TupleLength, TupleType};
10-
use crate::types::{KnownClass, Type, TypeCheckDiagnostics, infer_expression_types};
9+
use crate::types::tuple::{Splatter, SplatterError, Tuple, TupleLength, TupleType};
10+
use crate::types::{Type, TypeCheckDiagnostics, infer_expression_types};
1111
use crate::unpack::{UnpackKind, UnpackValue};
1212

1313
use super::context::InferContext;
@@ -147,7 +147,9 @@ impl<'db, 'ast> Unpacker<'db, 'ast> {
147147
if let Type::Tuple(tuple_ty) = ty {
148148
let tuple = tuple_ty.tuple(self.db());
149149
if let Err(err) = splatter.add_values(tuple) {
150-
splatter.add_unknown();
150+
splatter
151+
.add_values(&Tuple::homogeneous(Type::unknown()))
152+
.expect("adding a homogeneous tuple should always succeed");
151153
if let Some(builder) =
152154
self.context.report_lint(&INVALID_ASSIGNMENT, target)
153155
{
@@ -186,24 +188,15 @@ impl<'db, 'ast> Unpacker<'db, 'ast> {
186188
err.fallback_element_type(self.db())
187189
})
188190
};
189-
splatter.add_list_element(ty);
191+
splatter
192+
.add_values(&Tuple::homogeneous(ty))
193+
.expect("adding a homogeneous tuple should always succeed");
190194
}
191195
}
192196

193197
// We constructed splatter above using the length of elts, so the zip should
194198
// consume the same number of elements from each.
195-
for (target, value) in elts.iter().zip(splatter.into_all_elements()) {
196-
let value_ty = match value {
197-
TupleElement::Variable(value) => KnownClass::List.to_specialized_instance(
198-
self.db(),
199-
[value.try_build().unwrap_or_else(Type::unknown)],
200-
),
201-
TupleElement::Fixed(value)
202-
| TupleElement::Prefix(value)
203-
| TupleElement::Suffix(value) => {
204-
value.try_build().unwrap_or_else(Type::unknown)
205-
}
206-
};
199+
for (target, value_ty) in elts.iter().zip(splatter.into_types()) {
207200
self.unpack_inner(target, value_expr, value_ty);
208201
}
209202
}

0 commit comments

Comments
 (0)