Skip to content

Commit 6d402f9

Browse files
authored
Fix: duplicate edge creation (#305)
# Motivation <!-- Why is this change necessary? --> # Content <!-- Please include a summary of the change --> # Testing <!-- How was the change tested? --> # Please check the following before marking your PR as ready for review - [ ] I have added tests for my changes - [ ] I have updated the documentation or added new documentation as needed
1 parent cfd7ee2 commit 6d402f9

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

src/codegen/sdk/core/detached_symbols/function_call.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ def _resolved_types(self) -> Generator[ResolutionStack[Self], None, None]:
504504
yield from self.with_resolution_frame(next(iter(resolution.generics.values())), direct=resolution.direct)
505505
resolved = True
506506
elif len(resolution.generics) > 1:
507-
yield from self.with_resolution_frame(self.get_name())
507+
yield from self.with_resolution(resolution)
508508
resolved = True
509509
if not resolved:
510510
yield ResolutionStack(self) # This let's us still calculate dependencies even if we can't resolve a function call's definition

src/codegen/sdk/core/interfaces/chainable.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,30 @@ def resolved_type_frames(self) -> list[ResolutionStack["Self"]]:
3737
self._resolving = False
3838

3939
@noapidoc
40-
def with_resolution_frame(self, child: Editable, *args, generic_parameters: list | None = None, generics: dict | None = None, **kwargs) -> Generator[ResolutionStack["Self"], None, None]:
41-
"""Resolve the definition(s) of this object."""
40+
def with_resolution(
41+
self, resolution: ResolutionStack["Self"], *args, generic_parameters: list | None = None, generics: dict | None = None, **kwargs
42+
) -> Generator[ResolutionStack["Self"], None, None]:
4243
from codegen.sdk.core.interfaces.supports_generic import SupportsGenerics
4344

45+
assert resolution is not self
46+
generics = generics or resolution.generics
47+
if generic_parameters:
48+
if isinstance(resolution.top.node, SupportsGenerics) and self.G.config.feature_flags.generics:
49+
generics = {k: v for v, k in zip(generic_parameters, resolution.top.node.generics)}
50+
elif not generics:
51+
generics = {i: v for i, v in enumerate(generic_parameters)}
52+
yield resolution.with_frame(self, *args, **kwargs, generics=generics)
53+
54+
@noapidoc
55+
def with_resolution_frame(self, child: Editable, *args, generic_parameters: list | None = None, generics: dict | None = None, **kwargs) -> Generator[ResolutionStack["Self"], None, None]:
56+
"""Resolve the definition(s) of this object."""
4457
if isinstance(child, Chainable):
4558
assert child is not self
4659
if not child._resolving:
4760
resolved = child.resolved_type_frames
4861
if len(resolved) > 0:
4962
for resolution in resolved:
50-
assert resolution is not self
51-
generics = generics or resolution.generics
52-
if generic_parameters:
53-
if isinstance(resolution.top.node, SupportsGenerics) and self.G.config.feature_flags.generics:
54-
generics = {k: v for v, k in zip(generic_parameters, resolution.top.node.generics)}
55-
elif not generics:
56-
generics = {i: v for i, v in enumerate(generic_parameters)}
57-
yield resolution.with_frame(self, *args, **kwargs, generics=generics)
63+
yield from self.with_resolution(resolution, *args, generic_parameters=generic_parameters, generics=generics, **kwargs)
5864
return
5965
if generics is None:
6066
generics = {i: v for i, v in enumerate(generic_parameters)} if generic_parameters else None

0 commit comments

Comments
 (0)