Skip to content

Commit 5756b38

Browse files
authored
[ty] Extend invalid-explicit-override to also cover properties decorated with @override that do not override anything (#21756)
1 parent 92c5f62 commit 5756b38

File tree

3 files changed

+412
-249
lines changed

3 files changed

+412
-249
lines changed

crates/ty_python_semantic/resources/mdtest/override.md

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,54 +19,74 @@ class A:
1919

2020
class Parent:
2121
def foo(self): ...
22+
2223
@property
2324
def my_property1(self) -> int: ...
25+
2426
@property
2527
def my_property2(self) -> int: ...
28+
2629
baz = None
30+
2731
@classmethod
2832
def class_method1(cls) -> int: ...
33+
2934
@staticmethod
3035
def static_method1() -> int: ...
36+
3137
@classmethod
3238
def class_method2(cls) -> int: ...
39+
3340
@staticmethod
3441
def static_method2() -> int: ...
42+
3543
@lossy_decorator
3644
def decorated_1(self): ...
45+
3746
@lossy_decorator
3847
def decorated_2(self): ...
48+
3949
@lossy_decorator
4050
def decorated_3(self): ...
4151

4252
class Child(Parent):
4353
@override
4454
def foo(self): ... # fine: overrides `Parent.foo`
55+
4556
@property
4657
@override
4758
def my_property1(self) -> int: ... # fine: overrides `Parent.my_property1`
59+
4860
@override
4961
@property
5062
def my_property2(self) -> int: ... # fine: overrides `Parent.my_property2`
63+
5164
@override
5265
def baz(self): ... # fine: overrides `Parent.baz`
66+
5367
@classmethod
5468
@override
5569
def class_method1(cls) -> int: ... # fine: overrides `Parent.class_method1`
70+
5671
@staticmethod
5772
@override
5873
def static_method1() -> int: ... # fine: overrides `Parent.static_method1`
74+
5975
@override
6076
@classmethod
6177
def class_method2(cls) -> int: ... # fine: overrides `Parent.class_method2`
78+
6279
@override
6380
@staticmethod
6481
def static_method2() -> int: ... # fine: overrides `Parent.static_method2`
82+
6583
@override
6684
def decorated_1(self): ... # fine: overrides `Parent.decorated_1`
85+
6786
@override
6887
@lossy_decorator
6988
def decorated_2(self): ... # fine: overrides `Parent.decorated_2`
89+
7090
@lossy_decorator
7191
@override
7292
def decorated_3(self): ... # fine: overrides `Parent.decorated_3`
@@ -76,56 +96,79 @@ class OtherChild(Parent): ...
7696
class Grandchild(OtherChild):
7797
@override
7898
def foo(self): ... # fine: overrides `Parent.foo`
99+
79100
@override
80101
@property
81-
def bar(self) -> int: ... # fine: overrides `Parent.bar`
102+
def my_property1(self) -> int: ... # fine: overrides `Parent.my_property1`
103+
82104
@override
83105
def baz(self): ... # fine: overrides `Parent.baz`
106+
84107
@classmethod
85108
@override
86109
def class_method1(cls) -> int: ... # fine: overrides `Parent.class_method1`
110+
87111
@staticmethod
88112
@override
89113
def static_method1() -> int: ... # fine: overrides `Parent.static_method1`
114+
90115
@override
91116
@classmethod
92117
def class_method2(cls) -> int: ... # fine: overrides `Parent.class_method2`
118+
93119
@override
94120
@staticmethod
95121
def static_method2() -> int: ... # fine: overrides `Parent.static_method2`
122+
96123
@override
97124
def decorated_1(self): ... # fine: overrides `Parent.decorated_1`
125+
98126
@override
99127
@lossy_decorator
100128
def decorated_2(self): ... # fine: overrides `Parent.decorated_2`
129+
101130
@lossy_decorator
102131
@override
103132
def decorated_3(self): ... # fine: overrides `Parent.decorated_3`
104133

105134
class Invalid:
106135
@override
107136
def ___reprrr__(self): ... # error: [invalid-explicit-override]
137+
108138
@override
109139
@classmethod
110140
def foo(self): ... # error: [invalid-explicit-override]
141+
111142
@classmethod
112143
@override
113144
def bar(self): ... # error: [invalid-explicit-override]
145+
114146
@staticmethod
115147
@override
116148
def baz(): ... # error: [invalid-explicit-override]
149+
117150
@override
118151
@staticmethod
119152
def eggs(): ... # error: [invalid-explicit-override]
153+
120154
@property
121155
@override
122-
def bad_property1(self) -> int: ... # TODO: should emit `invalid-explicit-override` here
156+
def bad_property1(self) -> int: ... # error: [invalid-explicit-override]
157+
123158
@override
124159
@property
125-
def bad_property2(self) -> int: ... # TODO: should emit `invalid-explicit-override` here
160+
def bad_property2(self) -> int: ... # error: [invalid-explicit-override]
161+
162+
@property
163+
@override
164+
def bad_settable_property(self) -> int: ... # error: [invalid-explicit-override]
165+
@bad_settable_property.setter
166+
def bad_settable_property(self, x: int) -> None: ...
167+
126168
@lossy_decorator
127169
@override
128170
def lossy(self): ... # TODO: should emit `invalid-explicit-override` here
171+
129172
@override
130173
@lossy_decorator
131174
def lossy2(self): ... # TODO: should emit `invalid-explicit-override` here
@@ -136,11 +179,14 @@ class LiskovViolatingButNotOverrideViolating(Parent):
136179
@override
137180
@property
138181
def foo(self) -> int: ...
182+
139183
@override
140184
def my_property1(self) -> int: ...
185+
141186
@staticmethod
142187
@override
143188
def class_method1() -> int: ...
189+
144190
@classmethod
145191
@override
146192
def static_method1(cls) -> int: ...

0 commit comments

Comments
 (0)