117117 TypeAlias ,
118118 TypeAliasStmt ,
119119 TypeInfo ,
120- TypeVarExpr ,
121120 UnaryExpr ,
122121 Var ,
123122 WhileStmt ,
@@ -697,11 +696,9 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
697696 assert isinstance (defn .items [0 ], Decorator )
698697 self .visit_decorator (defn .items [0 ])
699698 if defn .items [0 ].var .is_settable_property :
700- # TODO: here and elsewhere we assume setter immediately follows getter.
701- assert isinstance (defn .items [1 ], Decorator )
702699 # Perform a reduced visit just to infer the actual setter type.
703- self .visit_decorator_inner (defn .items [ 1 ] , skip_first_item = True )
704- setter_type = defn .items [ 1 ] .var .type
700+ self .visit_decorator_inner (defn .setter , skip_first_item = True )
701+ setter_type = defn .setter .var .type
705702 # Check if the setter can accept two positional arguments.
706703 any_type = AnyType (TypeOfAny .special_form )
707704 fallback_setter_type = CallableType (
@@ -712,7 +709,7 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
712709 fallback = self .named_type ("builtins.function" ),
713710 )
714711 if setter_type and not is_subtype (setter_type , fallback_setter_type ):
715- self .fail ("Invalid property setter signature" , defn .items [ 1 ] .func )
712+ self .fail ("Invalid property setter signature" , defn .setter .func )
716713 setter_type = self .extract_callable_type (setter_type , defn )
717714 if not isinstance (setter_type , CallableType ) or len (setter_type .arg_types ) != 2 :
718715 # TODO: keep precise type for callables with tricky but valid signatures.
@@ -2171,7 +2168,7 @@ def check_setter_type_override(self, defn: OverloadedFuncDef, base: TypeInfo) ->
21712168 assert typ is not None and original_type is not None
21722169
21732170 if not is_subtype (original_type , typ ):
2174- self .msg .incompatible_setter_override (defn .items [ 1 ] , typ , original_type , base )
2171+ self .msg .incompatible_setter_override (defn .setter , typ , original_type , base )
21752172
21762173 def check_method_override_for_base_with_name (
21772174 self , defn : FuncDef | OverloadedFuncDef | Decorator , name : str , base : TypeInfo
@@ -2860,29 +2857,6 @@ def check_multiple_inheritance(self, typ: TypeInfo) -> None:
28602857 if name in base2 .names and base2 not in base .mro :
28612858 self .check_compatibility (name , base , base2 , typ )
28622859
2863- def determine_type_of_member (self , sym : SymbolTableNode ) -> Type | None :
2864- # TODO: this duplicates both checkmember.py and analyze_ref_expr(), delete.
2865- if sym .type is not None :
2866- return sym .type
2867- if isinstance (sym .node , SYMBOL_FUNCBASE_TYPES ):
2868- return self .function_type (sym .node )
2869- if isinstance (sym .node , TypeInfo ):
2870- if sym .node .typeddict_type :
2871- # We special-case TypedDict, because they don't define any constructor.
2872- return self .expr_checker .typeddict_callable (sym .node )
2873- else :
2874- return type_object_type (sym .node , self .named_type )
2875- if isinstance (sym .node , TypeVarExpr ):
2876- # Use of TypeVars is rejected in an expression/runtime context, so
2877- # we don't need to check supertype compatibility for them.
2878- return AnyType (TypeOfAny .special_form )
2879- if isinstance (sym .node , TypeAlias ):
2880- with self .msg .filter_errors ():
2881- # Suppress any errors, they will be given when analyzing the corresponding node.
2882- # Here we may have incorrect options and location context.
2883- return self .expr_checker .alias_type_in_runtime_context (sym .node , ctx = sym .node )
2884- return None
2885-
28862860 def check_compatibility (
28872861 self , name : str , base1 : TypeInfo , base2 : TypeInfo , ctx : TypeInfo
28882862 ) -> None :
0 commit comments