From c7dfad3ec905a5ee795be1d313d9c078ab3b4234 Mon Sep 17 00:00:00 2001 From: Romain Marcadier Date: Thu, 22 Sep 2022 20:11:22 +0200 Subject: [PATCH] fix(runtime): type not found (#3763) When a jsii module returned a private class implementation of an interface, consuming jsii.rtti data may return an FQN for the internal class, which does not exist in foreign languages, leading to an error. Revert to tagging FQNs directly instead. Fixes #3742 --- .all-contributorsrc | 9 ++ README.md | 5 +- .../specification/6-compliance-report.md | 3 +- .../ComplianceTests.cs | 13 ++- .../project/compliance_test.go | 7 ++ .../amazon/jsii/testing/ComplianceTest.java | 18 +++- packages/@jsii/kernel/src/kernel.ts | 2 +- packages/@jsii/kernel/src/objects.ts | 32 +++--- .../python-runtime/tests/test_compliance.py | 5 + .../jsii-calc-lib/deprecated-to-strip.txt | 1 + .../jsii-calc-lib/lib/deprecation-removal.ts | 16 +++ packages/@scope/jsii-calc-lib/lib/index.ts | 1 + packages/@scope/jsii-calc-lib/package.json | 2 +- .../@scope/jsii-calc-lib/test/assembly.jsii | 70 +++++++++++- packages/jsii-calc/test/assembly.jsii | 3 +- .../__snapshots__/target-dotnet.test.js.snap | 92 ++++++++++++++++ .../__snapshots__/target-go.test.js.snap | 101 ++++++++++++++++++ .../__snapshots__/target-java.test.js.snap | 91 ++++++++++++++++ .../__snapshots__/target-python.test.js.snap | 81 +++++++++++++- .../test/__snapshots__/jsii-tree.test.js.snap | 30 ++++++ .../test/__snapshots__/tree.test.js.snap | 20 ++++ .../__snapshots__/type-system.test.js.snap | 1 + packages/jsii/bin/jsii.ts | 2 +- .../jsii/test/deprecation-warnings.test.ts | 16 ++- tools/jsii-compliance/suite.ts | 4 + 25 files changed, 589 insertions(+), 36 deletions(-) create mode 100644 packages/@scope/jsii-calc-lib/deprecated-to-strip.txt create mode 100644 packages/@scope/jsii-calc-lib/lib/deprecation-removal.ts diff --git a/.all-contributorsrc b/.all-contributorsrc index 511fce6f28..7dcd0d9258 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1457,6 +1457,15 @@ "contributions": [ "review" ] + }, + { + "login": "cn-cit", + "name": "cn-cit", + "avatar_url": "https://avatars.githubusercontent.com/u/27255477?v=4", + "profile": "https://github.com/cn-cit", + "contributions": [ + "bug" + ] } ], "repoType": "github", diff --git a/README.md b/README.md index 2c8dd27f8e..5fcd7d82f0 100644 --- a/README.md +++ b/README.md @@ -228,23 +228,24 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
arnogeurts-sqills

🐛 💻 +
cn-cit

🐛
deccy-mcc

🐛
dependabot-preview[bot]

🐛 🚧
dependabot[bot]

🚧
dheffx

🐛
gregswdl

🐛 -
guyroberts21

📖 +
guyroberts21

📖
mattBrzezinski

📖
mergify

🚧
mergify[bot]

🚧
nathannaveen

🚧
seiyashima42

🐛 💻 📖
sullis

💻 -
vaneek

🐛 +
vaneek

🐛
wendysophie

🐛 diff --git a/gh-pages/content/specification/6-compliance-report.md b/gh-pages/content/specification/6-compliance-report.md index ee54cee7a2..4e70f767cd 100644 --- a/gh-pages/content/specification/6-compliance-report.md +++ b/gh-pages/content/specification/6-compliance-report.md @@ -5,7 +5,7 @@ This section details the current state of each language binding with respect to our standard compliance suite. -| number | test | java (98.33%) | golang (79.17%) | Dotnet | Python | +| number | test | java (98.35%) | golang (79.34%) | Dotnet | Python | | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------------------------------------------- | ------ | ------ | | 1 | asyncOverrides_overrideCallsSuper | 🟢 | [🔴](https://github.com/aws/jsii/issues/2670) | ⭕ | ⭕ | | 2 | [arrayReturnedByMethodCanBeRead]("Array created in the kernel can be queried for its elements") | 🟢 | 🟢 | ⭕ | ⭕ | @@ -127,3 +127,4 @@ This section details the current state of each language binding with respect to | 118 | [callbackParameterIsInterface]("Validates pure interfaces can be passed to callbacks") | ⭕ | 🟢 | ⭕ | ⭕ | | 119 | [classCanBeUsedWhenNotExpressedlyLoaded]("Validates that types not explicitly loaded by the user can safely be returned by JS code") | 🟢 | 🟢 | ⭕ | ⭕ | | 120 | [downcasting]("Ensures unsafe-cast features work as expected") | ⭕ | 🟢 | ⭕ | ⭕ | +| 121 | [strippedDeprecatedMemberCanBeReceived]("Ensures --strip-deprecated does not cause odd runtime errors") | 🟢 | 🟢 | ⭕ | ⭕ | 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 d3df89f7a1..7a7bef2ee5 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 @@ -7,6 +7,7 @@ using CompositeOperation = Amazon.JSII.Tests.CalculatorNamespace.Composition.CompositeOperation; using Amazon.JSII.Tests.CalculatorNamespace.LibNamespace; using Amazon.JSII.Tests.CalculatorNamespace.BaseOfBaseNamespace; +using Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval; using Newtonsoft.Json.Linq; using Xunit; using Xunit.Abstractions; @@ -1534,9 +1535,15 @@ public void ClassCanBeUsedWhenNotExpressedlyLoaded() } private sealed class Cdk16625Impl: Cdk16625 { - protected override double Unwrap(IRandomNumberGenerator rng) { - return rng.Next(); - } + protected override double Unwrap(IRandomNumberGenerator rng) { + return rng.Next(); } + } + + [Fact(DisplayName = Prefix + nameof(StrippedDeprecatedMemberCanBeReceived))] + public void StrippedDeprecatedMemberCanBeReceived() + { + Assert.NotNull(InterfaceFactory.Create()); + } } } diff --git a/packages/@jsii/go-runtime-test/project/compliance_test.go b/packages/@jsii/go-runtime-test/project/compliance_test.go index 529f596476..656ec2d0a9 100644 --- a/packages/@jsii/go-runtime-test/project/compliance_test.go +++ b/packages/@jsii/go-runtime-test/project/compliance_test.go @@ -24,6 +24,7 @@ import ( "github.com/aws/jsii/jsii-calc/go/jsiicalc/v3/submodule/child" calclib "github.com/aws/jsii/jsii-calc/go/scopejsiicalclib" "github.com/aws/jsii/jsii-calc/go/scopejsiicalclib/customsubmodulename" + "github.com/aws/jsii/jsii-calc/go/scopejsiicalclib/deprecationremoval" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -1655,6 +1656,12 @@ func (suite *ComplianceSuite) TestDownCasting() { require.Equal(realValue.Foo(), jsii.Number(1337)) } +func (suite *ComplianceSuite) TestStrippedDeprecatedMemberCanBeReceived() { + require := suite.Require() + + require.NotNil(deprecationremoval.InterfaceFactory_Create()) +} + // required to make `go test` recognize the suite. func TestComplianceSuite(t *testing.T) { suite.Run(t, new(ComplianceSuite)) 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 ada75214ac..264bd0ab65 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 @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import software.amazon.jsii.ComplianceSuiteHarness; @@ -14,6 +15,7 @@ import software.amazon.jsii.tests.calculator.cdk16625.Cdk16625; import software.amazon.jsii.tests.calculator.composition.CompositeOperation; import software.amazon.jsii.tests.calculator.custom_submodule_name.NestingClass.NestedStruct; +import software.amazon.jsii.tests.calculator.lib.deprecation_removal.InterfaceFactory; import software.amazon.jsii.tests.calculator.lib.EnumFromScopedModule; import software.amazon.jsii.tests.calculator.lib.IFriendly; import software.amazon.jsii.tests.calculator.lib.MyFirstStruct; @@ -24,10 +26,6 @@ import java.io.IOException; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; @@ -1790,13 +1788,17 @@ public void iso8601DoesNotDeserializeToDate() { final String nowAsISO = df.format(new Date()); final IWallClock wallClock = new IWallClock() { + @NotNull + @Override public String iso8601Now() { return nowAsISO; } }; final Entropy entropy = new Entropy(wallClock) { - public String repeat(final String word) { + @NotNull + @Override + public String repeat(@NotNull final String word) { return word; } }; @@ -1807,6 +1809,7 @@ public String repeat(final String word) { @Test public void classCanBeUsedWhenNotExpressedlyLoaded() { final Cdk16625 subject = new Cdk16625() { + @NotNull @Override protected java.lang.Number unwrap(final IRandomNumberGenerator rng) { return rng.next(); @@ -1814,4 +1817,9 @@ protected java.lang.Number unwrap(final IRandomNumberGenerator rng) { }; subject.test(); } + + @Test + public void strippedDeprecatedMemberCanBeReceived() { + assertNotNull(InterfaceFactory.create()); + } } diff --git a/packages/@jsii/kernel/src/kernel.ts b/packages/@jsii/kernel/src/kernel.ts index 5100b490c7..36d2ee571d 100644 --- a/packages/@jsii/kernel/src/kernel.ts +++ b/packages/@jsii/kernel/src/kernel.ts @@ -583,7 +583,7 @@ export class Kernel { case spec.TypeKind.Class: case spec.TypeKind.Enum: const constructor = this._findSymbol(fqn); - tagJsiiConstructor(constructor, fqn, assm.metadata.version); + tagJsiiConstructor(constructor, fqn); } } } diff --git a/packages/@jsii/kernel/src/objects.ts b/packages/@jsii/kernel/src/objects.ts index 425420a3af..ea7d78fd76 100644 --- a/packages/@jsii/kernel/src/objects.ts +++ b/packages/@jsii/kernel/src/objects.ts @@ -1,4 +1,5 @@ import * as spec from '@jsii/spec'; +import * as assert from 'assert'; import * as api from './api'; import { JsiiFault } from './kernel'; @@ -15,15 +16,12 @@ const OBJID_SYMBOL = Symbol.for('$__jsii__objid__$'); const IFACES_SYMBOL = Symbol.for('$__jsii__interfaces__$'); /** - * Symbol we use to tag the constructor of a JSII class + * Symbol we use to tag constructors that are exported from a JSII module. */ -const JSII_RTTI_SYMBOL = Symbol.for('jsii.rtti'); +const JSII_TYPE_FQN_SYMBOL = Symbol('$__jsii__fqn__$'); interface ManagedConstructor { - readonly [JSII_RTTI_SYMBOL]: { - readonly fqn: string; - readonly version: string; - }; + readonly [JSII_TYPE_FQN_SYMBOL]: string; } type MaybeManagedConstructor = Partial; @@ -36,7 +34,7 @@ type MaybeManagedConstructor = Partial; * information. */ export function jsiiTypeFqn(obj: any): string | undefined { - return (obj.constructor as MaybeManagedConstructor)[JSII_RTTI_SYMBOL]?.fqn; + return (obj.constructor as MaybeManagedConstructor)[JSII_TYPE_FQN_SYMBOL]; } /** @@ -96,19 +94,21 @@ function tagObject(obj: unknown, objid: string, interfaces?: string[]) { /** * Set the JSII FQN for classes produced by a given constructor */ -export function tagJsiiConstructor( - constructor: any, - fqn: string, - version: string, -) { - if (Object.prototype.hasOwnProperty.call(constructor, JSII_RTTI_SYMBOL)) { - return; +export function tagJsiiConstructor(constructor: any, fqn: string) { + if (Object.prototype.hasOwnProperty.call(constructor, JSII_TYPE_FQN_SYMBOL)) { + return assert( + constructor[JSII_TYPE_FQN_SYMBOL] === fqn, + `Unable to register ${constructor.name} as ${fqn}: it is already registerd with FQN ${constructor[JSII_TYPE_FQN_SYMBOL]}`, + ); } - Object.defineProperty(constructor, JSII_RTTI_SYMBOL, { + + // Mark this constructor as exported from a jsii module, so we know we + // should be considering it's FQN as a valid exported type. + Object.defineProperty(constructor, JSII_TYPE_FQN_SYMBOL, { configurable: false, enumerable: false, writable: false, - value: { fqn, version }, + value: fqn, }); } diff --git a/packages/@jsii/python-runtime/tests/test_compliance.py b/packages/@jsii/python-runtime/tests/test_compliance.py index 046ae13839..329aabfca6 100644 --- a/packages/@jsii/python-runtime/tests/test_compliance.py +++ b/packages/@jsii/python-runtime/tests/test_compliance.py @@ -86,6 +86,7 @@ from jsii_calc.submodule.child import SomeEnum from scope.jsii_calc_lib import IFriendly, EnumFromScopedModule, Number from scope.jsii_calc_lib.custom_submodule_name import IReflectable, ReflectableEntry +from scope.jsii_calc_lib.deprecation_removal import InterfaceFactory # Note: The names of these test functions have been chosen to map as closely to the # Java Compliance tests as possible. @@ -1343,3 +1344,7 @@ def _unwrap(self, rng: IRandomNumberGenerator): # This should NOT throw Subject().test() + + +def test_stripped_deprecated_member_can_be_received(): + assert InterfaceFactory.create() is not None diff --git a/packages/@scope/jsii-calc-lib/deprecated-to-strip.txt b/packages/@scope/jsii-calc-lib/deprecated-to-strip.txt new file mode 100644 index 0000000000..c685eefe76 --- /dev/null +++ b/packages/@scope/jsii-calc-lib/deprecated-to-strip.txt @@ -0,0 +1 @@ +@scope/jsii-calc-lib.deprecationRemoval.DeprecatedImplementation diff --git a/packages/@scope/jsii-calc-lib/lib/deprecation-removal.ts b/packages/@scope/jsii-calc-lib/lib/deprecation-removal.ts new file mode 100644 index 0000000000..75e18b6776 --- /dev/null +++ b/packages/@scope/jsii-calc-lib/lib/deprecation-removal.ts @@ -0,0 +1,16 @@ +export interface IInterface { + method(): void; +} + +/** @deprecated do not use me! */ +export class DeprecatedImplementation implements IInterface { + public method(): void { } +} + +export class InterfaceFactory { + public static create(): IInterface { + return new DeprecatedImplementation(); + } + + private constructor() { } +} diff --git a/packages/@scope/jsii-calc-lib/lib/index.ts b/packages/@scope/jsii-calc-lib/lib/index.ts index beeee50442..46c4bd4045 100644 --- a/packages/@scope/jsii-calc-lib/lib/index.ts +++ b/packages/@scope/jsii-calc-lib/lib/index.ts @@ -129,3 +129,4 @@ export class BaseFor2647 { export * as submodule from './submodule'; export * from './duplicate-inherited-prop'; +export * as deprecationRemoval from './deprecation-removal'; diff --git a/packages/@scope/jsii-calc-lib/package.json b/packages/@scope/jsii-calc-lib/package.json index 5f44f71d9c..d3bc5c4f32 100644 --- a/packages/@scope/jsii-calc-lib/package.json +++ b/packages/@scope/jsii-calc-lib/package.json @@ -26,7 +26,7 @@ "main": "build/index.js", "types": "build/index.d.ts", "scripts": { - "build": "jsii --project-references && jsii-rosetta", + "build": "jsii --project-references --strip-deprecated=deprecated-to-strip.txt && jsii-rosetta", "pacmak": "jsii-pacmak", "test": "diff-test test/assembly.jsii .jsii", "test:update": "npm run build && UPDATE_DIFF=1 npm run test" diff --git a/packages/@scope/jsii-calc-lib/test/assembly.jsii b/packages/@scope/jsii-calc-lib/test/assembly.jsii index 671057ad68..318b1a07be 100644 --- a/packages/@scope/jsii-calc-lib/test/assembly.jsii +++ b/packages/@scope/jsii-calc-lib/test/assembly.jsii @@ -92,6 +92,13 @@ }, "schema": "jsii/0.10.0", "submodules": { + "@scope/jsii-calc-lib.deprecationRemoval": { + "locationInModule": { + "filename": "lib/index.ts", + "line": 132 + }, + "symbolId": "lib/deprecation-removal:" + }, "@scope/jsii-calc-lib.submodule": { "locationInModule": { "filename": "lib/index.ts", @@ -729,6 +736,67 @@ ], "symbolId": "lib/index:StructWithOnlyOptionals" }, + "@scope/jsii-calc-lib.deprecationRemoval.IInterface": { + "assembly": "@scope/jsii-calc-lib", + "docs": { + "stability": "deprecated" + }, + "fqn": "@scope/jsii-calc-lib.deprecationRemoval.IInterface", + "kind": "interface", + "locationInModule": { + "filename": "lib/deprecation-removal.ts", + "line": 1 + }, + "methods": [ + { + "abstract": true, + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/deprecation-removal.ts", + "line": 2 + }, + "name": "method" + } + ], + "name": "IInterface", + "namespace": "deprecationRemoval", + "symbolId": "lib/deprecation-removal:IInterface" + }, + "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory": { + "assembly": "@scope/jsii-calc-lib", + "docs": { + "stability": "deprecated" + }, + "fqn": "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory", + "kind": "class", + "locationInModule": { + "filename": "lib/deprecation-removal.ts", + "line": 10 + }, + "methods": [ + { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/deprecation-removal.ts", + "line": 11 + }, + "name": "create", + "returns": { + "type": { + "fqn": "@scope/jsii-calc-lib.deprecationRemoval.IInterface" + } + }, + "static": true + } + ], + "name": "InterfaceFactory", + "namespace": "deprecationRemoval", + "symbolId": "lib/deprecation-removal:InterfaceFactory" + }, "@scope/jsii-calc-lib.submodule.IReflectable": { "assembly": "@scope/jsii-calc-lib", "docs": { @@ -954,5 +1022,5 @@ } }, "version": "0.0.0", - "fingerprint": "kYLYyNyPod3JTyJWmgPJL1Z85k0HEEhQeMIs4zH4bEQ=" + "fingerprint": "XDMAZYhhgc09X8VS8hpn3ch21YxKDn+HB0w82IofsRM=" } \ No newline at end of file diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index d392689d96..d98342303c 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -95,6 +95,7 @@ }, "@scope/jsii-calc-lib": { "submodules": { + "@scope/jsii-calc-lib.deprecationRemoval": {}, "@scope/jsii-calc-lib.submodule": { "targets": { "dotnet": { @@ -18326,5 +18327,5 @@ } }, "version": "3.20.120", - "fingerprint": "OaHwYmdPa8tbAJnlREahLGpRaNNBor2aoG04vsA/SvM=" + "fingerprint": "O7e7hA2s4dwiCigDIFE0ANjlmeXIQydXdSodi9WHja4=" } \ No newline at end of file diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.js.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.js.snap index ee78fe8a21..0e038f7652 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.js.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.js.snap @@ -1011,6 +1011,9 @@ exports[`Generated code for "@scope/jsii-calc-lib": / 1`] = ` ┃ ┣━ 📁 CalculatorNamespace ┃ ┃ ┗━ 📁 LibNamespace ┃ ┃ ┣━ 📄 BaseFor2647.cs + ┃ ┃ ┣━ 📁 DeprecationRemoval + ┃ ┃ ┃ ┣━ 📄 IInterface.cs + ┃ ┃ ┃ ┗━ 📄 InterfaceFactory.cs ┃ ┃ ┣━ 📄 DiamondLeft.cs ┃ ┃ ┣━ 📄 DiamondRight.cs ┃ ┃ ┣━ 📄 EnumFromScopedModule.cs @@ -1151,6 +1154,95 @@ namespace Amazon.JSII.Tests.CalculatorNamespace.LibNamespace `; +exports[`Generated code for "@scope/jsii-calc-lib": /dotnet/Amazon.JSII.Tests.CalculatorPackageId.LibPackageId/Amazon/JSII/Tests/CalculatorNamespace/LibNamespace/DeprecationRemoval/IInterface.cs 1`] = ` +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval +{ + /// + /// Stability: Deprecated + /// + [JsiiInterface(nativeType: typeof(IInterface), fullyQualifiedName: "@scope/jsii-calc-lib.deprecationRemoval.IInterface")] + [System.Obsolete()] + public interface IInterface + { + /// + /// Stability: Deprecated + /// + [JsiiMethod(name: "method")] + [System.Obsolete()] + void Method(); + + /// + /// Stability: Deprecated + /// + [JsiiTypeProxy(nativeType: typeof(IInterface), fullyQualifiedName: "@scope/jsii-calc-lib.deprecationRemoval.IInterface")] + [System.Obsolete()] + internal sealed class _Proxy : DeputyBase, Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval.IInterface + { + private _Proxy(ByRefValue reference): base(reference) + { + } + + /// + /// Stability: Deprecated + /// + [JsiiMethod(name: "method")] + [System.Obsolete()] + public void Method() + { + InvokeInstanceVoidMethod(new System.Type[]{}, new object[]{}); + } + } + } +} + +`; + +exports[`Generated code for "@scope/jsii-calc-lib": /dotnet/Amazon.JSII.Tests.CalculatorPackageId.LibPackageId/Amazon/JSII/Tests/CalculatorNamespace/LibNamespace/DeprecationRemoval/InterfaceFactory.cs 1`] = ` +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval +{ + /// + /// Stability: Deprecated + /// + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval.InterfaceFactory), fullyQualifiedName: "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory")] + [System.Obsolete()] + public class InterfaceFactory : DeputyBase + { + /// 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 InterfaceFactory(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 InterfaceFactory(DeputyProps props): base(props) + { + } + + /// + /// Stability: Deprecated + /// + [JsiiMethod(name: "create", returnsJson: "{\\"type\\":{\\"fqn\\":\\"@scope/jsii-calc-lib.deprecationRemoval.IInterface\\"}}")] + [System.Obsolete()] + public static Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval.IInterface Create() + { + return InvokeStaticMethod(typeof(Amazon.JSII.Tests.CalculatorNamespace.LibNamespace.DeprecationRemoval.InterfaceFactory), new System.Type[]{}, new object[]{})!; + } + } +} + +`; + exports[`Generated code for "@scope/jsii-calc-lib": /dotnet/Amazon.JSII.Tests.CalculatorPackageId.LibPackageId/Amazon/JSII/Tests/CalculatorNamespace/LibNamespace/DiamondLeft.cs 1`] = ` using Amazon.JSII.Runtime.Deputy; diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.js.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.js.snap index 76f3a65330..170650e4a5 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.js.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.js.snap @@ -971,6 +971,10 @@ exports[`Generated code for "@scope/jsii-calc-lib": / 1`] = ` ┃ ┣━ 📄 customsubmodulename_Reflector.go ┃ ┣━ 📄 customsubmodulename.go ┃ ┗━ 📄 README.md + ┣━ 📁 deprecationremoval + ┃ ┣━ 📄 deprecationremoval_IInterface.go + ┃ ┣━ 📄 deprecationremoval_InterfaceFactory.go + ┃ ┗━ 📄 deprecationremoval.go ┣━ 📄 go.mod ┣━ 📁 internal ┃ ┗━ 📄 types.go @@ -1471,6 +1475,103 @@ func (r *jsiiProxy_Reflector) AsMap(reflectable IReflectable) *map[string]interf } +`; + +exports[`Generated code for "@scope/jsii-calc-lib": /go/scopejsiicalclib/deprecationremoval/deprecationremoval.go 1`] = ` +package deprecationremoval + +import ( + "reflect" + + _jsii_ "github.com/aws/jsii-runtime-go/runtime" +) + +func init() { + _jsii_.RegisterInterface( + "@scope/jsii-calc-lib.deprecationRemoval.IInterface", + reflect.TypeOf((*IInterface)(nil)).Elem(), + []_jsii_.Member{ + _jsii_.MemberMethod{JsiiMethod: "method", GoMethod: "Method"}, + }, + func() interface{} { + return &jsiiProxy_IInterface{} + }, + ) + _jsii_.RegisterClass( + "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory", + reflect.TypeOf((*InterfaceFactory)(nil)).Elem(), + nil, // no members + func() interface{} { + return &jsiiProxy_InterfaceFactory{} + }, + ) +} + +`; + +exports[`Generated code for "@scope/jsii-calc-lib": /go/scopejsiicalclib/deprecationremoval/deprecationremoval_IInterface.go 1`] = ` +package deprecationremoval + +import ( + _jsii_ "github.com/aws/jsii-runtime-go/runtime" +) + +// Deprecated. +type IInterface interface { + // Deprecated. + Method() +} + +// The jsii proxy for IInterface +type jsiiProxy_IInterface struct { + _ byte // padding +} + +func (i *jsiiProxy_IInterface) Method() { + _jsii_.InvokeVoid( + i, + "method", + nil, // no parameters + ) +} + + +`; + +exports[`Generated code for "@scope/jsii-calc-lib": /go/scopejsiicalclib/deprecationremoval/deprecationremoval_InterfaceFactory.go 1`] = ` +package deprecationremoval + +import ( + _jsii_ "github.com/aws/jsii-runtime-go/runtime" + _init_ "github.com/aws/jsii/jsii-calc/go/scopejsiicalclib/jsii" +) + +// Deprecated. +type InterfaceFactory interface { +} + +// The jsii proxy struct for InterfaceFactory +type jsiiProxy_InterfaceFactory struct { + _ byte // padding +} + +// Deprecated. +func InterfaceFactory_Create() IInterface { + _init_.Initialize() + + var returns IInterface + + _jsii_.StaticInvoke( + "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory", + "create", + nil, // no parameters + &returns, + ) + + return returns +} + + `; exports[`Generated code for "@scope/jsii-calc-lib": /go/scopejsiicalclib/go.mod 1`] = ` diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.js.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.js.snap index 2a8ec40c46..43dda414da 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.js.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.js.snap @@ -1434,6 +1434,9 @@ exports[`Generated code for "@scope/jsii-calc-lib": / 1`] = ` ┃ ┗━ 📁 lib ┃ ┣━ 📄 $Module.java ┃ ┣━ 📄 BaseFor2647.java + ┃ ┣━ 📁 deprecation_removal + ┃ ┃ ┣━ 📄 IInterface.java + ┃ ┃ ┗━ 📄 InterfaceFactory.java ┃ ┣━ 📄 DiamondLeft.java ┃ ┣━ 📄 DiamondRight.java ┃ ┣━ 📄 EnumFromScopedModule.java @@ -3539,6 +3542,92 @@ public interface StructWithOnlyOptionals extends software.amazon.jsii.JsiiSerial `; +exports[`Generated code for "@scope/jsii-calc-lib": /java/src/main/java/software/amazon/jsii/tests/calculator/lib/deprecation_removal/IInterface.java 1`] = ` +package software.amazon.jsii.tests.calculator.lib.deprecation_removal; + +/** + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.lib.$Module.class, fqn = "@scope/jsii-calc-lib.deprecationRemoval.IInterface") +@software.amazon.jsii.Jsii.Proxy(IInterface.Jsii$Proxy.class) +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Deprecated) +@Deprecated +public interface IInterface extends software.amazon.jsii.JsiiSerializable { + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Deprecated) + @Deprecated + void method(); + + /** + * A proxy class which represents a concrete javascript instance of this type. + */ + @software.amazon.jsii.Internal + final class Jsii$Proxy extends software.amazon.jsii.JsiiObject implements software.amazon.jsii.tests.calculator.lib.deprecation_removal.IInterface.Jsii$Default { + protected Jsii$Proxy(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Deprecated) + @Deprecated + @Override + public final void method() { + software.amazon.jsii.Kernel.call(this, "method", software.amazon.jsii.NativeType.VOID); + } + } + + /** + * Internal default implementation for {@link IInterface}. + */ + @software.amazon.jsii.Internal + interface Jsii$Default extends IInterface { + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Deprecated) + @Deprecated + @Override + default void method() { + software.amazon.jsii.Kernel.call(this, "method", software.amazon.jsii.NativeType.VOID); + } + } +} + +`; + +exports[`Generated code for "@scope/jsii-calc-lib": /java/src/main/java/software/amazon/jsii/tests/calculator/lib/deprecation_removal/InterfaceFactory.java 1`] = ` +package software.amazon.jsii.tests.calculator.lib.deprecation_removal; + +/** + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Deprecated) +@Deprecated +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.lib.$Module.class, fqn = "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory") +public class InterfaceFactory extends software.amazon.jsii.JsiiObject { + + protected InterfaceFactory(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + protected InterfaceFactory(final software.amazon.jsii.JsiiObject.InitializationMode initializationMode) { + super(initializationMode); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Deprecated) + @Deprecated + public static @org.jetbrains.annotations.NotNull software.amazon.jsii.tests.calculator.lib.deprecation_removal.IInterface create() { + return software.amazon.jsii.JsiiObject.jsiiStaticCall(software.amazon.jsii.tests.calculator.lib.deprecation_removal.InterfaceFactory.class, "create", software.amazon.jsii.NativeType.forClass(software.amazon.jsii.tests.calculator.lib.deprecation_removal.IInterface.class)); + } +} + +`; + exports[`Generated code for "@scope/jsii-calc-lib": /java/src/main/java/software/amazon/jsii/tests/calculator/lib/package-info.java 1`] = ` /** * @@ -3563,6 +3652,8 @@ exports[`Generated code for "@scope/jsii-calc-lib": /java/src/main/resou @scope/jsii-calc-lib.NumericValue=software.amazon.jsii.tests.calculator.lib.NumericValue @scope/jsii-calc-lib.Operation=software.amazon.jsii.tests.calculator.lib.Operation @scope/jsii-calc-lib.StructWithOnlyOptionals=software.amazon.jsii.tests.calculator.lib.StructWithOnlyOptionals +@scope/jsii-calc-lib.deprecationRemoval.IInterface=software.amazon.jsii.tests.calculator.lib.deprecation_removal.IInterface +@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory=software.amazon.jsii.tests.calculator.lib.deprecation_removal.InterfaceFactory @scope/jsii-calc-lib.submodule.IReflectable=software.amazon.jsii.tests.calculator.custom_submodule_name.IReflectable @scope/jsii-calc-lib.submodule.NestingClass=software.amazon.jsii.tests.calculator.custom_submodule_name.NestingClass @scope/jsii-calc-lib.submodule.NestingClass.NestedClass=software.amazon.jsii.tests.calculator.custom_submodule_name.NestingClass$NestedClass diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.js.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.js.snap index 5e135fbd7d..41546e4ee8 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.js.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.js.snap @@ -1056,6 +1056,8 @@ exports[`Generated code for "@scope/jsii-calc-lib": / 1`] = ` ┃ ┗━ 📄 jsii-calc-lib@0.0.0.jsii.tgz ┣━ 📁 custom_submodule_name ┃ ┗━ 📄 __init__.py + ┣━ 📁 deprecation_removal + ┃ ┗━ 📄 __init__.py ┗━ 📄 py.typed `; @@ -1320,7 +1322,8 @@ kwargs = json.loads( "packages": [ "scope.jsii_calc_lib", "scope.jsii_calc_lib._jsii", - "scope.jsii_calc_lib.custom_submodule_name" + "scope.jsii_calc_lib.custom_submodule_name", + "scope.jsii_calc_lib.deprecation_removal" ], "package_data": { "scope.jsii_calc_lib._jsii": [ @@ -1944,12 +1947,14 @@ __all__ = [ "Operation", "StructWithOnlyOptionals", "custom_submodule_name", + "deprecation_removal", ] publication.publish() # Loading modules to ensure their types are registered with the jsii runtime library from . import custom_submodule_name +from . import deprecation_removal `; @@ -2196,6 +2201,80 @@ publication.publish() `; +exports[`Generated code for "@scope/jsii-calc-lib": /python/src/scope/jsii_calc_lib/deprecation_removal/__init__.py 1`] = ` +import abc +import builtins +import datetime +import enum +import typing + +import jsii +import publication +import typing_extensions + +from typeguard import check_type + +from .._jsii import * + + +@jsii.interface(jsii_type="@scope/jsii-calc-lib.deprecationRemoval.IInterface") +class IInterface(typing_extensions.Protocol): + ''' + :stability: deprecated + ''' + + @jsii.member(jsii_name="method") + def method(self) -> None: + ''' + :stability: deprecated + ''' + ... + + +class _IInterfaceProxy: + ''' + :stability: deprecated + ''' + + __jsii_type__: typing.ClassVar[str] = "@scope/jsii-calc-lib.deprecationRemoval.IInterface" + + @jsii.member(jsii_name="method") + def method(self) -> None: + ''' + :stability: deprecated + ''' + return typing.cast(None, jsii.invoke(self, "method", [])) + +# Adding a "__jsii_proxy_class__(): typing.Type" function to the interface +typing.cast(typing.Any, IInterface).__jsii_proxy_class__ = lambda : _IInterfaceProxy + + +class InterfaceFactory( + metaclass=jsii.JSIIMeta, + jsii_type="@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory", +): + ''' + :stability: deprecated + ''' + + @jsii.member(jsii_name="create") + @builtins.classmethod + def create(cls) -> IInterface: + ''' + :stability: deprecated + ''' + return typing.cast(IInterface, jsii.sinvoke(cls, "create", [])) + + +__all__ = [ + "IInterface", + "InterfaceFactory", +] + +publication.publish() + +`; + exports[`Generated code for "@scope/jsii-calc-lib": /python/src/scope/jsii_calc_lib/py.typed 1`] = ` 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 4ac15cf9f7..c8be186d6e 100644 --- a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap @@ -3378,6 +3378,18 @@ exports[`jsii-tree --all 1`] = ` │ ├── @scope/jsii-calc-base │ └── @scope/jsii-calc-base-of-base ├─┬ submodules + │ ├─┬ deprecationRemoval + │ │ └─┬ types + │ │ ├─┬ class InterfaceFactory (deprecated) + │ │ │ └─┬ members + │ │ │ └─┬ static create() method (deprecated) + │ │ │ ├── static + │ │ │ └── returns: @scope/jsii-calc-lib.deprecationRemoval.IInterface + │ │ └─┬ interface IInterface (deprecated) + │ │ └─┬ members + │ │ └─┬ method() method (deprecated) + │ │ ├── abstract + │ │ └── returns: void │ └─┬ submodule │ └─┬ types │ ├─┬ class NestingClass (deprecated) @@ -4011,6 +4023,10 @@ exports[`jsii-tree --inheritance 1`] = ` │ └── interface VeryBaseProps └─┬ @scope/jsii-calc-lib ├─┬ submodules + │ ├─┬ deprecationRemoval + │ │ └─┬ types + │ │ ├── class InterfaceFactory + │ │ └── interface IInterface │ └─┬ submodule │ └─┬ types │ ├── class NestingClass @@ -5568,6 +5584,14 @@ exports[`jsii-tree --members 1`] = ` │ └── foo property └─┬ @scope/jsii-calc-lib ├─┬ submodules + │ ├─┬ deprecationRemoval + │ │ └─┬ types + │ │ ├─┬ class InterfaceFactory + │ │ │ └─┬ members + │ │ │ └── static create() method + │ │ └─┬ interface IInterface + │ │ └─┬ members + │ │ └── method() method │ └─┬ submodule │ └─┬ types │ ├─┬ class NestingClass @@ -5691,6 +5715,7 @@ exports[`jsii-tree --signatures 1`] = ` ├── @scope/jsii-calc-base-of-base └─┬ @scope/jsii-calc-lib └─┬ submodules + ├── deprecationRemoval └── submodule " `; @@ -6074,6 +6099,10 @@ exports[`jsii-tree --types 1`] = ` │ └── interface VeryBaseProps └─┬ @scope/jsii-calc-lib ├─┬ submodules + │ ├─┬ deprecationRemoval + │ │ └─┬ types + │ │ ├── class InterfaceFactory + │ │ └── interface IInterface │ └─┬ submodule │ └─┬ types │ ├── class NestingClass @@ -6147,6 +6176,7 @@ exports[`jsii-tree 1`] = ` ├── @scope/jsii-calc-base-of-base └─┬ @scope/jsii-calc-lib └─┬ submodules + ├── deprecationRemoval └── submodule " `; diff --git a/packages/jsii-reflect/test/__snapshots__/tree.test.js.snap b/packages/jsii-reflect/test/__snapshots__/tree.test.js.snap index e3d1791aee..a349bff7b0 100644 --- a/packages/jsii-reflect/test/__snapshots__/tree.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/tree.test.js.snap @@ -49,6 +49,7 @@ exports[`defaults 1`] = ` ├── @scope/jsii-calc-base-of-base └─┬ @scope/jsii-calc-lib └─┬ submodules + ├── deprecationRemoval └── submodule " `; @@ -102,6 +103,7 @@ exports[`inheritance 1`] = ` ├── @scope/jsii-calc-base-of-base └─┬ @scope/jsii-calc-lib └─┬ submodules + ├── deprecationRemoval └── submodule " `; @@ -155,6 +157,7 @@ exports[`members 1`] = ` ├── @scope/jsii-calc-base-of-base └─┬ @scope/jsii-calc-lib └─┬ submodules + ├── deprecationRemoval └── submodule " `; @@ -3537,6 +3540,18 @@ exports[`showAll 1`] = ` │ ├── @scope/jsii-calc-base │ └── @scope/jsii-calc-base-of-base ├─┬ submodules + │ ├─┬ deprecationRemoval + │ │ └─┬ types + │ │ ├─┬ class InterfaceFactory + │ │ │ └─┬ members + │ │ │ └─┬ static create() method + │ │ │ ├── static + │ │ │ └── returns: @scope/jsii-calc-lib.deprecationRemoval.IInterface + │ │ └─┬ interface IInterface + │ │ └─┬ members + │ │ └─┬ method() method + │ │ ├── abstract + │ │ └── returns: void │ └─┬ submodule │ └─┬ types │ ├─┬ class NestingClass @@ -3741,6 +3756,7 @@ exports[`signatures 1`] = ` ├── @scope/jsii-calc-base-of-base └─┬ @scope/jsii-calc-lib └─┬ submodules + ├── deprecationRemoval └── submodule " `; @@ -4124,6 +4140,10 @@ exports[`types 1`] = ` │ └── interface VeryBaseProps └─┬ @scope/jsii-calc-lib ├─┬ submodules + │ ├─┬ deprecationRemoval + │ │ └─┬ types + │ │ ├── class InterfaceFactory + │ │ └── interface IInterface │ └─┬ submodule │ └─┬ types │ ├── class NestingClass 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 4175895716..8e045fcafd 100644 --- a/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/type-system.test.js.snap @@ -19,6 +19,7 @@ exports[`TypeSystem.classes lists all the classes in the typesystem 1`] = ` "@scope/jsii-calc-lib.Number", "@scope/jsii-calc-lib.NumericValue", "@scope/jsii-calc-lib.Operation", + "@scope/jsii-calc-lib.deprecationRemoval.InterfaceFactory", "@scope/jsii-calc-lib.submodule.NestingClass", "@scope/jsii-calc-lib.submodule.NestingClass.NestedClass", "@scope/jsii-calc-lib.submodule.Reflector", diff --git a/packages/jsii/bin/jsii.ts b/packages/jsii/bin/jsii.ts index 838f523fb4..c2fb14cb54 100644 --- a/packages/jsii/bin/jsii.ts +++ b/packages/jsii/bin/jsii.ts @@ -114,7 +114,7 @@ const warningTypes = Object.keys(enabledWarnings); projectInfo, projectReferences: argv['project-references'], failOnWarnings: argv['fail-on-warnings'], - stripDeprecated: !!argv['strip-deprecated'], + stripDeprecated: argv['strip-deprecated'] != null, stripDeprecatedAllowListFile: argv['strip-deprecated'], addDeprecationWarnings: argv['add-deprecation-warnings'], generateTypeScriptConfig: argv['generate-tsconfig'], diff --git a/packages/jsii/test/deprecation-warnings.test.ts b/packages/jsii/test/deprecation-warnings.test.ts index c57a64cbfb..b62541b8e1 100644 --- a/packages/jsii/test/deprecation-warnings.test.ts +++ b/packages/jsii/test/deprecation-warnings.test.ts @@ -383,10 +383,14 @@ function testpkg_Baz(p) { ); const calcBaseRoot = resolveModuleDir('@scope/jsii-calc-base'); const calcLibRoot = resolveModuleDir('@scope/jsii-calc-lib'); + const calcLibStripDeprecated = path.join( + calcLibRoot, + 'deprecated-to-strip.txt', + ); compile(calcBaseOfBaseRoot, false); compile(calcBaseRoot, true); - compile(calcLibRoot, true); + compile(calcLibRoot, true, calcLibStripDeprecated); const warningsFile = loadWarningsFile(calcBaseRoot); // jsii-calc-base was compiled with warnings. So we expect to see handlers for its types in the warnings file @@ -397,7 +401,7 @@ function testpkg_Baz(p) { // Recompiling without deprecation warning to leave the packages in a clean state compile(calcBaseRoot, false); - compile(calcLibRoot, false); + compile(calcLibRoot, false, calcLibStripDeprecated); }, 120000); }); @@ -905,12 +909,18 @@ function resolveModuleDir(name: string) { return path.dirname(require.resolve(`${name}/package.json`)); } -function compile(projectRoot: string, addDeprecationWarnings: boolean) { +function compile( + projectRoot: string, + addDeprecationWarnings: boolean, + stripDeprecated?: string, +) { const { projectInfo } = loadProjectInfo(projectRoot); const compiler = new Compiler({ projectInfo, addDeprecationWarnings, + stripDeprecated: stripDeprecated != null, + stripDeprecatedAllowListFile: stripDeprecated, }); compiler.emit(); diff --git a/tools/jsii-compliance/suite.ts b/tools/jsii-compliance/suite.ts index 7616aa1206..6f3f2455e8 100644 --- a/tools/jsii-compliance/suite.ts +++ b/tools/jsii-compliance/suite.ts @@ -516,5 +516,9 @@ export const suite: schema.Suite = { name: 'downcasting', description: 'Ensures unsafe-cast features work as expected', }, + { + name: 'strippedDeprecatedMemberCanBeReceived', + description: 'Ensures --strip-deprecated does not cause odd runtime errors', + }, ], };