mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-21 07:41:53 +00:00
Fix run-away for mutually referential instance attributes (#20645)
This commit is contained in:
parent
9393279f65
commit
5fb142374d
5 changed files with 59 additions and 10 deletions
|
@ -2363,6 +2363,55 @@ reveal_type(B().x) # revealed: Unknown | Literal[1]
|
|||
reveal_type(A().x) # revealed: Unknown | Literal[1]
|
||||
```
|
||||
|
||||
And cycles between many attributes:
|
||||
|
||||
```py
|
||||
class ManyCycles:
|
||||
def __init__(self: "ManyCycles"):
|
||||
self.x1 = 0
|
||||
self.x2 = 0
|
||||
self.x3 = 0
|
||||
self.x4 = 0
|
||||
self.x5 = 0
|
||||
self.x6 = 0
|
||||
self.x7 = 1
|
||||
|
||||
def f1(self: "ManyCycles"):
|
||||
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
|
||||
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
|
||||
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
|
||||
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
|
||||
|
||||
def f2(self: "ManyCycles"):
|
||||
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
|
||||
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
|
||||
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
|
||||
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
|
||||
|
||||
def f3(self: "ManyCycles"):
|
||||
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
|
||||
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
|
||||
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
|
||||
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
|
||||
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
|
||||
|
||||
reveal_type(self.x1) # revealed: Unknown | int
|
||||
reveal_type(self.x2) # revealed: Unknown | int
|
||||
reveal_type(self.x3) # revealed: Unknown | int
|
||||
reveal_type(self.x4) # revealed: Unknown | int
|
||||
reveal_type(self.x5) # revealed: Unknown | int
|
||||
reveal_type(self.x6) # revealed: Unknown | int
|
||||
reveal_type(self.x7) # revealed: Unknown | int
|
||||
```
|
||||
|
||||
This case additionally tests our union/intersection simplification logic:
|
||||
|
||||
```py
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue