@@ -716,6 +716,218 @@ class B(A):
716716 assert eval_typing (ft (B )) == classmethod [B , tuple [()], tuple [bool , str ]]
717717
718718
719+ def test_getmember_11 ():
720+ class C :
721+ def member_method (self , x : T ) -> T : ...
722+ @classmethod
723+ def class_method (cls , x : T ) -> T : ...
724+ @staticmethod
725+ def static_method (x : T ) -> T : ...
726+
727+ # member method
728+ m = eval_typing (GetMember [C , Literal ["member_method" ]])
729+ assert eval_typing (GetName [m ]) == Literal ["member_method" ]
730+ assert eval_typing (IsAssignable [GetType [m ], GenericCallable ])
731+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
732+ assert eval_typing (GetDefiner [m ]) == C
733+
734+ ft = m .__args__ [1 ].__args__ [1 ]
735+ with _ensure_context ():
736+ assert (
737+ ft (str )
738+ == Callable [
739+ [Param [Literal ["self" ], C ], Param [Literal ["x" ], str , Never ]],
740+ str ,
741+ ]
742+ )
743+
744+ # class method
745+ m = eval_typing (GetMember [C , Literal ["class_method" ]])
746+ assert eval_typing (GetName [m ]) == Literal ["class_method" ]
747+ assert eval_typing (IsAssignable [GetType [m ], GenericCallable ])
748+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
749+ assert eval_typing (GetDefiner [m ]) == C
750+
751+ ft = m .__args__ [1 ].__args__ [1 ]
752+ with _ensure_context ():
753+ assert (
754+ ft (str )
755+ == classmethod [
756+ C ,
757+ tuple [Param [Literal ["x" ], str , Never ]],
758+ str ,
759+ ]
760+ )
761+
762+ # static method
763+ m = eval_typing (GetMember [C , Literal ["static_method" ]])
764+ assert eval_typing (GetName [m ]) == Literal ["static_method" ]
765+ assert eval_typing (IsAssignable [GetType [m ], GenericCallable ])
766+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
767+ assert eval_typing (GetDefiner [m ]) == C
768+
769+ ft = m .__args__ [1 ].__args__ [1 ]
770+ with _ensure_context ():
771+ assert (
772+ ft (str ) == staticmethod [tuple [Param [Literal ["x" ], str , Never ]], str ]
773+ )
774+
775+
776+ def test_getmember_12 ():
777+ class C [T ]:
778+ def member_method (
779+ self , x : T
780+ ) -> set [T ] if IsAssignable [T , int ] else T : ...
781+ @classmethod
782+ def class_method (
783+ cls , x : T
784+ ) -> set [T ] if IsAssignable [T , int ] else T : ...
785+ @staticmethod
786+ def static_method (x : T ) -> set [T ] if IsAssignable [T , int ] else T : ...
787+
788+ # member method
789+ m = eval_typing (GetMember [C [int ], Literal ["member_method" ]])
790+ assert eval_typing (GetName [m ]) == Literal ["member_method" ]
791+ assert (
792+ eval_typing (GetType [m ])
793+ == Callable [
794+ [Param [Literal ["self" ], C [int ]], Param [Literal ["x" ], int ]], set [int ]
795+ ]
796+ )
797+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
798+ assert eval_typing (GetDefiner [m ]) == C [int ]
799+
800+ m = eval_typing (GetMember [C [str ], Literal ["member_method" ]])
801+ assert eval_typing (GetName [m ]) == Literal ["member_method" ]
802+ assert (
803+ eval_typing (GetType [m ])
804+ == Callable [
805+ [Param [Literal ["self" ], C [str ]], Param [Literal ["x" ], str ]], str
806+ ]
807+ )
808+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
809+ assert eval_typing (GetDefiner [m ]) == C [str ]
810+
811+ # class method
812+ m = eval_typing (GetMember [C [int ], Literal ["class_method" ]])
813+ assert eval_typing (GetName [m ]) == Literal ["class_method" ]
814+ assert (
815+ eval_typing (GetType [m ])
816+ == classmethod [C [int ], tuple [Param [Literal ["x" ], int ]], set [int ]]
817+ )
818+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
819+ assert eval_typing (GetDefiner [m ]) == C [int ]
820+
821+ m = eval_typing (GetMember [C [str ], Literal ["class_method" ]])
822+ assert eval_typing (GetName [m ]) == Literal ["class_method" ]
823+ assert (
824+ eval_typing (GetType [m ])
825+ == classmethod [C [str ], tuple [Param [Literal ["x" ], str ]], str ]
826+ )
827+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
828+ assert eval_typing (GetDefiner [m ]) == C [str ]
829+
830+ # static method
831+ m = eval_typing (GetMember [C [int ], Literal ["static_method" ]])
832+ assert eval_typing (GetName [m ]) == Literal ["static_method" ]
833+ assert (
834+ eval_typing (GetType [m ])
835+ == staticmethod [tuple [Param [Literal ["x" ], int ]], set [int ]]
836+ )
837+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
838+ assert eval_typing (GetDefiner [m ]) == C [int ]
839+
840+ m = eval_typing (GetMember [C [str ], Literal ["static_method" ]])
841+ assert eval_typing (GetName [m ]) == Literal ["static_method" ]
842+ assert (
843+ eval_typing (GetType [m ])
844+ == staticmethod [tuple [Param [Literal ["x" ], str ]], str ]
845+ )
846+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
847+ assert eval_typing (GetDefiner [m ]) == C [str ]
848+
849+
850+ def test_getmember_13 ():
851+ # T defined externally
852+ class C :
853+ def member_method (
854+ self , x : T
855+ ) -> set [T ] if IsAssignable [T , int ] else T : ...
856+ @classmethod
857+ def class_method (
858+ cls , x : T
859+ ) -> set [T ] if IsAssignable [T , int ] else T : ...
860+ @staticmethod
861+ def static_method (x : T ) -> set [T ] if IsAssignable [T , int ] else T : ...
862+
863+ # member method
864+ m = eval_typing (GetMember [C , Literal ["member_method" ]])
865+ assert eval_typing (GetName [m ]) == Literal ["member_method" ]
866+ assert eval_typing (IsAssignable [GetType [m ], GenericCallable ])
867+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
868+ assert eval_typing (GetDefiner [m ]) == C
869+
870+ ft = m .__args__ [1 ].__args__ [1 ]
871+ with _ensure_context ():
872+ assert (
873+ ft (str )
874+ == Callable [
875+ [Param [Literal ["self" ], C ], Param [Literal ["x" ], str , Never ]],
876+ str ,
877+ ]
878+ )
879+ assert (
880+ ft (int )
881+ == Callable [
882+ [Param [Literal ["self" ], C ], Param [Literal ["x" ], int , Never ]],
883+ set [int ],
884+ ]
885+ )
886+
887+ # class method
888+ m = eval_typing (GetMember [C , Literal ["class_method" ]])
889+ assert eval_typing (GetName [m ]) == Literal ["class_method" ]
890+ assert eval_typing (IsAssignable [GetType [m ], GenericCallable ])
891+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
892+ assert eval_typing (GetDefiner [m ]) == C
893+
894+ ft = m .__args__ [1 ].__args__ [1 ]
895+ with _ensure_context ():
896+ assert (
897+ ft (str )
898+ == classmethod [
899+ C ,
900+ tuple [Param [Literal ["x" ], str , Never ]],
901+ str ,
902+ ]
903+ )
904+ assert (
905+ ft (int )
906+ == classmethod [
907+ C ,
908+ tuple [Param [Literal ["x" ], int , Never ]],
909+ set [int ],
910+ ]
911+ )
912+
913+ # static method
914+ m = eval_typing (GetMember [C , Literal ["static_method" ]])
915+ assert eval_typing (GetName [m ]) == Literal ["static_method" ]
916+ assert eval_typing (IsAssignable [GetType [m ], GenericCallable ])
917+ assert eval_typing (GetQuals [m ]) == Literal ["ClassVar" ]
918+ assert eval_typing (GetDefiner [m ]) == C
919+
920+ ft = m .__args__ [1 ].__args__ [1 ]
921+ with _ensure_context ():
922+ assert (
923+ ft (str ) == staticmethod [tuple [Param [Literal ["x" ], str , Never ]], str ]
924+ )
925+ assert (
926+ ft (int )
927+ == staticmethod [tuple [Param [Literal ["x" ], int , Never ]], set [int ]]
928+ )
929+
930+
719931def test_getarg_never ():
720932 d = eval_typing (GetArg [Never , object , Literal [0 ]])
721933 assert d is Never
0 commit comments