Skip to content

Commit 36fe534

Browse files
committed
Use the new utility function for the other handlers aswell
1 parent bc8b028 commit 36fe534

File tree

1 file changed

+32
-20
lines changed

1 file changed

+32
-20
lines changed

pylint/pyreverse/inspector.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,14 @@ def handle(self, node: nodes.AssignAttr, parent: nodes.ClassDef) -> None:
350350

351351
# Composition: direct object creation (self.x = P())
352352
if isinstance(value, nodes.Call):
353+
inferred_types = utils.infer_node(node)
354+
element_types = extract_element_types(inferred_types)
355+
356+
# Resolve nodes to actual class definitions
357+
resolved_types = resolve_to_class_def(element_types)
358+
353359
current = set(parent.compositions_type[node.attrname])
354-
parent.compositions_type[node.attrname] = list(
355-
current | utils.infer_node(node)
356-
)
360+
parent.compositions_type[node.attrname] = list(current | resolved_types)
357361
return
358362

359363
# Composition: comprehensions with object creation (self.x = [P() for ...])
@@ -367,13 +371,15 @@ def handle(self, node: nodes.AssignAttr, parent: nodes.ClassDef) -> None:
367371

368372
# If the element is a Call (object creation), it's composition
369373
if isinstance(element, nodes.Call):
370-
element_type = safe_infer(element)
371-
if element_type:
372-
current = set(parent.compositions_type[node.attrname])
373-
parent.compositions_type[node.attrname] = list(
374-
current | {element_type}
375-
)
376-
return
374+
inferred_types = utils.infer_node(node)
375+
element_types = extract_element_types(inferred_types)
376+
377+
# Resolve nodes to actual class definitions
378+
resolved_types = resolve_to_class_def(element_types)
379+
380+
current = set(parent.compositions_type[node.attrname])
381+
parent.compositions_type[node.attrname] = list(current | resolved_types)
382+
return
377383

378384
# Not a composition, pass to next handler
379385
super().handle(node, parent)
@@ -391,10 +397,14 @@ def handle(self, node: nodes.AssignAttr, parent: nodes.ClassDef) -> None:
391397

392398
# Aggregation: direct assignment (self.x = x)
393399
if isinstance(value, nodes.Name):
400+
inferred_types = utils.infer_node(node)
401+
element_types = extract_element_types(inferred_types)
402+
403+
# Resolve nodes to actual class definitions
404+
resolved_types = resolve_to_class_def(element_types)
405+
394406
current = set(parent.aggregations_type[node.attrname])
395-
parent.aggregations_type[node.attrname] = list(
396-
current | utils.infer_node(node)
397-
)
407+
parent.aggregations_type[node.attrname] = list(current | resolved_types)
398408
return
399409

400410
# Aggregation: comprehensions without object creation (self.x = [existing_obj for ...])
@@ -409,13 +419,15 @@ def handle(self, node: nodes.AssignAttr, parent: nodes.ClassDef) -> None:
409419

410420
# If the element is a Name, it means it's an existing object, so it's aggregation
411421
if isinstance(element, nodes.Name):
412-
element_type = safe_infer(element)
413-
if element_type:
414-
current = set(parent.aggregations_type[node.attrname])
415-
parent.aggregations_type[node.attrname] = list(
416-
current | {element_type}
417-
)
418-
return
422+
inferred_types = utils.infer_node(node)
423+
element_types = extract_element_types(inferred_types)
424+
425+
# Resolve nodes to actual class definitions
426+
resolved_types = resolve_to_class_def(element_types)
427+
428+
current = set(parent.aggregations_type[node.attrname])
429+
parent.aggregations_type[node.attrname] = list(current | resolved_types)
430+
return
419431

420432
# Not an aggregation, pass to next handler
421433
super().handle(node, parent)

0 commit comments

Comments
 (0)