|
130 | 130 | WhileStmt, |
131 | 131 | WithStmt, |
132 | 132 | YieldExpr, |
| 133 | + get_func_def, |
133 | 134 | is_final_node, |
134 | 135 | ) |
135 | 136 | from mypy.operators import flip_ops, int_op_to_method, neg_ops |
@@ -430,6 +431,13 @@ def __init__( |
430 | 431 | self._expr_checker = mypy.checkexpr.ExpressionChecker( |
431 | 432 | self, self.msg, self.plugin, per_line_checking_time_ns |
432 | 433 | ) |
| 434 | + |
| 435 | + self._str_type: Instance | None = None |
| 436 | + self._function_type: Instance | None = None |
| 437 | + self._int_type: Instance | None = None |
| 438 | + self._bool_type: Instance | None = None |
| 439 | + self._object_type: Instance | None = None |
| 440 | + |
433 | 441 | self.pattern_checker = PatternChecker(self, self.msg, self.plugin, options) |
434 | 442 | self._unique_id = 0 |
435 | 443 |
|
@@ -703,6 +711,12 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None: |
703 | 711 | # TODO: keep precise type for callables with tricky but valid signatures. |
704 | 712 | setter_type = fallback_setter_type |
705 | 713 | defn.items[0].var.setter_type = setter_type |
| 714 | + if isinstance(defn.type, Overloaded): |
| 715 | + # Update legacy property type for decorated properties. |
| 716 | + getter_type = self.extract_callable_type(defn.items[0].var.type, defn) |
| 717 | + if getter_type is not None: |
| 718 | + getter_type.definition = defn.items[0] |
| 719 | + defn.type.items[0] = getter_type |
706 | 720 | for i, fdef in enumerate(defn.items): |
707 | 721 | assert isinstance(fdef, Decorator) |
708 | 722 | if defn.is_property: |
@@ -730,7 +744,7 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None: |
730 | 744 | assert isinstance(item, Decorator) |
731 | 745 | item_type = self.extract_callable_type(item.var.type, item) |
732 | 746 | if item_type is not None: |
733 | | - item_type.definition = item.func |
| 747 | + item_type.definition = item |
734 | 748 | item_types.append(item_type) |
735 | 749 | if item_types: |
736 | 750 | defn.type = Overloaded(item_types) |
@@ -2501,8 +2515,9 @@ def check_override( |
2501 | 2515 |
|
2502 | 2516 | override_ids = override.type_var_ids() |
2503 | 2517 | type_name = None |
2504 | | - if isinstance(override.definition, FuncDef): |
2505 | | - type_name = override.definition.info.name |
| 2518 | + definition = get_func_def(override) |
| 2519 | + if isinstance(definition, FuncDef): |
| 2520 | + type_name = definition.info.name |
2506 | 2521 |
|
2507 | 2522 | def erase_override(t: Type) -> Type: |
2508 | 2523 | return erase_typevars(t, ids_to_erase=override_ids) |
@@ -3509,6 +3524,7 @@ def check_compatibility_all_supers(self, lvalue: RefExpr, rvalue: Expression) -> |
3509 | 3524 | continue |
3510 | 3525 |
|
3511 | 3526 | base_type, base_node = self.node_type_from_base(lvalue_node.name, base, lvalue) |
| 3527 | + # TODO: if the r.h.s. is a descriptor, we should check setter override as well. |
3512 | 3528 | custom_setter = is_custom_settable_property(base_node) |
3513 | 3529 | if isinstance(base_type, PartialType): |
3514 | 3530 | base_type = None |
@@ -4494,6 +4510,8 @@ def set_inferred_type(self, var: Var, lvalue: Lvalue, type: Type) -> None: |
4494 | 4510 | if isinstance(p_type, Overloaded): |
4495 | 4511 | # TODO: in theory we can have a property with a deleter only. |
4496 | 4512 | var.is_settable_property = True |
| 4513 | + assert isinstance(definition, Decorator), definition |
| 4514 | + var.setter_type = definition.var.setter_type |
4497 | 4515 |
|
4498 | 4516 | def set_inference_error_fallback_type(self, var: Var, lvalue: Lvalue, type: Type) -> None: |
4499 | 4517 | """Store best known type for variable if type inference failed. |
@@ -5356,6 +5374,8 @@ def visit_decorator_inner( |
5356 | 5374 | self.check_untyped_after_decorator(sig, e.func) |
5357 | 5375 | self.require_correct_self_argument(sig, e.func) |
5358 | 5376 | sig = set_callable_name(sig, e.func) |
| 5377 | + if isinstance(sig, CallableType): |
| 5378 | + sig.definition = e |
5359 | 5379 | e.var.type = sig |
5360 | 5380 | e.var.is_ready = True |
5361 | 5381 | if e.func.is_property: |
@@ -7356,6 +7376,29 @@ def named_type(self, name: str) -> Instance: |
7356 | 7376 |
|
7357 | 7377 | For example, named_type('builtins.object') produces the 'object' type. |
7358 | 7378 | """ |
| 7379 | + if name == "builtins.str": |
| 7380 | + if self._str_type is None: |
| 7381 | + self._str_type = self._named_type(name) |
| 7382 | + return self._str_type |
| 7383 | + if name == "builtins.function": |
| 7384 | + if self._function_type is None: |
| 7385 | + self._function_type = self._named_type(name) |
| 7386 | + return self._function_type |
| 7387 | + if name == "builtins.int": |
| 7388 | + if self._int_type is None: |
| 7389 | + self._int_type = self._named_type(name) |
| 7390 | + return self._int_type |
| 7391 | + if name == "builtins.bool": |
| 7392 | + if self._bool_type is None: |
| 7393 | + self._bool_type = self._named_type(name) |
| 7394 | + return self._bool_type |
| 7395 | + if name == "builtins.object": |
| 7396 | + if self._object_type is None: |
| 7397 | + self._object_type = self._named_type(name) |
| 7398 | + return self._object_type |
| 7399 | + return self._named_type(name) |
| 7400 | + |
| 7401 | + def _named_type(self, name: str) -> Instance: |
7359 | 7402 | # Assume that the name refers to a type. |
7360 | 7403 | sym = self.lookup_qualified(name) |
7361 | 7404 | node = sym.node |
@@ -8654,17 +8697,21 @@ def visit_type_alias_type(self, t: TypeAliasType) -> Type: |
8654 | 8697 | return t.copy_modified(args=[a.accept(self) for a in t.args]) |
8655 | 8698 |
|
8656 | 8699 |
|
8657 | | -def is_classmethod_node(node: Node | None) -> bool | None: |
| 8700 | +def is_classmethod_node(node: SymbolNode | None) -> bool | None: |
8658 | 8701 | """Find out if a node describes a classmethod.""" |
| 8702 | + if isinstance(node, Decorator): |
| 8703 | + node = node.func |
8659 | 8704 | if isinstance(node, FuncDef): |
8660 | 8705 | return node.is_class |
8661 | 8706 | if isinstance(node, Var): |
8662 | 8707 | return node.is_classmethod |
8663 | 8708 | return None |
8664 | 8709 |
|
8665 | 8710 |
|
8666 | | -def is_node_static(node: Node | None) -> bool | None: |
| 8711 | +def is_node_static(node: SymbolNode | None) -> bool | None: |
8667 | 8712 | """Find out if a node describes a static function method.""" |
| 8713 | + if isinstance(node, Decorator): |
| 8714 | + node = node.func |
8668 | 8715 | if isinstance(node, FuncDef): |
8669 | 8716 | return node.is_static |
8670 | 8717 | if isinstance(node, Var): |
|
0 commit comments