infer: emit $ref/$defs for recursive types instead of erroring - #79
Open
rafaeljusto wants to merge 1 commit into
Open
infer: emit $ref/$defs for recursive types instead of erroring#79rafaeljusto wants to merge 1 commit into
rafaeljusto wants to merge 1 commit into
Conversation
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
Contributor
Author
Oh, looks like I cannot set the co-author thing due to the CLA rules ( I will force-push again. |
For and ForType previously returned "cycle detected for type ..." when a
Go type referred to itself, directly or indirectly. This made it
impossible to generate a schema for self-referential types such as
jsonschema.Schema itself, which is a common need when accepting a JSON
schema as input to an MCP tool.
Now, when a named type closes a cycle, its schema is emitted once under
"$defs" and referenced with "$ref" wherever it recurs. The recursion
bookkeeping (seen set, assigned def names, collected defs) is threaded
through forType via a shared inferState. Output for non-recursive types
is unchanged: no "$defs" is added and no "$ref" is emitted.
Verified end to end against the modelcontextprotocol/go-sdk, which
depends on this library: ForType, Resolve{ValidateDefaults:true},
Validate, ApplyDefaults, the JSON wire round-trip, and AddTool all
handle the generated recursive schemas, and the SDK's own test suite
passes.
Resolves google#46
rafaeljusto
force-pushed
the
recursive-types
branch
from
June 29, 2026 10:40
a0abba9 to
2d7320e
Compare
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.
For and ForType previously returned "cycle detected for type ..." when a Go type referred to itself, directly or indirectly. This made it impossible to generate a schema for self-referential types such as jsonschema.Schema itself, which is a common need when accepting a JSON schema as input to an MCP tool.
Now, when a named type closes a cycle, its schema is emitted once under "$defs" and referenced with "$ref" wherever it recurs. The recursion bookkeeping (seen set, assigned def names, collected defs) is threaded through forType via a shared inferState. Output for non-recursive types is unchanged: no "$defs" is added and no "$ref" is emitted.
Verified end to end against the modelcontextprotocol/go-sdk, which depends on this library: ForType, Resolve{ValidateDefaults:true}, Validate, ApplyDefaults, the JSON wire round-trip, and AddTool all handle the generated recursive schemas, and the SDK's own test suite passes.
Resolves #46