Skip to content

Commit 84de3bb

Browse files
committed
Merge branch 'master' into fix/narrowing_unreachable_try_finally
# Conflicts: # mypy/checker.py
2 parents fc1c790 + dc42e28 commit 84de3bb

35 files changed

+629
-449
lines changed

misc/self_compile_info.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"""Print list of files compiled when compiling self (mypy and mypyc)."""
2+
3+
import argparse
4+
import sys
5+
from typing import Any
6+
7+
import setuptools
8+
9+
import mypyc.build
10+
11+
12+
class FakeExtension:
13+
def __init__(self, *args: Any, **kwargs: Any) -> None:
14+
pass
15+
16+
17+
def fake_mypycify(args: list[str], **kwargs: Any) -> list[FakeExtension]:
18+
for target in sorted(args):
19+
if not target.startswith("-"):
20+
print(target)
21+
return [FakeExtension()]
22+
23+
24+
def fake_setup(*args: Any, **kwargs: Any) -> Any:
25+
pass
26+
27+
28+
def main() -> None:
29+
parser = argparse.ArgumentParser(
30+
description="Print list of files compiled when compiling self. Run in repository root."
31+
)
32+
parser.parse_args()
33+
34+
# Prepare fake state for running setup.py.
35+
mypyc.build.mypycify = fake_mypycify # type: ignore[assignment]
36+
setuptools.Extension = FakeExtension # type: ignore[misc, assignment]
37+
setuptools.setup = fake_setup
38+
sys.argv = [sys.argv[0], "--use-mypyc"]
39+
40+
# Run setup.py at the root of the repository.
41+
import setup # noqa: F401
42+
43+
44+
if __name__ == "__main__":
45+
main()

mypy/checker.py

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from mypy.erasetype import erase_type, erase_typevars, remove_instance_last_known_values
2727
from mypy.errorcodes import TYPE_VAR, UNUSED_AWAITABLE, UNUSED_COROUTINE, ErrorCode
2828
from mypy.errors import (
29+
ErrorInfo,
2930
Errors,
3031
ErrorWatcher,
3132
IterationErrorWatcher,
@@ -123,7 +124,6 @@
123124
TypeAlias,
124125
TypeAliasStmt,
125126
TypeInfo,
126-
TypeVarExpr,
127127
UnaryExpr,
128128
Var,
129129
WhileStmt,
@@ -673,11 +673,9 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
673673
assert isinstance(defn.items[0], Decorator)
674674
self.visit_decorator(defn.items[0])
675675
if defn.items[0].var.is_settable_property:
676-
# TODO: here and elsewhere we assume setter immediately follows getter.
677-
assert isinstance(defn.items[1], Decorator)
678676
# Perform a reduced visit just to infer the actual setter type.
679-
self.visit_decorator_inner(defn.items[1], skip_first_item=True)
680-
setter_type = defn.items[1].var.type
677+
self.visit_decorator_inner(defn.setter, skip_first_item=True)
678+
setter_type = defn.setter.var.type
681679
# Check if the setter can accept two positional arguments.
682680
any_type = AnyType(TypeOfAny.special_form)
683681
fallback_setter_type = CallableType(
@@ -688,7 +686,7 @@ def _visit_overloaded_func_def(self, defn: OverloadedFuncDef) -> None:
688686
fallback=self.named_type("builtins.function"),
689687
)
690688
if setter_type and not is_subtype(setter_type, fallback_setter_type):
691-
self.fail("Invalid property setter signature", defn.items[1].func)
689+
self.fail("Invalid property setter signature", defn.setter.func)
692690
setter_type = self.extract_callable_type(setter_type, defn)
693691
if not isinstance(setter_type, CallableType) or len(setter_type.arg_types) != 2:
694692
# TODO: keep precise type for callables with tricky but valid signatures.
@@ -2147,7 +2145,7 @@ def check_setter_type_override(self, defn: OverloadedFuncDef, base: TypeInfo) ->
21472145
assert typ is not None and original_type is not None
21482146

21492147
if not is_subtype(original_type, typ):
2150-
self.msg.incompatible_setter_override(defn.items[1], typ, original_type, base)
2148+
self.msg.incompatible_setter_override(defn.setter, typ, original_type, base)
21512149

21522150
def check_method_override_for_base_with_name(
21532151
self, defn: FuncDef | OverloadedFuncDef | Decorator, name: str, base: TypeInfo
@@ -2836,29 +2834,6 @@ def check_multiple_inheritance(self, typ: TypeInfo) -> None:
28362834
if name in base2.names and base2 not in base.mro:
28372835
self.check_compatibility(name, base, base2, typ)
28382836

2839-
def determine_type_of_member(self, sym: SymbolTableNode) -> Type | None:
2840-
# TODO: this duplicates both checkmember.py and analyze_ref_expr(), delete.
2841-
if sym.type is not None:
2842-
return sym.type
2843-
if isinstance(sym.node, SYMBOL_FUNCBASE_TYPES):
2844-
return self.function_type(sym.node)
2845-
if isinstance(sym.node, TypeInfo):
2846-
if sym.node.typeddict_type:
2847-
# We special-case TypedDict, because they don't define any constructor.
2848-
return self.expr_checker.typeddict_callable(sym.node)
2849-
else:
2850-
return type_object_type(sym.node, self.named_type)
2851-
if isinstance(sym.node, TypeVarExpr):
2852-
# Use of TypeVars is rejected in an expression/runtime context, so
2853-
# we don't need to check supertype compatibility for them.
2854-
return AnyType(TypeOfAny.special_form)
2855-
if isinstance(sym.node, TypeAlias):
2856-
with self.msg.filter_errors():
2857-
# Suppress any errors, they will be given when analyzing the corresponding node.
2858-
# Here we may have incorrect options and location context.
2859-
return self.expr_checker.alias_type_in_runtime_context(sym.node, ctx=sym.node)
2860-
return None
2861-
28622837
def check_compatibility(
28632838
self, name: str, base1: TypeInfo, base2: TypeInfo, ctx: TypeInfo
28642839
) -> None:
@@ -7195,7 +7170,7 @@ def check_subtype(
71957170
if extra_info:
71967171
msg = msg.with_additional_msg(" (" + ", ".join(extra_info) + ")")
71977172

7198-
self.fail(msg, context)
7173+
error = self.fail(msg, context)
71997174
for note in notes:
72007175
self.msg.note(note, context, code=msg.code)
72017176
if note_msg:
@@ -7206,7 +7181,7 @@ def check_subtype(
72067181
and supertype.type.is_protocol
72077182
and isinstance(subtype, (CallableType, Instance, TupleType, TypedDictType))
72087183
):
7209-
self.msg.report_protocol_problems(subtype, supertype, context, code=msg.code)
7184+
self.msg.report_protocol_problems(subtype, supertype, context, parent_error=error)
72107185
if isinstance(supertype, CallableType) and isinstance(subtype, Instance):
72117186
call = find_member("__call__", subtype, subtype, is_operator=True)
72127187
if call:
@@ -7535,12 +7510,11 @@ def temp_node(self, t: Type, context: Context | None = None) -> TempNode:
75357510

75367511
def fail(
75377512
self, msg: str | ErrorMessage, context: Context, *, code: ErrorCode | None = None
7538-
) -> None:
7513+
) -> ErrorInfo:
75397514
"""Produce an error message."""
75407515
if isinstance(msg, ErrorMessage):
7541-
self.msg.fail(msg.value, context, code=msg.code)
7542-
return
7543-
self.msg.fail(msg, context, code=code)
7516+
return self.msg.fail(msg.value, context, code=msg.code)
7517+
return self.msg.fail(msg, context, code=code)
75447518

75457519
def note(
75467520
self,

mypy/checker_shared.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
MypyFile,
2222
Node,
2323
RefExpr,
24-
TypeAlias,
24+
SymbolNode,
2525
TypeInfo,
2626
Var,
2727
)
@@ -64,10 +64,6 @@ def accept(
6464
def analyze_ref_expr(self, e: RefExpr, lvalue: bool = False) -> Type:
6565
raise NotImplementedError
6666

67-
@abstractmethod
68-
def module_type(self, node: MypyFile) -> Instance:
69-
raise NotImplementedError
70-
7167
@abstractmethod
7268
def check_call(
7369
self,
@@ -112,24 +108,26 @@ def check_method_call_by_name(
112108
) -> tuple[Type, Type]:
113109
raise NotImplementedError
114110

115-
@abstractmethod
116-
def alias_type_in_runtime_context(
117-
self, alias: TypeAlias, *, ctx: Context, alias_definition: bool = False
118-
) -> Type:
119-
raise NotImplementedError
120-
121111
@abstractmethod
122112
def visit_typeddict_index_expr(
123113
self, td_type: TypedDictType, index: Expression, setitem: bool = False
124114
) -> tuple[Type, set[str]]:
125115
raise NotImplementedError
126116

127117
@abstractmethod
128-
def typeddict_callable(self, info: TypeInfo) -> CallableType:
118+
def infer_literal_expr_type(self, value: LiteralValue, fallback_name: str) -> Type:
129119
raise NotImplementedError
130120

131121
@abstractmethod
132-
def infer_literal_expr_type(self, value: LiteralValue, fallback_name: str) -> Type:
122+
def analyze_static_reference(
123+
self,
124+
node: SymbolNode,
125+
ctx: Context,
126+
is_lvalue: bool,
127+
*,
128+
include_modules: bool = True,
129+
suppress_errors: bool = False,
130+
) -> Type:
133131
raise NotImplementedError
134132

135133

0 commit comments

Comments
 (0)