Skip to content

Commit 0206036

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__". it's a part of the campaign to get rid of non-module roots
1 parent eb88dfe commit 0206036

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
@@ -266,7 +266,9 @@ def object_build_class(
266266
) -> nodes.ClassDef:
267267
"""create astroid for a living class object"""
268268
basenames = [base.__name__ for base in member.__bases__]
269-
return _base_class_object_build(node, member, basenames, localname=localname)
269+
# N.B. ↓ why do we need to override the localname?
270+
name = getattr(member, "__name__", localname)
271+
return _base_class_object_build(node, member, basenames, name)
270272

271273

272274
def _get_args_info_from_callable(
@@ -316,7 +318,7 @@ def object_build_function(
316318
) = _get_args_info_from_callable(member)
317319

318320
func = build_function(
319-
getattr(member, "__name__", None) or localname,
321+
localname,
320322
args,
321323
posonlyargs,
322324
defaults,
@@ -342,9 +344,7 @@ 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, doc=member.__doc__
347-
)
347+
func = build_function(localname, doc=member.__doc__)
348348
node.add_local_node(func, localname)
349349
_add_dunder_class(func, node, member)
350350

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

0 commit comments

Comments
 (0)