From 3567bab29580bc862525e45fff6ffa4f03823cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=91=A8=F0=9F=8F=BC=E2=80=8D=F0=9F=92=BB=20Romain=20M?= =?UTF-8?q?arcadier-Muller?= Date: Mon, 8 Jun 2020 15:36:02 +0200 Subject: [PATCH] fix(dotnet): "Could not infer JSII type for .NET type 'AnonymousObject'" When obtained through an untyped way (e.g: as part of an opaque object for example), instances of `AnonymousObject` could not be cast back to their Kernel form, because the converter lacked a code path to handle this type. Instead, it insisted on trying to infer a "better" run-time type for it. This adds the necessary code path to handle this condition and properly return the reverse conversion. Fixes aws/aws-cdk#7977 --- .../ComplianceTests.cs | 16 ++++- .../Services/Converters/ValueConverter.cs | 12 +++- packages/jsii-calc/lib/compliance.ts | 20 ++++++ packages/jsii-calc/test/assembly.jsii | 64 +++++++++++++++++- .../.jsii | 64 +++++++++++++++++- .../BurriedAnonymousObject.cs | 51 ++++++++++++++ .../BurriedAnonymousObjectProxy.cs | 30 +++++++++ .../calculator/BurriedAnonymousObject.java | 67 +++++++++++++++++++ .../amazon/jsii/tests/calculator/$Module.txt | 1 + .../python/src/jsii_calc/__init__.py | 54 +++++++++++++++ .../test/__snapshots__/jsii-tree.test.js.snap | 18 +++++ .../__snapshots__/type-system.test.js.snap | 1 + 12 files changed, 394 insertions(+), 4 deletions(-) create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObject.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObjectProxy.cs create mode 100644 packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/BurriedAnonymousObject.java 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 04d7d2be59..4cf03e3e80 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 @@ -34,7 +34,7 @@ public RuntimeException(string message) const string Prefix = nameof(IntegrationTests) + ".Compliance."; private readonly IDisposable _serviceContainerFixture; - + public ComplianceTests(ITestOutputHelper outputHelper, ServiceContainerFixture serviceContainerFixture) { serviceContainerFixture.SetOverride(outputHelper); @@ -1475,5 +1475,19 @@ public void CollectionOfInterfaces_MapOfInterfaces() Assert.IsAssignableFrom(elt); } } + + [Fact(DisplayName = Prefix + nameof(BurriedAnonymousObject))] + public void BurriedAnonymousObject() + { + var subject = new BurriedAnonymousObjectImpl(); + Assert.True(subject.Check()); + } + + private sealed class BurriedAnonymousObjectImpl : BurriedAnonymousObject + { + public override object GiveItBack(object value) { + return value; + } + } } } diff --git a/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/ValueConverter.cs b/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/ValueConverter.cs index 46989fcf43..eed620c9bb 100644 --- a/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/ValueConverter.cs +++ b/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/ValueConverter.cs @@ -1,4 +1,5 @@ using Amazon.JSII.JsonModel.Spec; +using Amazon.JSII.Runtime.Deputy; using System; namespace Amazon.JSII.Runtime.Services.Converters @@ -89,8 +90,17 @@ protected bool IsNumeric(System.Type type) return null; } + if (value is AnonymousObject) + { + if (!TryConvertClass(type, referenceMap, value, out var anonResult)) + { + throw new Exception("Unable to convert AnonymousObject instance!"); + } + return anonResult; + } + TypeReference reference = InferType(referenceMap, value); - if (TryConvert(reference, type, referenceMap, value, out object? result)) + if (TryConvert(reference, type, referenceMap, value, out var result)) { return result; } diff --git a/packages/jsii-calc/lib/compliance.ts b/packages/jsii-calc/lib/compliance.ts index 924f8386f6..77ddf06be0 100644 --- a/packages/jsii-calc/lib/compliance.ts +++ b/packages/jsii-calc/lib/compliance.ts @@ -2490,3 +2490,23 @@ export class InterfaceCollections { export interface IOptionalMethod { optional(): string | undefined; } + +/** + * See https://github.com/aws/aws-cdk/issues/7977 + */ +export abstract class BurriedAnonymousObject { + public check(): boolean { + const anonymousObject = { method() { return true; } }; + const result = this.giveItBack({ anonymousObject }); + return anonymousObject === result.anonymousObject; + } + + /** + * Implement this method and have it return it's parameter. + * + * @param value the value that should be returned. + * + * @returns `value` + */ + public abstract giveItBack(value: any): any; +} diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index 54988d787b..29f2fefc49 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -1561,6 +1561,68 @@ } ] }, + "jsii-calc.BurriedAnonymousObject": { + "abstract": true, + "assembly": "jsii-calc", + "docs": { + "stability": "experimental", + "summary": "See https://github.com/aws/aws-cdk/issues/7977." + }, + "fqn": "jsii-calc.BurriedAnonymousObject", + "initializer": {}, + "kind": "class", + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 2497 + }, + "methods": [ + { + "docs": { + "stability": "experimental" + }, + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 2498 + }, + "name": "check", + "returns": { + "type": { + "primitive": "boolean" + } + } + }, + { + "abstract": true, + "docs": { + "returns": "`value`", + "stability": "experimental", + "summary": "Implement this method and have it return it's parameter." + }, + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 2511 + }, + "name": "giveItBack", + "parameters": [ + { + "docs": { + "summary": "the value that should be returned." + }, + "name": "value", + "type": { + "primitive": "any" + } + } + ], + "returns": { + "type": { + "primitive": "any" + } + } + } + ], + "name": "BurriedAnonymousObject" + }, "jsii-calc.Calculator": { "assembly": "jsii-calc", "base": "jsii-calc.composition.CompositeOperation", @@ -13128,5 +13190,5 @@ } }, "version": "0.0.0", - "fingerprint": "5SbCJfv1kDW24DUhPcwzoQ1k7Moq+rKOB+Q4TSZlKPE=" + "fingerprint": "7VM/RrwzNCG/6tS4XA9gNbbADHnt/th93W72D8+pe94=" } 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 54988d787b..29f2fefc49 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 @@ -1561,6 +1561,68 @@ } ] }, + "jsii-calc.BurriedAnonymousObject": { + "abstract": true, + "assembly": "jsii-calc", + "docs": { + "stability": "experimental", + "summary": "See https://github.com/aws/aws-cdk/issues/7977." + }, + "fqn": "jsii-calc.BurriedAnonymousObject", + "initializer": {}, + "kind": "class", + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 2497 + }, + "methods": [ + { + "docs": { + "stability": "experimental" + }, + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 2498 + }, + "name": "check", + "returns": { + "type": { + "primitive": "boolean" + } + } + }, + { + "abstract": true, + "docs": { + "returns": "`value`", + "stability": "experimental", + "summary": "Implement this method and have it return it's parameter." + }, + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 2511 + }, + "name": "giveItBack", + "parameters": [ + { + "docs": { + "summary": "the value that should be returned." + }, + "name": "value", + "type": { + "primitive": "any" + } + } + ], + "returns": { + "type": { + "primitive": "any" + } + } + } + ], + "name": "BurriedAnonymousObject" + }, "jsii-calc.Calculator": { "assembly": "jsii-calc", "base": "jsii-calc.composition.CompositeOperation", @@ -13128,5 +13190,5 @@ } }, "version": "0.0.0", - "fingerprint": "5SbCJfv1kDW24DUhPcwzoQ1k7Moq+rKOB+Q4TSZlKPE=" + "fingerprint": "7VM/RrwzNCG/6tS4XA9gNbbADHnt/th93W72D8+pe94=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObject.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObject.cs new file mode 100644 index 0000000000..5738208a3f --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObject.cs @@ -0,0 +1,51 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + /// See https://github.com/aws/aws-cdk/issues/7977. + /// + /// Stability: Experimental + /// + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.BurriedAnonymousObject), fullyQualifiedName: "jsii-calc.BurriedAnonymousObject")] + public abstract class BurriedAnonymousObject : DeputyBase + { + protected BurriedAnonymousObject(): 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 BurriedAnonymousObject(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 BurriedAnonymousObject(DeputyProps props): base(props) + { + } + + /// + /// Stability: Experimental + /// + [JsiiMethod(name: "check", returnsJson: "{\"type\":{\"primitive\":\"boolean\"}}")] + public virtual bool Check() + { + return InvokeInstanceMethod(new System.Type[]{}, new object[]{}); + } + + /// Implement this method and have it return it's parameter. + /// the value that should be returned. + /// `value` + /// + /// Stability: Experimental + /// + [JsiiMethod(name: "giveItBack", returnsJson: "{\"type\":{\"primitive\":\"any\"}}", parametersJson: "[{\"docs\":{\"summary\":\"the value that should be returned.\"},\"name\":\"value\",\"type\":{\"primitive\":\"any\"}}]")] + public abstract object GiveItBack(object @value); + + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObjectProxy.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObjectProxy.cs new file mode 100644 index 0000000000..9066a400cd --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BurriedAnonymousObjectProxy.cs @@ -0,0 +1,30 @@ +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + /// See https://github.com/aws/aws-cdk/issues/7977. + /// + /// Stability: Experimental + /// + [JsiiTypeProxy(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.BurriedAnonymousObject), fullyQualifiedName: "jsii-calc.BurriedAnonymousObject")] + internal sealed class BurriedAnonymousObjectProxy : Amazon.JSII.Tests.CalculatorNamespace.BurriedAnonymousObject + { + private BurriedAnonymousObjectProxy(ByRefValue reference): base(reference) + { + } + + /// Implement this method and have it return it's parameter. + /// the value that should be returned. + /// `value` + /// + /// Stability: Experimental + /// + [JsiiMethod(name: "giveItBack", returnsJson: "{\"type\":{\"primitive\":\"any\"}}", parametersJson: "[{\"docs\":{\"summary\":\"the value that should be returned.\"},\"name\":\"value\",\"type\":{\"primitive\":\"any\"}}]")] + public override object GiveItBack(object @value) + { + return InvokeInstanceMethod(new System.Type[]{typeof(object)}, new object[]{@value}); + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/BurriedAnonymousObject.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/BurriedAnonymousObject.java new file mode 100644 index 0000000000..a596b91fba --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/BurriedAnonymousObject.java @@ -0,0 +1,67 @@ +package software.amazon.jsii.tests.calculator; + +/** + * See https://github.com/aws/aws-cdk/issues/7977. + *

+ * 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.BurriedAnonymousObject") +public abstract class BurriedAnonymousObject extends software.amazon.jsii.JsiiObject { + + protected BurriedAnonymousObject(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + protected BurriedAnonymousObject(final software.amazon.jsii.JsiiObject.InitializationMode initializationMode) { + super(initializationMode); + } + + protected BurriedAnonymousObject() { + 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 java.lang.Boolean check() { + return this.jsiiCall("check", java.lang.Boolean.class); + } + + /** + * Implement this method and have it return it's parameter. + *

+ * EXPERIMENTAL + *

+ * @return `value` + * @param value the value that should be returned. This parameter is required. + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public abstract @org.jetbrains.annotations.NotNull java.lang.Object giveItBack(final @org.jetbrains.annotations.NotNull java.lang.Object value); + + /** + * A proxy class which represents a concrete javascript instance of this type. + */ + final static class Jsii$Proxy extends software.amazon.jsii.tests.calculator.BurriedAnonymousObject { + protected Jsii$Proxy(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + /** + * Implement this method and have it return it's parameter. + *

+ * EXPERIMENTAL + *

+ * @return `value` + * @param value the value that should be returned. This parameter is required. + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + @Override + public @org.jetbrains.annotations.NotNull java.lang.Object giveItBack(final @org.jetbrains.annotations.NotNull java.lang.Object value) { + return this.jsiiCall("giveItBack", java.lang.Object.class, new Object[] { value }); + } + } +} 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 8db5e6fa7b..224aa8b3d7 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 @@ -13,6 +13,7 @@ jsii-calc.AugmentableClass=software.amazon.jsii.tests.calculator.AugmentableClas jsii-calc.BaseJsii976=software.amazon.jsii.tests.calculator.BaseJsii976 jsii-calc.Bell=software.amazon.jsii.tests.calculator.Bell jsii-calc.BinaryOperation=software.amazon.jsii.tests.calculator.BinaryOperation +jsii-calc.BurriedAnonymousObject=software.amazon.jsii.tests.calculator.BurriedAnonymousObject jsii-calc.Calculator=software.amazon.jsii.tests.calculator.Calculator jsii-calc.CalculatorProps=software.amazon.jsii.tests.calculator.CalculatorProps jsii-calc.ChildStruct982=software.amazon.jsii.tests.calculator.ChildStruct982 diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py index ac15e3e695..a544bff839 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py +++ b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py @@ -742,6 +742,59 @@ def rhs(self) -> scope.jsii_calc_lib.Value: class _BinaryOperationProxy(BinaryOperation, jsii.proxy_for(scope.jsii_calc_lib.Operation)): pass +class BurriedAnonymousObject(metaclass=jsii.JSIIAbstractClass, jsii_type="jsii-calc.BurriedAnonymousObject"): + """See https://github.com/aws/aws-cdk/issues/7977. + + stability + :stability: experimental + """ + @builtins.staticmethod + def __jsii_proxy_class__(): + return _BurriedAnonymousObjectProxy + + def __init__(self) -> None: + jsii.create(BurriedAnonymousObject, self, []) + + @jsii.member(jsii_name="check") + def check(self) -> bool: + """ + stability + :stability: experimental + """ + return jsii.invoke(self, "check", []) + + @jsii.member(jsii_name="giveItBack") + @abc.abstractmethod + def give_it_back(self, value: typing.Any) -> typing.Any: + """Implement this method and have it return it's parameter. + + :param value: the value that should be returned. + + return + :return: ``value`` + + stability + :stability: experimental + """ + ... + + +class _BurriedAnonymousObjectProxy(BurriedAnonymousObject): + @jsii.member(jsii_name="giveItBack") + def give_it_back(self, value: typing.Any) -> typing.Any: + """Implement this method and have it return it's parameter. + + :param value: the value that should be returned. + + return + :return: ``value`` + + stability + :stability: experimental + """ + return jsii.invoke(self, "giveItBack", [value]) + + class Calculator(_CompositeOperation_1c4d123b, metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.Calculator"): """A calculator which maintains a current value and allows adding operations. @@ -8592,6 +8645,7 @@ def next(self) -> jsii.Number: "BaseJsii976", "Bell", "BinaryOperation", + "BurriedAnonymousObject", "Calculator", "CalculatorProps", "ChildStruct982", 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 54a5e93c4c..f1a7599672 100644 --- a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap @@ -414,6 +414,17 @@ exports[`jsii-tree --all 1`] = ` │ │ └─┬ rhs property (experimental) │ │ ├── immutable │ │ └── type: @scope/jsii-calc-lib.Value + │ ├─┬ class BurriedAnonymousObject (experimental) + │ │ └─┬ members + │ │ ├── () initializer (experimental) + │ │ ├─┬ check() method (experimental) + │ │ │ └── returns: boolean + │ │ └─┬ giveItBack(value) method (experimental) + │ │ ├── abstract + │ │ ├─┬ parameters + │ │ │ └─┬ value + │ │ │ └── type: any + │ │ └── returns: any │ ├─┬ class Calculator (experimental) │ │ ├── base: CompositeOperation │ │ └─┬ members @@ -2686,6 +2697,7 @@ exports[`jsii-tree --inheritance 1`] = ` │ ├─┬ class BinaryOperation │ │ ├── base: Operation │ │ └── interfaces: IFriendly + │ ├── class BurriedAnonymousObject │ ├─┬ class Calculator │ │ └── base: CompositeOperation │ ├─┬ class ClassThatImplementsTheInternalInterface @@ -3153,6 +3165,11 @@ exports[`jsii-tree --members 1`] = ` │ │ ├── hello() method │ │ ├── lhs property │ │ └── rhs property + │ ├─┬ class BurriedAnonymousObject + │ │ └─┬ members + │ │ ├── () initializer + │ │ ├── check() method + │ │ └── giveItBack(value) method │ ├─┬ class Calculator │ │ └─┬ members │ │ ├── (props) initializer @@ -4202,6 +4219,7 @@ exports[`jsii-tree --types 1`] = ` │ ├── class BaseJsii976 │ ├── class Bell │ ├── class BinaryOperation + │ ├── class BurriedAnonymousObject │ ├── class Calculator │ ├── class ClassThatImplementsTheInternalInterface │ ├── class ClassThatImplementsThePrivateInterface 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 c7fb7aec20..13249bd15c 100644 --- a/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap @@ -31,6 +31,7 @@ Array [ "jsii-calc.BaseJsii976", "jsii-calc.Bell", "jsii-calc.BinaryOperation", + "jsii-calc.BurriedAnonymousObject", "jsii-calc.Calculator", "jsii-calc.ClassThatImplementsTheInternalInterface", "jsii-calc.ClassThatImplementsThePrivateInterface",