From 0ef150862cc7dd0ff72adee88b14575e46f6af06 Mon Sep 17 00:00:00 2001 From: STerliakov Date: Fri, 11 Jul 2025 18:08:47 +0200 Subject: [PATCH 1/3] Ignore `OverloadedFuncDef.setter` when patching from daemon --- mypy/server/astmerge.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mypy/server/astmerge.py b/mypy/server/astmerge.py index 8cd574628bb8..3ffef4736ac4 100644 --- a/mypy/server/astmerge.py +++ b/mypy/server/astmerge.py @@ -351,6 +351,9 @@ def fixup(self, node: SN) -> SN: # in external types (e.g. named tuples), so we need to update it manually. skip_slots = ("special_alias",) replace_object_state(new.special_alias, node.special_alias) + if isinstance(node, OverloadedFuncDef) and isinstance(new, OverloadedFuncDef): + # Non-settable property that can raise AssertionError's during patching + skip_slots = ("setter",) replace_object_state(new, node, skip_slots=skip_slots) return cast(SN, new) return node From 6c36c84d4167774f6cf345180dce0abc90ebaaf6 Mon Sep 17 00:00:00 2001 From: STerliakov Date: Fri, 11 Jul 2025 18:18:41 +0200 Subject: [PATCH 2/3] Force death on warnings --- pyproject.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 1870e0931407..032bfcb609e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -222,6 +222,14 @@ addopts = "-nauto --strict-markers --strict-config" # treat xpasses as test failures so they get converted to regular tests as soon as possible xfail_strict = true +# Force warnings as errors +filterwarnings = [ + "error", + # Some testcases may contain code that emits SyntaxWarnings, and they are not yet + # handled consistently in 3.14 (PEP 765) + "default::SyntaxWarning", +] + [tool.coverage.run] branch = true source = ["mypy"] From ec9f951a914cdd6dcc2c356a91eb9edc1bb0ad26 Mon Sep 17 00:00:00 2001 From: STerliakov Date: Fri, 11 Jul 2025 18:49:16 +0200 Subject: [PATCH 3/3] Do this everywhere --- mypy/server/astmerge.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mypy/server/astmerge.py b/mypy/server/astmerge.py index 3ffef4736ac4..33e2d2b799cb 100644 --- a/mypy/server/astmerge.py +++ b/mypy/server/astmerge.py @@ -345,16 +345,11 @@ def visit_type_alias(self, node: TypeAlias) -> None: def fixup(self, node: SN) -> SN: if node in self.replacements: new = self.replacements[node] - skip_slots: tuple[str, ...] = () if isinstance(node, TypeInfo) and isinstance(new, TypeInfo): # Special case: special_alias is not exposed in symbol tables, but may appear # in external types (e.g. named tuples), so we need to update it manually. - skip_slots = ("special_alias",) replace_object_state(new.special_alias, node.special_alias) - if isinstance(node, OverloadedFuncDef) and isinstance(new, OverloadedFuncDef): - # Non-settable property that can raise AssertionError's during patching - skip_slots = ("setter",) - replace_object_state(new, node, skip_slots=skip_slots) + replace_object_state(new, node, skip_slots=_get_ignored_slots(new)) return cast(SN, new) return node @@ -559,9 +554,16 @@ def replace_nodes_in_symbol_table( if node.node in replacements: new = replacements[node.node] old = node.node - # Needed for TypeInfo, see comment in fixup() above. - replace_object_state(new, old, skip_slots=("special_alias",)) + replace_object_state(new, old, skip_slots=_get_ignored_slots(new)) node.node = new if isinstance(node.node, (Var, TypeAlias)): # Handle them here just in case these aren't exposed through the AST. node.node.accept(NodeReplaceVisitor(replacements)) + + +def _get_ignored_slots(node: SymbolNode) -> tuple[str, ...]: + if isinstance(node, OverloadedFuncDef): + return ("setter",) + if isinstance(node, TypeInfo): + return ("special_alias",) + return ()