Skip to content

Commit c34ee25

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 b4ac0e2 commit c34ee25

File tree

1 file changed

+8
-11
lines changed

1 file changed

+8
-11
lines changed

astroid/raw_building.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,9 @@ def object_build_class(
263263
) -> nodes.ClassDef:
264264
"""create astroid for a living class object"""
265265
basenames = [base.__name__ for base in member.__bases__]
266-
return _base_class_object_build(node, member, basenames, localname=localname)
266+
# N.B. ↓ why do we need to override the localname?
267+
name = getattr(member, "__name__", localname)
268+
return _base_class_object_build(node, member, basenames, name)
267269

268270

269271
def _get_args_info_from_callable(
@@ -313,7 +315,7 @@ def object_build_function(
313315
) = _get_args_info_from_callable(member)
314316

315317
func = build_function(
316-
getattr(member, "__name__", None) or localname,
318+
localname,
317319
args,
318320
posonlyargs,
319321
defaults,
@@ -339,9 +341,7 @@ def object_build_methoddescriptor(
339341
) -> None:
340342
"""create astroid for a living method descriptor object"""
341343
# FIXME get arguments ?
342-
func = build_function(
343-
getattr(member, "__name__", None) or localname, doc=member.__doc__
344-
)
344+
func = build_function(localname, doc=member.__doc__)
345345
node.add_local_node(func, localname)
346346
_add_dunder_class(func, member)
347347

@@ -350,18 +350,15 @@ def _base_class_object_build(
350350
node: nodes.Module | nodes.ClassDef,
351351
member: type,
352352
basenames: list[str],
353-
name: str | None = None,
354-
localname: str | None = None,
353+
name: str,
355354
) -> nodes.ClassDef:
356355
"""create astroid for a living class object, with a given set of base names
357356
(e.g. ancestors)
358357
"""
359-
class_name = name or getattr(member, "__name__", None) or localname
360-
assert isinstance(class_name, str)
361358
doc = member.__doc__ if isinstance(member.__doc__, str) else None
362-
klass = build_class(class_name, basenames, doc)
359+
klass = build_class(name, basenames, doc)
363360
klass._newstyle = isinstance(member, type)
364-
node.add_local_node(klass, localname)
361+
node.add_local_node(klass, name)
365362
try:
366363
# limit the instantiation trick since it's too dangerous
367364
# (such as infinite test execution...)

0 commit comments

Comments
 (0)