Skip to content

Commit da0796a

Browse files
SubhamAshokclaude
andcommitted
merge extensions per key and exclude const/not overlays from the merge
Review feedback. Extensions from both parts now survive, overlay wins per key. Overlays carrying const or not keep the old replace behavior. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 9973312 commit da0796a

4 files changed

Lines changed: 14 additions & 1 deletion

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3665,7 +3665,8 @@ private void putProperty(Map<String, Schema> targetProperties, String name, Sche
36653665
Schema existing = targetProperties.get(name);
36663666
if (existing != null && incoming != null
36673667
&& !ModelUtils.isAnyType(existing)
3668-
&& ModelUtils.isMetadataOnlySchema(incoming) && incoming.getEnum() == null) {
3668+
&& ModelUtils.isMetadataOnlySchema(incoming)
3669+
&& incoming.getEnum() == null && incoming.getConst() == null && incoming.getNot() == null) {
36693670
Schema merged = ModelUtils.cloneSchema(existing, specVersionGreaterThanOrEqualTo310(openAPI));
36703671
ModelUtils.copyConstraints(incoming, merged);
36713672
targetProperties.put(name, merged);

modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,7 +2771,14 @@ public static void copyMetadata(Schema from, Schema to) {
27712771
* @param to schema to copy to
27722772
*/
27732773
public static void copyConstraints(Schema from, Schema to) {
2774+
Map<String, Object> targetExtensions = to.getExtensions() == null ? null : new HashMap<>(to.getExtensions());
27742775
copyMetadata(from, to);
2776+
// merge extensions per key instead of replacing, the source wins on conflicts
2777+
if (targetExtensions != null && from.getExtensions() != null) {
2778+
Map<String, Object> mergedExtensions = new HashMap<>(targetExtensions);
2779+
mergedExtensions.putAll(from.getExtensions());
2780+
to.setExtensions(mergedExtensions);
2781+
}
27752782
if (from.getFormat() != null) {
27762783
to.setFormat(from.getFormat());
27772784
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,6 +1330,9 @@ public void testAllOfNullableWithoutTypeKeepsType() {
13301330
assertEquals("String", addressId.dataType);
13311331
assertTrue(addressId.isNullable);
13321332
assertEquals(Integer.valueOf(36), addressId.maxLength);
1333+
// extensions from both parts survive the merge
1334+
assertEquals("keep", addressId.vendorExtensions.get("x-base-marker"));
1335+
assertEquals("added", addressId.vendorExtensions.get("x-overlay-marker"));
13331336
}
13341337

13351338
@Test

modules/openapi-generator/src/test/resources/3_0/allOf-nullable-typeless-override.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ components:
2727
properties:
2828
addressId:
2929
type: string
30+
x-base-marker: keep
3031
UpdateFirm:
3132
allOf:
3233
- $ref: "#/components/schemas/FirmProperties"
@@ -37,3 +38,4 @@ components:
3738
addressId:
3839
nullable: true
3940
maxLength: 36
41+
x-overlay-marker: added

0 commit comments

Comments
 (0)