mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-27 10:26:26 +00:00
[ty] Enums: allow multiple aliases to point to the same member (#20669)
## Summary closes https://github.com/astral-sh/ty/issues/1293 ## Test Plan Regression test
This commit is contained in:
parent
963bc8c228
commit
56d630e303
2 changed files with 45 additions and 3 deletions
|
|
@ -265,6 +265,41 @@ reveal_type(enum_members(Color))
|
||||||
reveal_type(Color.red)
|
reveal_type(Color.red)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Multiple aliases to the same member are also supported. This is a regression test for
|
||||||
|
<https://github.com/astral-sh/ty/issues/1293>:
|
||||||
|
|
||||||
|
```py
|
||||||
|
from ty_extensions import enum_members
|
||||||
|
|
||||||
|
class ManyAliases(Enum):
|
||||||
|
real_member = "real_member"
|
||||||
|
alias1 = "real_member"
|
||||||
|
alias2 = "real_member"
|
||||||
|
alias3 = "real_member"
|
||||||
|
|
||||||
|
other_member = "other_real_member"
|
||||||
|
|
||||||
|
# revealed: tuple[Literal["real_member"], Literal["other_member"]]
|
||||||
|
reveal_type(enum_members(ManyAliases))
|
||||||
|
|
||||||
|
reveal_type(ManyAliases.real_member) # revealed: Literal[ManyAliases.real_member]
|
||||||
|
reveal_type(ManyAliases.alias1) # revealed: Literal[ManyAliases.real_member]
|
||||||
|
reveal_type(ManyAliases.alias2) # revealed: Literal[ManyAliases.real_member]
|
||||||
|
reveal_type(ManyAliases.alias3) # revealed: Literal[ManyAliases.real_member]
|
||||||
|
|
||||||
|
reveal_type(ManyAliases.real_member.value) # revealed: Literal["real_member"]
|
||||||
|
reveal_type(ManyAliases.real_member.name) # revealed: Literal["real_member"]
|
||||||
|
|
||||||
|
reveal_type(ManyAliases.alias1.value) # revealed: Literal["real_member"]
|
||||||
|
reveal_type(ManyAliases.alias1.name) # revealed: Literal["real_member"]
|
||||||
|
|
||||||
|
reveal_type(ManyAliases.alias2.value) # revealed: Literal["real_member"]
|
||||||
|
reveal_type(ManyAliases.alias2.name) # revealed: Literal["real_member"]
|
||||||
|
|
||||||
|
reveal_type(ManyAliases.alias3.value) # revealed: Literal["real_member"]
|
||||||
|
reveal_type(ManyAliases.alias3.name) # revealed: Literal["real_member"]
|
||||||
|
```
|
||||||
|
|
||||||
### Using `auto()`
|
### Using `auto()`
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
|
|
||||||
|
|
@ -194,12 +194,19 @@ pub(crate) fn enum_metadata<'db>(
|
||||||
// we don't know if it's a duplicate or not.
|
// we don't know if it's a duplicate or not.
|
||||||
if matches!(
|
if matches!(
|
||||||
value_ty,
|
value_ty,
|
||||||
Type::IntLiteral(_) | Type::StringLiteral(_) | Type::BytesLiteral(_)
|
Type::BooleanLiteral(_)
|
||||||
|
| Type::IntLiteral(_)
|
||||||
|
| Type::StringLiteral(_)
|
||||||
|
| Type::BytesLiteral(_)
|
||||||
) {
|
) {
|
||||||
if let Some(previous) = enum_values.insert(value_ty, name.clone()) {
|
if let Some(canonical) = enum_values.get(&value_ty) {
|
||||||
aliases.insert(name.clone(), previous);
|
// This is a duplicate value, create an alias to the canonical (first) member
|
||||||
|
aliases.insert(name.clone(), canonical.clone());
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is the first occurrence of this value, track it as the canonical member
|
||||||
|
enum_values.insert(value_ty, name.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let declarations = use_def_map.end_of_scope_symbol_declarations(symbol_id);
|
let declarations = use_def_map.end_of_scope_symbol_declarations(symbol_id);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue