Skip to content

Commit b9d298b

Browse files
committed
enforce a non-None parent in build_function
We also remove `add_local_node` to avoid redundancy. Instead we do the attachment to the parent scope in the constructor of `FunctionDef`. We append a node to the body of the frame when it is also the parent. If it's not a parent, then the node should belong to the "body" of the parent if it existed. An example is a definition within an "if", where the parent is the If node, but the frame is the whole module. it's a part of the campaign to get rid of non-module roots
1 parent 10dd6cd commit b9d298b

File tree

3 files changed

+10
-12
lines changed

3 files changed

+10
-12
lines changed

astroid/nodes/scoped_nodes/scoped_nodes.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1174,8 +1174,7 @@ def __init__(
11741174
parent=parent,
11751175
)
11761176
if parent and not isinstance(parent, Unknown):
1177-
frame = parent.frame()
1178-
frame.set_local(name, self)
1177+
_attach_to_parent(self, name, parent)
11791178

11801179
def postinit(
11811180
self,

astroid/raw_building.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ def build_class(
132132

133133
def build_function(
134134
name: str,
135+
parent: nodes.NodeNG,
135136
args: list[str] | None = None,
136137
posonlyargs: list[str] | None = None,
137138
defaults: list[Any] | None = None,
@@ -145,7 +146,7 @@ def build_function(
145146
name,
146147
lineno=0,
147148
col_offset=0,
148-
parent=node_classes.Unknown(),
149+
parent=parent,
149150
end_col_offset=0,
150151
end_lineno=0,
151152
)
@@ -317,8 +318,9 @@ def object_build_function(
317318
kwonly_defaults,
318319
) = _get_args_info_from_callable(member)
319320

320-
func = build_function(
321+
build_function(
321322
localname,
323+
node,
322324
args,
323325
posonlyargs,
324326
defaults,
@@ -327,8 +329,6 @@ def object_build_function(
327329
kwonlydefaults=kwonly_defaults,
328330
)
329331

330-
node.add_local_node(func, localname)
331-
332332

333333
def object_build_datadescriptor(
334334
node: nodes.Module | nodes.ClassDef, member: type, name: str
@@ -345,7 +345,6 @@ def object_build_methoddescriptor(
345345
"""create astroid for a living method descriptor object"""
346346
# FIXME get arguments ?
347347
func = build_function(localname, doc=member.__doc__)
348-
node.add_local_node(func, localname)
349348
_add_dunder_class(func, node, member)
350349

351350

tests/test_raw_building.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,28 @@ def test_build_class(self) -> None:
5555
self.assertEqual(node.doc_node, None)
5656

5757
def test_build_function(self) -> None:
58-
node = build_function("MyFunction")
58+
node = build_function("MyFunction", DUMMY_MOD)
5959
self.assertEqual(node.name, "MyFunction")
6060
self.assertEqual(node.doc_node, None)
6161

6262
def test_build_function_args(self) -> None:
6363
args = ["myArgs1", "myArgs2"]
64-
node = build_function("MyFunction", args)
64+
node = build_function("MyFunction", DUMMY_MOD, args)
6565
self.assertEqual("myArgs1", node.args.args[0].name)
6666
self.assertEqual("myArgs2", node.args.args[1].name)
6767
self.assertEqual(2, len(node.args.args))
6868

6969
def test_build_function_defaults(self) -> None:
7070
defaults = ["defaults1", "defaults2"]
71-
node = build_function(name="MyFunction", args=None, defaults=defaults)
71+
node = build_function("MyFunction", DUMMY_MOD, args=None, defaults=defaults)
7272
self.assertEqual(2, len(node.args.defaults))
7373

7474
def test_build_function_posonlyargs(self) -> None:
75-
node = build_function(name="MyFunction", posonlyargs=["a", "b"])
75+
node = build_function("MyFunction", DUMMY_MOD, posonlyargs=["a", "b"])
7676
self.assertEqual(2, len(node.args.posonlyargs))
7777

7878
def test_build_function_kwonlyargs(self) -> None:
79-
node = build_function(name="MyFunction", kwonlyargs=["a", "b"])
79+
node = build_function("MyFunction", DUMMY_MOD, kwonlyargs=["a", "b"])
8080
assert len(node.args.kwonlyargs) == 2
8181
assert node.args.kwonlyargs[0].name == "a"
8282
assert node.args.kwonlyargs[1].name == "b"

0 commit comments

Comments
 (0)