Skip to content

Conversation

@l3xx
Copy link

@l3xx l3xx commented Mar 15, 2023

No description provided.

@deepmap-marcinr
Copy link
Contributor

This is going to hide problems. Since we rename identifiers to become valid Go types, we occasionally create a conflict, and this code will hide duplicates versus creating an error; meaning that some types are missing. That's no good as well.

I think I prefer the generated code breaking due to conflict because it indicates a problem.

@jamietanna
Copy link
Member

@deepmap-marcinr would you recommend closing this PR, or is there something else we can do with it?

mromaszewicz added a commit to mromaszewicz/oapi-codegen that referenced this pull request Feb 11, 2026
I've been meaning to use this approach for a long time, because
the attempts at avoiding type collisions via structure suffixes or
prefixes work sporadically, at best.

Conflict resolution is fundamentally a global problem, not a local
problem when doing recursive traversal, so this PR splits the code
generation into two parts. First, the OAPI document structure is
traversed, and all the schemas that we generate are gathered up
into a list of candidates, then we do global conflict resolution
across the space of all schemas. This allows us to preserve the
functionality of things affected by schema name - `$ref`, `required`
properties, and so forth.

This fixes issue oapi-codegen#1474 (client response wrapper type colliding with
a component schema of the same name and improves issue oapi-codegen#200 handling
(same name across schemas, parameters, responses, requestBodies,
headers).

The new system is gated behind the existing `resolve-type-name-collisions`
output option. When disabled, behavior is unchanged, oapi-codegen exits
with an error. This flag is default false, so there is no behavior change
to oapi-codegen unless it's specified. All current test files regenerate
without any differences.

Added a comprehensive test which reproduces the scenarios in all the
PR's and Issues below, and adds a few more, to make sure that references
to renamed targets are also correct..

Key changes:
- gather.go: walks entire spec collecting schemas with location metadata
- resolve_names.go: assigns unique names via context suffix, per-schema
  disambiguation, and numeric fallback strategies
- Component schemas are privileged and keep bare names on collision
- Client response wrapper types now participate in collision detection
- Removed ComponentType/DefinedComp from Schema struct
- Removed FixDuplicateTypeNames and related functions from utils.go

Obsoletes issues:
- oapi-codegen#1474 Schema name vs client wrapper (CreateChatCompletionResponse)
- oapi-codegen#1713 Schema name vs client wrapper (CreateBlueprintResponse)
- oapi-codegen#1450 Schema name vs client wrapper (DeleteBusinessResponse)
- oapi-codegen#2097 Path response type vs schema definition (Status)
- oapi-codegen#255  Endpoint path vs response type (QueryResponse)
- oapi-codegen#899  Duplicate types from response wrapper vs schema (AccessListResponse)
- oapi-codegen#1357 Schema vs operationId response (ListAssistantsResponse, OpenAI spec)
- oapi-codegen#254  Cross-section: requestBodies vs schemas (Pet)
- oapi-codegen#407  Cross-section: requestBodies vs schemas (myThing)
- oapi-codegen#1881 Cross-section: requestBodies with multiple content types

Obsoletes PRs:
- oapi-codegen#292  Parameter structures params postfix (superseded by context suffix)
- oapi-codegen#1005 Fix generate equals structs (superseded by multi-pass resolution)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
EOF
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants