mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 14:52:01 +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__ = []
|
||||||
__all__.extend(["C", "D"])
|
__all__.extend(["C", "D"])
|
||||||
|
__all__.extend(("E", "F"))
|
||||||
|
__all__.extend({"G", "H"})
|
||||||
__all__.extend(subexporter.__all__)
|
__all__.extend(subexporter.__all__)
|
||||||
|
|
||||||
class C: ...
|
class C: ...
|
||||||
|
@ -281,7 +283,7 @@ class D: ...
|
||||||
import exporter
|
import exporter
|
||||||
from ty_extensions import dunder_all_names
|
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))
|
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
|
/// 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.
|
/// Returns `true` if the expression is a valid list/tuple/set or module `__all__`, `false` otherwise.
|
||||||
fn extend_from_list_or_module(&mut self, expr: &ast::Expr) -> bool {
|
fn extend(&mut self, expr: &ast::Expr) -> bool {
|
||||||
match expr {
|
match expr {
|
||||||
// `__all__ += [...]`
|
// `__all__ += [...]`
|
||||||
// `__all__.extend([...])`
|
// `__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__ += module.__all__`
|
||||||
// `__all__.extend(module.__all__)`
|
// `__all__.extend(module.__all__)`
|
||||||
|
@ -155,7 +157,7 @@ impl<'db> DunderAllNamesCollector<'db> {
|
||||||
// `__all__.extend([...])`
|
// `__all__.extend([...])`
|
||||||
// `__all__.extend(module.__all__)`
|
// `__all__.extend(module.__all__)`
|
||||||
"extend" => {
|
"extend" => {
|
||||||
if !self.extend_from_list_or_module(argument) {
|
if !self.extend(argument) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -330,7 +332,7 @@ impl<'db> StatementVisitor<'db> for DunderAllNamesCollector<'db> {
|
||||||
if !is_dunder_all(target) {
|
if !is_dunder_all(target) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if !self.extend_from_list_or_module(value) {
|
if !self.extend(value) {
|
||||||
self.invalid = true;
|
self.invalid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue