From 43fb16ac5bd2137e391f6aa8e07443a700d0afed Mon Sep 17 00:00:00 2001 From: Elad Ben-Israel Date: Wed, 7 Nov 2018 14:37:24 +0200 Subject: [PATCH] fix(jsii-runtime): treat "null" as "undefined" (#297) Since most languages do not have a distinction between "null" and "undefined", jsii will effectively convert any "null" value passed into an argument, a property or inside an object to "undefined". Adds a compliance test to Java and .NET called "NullShouldBeTreatedAsUndefined". Fixes awslabs/aws-cdk#157 Fixes #282 --- packages/jsii-calc/lib/compliance.ts | 46 ++++++++ packages/jsii-calc/test/assembly.jsii | 95 ++++++++++++++- .../ComplianceTests.cs | 21 ++++ .../amazon/jsii/testing/ComplianceTest.java | 14 +++ packages/jsii-kernel/lib/kernel.ts | 5 +- packages/jsii-kernel/test/test.kernel.ts | 23 ++++ .../.jsii | 95 ++++++++++++++- .../INullShouldBeTreatedAsUndefinedData.cs | 22 ++++ .../NullShouldBeTreatedAsUndefined.cs | 46 ++++++++ .../NullShouldBeTreatedAsUndefinedData.cs | 21 ++++ ...NullShouldBeTreatedAsUndefinedDataProxy.cs | 26 +++++ .../amazon/jsii/tests/calculator/$Module.java | 2 + .../NullShouldBeTreatedAsUndefined.java | 45 ++++++++ .../NullShouldBeTreatedAsUndefinedData.java | 108 ++++++++++++++++++ .../expected.jsii-calc/sphinx/jsii-calc.rst | 95 +++++++++++++++ 15 files changed, 660 insertions(+), 4 deletions(-) create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/INullShouldBeTreatedAsUndefinedData.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefined.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedData.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedDataProxy.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefined.java create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefinedData.java diff --git a/packages/jsii-calc/lib/compliance.ts b/packages/jsii-calc/lib/compliance.ts index a0989493cc..24768a0b6b 100644 --- a/packages/jsii-calc/lib/compliance.ts +++ b/packages/jsii-calc/lib/compliance.ts @@ -948,3 +948,49 @@ export class DoNotRecognizeAnyAsOptional { } } + +/** + * jsii#282, aws-cdk#157: null should be treated as "undefined" + */ +export class NullShouldBeTreatedAsUndefined { + public changeMeToUndefined? = "hello"; + + constructor(_param1: string, optional?: any) { + if (optional !== undefined) { + throw new Error('Expecting second constructor argument to be "undefined"'); + } + } + + public giveMeUndefined(value?: any) { + if (value !== undefined) { + throw new Error('I am disappointed. I expected undefined and got: ' + JSON.stringify(value)); + } + } + + public giveMeUndefinedInsideAnObject(input: NullShouldBeTreatedAsUndefinedData) { + if (input.thisShouldBeUndefined !== undefined) { + throw new Error('I am disappointed. I expected undefined in "thisShouldBeUndefined" and got: ' + JSON.stringify(input)); + } + + const array = input.arrayWithThreeElementsAndUndefinedAsSecondArgument; + if (array.length !== 3) { + throw new Error('Expecting "arrayWithThreeElementsAndUndefinedAsSecondArgument" to have three elements: ' + JSON.stringify(input)); + } + + if (array[1] !== undefined) { + throw new Error('Expected arrayWithThreeElementsAndUndefinedAsSecondArgument[1] to be undefined: ' + JSON.stringify(input)) + } + } + + public verifyPropertyIsUndefined() { + if (this.changeMeToUndefined !== undefined) { + throw new Error('Expecting property "changeMeToUndefined" to be undefined, and it is: ' + this.changeMeToUndefined); + } + } +} + +export interface NullShouldBeTreatedAsUndefinedData { + thisShouldBeUndefined?: any; + arrayWithThreeElementsAndUndefinedAsSecondArgument: any[]; +} + diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index d245fa15e5..533c28165d 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -2273,6 +2273,99 @@ } ] }, + "jsii-calc.NullShouldBeTreatedAsUndefined": { + "assembly": "jsii-calc", + "docs": { + "comment": "jsii#282, aws-cdk#157: null should be treated as \"undefined\"" + }, + "fqn": "jsii-calc.NullShouldBeTreatedAsUndefined", + "initializer": { + "initializer": true, + "parameters": [ + { + "name": "_param1", + "type": { + "primitive": "string" + } + }, + { + "name": "optional", + "type": { + "optional": true, + "primitive": "any" + } + } + ] + }, + "kind": "class", + "methods": [ + { + "name": "giveMeUndefined", + "parameters": [ + { + "name": "value", + "type": { + "optional": true, + "primitive": "any" + } + } + ] + }, + { + "name": "giveMeUndefinedInsideAnObject", + "parameters": [ + { + "name": "input", + "type": { + "fqn": "jsii-calc.NullShouldBeTreatedAsUndefinedData" + } + } + ] + }, + { + "name": "verifyPropertyIsUndefined" + } + ], + "name": "NullShouldBeTreatedAsUndefined", + "properties": [ + { + "name": "changeMeToUndefined", + "type": { + "optional": true, + "primitive": "string" + } + } + ] + }, + "jsii-calc.NullShouldBeTreatedAsUndefinedData": { + "assembly": "jsii-calc", + "datatype": true, + "fqn": "jsii-calc.NullShouldBeTreatedAsUndefinedData", + "kind": "interface", + "name": "NullShouldBeTreatedAsUndefinedData", + "properties": [ + { + "abstract": true, + "name": "arrayWithThreeElementsAndUndefinedAsSecondArgument", + "type": { + "collection": { + "elementtype": { + "primitive": "any" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "name": "thisShouldBeUndefined", + "type": { + "optional": true, + "primitive": "any" + } + } + ] + }, "jsii-calc.NumberGenerator": { "assembly": "jsii-calc", "docs": { @@ -3444,5 +3537,5 @@ } }, "version": "0.7.8", - "fingerprint": "2BaszImarh4WChl9DFUcygfTpEfXU17fHQT2wgEptfM=" + "fingerprint": "FZk0ePQ2XUte84CmnOjU3PPCl6QUA88ke6wHIJKhyzo=" } diff --git a/packages/jsii-dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs b/packages/jsii-dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs index ff6747a7be..7cd6934249 100644 --- a/packages/jsii-dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs +++ b/packages/jsii-dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs @@ -827,6 +827,27 @@ public void TestReturnInterfaceFromOverride() Assert.Equal(4 * n, obj.Test(arg)); } + [Fact(DisplayName = Prefix + nameof(NullShouldBeTreatedAsUndefined))] + public void NullShouldBeTreatedAsUndefined() + { + // ctor + var obj = new NullShouldBeTreatedAsUndefined("param1", null); + + // method argument + obj.GiveMeUndefined(null); + + // inside object + obj.GiveMeUndefinedInsideAnObject(new NullShouldBeTreatedAsUndefinedData + { + ThisShouldBeUndefined = null, + ArrayWithThreeElementsAndUndefinedAsSecondArgument = new[] { "hello", null, "world" } + }); + + // property + obj.ChangeMeToUndefined = null; + obj.VerifyPropertyIsUndefined(); + } + class NumberReturner : DeputyBase, IIReturnsNumber { public NumberReturner(double number) diff --git a/packages/jsii-java-runtime-test/project/src/test/java/software/amazon/jsii/testing/ComplianceTest.java b/packages/jsii-java-runtime-test/project/src/test/java/software/amazon/jsii/testing/ComplianceTest.java index f2c437819b..48dac8a445 100644 --- a/packages/jsii-java-runtime-test/project/src/test/java/software/amazon/jsii/testing/ComplianceTest.java +++ b/packages/jsii-java-runtime-test/project/src/test/java/software/amazon/jsii/testing/ComplianceTest.java @@ -25,6 +25,8 @@ import software.amazon.jsii.tests.calculator.Multiply; import software.amazon.jsii.tests.calculator.Negate; import software.amazon.jsii.tests.calculator.NodeStandardLibrary; +import software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefined; +import software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefinedData; import software.amazon.jsii.tests.calculator.NumberGenerator; import software.amazon.jsii.tests.calculator.Polymorphism; import software.amazon.jsii.tests.calculator.Power; @@ -927,6 +929,18 @@ public void classWithPrivateConstructorAndAutomaticProperties() { assertEquals("Hello", obj.getReadOnlyString()); } + @Test + public void nullShouldBeTreatedAsUndefined() { + NullShouldBeTreatedAsUndefined obj = new NullShouldBeTreatedAsUndefined("hello", null); + obj.giveMeUndefined(null); + obj.giveMeUndefinedInsideAnObject(NullShouldBeTreatedAsUndefinedData.builder() + .withThisShouldBeUndefined(null) + .withArrayWithThreeElementsAndUndefinedAsSecondArgument(Arrays.asList("hello", null, "boom")) + .build()); + obj.setChangeMeToUndefined(null); + obj.verifyPropertyIsUndefined(); + } + static class MulTen extends Multiply { public MulTen(final int value) { super(new Number(value), new Number(10)); diff --git a/packages/jsii-kernel/lib/kernel.ts b/packages/jsii-kernel/lib/kernel.ts index a7f5241ba9..c508e34599 100644 --- a/packages/jsii-kernel/lib/kernel.ts +++ b/packages/jsii-kernel/lib/kernel.ts @@ -877,9 +877,10 @@ export class Kernel { return undefined; } - // null + // null is treated as "undefined" because most languages do not have this distinction + // see awslabs/aws-cdk#157 and awslabs/jsii#282 if (v === null) { - return null; + return undefined; } // pointer diff --git a/packages/jsii-kernel/test/test.kernel.ts b/packages/jsii-kernel/test/test.kernel.ts index bd778be7d5..7d54fe430f 100644 --- a/packages/jsii-kernel/test/test.kernel.ts +++ b/packages/jsii-kernel/test/test.kernel.ts @@ -936,6 +936,29 @@ defineTest('overrides: skip overrides of private properties', async (test, sandb test.deepEqual(result.result, 'privateProperty'); }); +defineTest('nulls are converted to undefined - ctor', async (_test, sandbox) => { + sandbox.create({ fqn: 'jsii-calc.NullShouldBeTreatedAsUndefined', args: [ "foo", null ] }); +}); + +defineTest('nulls are converted to undefined - method arguments', async (_test, sandbox) => { + const objref = sandbox.create({ fqn: 'jsii-calc.NullShouldBeTreatedAsUndefined', args: [ "foo" ] }); + sandbox.invoke({ objref, method: 'giveMeUndefined', args: [ null ] }); +}); + +defineTest('nulls are converted to undefined - inside objects', async (_test, sandbox) => { + const objref = sandbox.create({ fqn: 'jsii-calc.NullShouldBeTreatedAsUndefined', args: [ "foo" ] }); + sandbox.invoke({ objref, method: 'giveMeUndefinedInsideAnObject', args: [ { + thisShouldBeUndefined: null, + arrayWithThreeElementsAndUndefinedAsSecondArgument: [ 'one', null, 'two' ] + } ]}); +}); + +defineTest('nulls are converted to undefined - properties', async (_test, sandbox) => { + const objref = sandbox.create({ fqn: 'jsii-calc.NullShouldBeTreatedAsUndefined', args: [ "foo" ] }); + sandbox.set({ objref, property: 'changeMeToUndefined', value: null }); + sandbox.invoke({ objref, method: 'verifyPropertyIsUndefined' }); +}); + // ================================================================================================= const testNames: { [name: string]: boolean } = { }; diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii index d245fa15e5..533c28165d 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii @@ -2273,6 +2273,99 @@ } ] }, + "jsii-calc.NullShouldBeTreatedAsUndefined": { + "assembly": "jsii-calc", + "docs": { + "comment": "jsii#282, aws-cdk#157: null should be treated as \"undefined\"" + }, + "fqn": "jsii-calc.NullShouldBeTreatedAsUndefined", + "initializer": { + "initializer": true, + "parameters": [ + { + "name": "_param1", + "type": { + "primitive": "string" + } + }, + { + "name": "optional", + "type": { + "optional": true, + "primitive": "any" + } + } + ] + }, + "kind": "class", + "methods": [ + { + "name": "giveMeUndefined", + "parameters": [ + { + "name": "value", + "type": { + "optional": true, + "primitive": "any" + } + } + ] + }, + { + "name": "giveMeUndefinedInsideAnObject", + "parameters": [ + { + "name": "input", + "type": { + "fqn": "jsii-calc.NullShouldBeTreatedAsUndefinedData" + } + } + ] + }, + { + "name": "verifyPropertyIsUndefined" + } + ], + "name": "NullShouldBeTreatedAsUndefined", + "properties": [ + { + "name": "changeMeToUndefined", + "type": { + "optional": true, + "primitive": "string" + } + } + ] + }, + "jsii-calc.NullShouldBeTreatedAsUndefinedData": { + "assembly": "jsii-calc", + "datatype": true, + "fqn": "jsii-calc.NullShouldBeTreatedAsUndefinedData", + "kind": "interface", + "name": "NullShouldBeTreatedAsUndefinedData", + "properties": [ + { + "abstract": true, + "name": "arrayWithThreeElementsAndUndefinedAsSecondArgument", + "type": { + "collection": { + "elementtype": { + "primitive": "any" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "name": "thisShouldBeUndefined", + "type": { + "optional": true, + "primitive": "any" + } + } + ] + }, "jsii-calc.NumberGenerator": { "assembly": "jsii-calc", "docs": { @@ -3444,5 +3537,5 @@ } }, "version": "0.7.8", - "fingerprint": "2BaszImarh4WChl9DFUcygfTpEfXU17fHQT2wgEptfM=" + "fingerprint": "FZk0ePQ2XUte84CmnOjU3PPCl6QUA88ke6wHIJKhyzo=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/INullShouldBeTreatedAsUndefinedData.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/INullShouldBeTreatedAsUndefinedData.cs new file mode 100644 index 0000000000..c5eed0cac8 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/INullShouldBeTreatedAsUndefinedData.cs @@ -0,0 +1,22 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiInterface(typeof(INullShouldBeTreatedAsUndefinedData), "jsii-calc.NullShouldBeTreatedAsUndefinedData")] + public interface INullShouldBeTreatedAsUndefinedData + { + [JsiiProperty("arrayWithThreeElementsAndUndefinedAsSecondArgument", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\"}}}")] + object[] ArrayWithThreeElementsAndUndefinedAsSecondArgument + { + get; + set; + } + + [JsiiProperty("thisShouldBeUndefined", "{\"primitive\":\"any\",\"optional\":true}")] + object ThisShouldBeUndefined + { + get; + set; + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefined.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefined.cs new file mode 100644 index 0000000000..59078293ae --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefined.cs @@ -0,0 +1,46 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + /// jsii#282, aws-cdk#157: null should be treated as "undefined" + [JsiiClass(typeof(NullShouldBeTreatedAsUndefined), "jsii-calc.NullShouldBeTreatedAsUndefined", "[{\"name\":\"_param1\",\"type\":{\"primitive\":\"string\"}},{\"name\":\"optional\",\"type\":{\"primitive\":\"any\",\"optional\":true}}]")] + public class NullShouldBeTreatedAsUndefined : DeputyBase + { + public NullShouldBeTreatedAsUndefined(string _param1, object optional): base(new DeputyProps(new object[]{_param1, optional})) + { + } + + protected NullShouldBeTreatedAsUndefined(ByRefValue reference): base(reference) + { + } + + protected NullShouldBeTreatedAsUndefined(DeputyProps props): base(props) + { + } + + [JsiiProperty("changeMeToUndefined", "{\"primitive\":\"string\",\"optional\":true}")] + public virtual string ChangeMeToUndefined + { + get => GetInstanceProperty(); + set => SetInstanceProperty(value); + } + + [JsiiMethod("giveMeUndefined", null, "[{\"name\":\"value\",\"type\":{\"primitive\":\"any\",\"optional\":true}}]")] + public virtual void GiveMeUndefined(object value) + { + InvokeInstanceVoidMethod(new object[]{value}); + } + + [JsiiMethod("giveMeUndefinedInsideAnObject", null, "[{\"name\":\"input\",\"type\":{\"fqn\":\"jsii-calc.NullShouldBeTreatedAsUndefinedData\"}}]")] + public virtual void GiveMeUndefinedInsideAnObject(INullShouldBeTreatedAsUndefinedData input) + { + InvokeInstanceVoidMethod(new object[]{input}); + } + + [JsiiMethod("verifyPropertyIsUndefined", null, "[]")] + public virtual void VerifyPropertyIsUndefined() + { + InvokeInstanceVoidMethod(new object[]{}); + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedData.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedData.cs new file mode 100644 index 0000000000..9be4f5bbd0 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedData.cs @@ -0,0 +1,21 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + public class NullShouldBeTreatedAsUndefinedData : DeputyBase, INullShouldBeTreatedAsUndefinedData + { + [JsiiProperty("arrayWithThreeElementsAndUndefinedAsSecondArgument", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\"}}}", true)] + public object[] ArrayWithThreeElementsAndUndefinedAsSecondArgument + { + get; + set; + } + + [JsiiProperty("thisShouldBeUndefined", "{\"primitive\":\"any\",\"optional\":true}", true)] + public object ThisShouldBeUndefined + { + get; + set; + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedDataProxy.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedDataProxy.cs new file mode 100644 index 0000000000..0456317c14 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/NullShouldBeTreatedAsUndefinedDataProxy.cs @@ -0,0 +1,26 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiTypeProxy(typeof(INullShouldBeTreatedAsUndefinedData), "jsii-calc.NullShouldBeTreatedAsUndefinedData")] + internal sealed class NullShouldBeTreatedAsUndefinedDataProxy : DeputyBase, INullShouldBeTreatedAsUndefinedData + { + private NullShouldBeTreatedAsUndefinedDataProxy(ByRefValue reference): base(reference) + { + } + + [JsiiProperty("arrayWithThreeElementsAndUndefinedAsSecondArgument", "{\"collection\":{\"kind\":\"array\",\"elementtype\":{\"primitive\":\"any\"}}}")] + public object[] ArrayWithThreeElementsAndUndefinedAsSecondArgument + { + get => GetInstanceProperty(); + set => SetInstanceProperty(value); + } + + [JsiiProperty("thisShouldBeUndefined", "{\"primitive\":\"any\",\"optional\":true}")] + public object ThisShouldBeUndefined + { + get => GetInstanceProperty(); + set => SetInstanceProperty(value); + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java index 946461ede3..7648aaf8e8 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java @@ -61,6 +61,8 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException case "jsii-calc.MutableObjectLiteral": return software.amazon.jsii.tests.calculator.MutableObjectLiteral.class; case "jsii-calc.Negate": return software.amazon.jsii.tests.calculator.Negate.class; case "jsii-calc.NodeStandardLibrary": return software.amazon.jsii.tests.calculator.NodeStandardLibrary.class; + case "jsii-calc.NullShouldBeTreatedAsUndefined": return software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefined.class; + case "jsii-calc.NullShouldBeTreatedAsUndefinedData": return software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefinedData.class; case "jsii-calc.NumberGenerator": return software.amazon.jsii.tests.calculator.NumberGenerator.class; case "jsii-calc.ObjectRefsInCollections": return software.amazon.jsii.tests.calculator.ObjectRefsInCollections.class; case "jsii-calc.OptionalConstructorArgument": return software.amazon.jsii.tests.calculator.OptionalConstructorArgument.class; diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefined.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefined.java new file mode 100644 index 0000000000..96b9f62e90 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefined.java @@ -0,0 +1,45 @@ +package software.amazon.jsii.tests.calculator; + +/** + * jsii#282, aws-cdk#157: null should be treated as "undefined" + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.NullShouldBeTreatedAsUndefined") +public class NullShouldBeTreatedAsUndefined extends software.amazon.jsii.JsiiObject { + protected NullShouldBeTreatedAsUndefined(final software.amazon.jsii.JsiiObject.InitializationMode mode) { + super(mode); + } + public NullShouldBeTreatedAsUndefined(final java.lang.String _param1, @javax.annotation.Nullable final java.lang.Object optional) { + super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(_param1, "_param1 is required")), java.util.stream.Stream.of(optional)).toArray()); + } + public NullShouldBeTreatedAsUndefined(final java.lang.String _param1) { + super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(java.util.Objects.requireNonNull(_param1, "_param1 is required")).toArray()); + } + + public void giveMeUndefined(@javax.annotation.Nullable final java.lang.Object value) { + this.jsiiCall("giveMeUndefined", Void.class, java.util.stream.Stream.of(value).toArray()); + } + + public void giveMeUndefined() { + this.jsiiCall("giveMeUndefined", Void.class); + } + + public void giveMeUndefinedInsideAnObject(final software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefinedData input) { + this.jsiiCall("giveMeUndefinedInsideAnObject", Void.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(input, "input is required")).toArray()); + } + + public void verifyPropertyIsUndefined() { + this.jsiiCall("verifyPropertyIsUndefined", Void.class); + } + + @javax.annotation.Nullable + public java.lang.String getChangeMeToUndefined() { + return this.jsiiGet("changeMeToUndefined", java.lang.String.class); + } + + public void setChangeMeToUndefined(@javax.annotation.Nullable final java.lang.String value) { + this.jsiiSet("changeMeToUndefined", value); + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefinedData.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefinedData.java new file mode 100644 index 0000000000..e54655c3bf --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/NullShouldBeTreatedAsUndefinedData.java @@ -0,0 +1,108 @@ +package software.amazon.jsii.tests.calculator; + +@javax.annotation.Generated(value = "jsii-pacmak") +public interface NullShouldBeTreatedAsUndefinedData extends software.amazon.jsii.JsiiSerializable { + java.util.List getArrayWithThreeElementsAndUndefinedAsSecondArgument(); + void setArrayWithThreeElementsAndUndefinedAsSecondArgument(final java.util.List value); + java.lang.Object getThisShouldBeUndefined(); + void setThisShouldBeUndefined(final java.lang.Object value); + + /** + * @return a {@link Builder} of {@link NullShouldBeTreatedAsUndefinedData} + */ + static Builder builder() { + return new Builder(); + } + + /** + * A builder for {@link NullShouldBeTreatedAsUndefinedData} + */ + final class Builder { + private java.util.List _arrayWithThreeElementsAndUndefinedAsSecondArgument; + @javax.annotation.Nullable + private java.lang.Object _thisShouldBeUndefined; + + /** + * Sets the value of ArrayWithThreeElementsAndUndefinedAsSecondArgument + * @param value the value to be set + * @return {@code this} + */ + public Builder withArrayWithThreeElementsAndUndefinedAsSecondArgument(final java.util.List value) { + this._arrayWithThreeElementsAndUndefinedAsSecondArgument = java.util.Objects.requireNonNull(value, "arrayWithThreeElementsAndUndefinedAsSecondArgument is required"); + return this; + } + /** + * Sets the value of ThisShouldBeUndefined + * @param value the value to be set + * @return {@code this} + */ + public Builder withThisShouldBeUndefined(@javax.annotation.Nullable final java.lang.Object value) { + this._thisShouldBeUndefined = value; + return this; + } + + /** + * Builds the configured instance. + * @return a new instance of {@link NullShouldBeTreatedAsUndefinedData} + * @throws NullPointerException if any required attribute was not provided + */ + public NullShouldBeTreatedAsUndefinedData build() { + return new NullShouldBeTreatedAsUndefinedData() { + private java.util.List $arrayWithThreeElementsAndUndefinedAsSecondArgument = java.util.Objects.requireNonNull(_arrayWithThreeElementsAndUndefinedAsSecondArgument, "arrayWithThreeElementsAndUndefinedAsSecondArgument is required"); + @javax.annotation.Nullable + private java.lang.Object $thisShouldBeUndefined = _thisShouldBeUndefined; + + @Override + public java.util.List getArrayWithThreeElementsAndUndefinedAsSecondArgument() { + return this.$arrayWithThreeElementsAndUndefinedAsSecondArgument; + } + + @Override + public void setArrayWithThreeElementsAndUndefinedAsSecondArgument(final java.util.List value) { + this.$arrayWithThreeElementsAndUndefinedAsSecondArgument = java.util.Objects.requireNonNull(value, "arrayWithThreeElementsAndUndefinedAsSecondArgument is required"); + } + + @Override + public java.lang.Object getThisShouldBeUndefined() { + return this.$thisShouldBeUndefined; + } + + @Override + public void setThisShouldBeUndefined(@javax.annotation.Nullable final java.lang.Object value) { + this.$thisShouldBeUndefined = value; + } + + }; + } + } + + /** + * A proxy class which represents a concrete javascript instance of this type. + */ + final static class Jsii$Proxy extends software.amazon.jsii.JsiiObject implements software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefinedData { + protected Jsii$Proxy(final software.amazon.jsii.JsiiObject.InitializationMode mode) { + super(mode); + } + + @Override + public java.util.List getArrayWithThreeElementsAndUndefinedAsSecondArgument() { + return this.jsiiGet("arrayWithThreeElementsAndUndefinedAsSecondArgument", java.util.List.class); + } + + @Override + public void setArrayWithThreeElementsAndUndefinedAsSecondArgument(final java.util.List value) { + this.jsiiSet("arrayWithThreeElementsAndUndefinedAsSecondArgument", java.util.Objects.requireNonNull(value, "arrayWithThreeElementsAndUndefinedAsSecondArgument is required")); + } + + @Override + @javax.annotation.Nullable + public java.lang.Object getThisShouldBeUndefined() { + return this.jsiiGet("thisShouldBeUndefined", java.lang.Object.class); + } + + @Override + public void setThisShouldBeUndefined(@javax.annotation.Nullable final java.lang.Object value) { + this.jsiiSet("thisShouldBeUndefined", value); + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst b/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst index 91db1c06f9..e52e449166 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst +++ b/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst @@ -2778,6 +2778,101 @@ NodeStandardLibrary :type: string *(readonly)* +NullShouldBeTreatedAsUndefined +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. py:class:: NullShouldBeTreatedAsUndefined(_param1, [optional]) + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefined; + + .. code-tab:: javascript + + const { NullShouldBeTreatedAsUndefined } = require('jsii-calc'); + + .. code-tab:: typescript + + import { NullShouldBeTreatedAsUndefined } from 'jsii-calc'; + + + + jsii#282, aws-cdk#157: null should be treated as "undefined" + + + :param _param1: + :type _param1: string + :param optional: + :type optional: any or ``undefined`` + + .. py:method:: giveMeUndefined([value]) + + :param value: + :type value: any or ``undefined`` + + + .. py:method:: giveMeUndefinedInsideAnObject(input) + + :param input: + :type input: :py:class:`~jsii-calc.NullShouldBeTreatedAsUndefinedData`\ + + + .. py:method:: verifyPropertyIsUndefined() + + + + .. py:attribute:: changeMeToUndefined + + :type: string or ``undefined`` + + +NullShouldBeTreatedAsUndefinedData (interface) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. py:class:: NullShouldBeTreatedAsUndefinedData + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefinedData; + + .. code-tab:: javascript + + // NullShouldBeTreatedAsUndefinedData is an interface + + .. code-tab:: typescript + + import { NullShouldBeTreatedAsUndefinedData } from 'jsii-calc'; + + + + + + .. py:attribute:: arrayWithThreeElementsAndUndefinedAsSecondArgument + + :type: any[] *(abstract)* + + + .. py:attribute:: thisShouldBeUndefined + + :type: any or ``undefined`` *(abstract)* + + NumberGenerator ^^^^^^^^^^^^^^^