mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-30 23:27:27 +00:00
[ty] Support extending __all__
with a literal tuple or set as well as a literal list (#17948)
This commit is contained in:
parent
da8540862d
commit
0763331f7f
2 changed files with 11 additions and 7 deletions
|
@ -269,6 +269,8 @@ import subexporter
|
|||
|
||||
__all__ = []
|
||||
__all__.extend(["C", "D"])
|
||||
__all__.extend(("E", "F"))
|
||||
__all__.extend({"G", "H"})
|
||||
__all__.extend(subexporter.__all__)
|
||||
|
||||
class C: ...
|
||||
|
@ -281,7 +283,7 @@ class D: ...
|
|||
import exporter
|
||||
from ty_extensions import dunder_all_names
|
||||
|
||||
# revealed: tuple[Literal["A"], Literal["B"], Literal["C"], Literal["D"]]
|
||||
# revealed: tuple[Literal["A"], Literal["B"], Literal["C"], Literal["D"], Literal["E"], Literal["F"], Literal["G"], Literal["H"]]
|
||||
reveal_type(dunder_all_names(exporter))
|
||||
```
|
||||
|
||||
|
|
|
@ -94,14 +94,16 @@ impl<'db> DunderAllNamesCollector<'db> {
|
|||
}
|
||||
|
||||
/// Extends the current set of names with the names from the given expression which can be
|
||||
/// either a list of names or a module's `__all__` variable.
|
||||
/// either a list/tuple/set of string-literal names or a module's `__all__` variable.
|
||||
///
|
||||
/// Returns `true` if the expression is a valid list or module `__all__`, `false` otherwise.
|
||||
fn extend_from_list_or_module(&mut self, expr: &ast::Expr) -> bool {
|
||||
/// Returns `true` if the expression is a valid list/tuple/set or module `__all__`, `false` otherwise.
|
||||
fn extend(&mut self, expr: &ast::Expr) -> bool {
|
||||
match expr {
|
||||
// `__all__ += [...]`
|
||||
// `__all__.extend([...])`
|
||||
ast::Expr::List(ast::ExprList { elts, .. }) => self.add_names(elts),
|
||||
ast::Expr::List(ast::ExprList { elts, .. })
|
||||
| ast::Expr::Tuple(ast::ExprTuple { elts, .. })
|
||||
| ast::Expr::Set(ast::ExprSet { elts, .. }) => self.add_names(elts),
|
||||
|
||||
// `__all__ += module.__all__`
|
||||
// `__all__.extend(module.__all__)`
|
||||
|
@ -155,7 +157,7 @@ impl<'db> DunderAllNamesCollector<'db> {
|
|||
// `__all__.extend([...])`
|
||||
// `__all__.extend(module.__all__)`
|
||||
"extend" => {
|
||||
if !self.extend_from_list_or_module(argument) {
|
||||
if !self.extend(argument) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -330,7 +332,7 @@ impl<'db> StatementVisitor<'db> for DunderAllNamesCollector<'db> {
|
|||
if !is_dunder_all(target) {
|
||||
return;
|
||||
}
|
||||
if !self.extend_from_list_or_module(value) {
|
||||
if !self.extend(value) {
|
||||
self.invalid = true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue