From fa60b7f3d4268cd426d519bab9c738507c1ae503 Mon Sep 17 00:00:00 2001 From: Neta Nir Date: Tue, 2 Jun 2020 04:28:31 -0700 Subject: [PATCH] fix(jsii-pacmak): computeIfAbsent throws ConcurrentModificationException (#1706) --- Java generated modules use cache to store the result of `resolveClass` which is called when ever `jsiiStaticGet`/`jsiiGet` is called. The cache is implemented as a `HashMap`, to fill the cache we use `computeIfAbsent`: ```Java this.cache.computeIfAbsent(MODULE_TYPES.get(fqn), this::findClass); ``` > [code](https://github.com/aws/jsii/blob/master/packages/jsii-pacmak/lib/targets/java.ts#L2533) When either of the get methods is called on a type which in itself includes a type, the first get (the root type get) will call get on the inner type. When `computeIfAbsent` is called from the root get, the compute method will trigger another call to `computeIfAbsent` to resolve the inner type, since all types share the same cache it means that the inner `computeIfAbsent` call will modify the cache while the root `computeIfAbsent` is not yet completed, resulting it a `ConcurrentModificationException`. This effects all Java >= 9 applications as a change to the behavior of `computeIfAbsent` was introduced in Java 9. From the [Javadocs](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/HashMap.html#computeIfAbsent(K,java.util.function.Function)): ``` Throws: ConcurrentModificationException - if it is detected that the mapping function modified this map ``` The use of `computeIfAbsent ` was introduced in https://github.com/aws/jsii/pull/1605 and released in `v1.4.1`. This PR replaces `computeIfAbsent` with explicitly checking if the value exists in the cache and if not adding it (essentially old style `computeIfAbsent`). ### Test Steps to verify fix: 1. Build and package a sample module (see repro) using a local version of `jsii` and `jsii-pacmak`. 2. Add the generated jar to a local `mvn` repo. 3. Added the package as a dependency to a Java11 application. 4. Verify the exception is no longer thrown. ### Repro A repro can be found in this [repo](https://github.com/NetaNir/jsii-nested-get-repro) By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/@jsii/java-runtime-test/.gitignore | 1 + packages/@jsii/java-runtime-test/generate.sh | 3 + .../amazon/jsii/testing/ComplianceTest.java | 7 + .../@jsii/java-runtime-test/user.xml.t.js | 7 +- .../jsii-calc/lib/submodule/child/index.ts | 23 ++++ packages/jsii-calc/test/assembly.jsii | 130 +++++++++++++++++- packages/jsii-pacmak/lib/targets/java.ts | 9 +- .../tests/calculator/baseofbase/$Module.java | 6 +- .../jsii/tests/calculator/base/$Module.java | 6 +- .../jsii/tests/calculator/lib/$Module.java | 6 +- .../.jsii | 130 +++++++++++++++++- .../Submodule/Child/ISomeStruct.cs | 22 +++ .../Submodule/Child/InnerClass.cs | 44 ++++++ .../Submodule/Child/OuterClass.cs | 46 +++++++ .../Submodule/Child/SomeEnum.cs | 20 +++ .../Submodule/Child/SomeStruct.cs | 25 ++++ .../Submodule/Child/SomeStructProxy.cs | 26 ++++ .../amazon/jsii/tests/calculator/$Module.java | 6 +- .../submodule/child/InnerClass.java | 37 +++++ .../submodule/child/OuterClass.java | 39 ++++++ .../calculator/submodule/child/SomeEnum.java | 15 ++ .../submodule/child/SomeStruct.java | 117 ++++++++++++++++ .../amazon/jsii/tests/calculator/$Module.txt | 4 + .../src/jsii_calc/submodule/child/__init__.py | 94 +++++++++++++ .../test/__snapshots__/jsii-tree.test.js.snap | 63 +++++++-- .../__snapshots__/type-system.test.js.snap | 2 + 26 files changed, 867 insertions(+), 21 deletions(-) create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/ISomeStruct.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/InnerClass.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/OuterClass.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeEnum.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStruct.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStructProxy.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/InnerClass.java create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/OuterClass.java create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeEnum.java create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeStruct.java diff --git a/packages/@jsii/java-runtime-test/.gitignore b/packages/@jsii/java-runtime-test/.gitignore index f506cf132a..0ce5f2a328 100644 --- a/packages/@jsii/java-runtime-test/.gitignore +++ b/packages/@jsii/java-runtime-test/.gitignore @@ -1,3 +1,4 @@ +.m2 .vscode !*.js maven-repo diff --git a/packages/@jsii/java-runtime-test/generate.sh b/packages/@jsii/java-runtime-test/generate.sh index db76742984..df161eb24d 100755 --- a/packages/@jsii/java-runtime-test/generate.sh +++ b/packages/@jsii/java-runtime-test/generate.sh @@ -5,6 +5,9 @@ set -euo pipefail staging="maven-repo" rm -fr ${staging} && mkdir -p ${staging} +# Remove local artifacts from local maven repository +rm -fr project/.m2/software/amazon/jsii + # generate user.xml & pom.xml node ./user.xml.t.js > ./project/user.xml node ./pom.xml.t.js > ./project/pom.xml 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 09dbda8101..a77ee63af0 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 @@ -17,6 +17,7 @@ import software.amazon.jsii.tests.calculator.lib.Number; import software.amazon.jsii.tests.calculator.lib.StructWithOnlyOptionals; import software.amazon.jsii.tests.calculator.lib.Value; +import software.amazon.jsii.tests.calculator.submodule.child.OuterClass; import java.io.IOException; import java.lang.reflect.Constructor; @@ -1758,4 +1759,10 @@ public void collectionOfInterfaces_MapOfInterfaces() { assertTrue(obj instanceof IBell, () -> obj + " is an instance of " + IBell.class.getCanonicalName()); } } + + @Test + public void classesCanSelfReferenceDuringClassInitialization() { + final OuterClass outerClass = new OuterClass(); + assertNotNull(outerClass.getInnerClass()); + } } diff --git a/packages/@jsii/java-runtime-test/user.xml.t.js b/packages/@jsii/java-runtime-test/user.xml.t.js index 447e59ef3c..3484e153ff 100644 --- a/packages/@jsii/java-runtime-test/user.xml.t.js +++ b/packages/@jsii/java-runtime-test/user.xml.t.js @@ -1,4 +1,5 @@ const jsiiJavaRuntime = require('@jsii/java-runtime'); +const path = require('path'); process.stdout.write(` + ${path.resolve(__dirname, 'project', '.m2', 'repository')} + local jsii-runtime + Locally built jsii runtime for Java file://${jsiiJavaRuntime.repository} jsii-calc - file://${process.cwd()}/maven-repo + Locally built artifacts for jsii-calc and dependencies + file://${__dirname}/maven-repo/java diff --git a/packages/jsii-calc/lib/submodule/child/index.ts b/packages/jsii-calc/lib/submodule/child/index.ts index 87b0574273..bf4e79c179 100644 --- a/packages/jsii-calc/lib/submodule/child/index.ts +++ b/packages/jsii-calc/lib/submodule/child/index.ts @@ -16,3 +16,26 @@ export enum Awesomeness { /** It was awesome! */ AWESOME } + +/** + * Checks that classes can self-reference during initialization. + * @see: https://github.com/aws/jsii/pull/1706 + */ +export class OuterClass { + public readonly innerClass: InnerClass; + + public constructor() { + this.innerClass = new InnerClass(); + } +} +export enum SomeEnum { + SOME = 'SOME' +} +export interface SomeStruct { + readonly prop: SomeEnum; +} +export class InnerClass { + public static readonly staticProp: SomeStruct = { prop: SomeEnum.SOME }; + + public constructor() { } +} diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index b0144ed01d..54988d787b 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -12885,6 +12885,134 @@ "name": "Goodness", "namespace": "submodule.child" }, + "jsii-calc.submodule.child.InnerClass": { + "assembly": "jsii-calc", + "docs": { + "stability": "experimental" + }, + "fqn": "jsii-calc.submodule.child.InnerClass", + "initializer": { + "docs": { + "stability": "experimental" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 37 + }, + "name": "InnerClass", + "namespace": "submodule.child", + "properties": [ + { + "const": true, + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 38 + }, + "name": "staticProp", + "static": true, + "type": { + "fqn": "jsii-calc.submodule.child.SomeStruct" + } + } + ] + }, + "jsii-calc.submodule.child.OuterClass": { + "assembly": "jsii-calc", + "docs": { + "see": ": https://github.com/aws/jsii/pull/1706", + "stability": "experimental", + "summary": "Checks that classes can self-reference during initialization." + }, + "fqn": "jsii-calc.submodule.child.OuterClass", + "initializer": { + "docs": { + "stability": "experimental" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 24 + }, + "name": "OuterClass", + "namespace": "submodule.child", + "properties": [ + { + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 25 + }, + "name": "innerClass", + "type": { + "fqn": "jsii-calc.submodule.child.InnerClass" + } + } + ] + }, + "jsii-calc.submodule.child.SomeEnum": { + "assembly": "jsii-calc", + "docs": { + "stability": "experimental" + }, + "fqn": "jsii-calc.submodule.child.SomeEnum", + "kind": "enum", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 31 + }, + "members": [ + { + "docs": { + "stability": "experimental" + }, + "name": "SOME" + } + ], + "name": "SomeEnum", + "namespace": "submodule.child" + }, + "jsii-calc.submodule.child.SomeStruct": { + "assembly": "jsii-calc", + "datatype": true, + "docs": { + "stability": "experimental" + }, + "fqn": "jsii-calc.submodule.child.SomeStruct", + "kind": "interface", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 34 + }, + "name": "SomeStruct", + "namespace": "submodule.child", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 35 + }, + "name": "prop", + "type": { + "fqn": "jsii-calc.submodule.child.SomeEnum" + } + } + ] + }, "jsii-calc.submodule.child.Structure": { "assembly": "jsii-calc", "datatype": true, @@ -13000,5 +13128,5 @@ } }, "version": "0.0.0", - "fingerprint": "/DWCMji07IcZLGXOoefpKRPZyV9IHOIAR19tb1MHHWU=" + "fingerprint": "5SbCJfv1kDW24DUhPcwzoQ1k7Moq+rKOB+Q4TSZlKPE=" } diff --git a/packages/jsii-pacmak/lib/targets/java.ts b/packages/jsii-pacmak/lib/targets/java.ts index a282212dca..621b98460f 100644 --- a/packages/jsii-pacmak/lib/targets/java.ts +++ b/packages/jsii-pacmak/lib/targets/java.ts @@ -2529,11 +2529,12 @@ class JavaGenerator extends Generator { 'throw new ClassNotFoundException("Unknown JSII type: " + fqn);', ); this.code.closeBlock(); - this.code.line( - 'return this.cache.computeIfAbsent(MODULE_TYPES.get(fqn), this::findClass);', - ); + this.code.line('String className = MODULE_TYPES.get(fqn);'); + this.code.openBlock('if (!this.cache.containsKey(className))'); + this.code.line('this.cache.put(className, this.findClass(className));'); + this.code.closeBlock(); + this.code.line('return this.cache.get(className);'); this.code.closeBlock(); - this.code.line(); this.code.openBlock('private Class findClass(final String binaryName)'); this.code.openBlock('try'); diff --git a/packages/jsii-pacmak/test/expected.jsii-calc-base-of-base/java/src/main/java/software/amazon/jsii/tests/calculator/baseofbase/$Module.java b/packages/jsii-pacmak/test/expected.jsii-calc-base-of-base/java/src/main/java/software/amazon/jsii/tests/calculator/baseofbase/$Module.java index 69a22361f9..f183619c2f 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc-base-of-base/java/src/main/java/software/amazon/jsii/tests/calculator/baseofbase/$Module.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc-base-of-base/java/src/main/java/software/amazon/jsii/tests/calculator/baseofbase/$Module.java @@ -49,7 +49,11 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException if (!MODULE_TYPES.containsKey(fqn)) { throw new ClassNotFoundException("Unknown JSII type: " + fqn); } - return this.cache.computeIfAbsent(MODULE_TYPES.get(fqn), this::findClass); + String className = MODULE_TYPES.get(fqn); + if (!this.cache.containsKey(className)) { + this.cache.put(className, this.findClass(className)); + } + return this.cache.get(className); } private Class findClass(final String binaryName) { diff --git a/packages/jsii-pacmak/test/expected.jsii-calc-base/java/src/main/java/software/amazon/jsii/tests/calculator/base/$Module.java b/packages/jsii-pacmak/test/expected.jsii-calc-base/java/src/main/java/software/amazon/jsii/tests/calculator/base/$Module.java index 9cff837adb..99a7a6a8a0 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc-base/java/src/main/java/software/amazon/jsii/tests/calculator/base/$Module.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc-base/java/src/main/java/software/amazon/jsii/tests/calculator/base/$Module.java @@ -57,7 +57,11 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException if (!MODULE_TYPES.containsKey(fqn)) { throw new ClassNotFoundException("Unknown JSII type: " + fqn); } - return this.cache.computeIfAbsent(MODULE_TYPES.get(fqn), this::findClass); + String className = MODULE_TYPES.get(fqn); + if (!this.cache.containsKey(className)) { + this.cache.put(className, this.findClass(className)); + } + return this.cache.get(className); } private Class findClass(final String binaryName) { diff --git a/packages/jsii-pacmak/test/expected.jsii-calc-lib/java/src/main/java/software/amazon/jsii/tests/calculator/lib/$Module.java b/packages/jsii-pacmak/test/expected.jsii-calc-lib/java/src/main/java/software/amazon/jsii/tests/calculator/lib/$Module.java index af52b00896..925fda7434 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc-lib/java/src/main/java/software/amazon/jsii/tests/calculator/lib/$Module.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc-lib/java/src/main/java/software/amazon/jsii/tests/calculator/lib/$Module.java @@ -57,7 +57,11 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException if (!MODULE_TYPES.containsKey(fqn)) { throw new ClassNotFoundException("Unknown JSII type: " + fqn); } - return this.cache.computeIfAbsent(MODULE_TYPES.get(fqn), this::findClass); + String className = MODULE_TYPES.get(fqn); + if (!this.cache.containsKey(className)) { + this.cache.put(className, this.findClass(className)); + } + return this.cache.get(className); } private Class findClass(final String binaryName) { 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 b0144ed01d..54988d787b 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 @@ -12885,6 +12885,134 @@ "name": "Goodness", "namespace": "submodule.child" }, + "jsii-calc.submodule.child.InnerClass": { + "assembly": "jsii-calc", + "docs": { + "stability": "experimental" + }, + "fqn": "jsii-calc.submodule.child.InnerClass", + "initializer": { + "docs": { + "stability": "experimental" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 37 + }, + "name": "InnerClass", + "namespace": "submodule.child", + "properties": [ + { + "const": true, + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 38 + }, + "name": "staticProp", + "static": true, + "type": { + "fqn": "jsii-calc.submodule.child.SomeStruct" + } + } + ] + }, + "jsii-calc.submodule.child.OuterClass": { + "assembly": "jsii-calc", + "docs": { + "see": ": https://github.com/aws/jsii/pull/1706", + "stability": "experimental", + "summary": "Checks that classes can self-reference during initialization." + }, + "fqn": "jsii-calc.submodule.child.OuterClass", + "initializer": { + "docs": { + "stability": "experimental" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 24 + }, + "name": "OuterClass", + "namespace": "submodule.child", + "properties": [ + { + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 25 + }, + "name": "innerClass", + "type": { + "fqn": "jsii-calc.submodule.child.InnerClass" + } + } + ] + }, + "jsii-calc.submodule.child.SomeEnum": { + "assembly": "jsii-calc", + "docs": { + "stability": "experimental" + }, + "fqn": "jsii-calc.submodule.child.SomeEnum", + "kind": "enum", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 31 + }, + "members": [ + { + "docs": { + "stability": "experimental" + }, + "name": "SOME" + } + ], + "name": "SomeEnum", + "namespace": "submodule.child" + }, + "jsii-calc.submodule.child.SomeStruct": { + "assembly": "jsii-calc", + "datatype": true, + "docs": { + "stability": "experimental" + }, + "fqn": "jsii-calc.submodule.child.SomeStruct", + "kind": "interface", + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 34 + }, + "name": "SomeStruct", + "namespace": "submodule.child", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/child/index.ts", + "line": 35 + }, + "name": "prop", + "type": { + "fqn": "jsii-calc.submodule.child.SomeEnum" + } + } + ] + }, "jsii-calc.submodule.child.Structure": { "assembly": "jsii-calc", "datatype": true, @@ -13000,5 +13128,5 @@ } }, "version": "0.0.0", - "fingerprint": "/DWCMji07IcZLGXOoefpKRPZyV9IHOIAR19tb1MHHWU=" + "fingerprint": "5SbCJfv1kDW24DUhPcwzoQ1k7Moq+rKOB+Q4TSZlKPE=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/ISomeStruct.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/ISomeStruct.cs new file mode 100644 index 0000000000..80a8cf22a6 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/ISomeStruct.cs @@ -0,0 +1,22 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child +{ + /// + /// Stability: Experimental + /// + [JsiiInterface(nativeType: typeof(ISomeStruct), fullyQualifiedName: "jsii-calc.submodule.child.SomeStruct")] + public interface ISomeStruct + { + /// + /// Stability: Experimental + /// + [JsiiProperty(name: "prop", typeJson: "{\"fqn\":\"jsii-calc.submodule.child.SomeEnum\"}")] + Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.SomeEnum Prop + { + get; + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/InnerClass.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/InnerClass.cs new file mode 100644 index 0000000000..b81390a756 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/InnerClass.cs @@ -0,0 +1,44 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child +{ + /// + /// Stability: Experimental + /// + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.InnerClass), fullyQualifiedName: "jsii-calc.submodule.child.InnerClass")] + public class InnerClass : DeputyBase + { + /// + /// Stability: Experimental + /// + public InnerClass(): base(new DeputyProps(new object[]{})) + { + } + + /// Used by jsii to construct an instance of this class from a Javascript-owned object reference + /// The Javascript-owned object reference + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + protected InnerClass(ByRefValue reference): base(reference) + { + } + + /// Used by jsii to construct an instance of this class from DeputyProps + /// The deputy props + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + protected InnerClass(DeputyProps props): base(props) + { + } + + /// + /// Stability: Experimental + /// + [JsiiProperty(name: "staticProp", typeJson: "{\"fqn\":\"jsii-calc.submodule.child.SomeStruct\"}")] + public static Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.ISomeStruct StaticProp + { + get; + } + = GetStaticProperty(typeof(Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.InnerClass)); + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/OuterClass.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/OuterClass.cs new file mode 100644 index 0000000000..b348b5c725 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/OuterClass.cs @@ -0,0 +1,46 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child +{ + /// Checks that classes can self-reference during initialization. + /// + /// Stability: Experimental + /// + /// See: : https://github.com/aws/jsii/pull/1706 + /// + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.OuterClass), fullyQualifiedName: "jsii-calc.submodule.child.OuterClass")] + public class OuterClass : DeputyBase + { + /// + /// Stability: Experimental + /// + public OuterClass(): base(new DeputyProps(new object[]{})) + { + } + + /// Used by jsii to construct an instance of this class from a Javascript-owned object reference + /// The Javascript-owned object reference + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + protected OuterClass(ByRefValue reference): base(reference) + { + } + + /// Used by jsii to construct an instance of this class from DeputyProps + /// The deputy props + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] + protected OuterClass(DeputyProps props): base(props) + { + } + + /// + /// Stability: Experimental + /// + [JsiiProperty(name: "innerClass", typeJson: "{\"fqn\":\"jsii-calc.submodule.child.InnerClass\"}")] + public virtual Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.InnerClass InnerClass + { + get => GetInstanceProperty(); + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeEnum.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeEnum.cs new file mode 100644 index 0000000000..17e0efdf61 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeEnum.cs @@ -0,0 +1,20 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child +{ + + /// + /// Stability: Experimental + /// + [JsiiEnum(nativeType: typeof(SomeEnum), fullyQualifiedName: "jsii-calc.submodule.child.SomeEnum")] + public enum SomeEnum + { + /// + /// Stability: Experimental + /// + [JsiiEnumMember(name: "SOME")] + SOME + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStruct.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStruct.cs new file mode 100644 index 0000000000..5245796dde --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStruct.cs @@ -0,0 +1,25 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child +{ + #pragma warning disable CS8618 + + /// + /// Stability: Experimental + /// + [JsiiByValue(fqn: "jsii-calc.submodule.child.SomeStruct")] + public class SomeStruct : Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.ISomeStruct + { + /// + /// Stability: Experimental + /// + [JsiiProperty(name: "prop", typeJson: "{\"fqn\":\"jsii-calc.submodule.child.SomeEnum\"}", isOverride: true)] + public Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.SomeEnum Prop + { + get; + set; + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStructProxy.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStructProxy.cs new file mode 100644 index 0000000000..06b47ddaa6 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/Child/SomeStructProxy.cs @@ -0,0 +1,26 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child +{ + /// + /// Stability: Experimental + /// + [JsiiTypeProxy(nativeType: typeof(ISomeStruct), fullyQualifiedName: "jsii-calc.submodule.child.SomeStruct")] + internal sealed class SomeStructProxy : DeputyBase, Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.ISomeStruct + { + private SomeStructProxy(ByRefValue reference): base(reference) + { + } + + /// + /// Stability: Experimental + /// + [JsiiProperty(name: "prop", typeJson: "{\"fqn\":\"jsii-calc.submodule.child.SomeEnum\"}")] + public Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.SomeEnum Prop + { + get => GetInstanceProperty(); + } + } +} 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 12ec2e70f5..9015a7e763 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 @@ -57,7 +57,11 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException if (!MODULE_TYPES.containsKey(fqn)) { throw new ClassNotFoundException("Unknown JSII type: " + fqn); } - return this.cache.computeIfAbsent(MODULE_TYPES.get(fqn), this::findClass); + String className = MODULE_TYPES.get(fqn); + if (!this.cache.containsKey(className)) { + this.cache.put(className, this.findClass(className)); + } + return this.cache.get(className); } private Class findClass(final String binaryName) { diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/InnerClass.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/InnerClass.java new file mode 100644 index 0000000000..cc2dd9dea5 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/InnerClass.java @@ -0,0 +1,37 @@ +package software.amazon.jsii.tests.calculator.submodule.child; + +/** + * EXPERIMENTAL + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.submodule.child.InnerClass") +public class InnerClass extends software.amazon.jsii.JsiiObject { + + protected InnerClass(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + protected InnerClass(final software.amazon.jsii.JsiiObject.InitializationMode initializationMode) { + super(initializationMode); + } + + static { + STATIC_PROP = software.amazon.jsii.JsiiObject.jsiiStaticGet(software.amazon.jsii.tests.calculator.submodule.child.InnerClass.class, "staticProp", software.amazon.jsii.tests.calculator.submodule.child.SomeStruct.class); + } + + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public InnerClass() { + super(software.amazon.jsii.JsiiObject.InitializationMode.JSII); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this); + } + + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public final static software.amazon.jsii.tests.calculator.submodule.child.SomeStruct STATIC_PROP; +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/OuterClass.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/OuterClass.java new file mode 100644 index 0000000000..9160005388 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/OuterClass.java @@ -0,0 +1,39 @@ +package software.amazon.jsii.tests.calculator.submodule.child; + +/** + * Checks that classes can self-reference during initialization. + *

+ * EXPERIMENTAL + *

+ * @see : https://github.com/aws/jsii/pull/1706 + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.submodule.child.OuterClass") +public class OuterClass extends software.amazon.jsii.JsiiObject { + + protected OuterClass(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + protected OuterClass(final software.amazon.jsii.JsiiObject.InitializationMode initializationMode) { + super(initializationMode); + } + + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public OuterClass() { + super(software.amazon.jsii.JsiiObject.InitializationMode.JSII); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this); + } + + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public @org.jetbrains.annotations.NotNull software.amazon.jsii.tests.calculator.submodule.child.InnerClass getInnerClass() { + return this.jsiiGet("innerClass", software.amazon.jsii.tests.calculator.submodule.child.InnerClass.class); + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeEnum.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeEnum.java new file mode 100644 index 0000000000..ae633451ac --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeEnum.java @@ -0,0 +1,15 @@ +package software.amazon.jsii.tests.calculator.submodule.child; + +/** + * EXPERIMENTAL + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.submodule.child.SomeEnum") +public enum SomeEnum { + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + SOME, +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeStruct.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeStruct.java new file mode 100644 index 0000000000..eb39f07038 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/child/SomeStruct.java @@ -0,0 +1,117 @@ +package software.amazon.jsii.tests.calculator.submodule.child; + +/** + * EXPERIMENTAL + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.submodule.child.SomeStruct") +@software.amazon.jsii.Jsii.Proxy(SomeStruct.Jsii$Proxy.class) +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) +public interface SomeStruct extends software.amazon.jsii.JsiiSerializable { + + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + @org.jetbrains.annotations.NotNull software.amazon.jsii.tests.calculator.submodule.child.SomeEnum getProp(); + + /** + * @return a {@link Builder} of {@link SomeStruct} + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + static Builder builder() { + return new Builder(); + } + /** + * A builder for {@link SomeStruct} + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public static final class Builder implements software.amazon.jsii.Builder { + private software.amazon.jsii.tests.calculator.submodule.child.SomeEnum prop; + + /** + * Sets the value of {@link SomeStruct#getProp} + * @param prop the value to be set. This parameter is required. + * @return {@code this} + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public Builder prop(software.amazon.jsii.tests.calculator.submodule.child.SomeEnum prop) { + this.prop = prop; + return this; + } + + /** + * Builds the configured instance. + * @return a new instance of {@link SomeStruct} + * @throws NullPointerException if any required attribute was not provided + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + @Override + public SomeStruct build() { + return new Jsii$Proxy(prop); + } + } + + /** + * An implementation for {@link SomeStruct} + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + final class Jsii$Proxy extends software.amazon.jsii.JsiiObject implements SomeStruct { + private final software.amazon.jsii.tests.calculator.submodule.child.SomeEnum prop; + + /** + * Constructor that initializes the object based on values retrieved from the JsiiObject. + * @param objRef Reference to the JSII managed object. + */ + protected Jsii$Proxy(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + this.prop = this.jsiiGet("prop", software.amazon.jsii.tests.calculator.submodule.child.SomeEnum.class); + } + + /** + * Constructor that initializes the object based on literal property values passed by the {@link Builder}. + */ + private Jsii$Proxy(final software.amazon.jsii.tests.calculator.submodule.child.SomeEnum prop) { + super(software.amazon.jsii.JsiiObject.InitializationMode.JSII); + this.prop = java.util.Objects.requireNonNull(prop, "prop is required"); + } + + @Override + public software.amazon.jsii.tests.calculator.submodule.child.SomeEnum getProp() { + return this.prop; + } + + @Override + public com.fasterxml.jackson.databind.JsonNode $jsii$toJson() { + final com.fasterxml.jackson.databind.ObjectMapper om = software.amazon.jsii.JsiiObjectMapper.INSTANCE; + final com.fasterxml.jackson.databind.node.ObjectNode data = com.fasterxml.jackson.databind.node.JsonNodeFactory.instance.objectNode(); + + data.set("prop", om.valueToTree(this.getProp())); + + final com.fasterxml.jackson.databind.node.ObjectNode struct = com.fasterxml.jackson.databind.node.JsonNodeFactory.instance.objectNode(); + struct.set("fqn", om.valueToTree("jsii-calc.submodule.child.SomeStruct")); + struct.set("data", data); + + final com.fasterxml.jackson.databind.node.ObjectNode obj = com.fasterxml.jackson.databind.node.JsonNodeFactory.instance.objectNode(); + obj.set("$jsii.struct", struct); + + return obj; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SomeStruct.Jsii$Proxy that = (SomeStruct.Jsii$Proxy) o; + + return this.prop.equals(that.prop); + } + + @Override + public int hashCode() { + int result = this.prop.hashCode(); + return result; + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/$Module.txt b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/$Module.txt index 8e4fc3ea20..8db5e6fa7b 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/$Module.txt +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/resources/software/amazon/jsii/tests/calculator/$Module.txt @@ -200,6 +200,10 @@ jsii-calc.submodule.MyClass=software.amazon.jsii.tests.calculator.submodule.MyCl jsii-calc.submodule.back_references.MyClassReference=software.amazon.jsii.tests.calculator.submodule.back_references.MyClassReference jsii-calc.submodule.child.Awesomeness=software.amazon.jsii.tests.calculator.submodule.child.Awesomeness jsii-calc.submodule.child.Goodness=software.amazon.jsii.tests.calculator.submodule.child.Goodness +jsii-calc.submodule.child.InnerClass=software.amazon.jsii.tests.calculator.submodule.child.InnerClass +jsii-calc.submodule.child.OuterClass=software.amazon.jsii.tests.calculator.submodule.child.OuterClass +jsii-calc.submodule.child.SomeEnum=software.amazon.jsii.tests.calculator.submodule.child.SomeEnum +jsii-calc.submodule.child.SomeStruct=software.amazon.jsii.tests.calculator.submodule.child.SomeStruct jsii-calc.submodule.child.Structure=software.amazon.jsii.tests.calculator.submodule.child.Structure jsii-calc.submodule.nested_submodule.Namespaced=software.amazon.jsii.tests.calculator.submodule.nested_submodule.Namespaced jsii-calc.submodule.nested_submodule.deeplyNested.INamespaced=software.amazon.jsii.tests.calculator.submodule.nested_submodule.deeply_nested.INamespaced diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/child/__init__.py b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/child/__init__.py index 36f76fdf3f..e3eee7a961 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/child/__init__.py +++ b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/child/__init__.py @@ -49,6 +49,96 @@ class Goodness(enum.Enum): :stability: experimental """ +class InnerClass(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.submodule.child.InnerClass"): + """ + stability + :stability: experimental + """ + def __init__(self) -> None: + """ + stability + :stability: experimental + """ + jsii.create(InnerClass, self, []) + + @jsii.python.classproperty + @jsii.member(jsii_name="staticProp") + def STATIC_PROP(cls) -> "SomeStruct": + """ + stability + :stability: experimental + """ + return jsii.sget(cls, "staticProp") + + +class OuterClass(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.submodule.child.OuterClass"): + """Checks that classes can self-reference during initialization. + + see + :see: : https://github.com/aws/jsii/pull/1706 + stability + :stability: experimental + """ + def __init__(self) -> None: + """ + stability + :stability: experimental + """ + jsii.create(OuterClass, self, []) + + @builtins.property + @jsii.member(jsii_name="innerClass") + def inner_class(self) -> "InnerClass": + """ + stability + :stability: experimental + """ + return jsii.get(self, "innerClass") + + +@jsii.enum(jsii_type="jsii-calc.submodule.child.SomeEnum") +class SomeEnum(enum.Enum): + """ + stability + :stability: experimental + """ + SOME = "SOME" + """ + stability + :stability: experimental + """ + +@jsii.data_type(jsii_type="jsii-calc.submodule.child.SomeStruct", jsii_struct_bases=[], name_mapping={'prop': 'prop'}) +class SomeStruct(): + def __init__(self, *, prop: "SomeEnum") -> None: + """ + :param prop: + + stability + :stability: experimental + """ + self._values = { + 'prop': prop, + } + + @builtins.property + def prop(self) -> "SomeEnum": + """ + stability + :stability: experimental + """ + return self._values.get('prop') + + def __eq__(self, rhs) -> bool: + return isinstance(rhs, self.__class__) and rhs._values == self._values + + def __ne__(self, rhs) -> bool: + return not (rhs == self) + + def __repr__(self) -> str: + return 'SomeStruct(%s)' % ', '.join(k + '=' + repr(v) for k, v in self._values.items()) + + @jsii.data_type(jsii_type="jsii-calc.submodule.child.Structure", jsii_struct_bases=[], name_mapping={'bool': 'bool'}) class Structure(): def __init__(self, *, bool: bool) -> None: @@ -83,6 +173,10 @@ def __repr__(self) -> str: __all__ = [ "Awesomeness", "Goodness", + "InnerClass", + "OuterClass", + "SomeEnum", + "SomeStruct", "Structure", ] diff --git a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap index 584a4f8030..54a5e93c4c 100644 --- a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap @@ -115,6 +115,26 @@ exports[`jsii-tree --all 1`] = ` │ │ │ │ └── type: jsii-calc.submodule.MyClass │ │ │ ├─┬ child │ │ │ │ └─┬ types + │ │ │ │ ├─┬ class InnerClass (experimental) + │ │ │ │ │ └─┬ members + │ │ │ │ │ ├── () initializer (experimental) + │ │ │ │ │ └─┬ static staticProp property (experimental) + │ │ │ │ │ ├── const + │ │ │ │ │ ├── immutable + │ │ │ │ │ ├── static + │ │ │ │ │ └── type: jsii-calc.submodule.child.SomeStruct + │ │ │ │ ├─┬ class OuterClass (experimental) + │ │ │ │ │ └─┬ members + │ │ │ │ │ ├── () initializer (experimental) + │ │ │ │ │ └─┬ innerClass property (experimental) + │ │ │ │ │ ├── immutable + │ │ │ │ │ └── type: jsii-calc.submodule.child.InnerClass + │ │ │ │ ├─┬ interface SomeStruct (experimental) + │ │ │ │ │ └─┬ members + │ │ │ │ │ └─┬ prop property (experimental) + │ │ │ │ │ ├── abstract + │ │ │ │ │ ├── immutable + │ │ │ │ │ └── type: jsii-calc.submodule.child.SomeEnum │ │ │ │ ├─┬ interface Structure (experimental) │ │ │ │ │ └─┬ members │ │ │ │ │ └─┬ bool property (experimental) @@ -123,10 +143,12 @@ exports[`jsii-tree --all 1`] = ` │ │ │ │ │ └── type: boolean │ │ │ │ ├─┬ enum Awesomeness (experimental) │ │ │ │ │ └── AWESOME (experimental) - │ │ │ │ └─┬ enum Goodness (experimental) - │ │ │ │ ├── PRETTY_GOOD (experimental) - │ │ │ │ ├── REALLY_GOOD (experimental) - │ │ │ │ └── AMAZINGLY_GOOD (experimental) + │ │ │ │ ├─┬ enum Goodness (experimental) + │ │ │ │ │ ├── PRETTY_GOOD (experimental) + │ │ │ │ │ ├── REALLY_GOOD (experimental) + │ │ │ │ │ └── AMAZINGLY_GOOD (experimental) + │ │ │ │ └─┬ enum SomeEnum (experimental) + │ │ │ │ └── SOME (experimental) │ │ │ └─┬ nested_submodule │ │ │ ├─┬ submodules │ │ │ │ └─┬ deeplyNested @@ -2624,9 +2646,13 @@ exports[`jsii-tree --inheritance 1`] = ` │ │ │ │ └── interface MyClassReference │ │ │ ├─┬ child │ │ │ │ └─┬ types + │ │ │ │ ├── class InnerClass + │ │ │ │ ├── class OuterClass + │ │ │ │ ├── interface SomeStruct │ │ │ │ ├── interface Structure │ │ │ │ ├── enum Awesomeness - │ │ │ │ └── enum Goodness + │ │ │ │ ├── enum Goodness + │ │ │ │ └── enum SomeEnum │ │ │ └─┬ nested_submodule │ │ │ ├─┬ submodules │ │ │ │ └─┬ deeplyNested @@ -2987,15 +3013,28 @@ exports[`jsii-tree --members 1`] = ` │ │ │ │ └── reference property │ │ │ ├─┬ child │ │ │ │ └─┬ types + │ │ │ │ ├─┬ class InnerClass + │ │ │ │ │ └─┬ members + │ │ │ │ │ ├── () initializer + │ │ │ │ │ └── static staticProp property + │ │ │ │ ├─┬ class OuterClass + │ │ │ │ │ └─┬ members + │ │ │ │ │ ├── () initializer + │ │ │ │ │ └── innerClass property + │ │ │ │ ├─┬ interface SomeStruct + │ │ │ │ │ └─┬ members + │ │ │ │ │ └── prop property │ │ │ │ ├─┬ interface Structure │ │ │ │ │ └─┬ members │ │ │ │ │ └── bool property │ │ │ │ ├─┬ enum Awesomeness │ │ │ │ │ └── AWESOME - │ │ │ │ └─┬ enum Goodness - │ │ │ │ ├── PRETTY_GOOD - │ │ │ │ ├── REALLY_GOOD - │ │ │ │ └── AMAZINGLY_GOOD + │ │ │ │ ├─┬ enum Goodness + │ │ │ │ │ ├── PRETTY_GOOD + │ │ │ │ │ ├── REALLY_GOOD + │ │ │ │ │ └── AMAZINGLY_GOOD + │ │ │ │ └─┬ enum SomeEnum + │ │ │ │ └── SOME │ │ │ └─┬ nested_submodule │ │ │ ├─┬ submodules │ │ │ │ └─┬ deeplyNested @@ -4132,9 +4171,13 @@ exports[`jsii-tree --types 1`] = ` │ │ │ │ └── interface MyClassReference │ │ │ ├─┬ child │ │ │ │ └─┬ types + │ │ │ │ ├── class InnerClass + │ │ │ │ ├── class OuterClass + │ │ │ │ ├── interface SomeStruct │ │ │ │ ├── interface Structure │ │ │ │ ├── enum Awesomeness - │ │ │ │ └── enum Goodness + │ │ │ │ ├── enum Goodness + │ │ │ │ └── enum SomeEnum │ │ │ └─┬ nested_submodule │ │ │ ├─┬ submodules │ │ │ │ └─┬ deeplyNested diff --git a/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap b/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap index 9c38fb6276..c7fb7aec20 100644 --- a/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap @@ -136,6 +136,8 @@ Array [ "jsii-calc.WithPrivatePropertyInConstructor", "jsii-calc.composition.CompositeOperation", "jsii-calc.submodule.MyClass", + "jsii-calc.submodule.child.InnerClass", + "jsii-calc.submodule.child.OuterClass", "jsii-calc.submodule.nested_submodule.Namespaced", ] `;