@@ -488,11 +488,110 @@ class C(A):
488488 pass
489489
490490 if coinflip():
491- def method2 (self ) -> None : ... # TODO : should emit [override-of-final-method]
491+ def method2 (self ) -> None : ... # error: [override-of-final-method]
492492 else :
493- def method2 (self ) -> None : ... # TODO : should emit [override-of-final-method]
493+ def method2 (self ) -> None : ...
494494
495495 if coinflip():
496496 def method3 (self ) -> None : ... # error: [override-of-final-method]
497- def method4 (self ) -> None : ... # error: [override-of-final-method]
497+
498+ # TODO : we should emit Liskov violations here too:
499+ if coinflip():
500+ method4 = 42 # error: [override-of-final-method]
501+ else :
502+ method4 = 56
503+ ```
504+
505+ ## Definitions in statically known branches
506+
507+ ``` toml
508+ [environment ]
509+ python-version = " 3.10"
510+ ```
511+
512+ ``` py
513+ import sys
514+ from typing_extensions import final
515+
516+ class Parent :
517+ if sys.version_info >= (3 , 10 ):
518+ @final
519+ def foo (self ) -> None : ...
520+ @final
521+ def foooo (self ) -> None : ...
522+ @final
523+ def baaaaar (self ) -> None : ...
524+ else :
525+ @final
526+ def bar (self ) -> None : ...
527+ @final
528+ def baz (self ) -> None : ...
529+ @final
530+ def spam (self ) -> None : ...
531+
532+ class Child (Parent ):
533+ def foo (self ) -> None : ... # error: [override-of-final-method]
534+
535+ # The declaration on `Parent` is not reachable,
536+ # so this is fine
537+ def bar (self ) -> None : ...
538+
539+ if sys.version_info >= (3 , 10 ):
540+ def foooo (self ) -> None : ... # error: [override-of-final-method]
541+ def baz (self ) -> None : ...
542+ else :
543+ # Fine because this doesn't override any reachable definitions
544+ def foooo (self ) -> None : ...
545+ # There are `@final` definitions being overridden here,
546+ # but the definitions that override them are unreachable
547+ def spam (self ) -> None : ...
548+ def baaaaar (self ) -> None : ...
549+ ```
550+
551+ ## Overloads in statically-known branches in stub files
552+
553+ <!-- snapshot-diagnostics -->
554+
555+ ``` toml
556+ [environment ]
557+ python-version = " 3.10"
558+ ```
559+
560+ ``` pyi
561+ import sys
562+ from typing_extensions import overload, final
563+
564+ class Foo :
565+ if sys.version_info >= (3 , 10 ):
566+ @overload
567+ @final
568+ def method (self , x : int ) -> int : ...
569+ else :
570+ @overload
571+ def method (self , x : int ) -> int : ...
572+ @overload
573+ def method (self , x : str ) -> str : ...
574+
575+ if sys.version_info >= (3 , 10 ):
576+ @overload
577+ def method2 (self , x : int ) -> int : ...
578+ else :
579+ @overload
580+ @final
581+ def method2 (self , x : int ) -> int : ...
582+ @overload
583+ def method2 (self , x : str ) -> str : ...
584+
585+ class Bar (Foo ):
586+ @overload
587+ def method (self , x : int ) -> int : ...
588+ @overload
589+ def method (self , x : str ) -> str : ... # error: [override-of-final-method]
590+
591+ # This is fine: the only overload that is marked `@final`
592+ # is in a statically-unreachable branch
593+ @overload
594+ def method2 (self , x : int ) -> int : ...
595+ @overload
596+ def method2 (self , x : str ) -> str : ...
498597```
0 commit comments