Fix [UseConnection] source generation for resolvers returning Connection<T> - #10118
Open
PHILLIPS71 wants to merge 3 commits into
Open
Fix [UseConnection] source generation for resolvers returning Connection<T>#10118PHILLIPS71 wants to merge 3 commits into
PHILLIPS71 wants to merge 3 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[UseConnection]on a source generated resolver only worked forPageConnection<T>. ReturningTask<Connection<T>>(the type the common DataLoader patternToConnectionAsync()produces) was broken two different ways:The generator did not recognize
Connection<T>as a connection, becauseIsConnectionTypeonly matched types deriving fromConnectionBase<,,>. The field ended up typed as a plain list with no paging arguments.Once recognized, the generator built the connection type by reflecting over
Connection<T>'s public members. That produced code that does not compile (a bogus resolver forAccept(IPageObserver)) and the wrong schema shape: nonodesfield,infoinstead ofpageInfo, and an edge type missingcursor(interface base members aren't reachable throughBaseType).Fix
Mirror the split the runtime already uses for
[UsePaging]: a shared generic connection type for plainConnection<T>, reflection based named types only for custom classes.IsConnectionTypenow matchesIConnection<T>implementors, a superset of the oldConnectionBase<,,>check.Connection<T>orIConnection<T>,ConnectionTypeTransformerskips type synthesis and the generated code binds the field to the existing shared runtimeConnectionTypethrough a new helper,ConnectionTypeHelper.CreateConnectionTypeReference. This gives correctedges { cursor node }, nodes, pageInfo, andtotalCountwith no reflection over the connection class.PageConnection<T>and custom connection classes keep the existing reflection path.Connection<T>can't hit theAcceptcompile error either.