diff --git a/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts b/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts index 64f530a23c..fb15faf3a6 100644 --- a/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts +++ b/packages/quicktype-core/src/language/CPlusPlus/CPlusPlusRenderer.ts @@ -1597,6 +1597,12 @@ export class CPlusPlusRenderer extends ConvenienceRenderer { getter = [name]; } + const value = this._stringType.wrapEncodingChange( + [ourQualifier], + cppType, + toType, + ["x.", getter], + ); const assignment: Sourcelike[] = [ "j[", this._stringType.wrapEncodingChange( @@ -1608,31 +1614,17 @@ export class CPlusPlusRenderer extends ConvenienceRenderer { ]), ), "] = ", - this._stringType.wrapEncodingChange( - [ourQualifier], - cppType, - toType, - ["x.", getter], - ), + value, ";", ]; if (p.isOptional && this._options.hideNullOptional) { - this.emitBlock( - [ - "if (", - this._stringType.wrapEncodingChange( - [ourQualifier], - cppType, - toType, - ["x.", getter], - ), - ")", - ], - false, - () => { - this.emitLine(assignment); - }, - ); + const condition = + propType.kind === "null" || propType.kind === "any" + ? ["!", value, ".is_null()"] + : value; + this.emitBlock(["if (", condition, ")"], false, () => { + this.emitLine(assignment); + }); } else { this.emitLine(assignment); } diff --git a/packages/quicktype-core/src/language/Php/PhpRenderer.ts b/packages/quicktype-core/src/language/Php/PhpRenderer.ts index 85d4ea4ee0..e2701eb025 100644 --- a/packages/quicktype-core/src/language/Php/PhpRenderer.ts +++ b/packages/quicktype-core/src/language/Php/PhpRenderer.ts @@ -1811,6 +1811,7 @@ export class PhpRenderer extends ConvenienceRenderer { protected emitSourceStructure(givenFilename: string): void { this.emitLine(" this.emitClassDefinition(c, n), diff --git a/test/inputs/schema/optional-any.1.json b/test/inputs/schema/optional-any.1.json index 0967ef424b..fc902e365c 100644 --- a/test/inputs/schema/optional-any.1.json +++ b/test/inputs/schema/optional-any.1.json @@ -1 +1,3 @@ -{} +{ + "bar": true +} diff --git a/test/inputs/schema/optional-any.2.json b/test/inputs/schema/optional-any.2.json index 6465e11c40..33580c8c7e 100644 --- a/test/inputs/schema/optional-any.2.json +++ b/test/inputs/schema/optional-any.2.json @@ -1 +1,4 @@ -{ "foo": 123 } +{ + "foo": 123, + "bar": false +} diff --git a/test/inputs/schema/optional-any.3.fail.json b/test/inputs/schema/optional-any.3.fail.json new file mode 100644 index 0000000000..7f62983c35 --- /dev/null +++ b/test/inputs/schema/optional-any.3.fail.json @@ -0,0 +1,3 @@ +{ + "bar": "not a boolean" +} diff --git a/test/inputs/schema/optional-any.schema b/test/inputs/schema/optional-any.schema index b6d2e91e48..cc682a350e 100644 --- a/test/inputs/schema/optional-any.schema +++ b/test/inputs/schema/optional-any.schema @@ -2,6 +2,8 @@ "type": "object", "additionalProperties": false, "properties": { - "foo": {} - } + "foo": {}, + "bar": { "type": "boolean" } + }, + "required": ["bar"] } diff --git a/test/languages.ts b/test/languages.ts index c798e154c4..cee443a6e4 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -808,6 +808,7 @@ export const CPlusPlusLanguage: Language = { // boost and std optional/variant code paths differ. ["unions.json", { boost: "true" }], ["pokedex.json", { boost: "true" }], + ["optional-any.schema", { "hide-null-optional": "true" }], ], sourceFiles: ["src/language/CPlusPlus/index.ts"], }; @@ -2211,6 +2212,7 @@ export const ElixirLanguage: Language = { "strict-optional.schema", "required.schema", "intersection.schema", + "optional-any.schema", // The test incorrectly succeeds due to the emitter being permissive for unions that contain only primitives. A future enhancement // for the Elixir emitter could be a user-controlled 'strict' mode that pattern matches even on unions of only primitive types. diff --git a/test/unit/cjson-enum-default.test.ts b/test/unit/cjson-enum-default.test.ts index b2c02d60ee..0ecd24cb92 100644 --- a/test/unit/cjson-enum-default.test.ts +++ b/test/unit/cjson-enum-default.test.ts @@ -28,9 +28,9 @@ describe("cJSON enum invalid value", () => { const output = await cJSONOutput(); expect(output).toContain(`enum Subscription { - SUBSCRIPTION_CONFIG = 1, + SUBSCRIPTION_STATE = 1, + SUBSCRIPTION_CONFIG, SUBSCRIPTION_HEARTBEAT, - SUBSCRIPTION_STATE, };`); expect(output).toContain("enum Subscription x = 0;"); });