[ty] Type narrowing in comprehensions (#18934)

## Summary

Add type narrowing inside comprehensions:

```py
def _(xs: list[int | None]):
    [reveal_type(x) for x in xs if x is not None]  # revealed: int
```

closes https://github.com/astral-sh/ty/issues/680

## Test Plan

* New Markdown tests
* Made sure the example from https://github.com/astral-sh/ty/issues/680
now checks without errors
* Made sure that all removed ecosystem diagnostics were actually false
positives
This commit is contained in:
David Peter 2025-06-25 11:30:28 +02:00 committed by GitHub
parent 66dbea90f1
commit 689797a984
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 10 deletions

View file

@ -854,8 +854,9 @@ impl<'db, 'ast> SemanticIndexBuilder<'db, 'ast> {
value,
);
for expr in &generator.ifs {
self.visit_expr(expr);
for if_expr in &generator.ifs {
self.visit_expr(if_expr);
self.record_expression_narrowing_constraint(if_expr);
}
for generator in generators_iter {
@ -871,8 +872,9 @@ impl<'db, 'ast> SemanticIndexBuilder<'db, 'ast> {
value,
);
for expr in &generator.ifs {
self.visit_expr(expr);
for if_expr in &generator.ifs {
self.visit_expr(if_expr);
self.record_expression_narrowing_constraint(if_expr);
}
}

View file

@ -5089,7 +5089,7 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
.iterate(builder.db())
});
for expr in ifs {
self.infer_expression(expr);
self.infer_standalone_expression(expr);
}
}