Skip to content

Commit 703f23a

Browse files
committed
always use the local name when building definitions
Sometimes a class accesses a member by a different name than "__name__" of that member: in pypy3 `list.__mul__.__name__ == "__rmul__"`. As a result, in the example above we weren't able to find "list.__mul__", because it was recorded only as "list.__rmul__".
1 parent 7cc47ef commit 703f23a

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

astroid/raw_building.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,9 @@ def object_build_class(
267267
) -> nodes.ClassDef:
268268
"""create astroid for a living class object"""
269269
basenames = [base.__name__ for base in member.__bases__]
270-
return _base_class_object_build(node, member, basenames, localname=localname)
270+
# N.B. ↓ why do we need to override the localname?
271+
name = getattr(member, "__name__", localname)
272+
return _base_class_object_build(node, member, basenames, name)
271273

272274

273275
def _get_args_info_from_callable(
@@ -317,7 +319,7 @@ def object_build_function(
317319
) = _get_args_info_from_callable(member)
318320

319321
build_function(
320-
getattr(member, "__name__", None) or localname,
322+
localname,
321323
node,
322324
args,
323325
posonlyargs,
@@ -342,26 +344,21 @@ def object_build_methoddescriptor(
342344
) -> None:
343345
"""create astroid for a living method descriptor object"""
344346
# FIXME get arguments ?
345-
func = build_function(
346-
getattr(member, "__name__", None) or localname, node, doc=member.__doc__
347-
)
347+
func = build_function(localname, node, doc=member.__doc__)
348348
_add_dunder_class(func, node, member)
349349

350350

351351
def _base_class_object_build(
352352
node: nodes.Module | nodes.ClassDef,
353353
member: type,
354354
basenames: list[str],
355-
name: str | None = None,
356-
localname: str | None = None,
355+
name: str,
357356
) -> nodes.ClassDef:
358357
"""create astroid for a living class object, with a given set of base names
359358
(e.g. ancestors)
360359
"""
361-
class_name = name or getattr(member, "__name__", None) or localname
362-
assert isinstance(class_name, str)
363360
doc = member.__doc__ if isinstance(member.__doc__, str) else None
364-
klass = build_class(class_name, node, basenames, doc)
361+
klass = build_class(name, node, basenames, doc)
365362
klass._newstyle = isinstance(member, type)
366363
try:
367364
# limit the instantiation trick since it's too dangerous

0 commit comments

Comments
 (0)