@@ -397,6 +397,7 @@ def __init__(
397397 self .is_stub = tree .is_stub
398398 self .is_typeshed_stub = tree .is_typeshed_file (options )
399399 self .inferred_attribute_types = None
400+ self .allow_constructor_cache = True
400401
401402 # If True, process function definitions. If False, don't. This is used
402403 # for processing module top levels in fine-grained incremental mode.
@@ -448,7 +449,6 @@ def reset(self) -> None:
448449 self .binder = ConditionalTypeBinder (self .options )
449450 self ._type_maps [1 :] = []
450451 self ._type_maps [0 ].clear ()
451- self .temp_type_map = None
452452 self .expr_checker .reset ()
453453 self .deferred_nodes = []
454454 self .partial_types = []
@@ -500,12 +500,16 @@ def check_first_pass(self) -> None:
500500 )
501501
502502 def check_second_pass (
503- self , todo : Sequence [DeferredNode | FineGrainedDeferredNode ] | None = None
503+ self ,
504+ todo : Sequence [DeferredNode | FineGrainedDeferredNode ] | None = None ,
505+ * ,
506+ allow_constructor_cache : bool = True ,
504507 ) -> bool :
505508 """Run second or following pass of type checking.
506509
507510 This goes through deferred nodes, returning True if there were any.
508511 """
512+ self .allow_constructor_cache = allow_constructor_cache
509513 self .recurse_into_functions = True
510514 with state .strict_optional_set (self .options .strict_optional ), checker_state .set (self ):
511515 if not todo and not self .deferred_nodes :
@@ -1369,49 +1373,19 @@ def check_func_def(
13691373 )
13701374
13711375 # Store argument types.
1376+ found_self = False
1377+ if isinstance (defn , FuncDef ) and not defn .is_decorated :
1378+ found_self = self .require_correct_self_argument (typ , defn )
13721379 for i in range (len (typ .arg_types )):
13731380 arg_type = typ .arg_types [i ]
1374- if (
1375- isinstance (defn , FuncDef )
1376- and ref_type is not None
1377- and i == 0
1378- and defn .has_self_or_cls_argument
1379- and typ .arg_kinds [0 ] not in [nodes .ARG_STAR , nodes .ARG_STAR2 ]
1380- ):
1381- if defn .is_class or defn .name == "__new__" :
1382- ref_type = mypy .types .TypeType .make_normalized (ref_type )
1383- if not is_same_type (arg_type , ref_type ):
1384- # This level of erasure matches the one in checkmember.check_self_arg(),
1385- # better keep these two checks consistent.
1386- erased = get_proper_type (erase_typevars (erase_to_bound (arg_type )))
1387- if not is_subtype (ref_type , erased , ignore_type_params = True ):
1388- if (
1389- isinstance (erased , Instance )
1390- and erased .type .is_protocol
1391- or isinstance (erased , TypeType )
1392- and isinstance (erased .item , Instance )
1393- and erased .item .type .is_protocol
1394- ):
1395- # We allow the explicit self-type to be not a supertype of
1396- # the current class if it is a protocol. For such cases
1397- # the consistency check will be performed at call sites.
1398- msg = None
1399- elif typ .arg_names [i ] in {"self" , "cls" }:
1400- msg = message_registry .ERASED_SELF_TYPE_NOT_SUPERTYPE .format (
1401- erased .str_with_options (self .options ),
1402- ref_type .str_with_options (self .options ),
1403- )
1404- else :
1405- msg = message_registry .MISSING_OR_INVALID_SELF_TYPE
1406- if msg :
1407- self .fail (msg , defn )
1408- elif isinstance (arg_type , TypeVarType ):
1381+ if isinstance (arg_type , TypeVarType ):
14091382 # Refuse covariant parameter type variables
14101383 # TODO: check recursively for inner type variables
14111384 if (
14121385 arg_type .variance == COVARIANT
14131386 and defn .name not in ("__init__" , "__new__" , "__post_init__" )
14141387 and not is_private (defn .name ) # private methods are not inherited
1388+ and (i != 0 or not found_self )
14151389 ):
14161390 ctx : Context = arg_type
14171391 if ctx .line < 0 :
@@ -1561,6 +1535,69 @@ def check_func_def(
15611535
15621536 self .binder = old_binder
15631537
1538+ def require_correct_self_argument (self , func : Type , defn : FuncDef ) -> bool :
1539+ func = get_proper_type (func )
1540+ if not isinstance (func , CallableType ):
1541+ return False
1542+
1543+ # Do not report errors for untyped methods in classes nested in untyped funcs.
1544+ if not (
1545+ self .options .check_untyped_defs
1546+ or len (self .dynamic_funcs ) < 2
1547+ or not self .dynamic_funcs [- 2 ]
1548+ or not defn .is_dynamic ()
1549+ ):
1550+ return bool (func .arg_types )
1551+
1552+ with self .scope .push_function (defn ):
1553+ # We temporary push the definition to get the self type as
1554+ # visible from *inside* of this function/method.
1555+ ref_type : Type | None = self .scope .active_self_type ()
1556+ if ref_type is None :
1557+ return False
1558+
1559+ if not defn .has_self_or_cls_argument or (
1560+ func .arg_kinds and func .arg_kinds [0 ] in [nodes .ARG_STAR , nodes .ARG_STAR2 ]
1561+ ):
1562+ return False
1563+
1564+ if not func .arg_types :
1565+ self .fail (
1566+ 'Method must have at least one argument. Did you forget the "self" argument?' , defn
1567+ )
1568+ return False
1569+
1570+ arg_type = func .arg_types [0 ]
1571+ if defn .is_class or defn .name == "__new__" :
1572+ ref_type = mypy .types .TypeType .make_normalized (ref_type )
1573+ if is_same_type (arg_type , ref_type ):
1574+ return True
1575+
1576+ # This level of erasure matches the one in checkmember.check_self_arg(),
1577+ # better keep these two checks consistent.
1578+ erased = get_proper_type (erase_typevars (erase_to_bound (arg_type )))
1579+ if not is_subtype (ref_type , erased , ignore_type_params = True ):
1580+ if (
1581+ isinstance (erased , Instance )
1582+ and erased .type .is_protocol
1583+ or isinstance (erased , TypeType )
1584+ and isinstance (erased .item , Instance )
1585+ and erased .item .type .is_protocol
1586+ ):
1587+ # We allow the explicit self-type to be not a supertype of
1588+ # the current class if it is a protocol. For such cases
1589+ # the consistency check will be performed at call sites.
1590+ msg = None
1591+ elif func .arg_names [0 ] in {"self" , "cls" }:
1592+ msg = message_registry .ERASED_SELF_TYPE_NOT_SUPERTYPE .format (
1593+ erased .str_with_options (self .options ), ref_type .str_with_options (self .options )
1594+ )
1595+ else :
1596+ msg = message_registry .MISSING_OR_INVALID_SELF_TYPE
1597+ if msg :
1598+ self .fail (msg , defn )
1599+ return True
1600+
15641601 def is_var_redefined_in_outer_context (self , v : Var , after_line : int ) -> bool :
15651602 """Can the variable be assigned to at module top level or outer function?
15661603
@@ -3019,6 +3056,8 @@ def visit_block(self, b: Block) -> None:
30193056 break
30203057 else :
30213058 self .accept (s )
3059+ # Clear expression cache after each statement to avoid unlimited growth.
3060+ self .expr_checker .expr_cache .clear ()
30223061
30233062 def should_report_unreachable_issues (self ) -> bool :
30243063 return (
@@ -4000,7 +4039,7 @@ def check_multi_assignment_from_union(
40004039 for t , lv in zip (transposed , self .flatten_lvalues (lvalues )):
40014040 # We can access _type_maps directly since temporary type maps are
40024041 # only created within expressions.
4003- t .append (self ._type_maps [0 ].pop (lv , AnyType (TypeOfAny .special_form )))
4042+ t .append (self ._type_maps [- 1 ].pop (lv , AnyType (TypeOfAny .special_form )))
40044043 union_types = tuple (make_simplified_union (col ) for col in transposed )
40054044 for expr , items in assignments .items ():
40064045 # Bind a union of types collected in 'assignments' to every expression.
@@ -4659,6 +4698,8 @@ def replace_partial_type(
46594698 ) -> None :
46604699 """Replace the partial type of var with a non-partial type."""
46614700 var .type = new_type
4701+ # Updating a partial type should invalidate expression caches.
4702+ self .binder .version += 1
46624703 del partial_types [var ]
46634704 if self .options .allow_redefinition_new :
46644705 # When using --allow-redefinition-new, binder tracks all types of
@@ -5298,6 +5339,7 @@ def visit_decorator_inner(
52985339 )
52995340 if non_trivial_decorator :
53005341 self .check_untyped_after_decorator (sig , e .func )
5342+ self .require_correct_self_argument (sig , e .func )
53015343 sig = set_callable_name (sig , e .func )
53025344 e .var .type = sig
53035345 e .var .is_ready = True
@@ -5577,6 +5619,8 @@ def infer_variable_types_from_type_maps(
55775619 previous_type , _ , _ = self .check_lvalue (expr )
55785620 if previous_type is not None :
55795621 already_exists = True
5622+ if isinstance (expr .node , Var ) and expr .node .is_final :
5623+ self .msg .cant_assign_to_final (expr .name , False , expr )
55805624 if self .check_subtype (
55815625 typ ,
55825626 previous_type ,
0 commit comments