diff --git a/mypy/stubtest.py b/mypy/stubtest.py index 774f03cbbdd0..4a99c407f319 100644 --- a/mypy/stubtest.py +++ b/mypy/stubtest.py @@ -493,7 +493,7 @@ def verify_typeinfo( for entry in sorted(to_check): mangled_entry = entry if entry.startswith("__") and not entry.endswith("__"): - mangled_entry = f"_{stub.name}{entry}" + mangled_entry = f"_{stub.name.lstrip('_')}{entry}" stub_to_verify = next((t.names[entry].node for t in stub.mro if entry in t.names), MISSING) assert stub_to_verify is not None try: diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py index 5e59d8efec63..42dd40d76414 100644 --- a/mypy/test/teststubtest.py +++ b/mypy/test/teststubtest.py @@ -1154,6 +1154,49 @@ def __mangle_bad(self, text): pass """, error="X.__mangle_bad", ) + yield Case( + stub=""" + class Klass: + class __Mangled1: + class __Mangled2: + def __mangle_good(self, text: str) -> None: ... + def __mangle_bad(self, number: int) -> None: ... + """, + runtime=""" + class Klass: + class __Mangled1: + class __Mangled2: + def __mangle_good(self, text): pass + def __mangle_bad(self, text): pass + """, + error="Klass.__Mangled1.__Mangled2.__mangle_bad", + ) + yield Case( + stub=""" + class __Dunder__: + def __mangle_good(self, text: str) -> None: ... + def __mangle_bad(self, number: int) -> None: ... + """, + runtime=""" + class __Dunder__: + def __mangle_good(self, text): pass + def __mangle_bad(self, text): pass + """, + error="__Dunder__.__mangle_bad", + ) + yield Case( + stub=""" + class _Private: + def __mangle_good(self, text: str) -> None: ... + def __mangle_bad(self, number: int) -> None: ... + """, + runtime=""" + class _Private: + def __mangle_good(self, text): pass + def __mangle_bad(self, text): pass + """, + error="_Private.__mangle_bad", + ) @collect_cases def test_mro(self) -> Iterator[Case]: