diff --git a/src/codegen/sdk/core/detached_symbols/function_call.py b/src/codegen/sdk/core/detached_symbols/function_call.py index 81abef797..c7f004124 100644 --- a/src/codegen/sdk/core/detached_symbols/function_call.py +++ b/src/codegen/sdk/core/detached_symbols/function_call.py @@ -504,7 +504,7 @@ def _resolved_types(self) -> Generator[ResolutionStack[Self], None, None]: yield from self.with_resolution_frame(next(iter(resolution.generics.values())), direct=resolution.direct) resolved = True elif len(resolution.generics) > 1: - yield from self.with_resolution_frame(self.get_name()) + yield from self.with_resolution(resolution) resolved = True if not resolved: yield ResolutionStack(self) # This let's us still calculate dependencies even if we can't resolve a function call's definition diff --git a/src/codegen/sdk/core/interfaces/chainable.py b/src/codegen/sdk/core/interfaces/chainable.py index ab0f05978..a72366418 100644 --- a/src/codegen/sdk/core/interfaces/chainable.py +++ b/src/codegen/sdk/core/interfaces/chainable.py @@ -37,24 +37,30 @@ def resolved_type_frames(self) -> list[ResolutionStack["Self"]]: self._resolving = False @noapidoc - def with_resolution_frame(self, child: Editable, *args, generic_parameters: list | None = None, generics: dict | None = None, **kwargs) -> Generator[ResolutionStack["Self"], None, None]: - """Resolve the definition(s) of this object.""" + def with_resolution( + self, resolution: ResolutionStack["Self"], *args, generic_parameters: list | None = None, generics: dict | None = None, **kwargs + ) -> Generator[ResolutionStack["Self"], None, None]: from codegen.sdk.core.interfaces.supports_generic import SupportsGenerics + assert resolution is not self + generics = generics or resolution.generics + if generic_parameters: + if isinstance(resolution.top.node, SupportsGenerics) and self.G.config.feature_flags.generics: + generics = {k: v for v, k in zip(generic_parameters, resolution.top.node.generics)} + elif not generics: + generics = {i: v for i, v in enumerate(generic_parameters)} + yield resolution.with_frame(self, *args, **kwargs, generics=generics) + + @noapidoc + def with_resolution_frame(self, child: Editable, *args, generic_parameters: list | None = None, generics: dict | None = None, **kwargs) -> Generator[ResolutionStack["Self"], None, None]: + """Resolve the definition(s) of this object.""" if isinstance(child, Chainable): assert child is not self if not child._resolving: resolved = child.resolved_type_frames if len(resolved) > 0: for resolution in resolved: - assert resolution is not self - generics = generics or resolution.generics - if generic_parameters: - if isinstance(resolution.top.node, SupportsGenerics) and self.G.config.feature_flags.generics: - generics = {k: v for v, k in zip(generic_parameters, resolution.top.node.generics)} - elif not generics: - generics = {i: v for i, v in enumerate(generic_parameters)} - yield resolution.with_frame(self, *args, **kwargs, generics=generics) + yield from self.with_resolution(resolution, *args, generic_parameters=generic_parameters, generics=generics, **kwargs) return if generics is None: generics = {i: v for i, v in enumerate(generic_parameters)} if generic_parameters else None