Commit dd19a4e
fix: resolve type name mismatches for multi-content-type responses
When a component response has multiple JSON content types (e.g.,
application/json, application/json-patch+json, application/merge-patch+json),
three bugs produced uncompilable code:
1. Duplicate inline type declarations: GenerateGoSchema was called with a
path of [operationId, responseName] (or [responseName] in the component
phase), which doesn't include the content type. When multiple content
types share oneOf schemas with inline elements, they produce
identically-named AdditionalTypes. If the schemas differ, the result is
conflicting declarations; if they're the same, duplicate declarations.
Fix: include a mediaTypeToCamelCase(contentType) segment in the schema
path when jsonCount > 1, giving each content type's inline types unique
names. This is guarded by jsonCount > 1 for backward compatibility.
2. Undefined types in unmarshal code: GetResponseTypeDefinitions used
RefPathToGoType to resolve $ref paths like
#/components/responses/200Resource_Patch, but without content type
context. resolvedNameForComponent fell into a non-deterministic prefix
match, returning an arbitrary per-content-type base name that didn't
match any defined type when mediaTypeToCamelCase was appended.
Fix: add resolvedNameForRefPath helper that parses the $ref path and
delegates to resolvedNameForComponent with the specific content type
for exact matching.
3. Mismatched types in response struct fields: same root cause as bug 2 —
the struct field types were derived from the same non-deterministic
resolution path.
Additionally, promote AdditionalTypes from GenerateTypesForResponses and
GenerateTypesForRequestBodies to the top-level type list, matching the
existing pattern in GenerateTypesForSchemas. Without this, inline types
(e.g., oneOf union members, nested objects with additionalProperties)
defined inside response/requestBody schemas were silently dropped from
the output.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>1 parent fbbb36b commit dd19a4e
File tree
5 files changed
+703
-5
lines changed- internal/test/name_conflict_resolution
- pkg/codegen
5 files changed
+703
-5
lines changed
0 commit comments