2Tests the @final decorator.
5# Specification: https://typing.readthedocs.io/en/latest/spec/qualifiers.html#final
7from typing import final, overload
8from _qualifiers_final_decorator import Base3, Base4
10# > A type checker should prohibit any class decorated with @final from being
11# > subclassed and any method decorated with @final from being overridden in a
12# > subclass. The method decorator version may be used with all of instance
13# > methods, class methods, static methods, and properties.
21class Derived1(Base1): # E: Cannot inherit from final class "Base"
[subclass-of-final-class] Class `Derived1` cannot inherit from final class `Base1`
27 def method1(self) -> None:
32 def method2(cls) -> None:
37 def method3() -> None:
40 # > For overloaded methods, @final should be placed on the implementation.
43 def method4(self, x: int) -> int:
47 def method4(self, x: str) -> str:
51 def method4(self, x: int | str) -> int | str:
56 def method1(self) -> None: # E
[override-of-final-method] Cannot override final member `method1` from superclass `Base2`
59 @classmethod # E[method2]
60 def method2(cls) -> None: # E[method2]
Tag 'method2'
[override-of-final-method] Cannot override final member `method2` from superclass `Base2`
63 @staticmethod # E[method3]
64 def method3() -> None: # E[method3]
Tag 'method3'
[override-of-final-method] Cannot override final member `method3` from superclass `Base2`
67 @overload # E[method4]
68 def method4(self, x: int) -> int: # E[method4]
72 def method4(self, x: str) -> str:
75 def method4(self, x: int | str) -> int | str: # E[method4]
Tag 'method4'
[override-of-final-method] Cannot override final member `method4` from superclass `Base2`
80 @overload # E[Derived3]
81 def method(self, x: int) -> int: # E[Derived3]
84 @overload # E[Derived3-2]
85 @final # E[Derived3-2]: should be applied only to implementation
86 def method(self, x: str) -> str: # E[Derived3-2]
Tag 'Derived3-2'
[invalid-overload] `@final` decorator should be applied only to the overload implementation
89 def method(self, x: int | str) -> int | str: # E[Derived3]
Tag 'Derived3'
[override-of-final-method] Cannot override final member `method` from superclass `Base3`
94 @overload # E[Derived4]
95 def method(self, x: int) -> int: # E[Derived4]
99 def method(self, x: str) -> str:
102 def method(self, x: int | str) -> int | str: # E[Derived4]
Tag 'Derived4'
[override-of-final-method] Cannot override final member `method` from superclass `Base4`
112 def method(self, v: int) -> None:
116# Test multiple inheritance case.
117class Derived5(Base5_1, Base5_2):
118 def method(self) -> None: # E
[invalid-method-override] Invalid override of method `method`: Definition is incompatible with `Base5_2.method`
[override-of-final-method] Cannot override final member `method` from superclass `Base5_2`
122# > It is an error to use @final on a non-method function.
125@final # E[func]: not allowed on non-method function.
Expected a ty diagnostic for this line (tag 'func')
126def func1() -> int: # E[func]
Expected a ty diagnostic for this line (tag 'func')