Skip to content

Commit bd32701

Browse files
committed
Added module path output for the
supertype in case of an error.
1 parent 47e3526 commit bd32701

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed

mypy/messages.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
get_proper_types,
9898
)
9999
from mypy.typetraverser import TypeTraverserVisitor
100-
from mypy.util import plural_s, unmangle
100+
from mypy.util import plural_s, unmangle, get_qualified_name
101101

102102
TYPES_FOR_UNIMPORTED_HINTS: Final = {
103103
"typing.Any",
@@ -1379,15 +1379,7 @@ def return_type_incompatible_with_supertype(
13791379
)
13801380

13811381
def override_target(self, name: str, name_in_super: str, supertype: str) -> str:
1382-
def _get_qualified_name(class_name: str) -> str:
1383-
import sys
1384-
current_module = sys.modules[__name__]
1385-
cls = getattr(current_module, class_name, None)
1386-
if cls is None:
1387-
return class_name
1388-
return f"{cls.__module__}.{cls.__name__}"
1389-
1390-
target = f'supertype "{_get_qualified_name(supertype)}"'
1382+
target = f'supertype "{get_qualified_name(supertype)}"'
13911383
if name_in_super != name:
13921384
target = f'"{name_in_super}" of {target}'
13931385
return target
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from __future__ import annotations
2+
3+
from unittest import TestCase
4+
5+
from mypy.util import get_qualified_name
6+
7+
8+
class TestClassA:
9+
pass
10+
11+
12+
class TestClassB:
13+
pass
14+
15+
16+
class TestGetQualifiedName(TestCase):
17+
def test_existing_class_in_current_module(self):
18+
result = get_qualified_name("TestClassA")
19+
expected = f"{__name__}.TestClassA"
20+
self.assertEqual(result, expected)
21+
22+
def test_existing_class_in_current_module_another(self):
23+
result = get_qualified_name("TestClassB")
24+
expected = f"{__name__}.TestClassB"
25+
self.assertEqual(result, expected)
26+
27+
def test_non_existing_class(self):
28+
result = get_qualified_name("NonExistentClass")
29+
self.assertEqual(result, "NonExistentClass")
30+
31+
def test_empty_class_name(self):
32+
result = get_qualified_name("")
33+
self.assertEqual(result, "")

mypy/util.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import annotations
44

55
import hashlib
6+
import inspect
67
import io
78
import json
89
import os
@@ -942,3 +943,16 @@ def json_loads(data: bytes) -> Any:
942943
if orjson is not None:
943944
return orjson.loads(data)
944945
return json.loads(data)
946+
947+
948+
def get_qualified_name(class_name: str) -> str:
949+
for module_name, module in sys.modules.items():
950+
if module is None:
951+
continue
952+
if hasattr(module, class_name):
953+
cls = getattr(module, class_name)
954+
if inspect.isclass(cls):
955+
return f"{module.__name__}.{class_name}"
956+
return class_name
957+
958+

0 commit comments

Comments
 (0)