diff --git a/packages/jsii-calc/lib/index.ts b/packages/jsii-calc/lib/index.ts index 397ce7a103..663b1aa0b8 100644 --- a/packages/jsii-calc/lib/index.ts +++ b/packages/jsii-calc/lib/index.ts @@ -8,6 +8,7 @@ export * from './nested-class'; export * from './stability'; export * from './submodules'; export * from './container-types'; +export * from './indirect-implementation'; export * as submodule from './submodule'; export * as onlystatic from './only-static'; diff --git a/packages/jsii-calc/lib/indirect-implementation.ts b/packages/jsii-calc/lib/indirect-implementation.ts new file mode 100644 index 0000000000..e8ed2b4948 --- /dev/null +++ b/packages/jsii-calc/lib/indirect-implementation.ts @@ -0,0 +1,22 @@ +export interface IIndirectlyImplemented { + readonly property: string; + method(): number; +} + +export abstract class BaseClass { + public readonly property = 'YES'; + + protected constructor() {} + + public method(): number { + return 1337; + } +} + +export class FullCombo extends BaseClass implements IIndirectlyImplemented { + private constructor() { + super(); + } + + // Obtains implementation of IIndirectlyImplemented from BaseClass +} diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index b38d553b9a..fa9482fec6 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -208,7 +208,7 @@ "jsii-calc.cdk16625": { "locationInModule": { "filename": "lib/index.ts", - "line": 23 + "line": 24 }, "symbolId": "lib/cdk16625/index:" }, @@ -229,28 +229,28 @@ "jsii-calc.module2530": { "locationInModule": { "filename": "lib/index.ts", - "line": 20 + "line": 21 }, "symbolId": "lib/module2530/index:" }, "jsii-calc.module2617": { "locationInModule": { "filename": "lib/index.ts", - "line": 16 + "line": 17 }, "symbolId": "lib/module2617/index:" }, "jsii-calc.module2647": { "locationInModule": { "filename": "lib/index.ts", - "line": 15 + "line": 16 }, "symbolId": "lib/module2647/index:" }, "jsii-calc.module2689": { "locationInModule": { "filename": "lib/index.ts", - "line": 17 + "line": 18 }, "symbolId": "lib/module2689/index:" }, @@ -285,7 +285,7 @@ "jsii-calc.module2692": { "locationInModule": { "filename": "lib/index.ts", - "line": 19 + "line": 20 }, "symbolId": "lib/module2692/index:" }, @@ -306,21 +306,21 @@ "jsii-calc.module2700": { "locationInModule": { "filename": "lib/index.ts", - "line": 21 + "line": 22 }, "symbolId": "lib/module2700/index:" }, "jsii-calc.module2702": { "locationInModule": { "filename": "lib/index.ts", - "line": 18 + "line": 19 }, "symbolId": "lib/module2702/index:" }, "jsii-calc.nodirect": { "locationInModule": { "filename": "lib/index.ts", - "line": 14 + "line": 15 }, "symbolId": "lib/no-direct-types/index:" }, @@ -341,14 +341,14 @@ "jsii-calc.onlystatic": { "locationInModule": { "filename": "lib/index.ts", - "line": 13 + "line": 14 }, "symbolId": "lib/only-static/index:" }, "jsii-calc.submodule": { "locationInModule": { "filename": "lib/index.ts", - "line": 12 + "line": 13 }, "readme": { "markdown": "Read you, read me\n=================\n\nThis is the readme of the `jsii-calc.submodule` module.\n" @@ -1652,6 +1652,63 @@ "name": "AugmentableClass", "symbolId": "lib/compliance:AugmentableClass" }, + "jsii-calc.BaseClass": { + "abstract": true, + "assembly": "jsii-calc", + "docs": { + "stability": "stable" + }, + "fqn": "jsii-calc.BaseClass", + "initializer": { + "docs": { + "stability": "stable" + }, + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 9 + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 6 + }, + "methods": [ + { + "docs": { + "stability": "stable" + }, + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 11 + }, + "name": "method", + "returns": { + "type": { + "primitive": "number" + } + } + } + ], + "name": "BaseClass", + "properties": [ + { + "docs": { + "stability": "stable" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 7 + }, + "name": "property", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/indirect-implementation:BaseClass" + }, "jsii-calc.BaseJsii976": { "assembly": "jsii-calc", "docs": { @@ -5652,6 +5709,24 @@ ], "symbolId": "lib/stability:ExternalStruct" }, + "jsii-calc.FullCombo": { + "assembly": "jsii-calc", + "base": "jsii-calc.BaseClass", + "docs": { + "stability": "stable" + }, + "fqn": "jsii-calc.FullCombo", + "interfaces": [ + "jsii-calc.IIndirectlyImplemented" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 16 + }, + "name": "FullCombo", + "symbolId": "lib/indirect-implementation:FullCombo" + }, "jsii-calc.GiveMeStructs": { "assembly": "jsii-calc", "docs": { @@ -6335,6 +6410,55 @@ "name": "IFriendlyRandomGenerator", "symbolId": "lib/calculator:IFriendlyRandomGenerator" }, + "jsii-calc.IIndirectlyImplemented": { + "assembly": "jsii-calc", + "docs": { + "stability": "stable" + }, + "fqn": "jsii-calc.IIndirectlyImplemented", + "kind": "interface", + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 1 + }, + "methods": [ + { + "abstract": true, + "docs": { + "stability": "stable" + }, + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 3 + }, + "name": "method", + "returns": { + "type": { + "primitive": "number" + } + } + } + ], + "name": "IIndirectlyImplemented", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "stable" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/indirect-implementation.ts", + "line": 2 + }, + "name": "property", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/indirect-implementation:IIndirectlyImplemented" + }, "jsii-calc.IInterfaceImplementedByAbstractClass": { "assembly": "jsii-calc", "docs": { @@ -16807,5 +16931,5 @@ } }, "version": "3.20.120", - "fingerprint": "lt+IM5wKyCp+HghCCEt9CX5x65ePqyHvu/emNzsxqbg=" + "fingerprint": "sqJBfFAp4Hg5OgntWB3IRyRS7mpPF7G3qoh4NYSDeSw=" } diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.ts.snap index 89b11fd9fc..0706c2d65d 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-dotnet.test.ts.snap @@ -2743,6 +2743,7 @@ exports[`Generated code for "jsii-calc": / 1`] = ` ┃ ┣━ 📄 AnonymousImplementationProvider.cs ┃ ┣━ 📄 AsyncVirtualMethods.cs ┃ ┣━ 📄 AugmentableClass.cs + ┃ ┣━ 📄 BaseClass.cs ┃ ┣━ 📄 BaseJsii976.cs ┃ ┣━ 📄 Bell.cs ┃ ┣━ 📄 BinaryOperation.cs @@ -2809,6 +2810,7 @@ exports[`Generated code for "jsii-calc": / 1`] = ` ┃ ┣━ 📄 ExternalClass.cs ┃ ┣━ 📄 ExternalEnum.cs ┃ ┣━ 📄 ExternalStruct.cs + ┃ ┣━ 📄 FullCombo.cs ┃ ┣━ 📄 GiveMeStructs.cs ┃ ┣━ 📄 Greetee.cs ┃ ┣━ 📄 GreetingAugmenter.cs @@ -2842,6 +2844,7 @@ exports[`Generated code for "jsii-calc": / 1`] = ` ┃ ┣━ 📄 IFriendlyRandomGenerator.cs ┃ ┣━ 📄 IGreetee.cs ┃ ┣━ 📄 IImplictBaseOfBase.cs + ┃ ┣━ 📄 IIndirectlyImplemented.cs ┃ ┣━ 📄 IInterfaceImplementedByAbstractClass.cs ┃ ┣━ 📄 IInterfaceThatShouldNotBeADataType.cs ┃ ┣━ 📄 IInterfaceWithInternal.cs @@ -3904,6 +3907,58 @@ namespace Amazon.JSII.Tests.CalculatorNamespace `; +exports[`Generated code for "jsii-calc": /dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BaseClass.cs 1`] = ` +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.BaseClass), fullyQualifiedName: "jsii-calc.BaseClass")] + public abstract class BaseClass : DeputyBase + { + protected BaseClass(): base(new DeputyProps(System.Array.Empty())) + { + } + + /// 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 BaseClass(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 BaseClass(DeputyProps props): base(props) + { + } + + [JsiiMethod(name: "method", returnsJson: "{\\"type\\":{\\"primitive\\":\\"number\\"}}")] + public virtual double Method() + { + return InvokeInstanceMethod(new System.Type[]{}, new object[]{})!; + } + + [JsiiProperty(name: "property", typeJson: "{\\"primitive\\":\\"string\\"}")] + public virtual string Property + { + get => GetInstanceProperty()!; + } + + [JsiiTypeProxy(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.BaseClass), fullyQualifiedName: "jsii-calc.BaseClass")] + internal sealed class _Proxy : Amazon.JSII.Tests.CalculatorNamespace.BaseClass + { + private _Proxy(ByRefValue reference): base(reference) + { + } + } + } +} + +`; + exports[`Generated code for "jsii-calc": /dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/BaseJsii976.cs 1`] = ` using Amazon.JSII.Runtime.Deputy; @@ -7016,6 +7071,34 @@ namespace Amazon.JSII.Tests.CalculatorNamespace `; +exports[`Generated code for "jsii-calc": /dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/FullCombo.cs 1`] = ` +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.FullCombo), fullyQualifiedName: "jsii-calc.FullCombo")] + public class FullCombo : Amazon.JSII.Tests.CalculatorNamespace.BaseClass, Amazon.JSII.Tests.CalculatorNamespace.IIndirectlyImplemented + { + /// 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 FullCombo(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 FullCombo(DeputyProps props): base(props) + { + } + } +} + +`; + exports[`Generated code for "jsii-calc": /dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/GiveMeStructs.cs 1`] = ` using Amazon.JSII.Runtime.Deputy; @@ -8694,6 +8777,48 @@ namespace Amazon.JSII.Tests.CalculatorNamespace `; +exports[`Generated code for "jsii-calc": /dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IIndirectlyImplemented.cs 1`] = ` +using Amazon.JSII.Runtime.Deputy; + +#pragma warning disable CS0672,CS0809,CS1591 + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiInterface(nativeType: typeof(IIndirectlyImplemented), fullyQualifiedName: "jsii-calc.IIndirectlyImplemented")] + public interface IIndirectlyImplemented + { + [JsiiProperty(name: "property", typeJson: "{\\"primitive\\":\\"string\\"}")] + string Property + { + get; + } + [JsiiMethod(name: "method", returnsJson: "{\\"type\\":{\\"primitive\\":\\"number\\"}}")] + double Method(); + + [JsiiTypeProxy(nativeType: typeof(IIndirectlyImplemented), fullyQualifiedName: "jsii-calc.IIndirectlyImplemented")] + internal sealed class _Proxy : DeputyBase, Amazon.JSII.Tests.CalculatorNamespace.IIndirectlyImplemented + { + private _Proxy(ByRefValue reference): base(reference) + { + } + + [JsiiProperty(name: "property", typeJson: "{\\"primitive\\":\\"string\\"}")] + public string Property + { + get => GetInstanceProperty()!; + } + + [JsiiMethod(name: "method", returnsJson: "{\\"type\\":{\\"primitive\\":\\"number\\"}}")] + public double Method() + { + return InvokeInstanceMethod(new System.Type[]{}, new object[]{})!; + } + } + } +} + +`; + exports[`Generated code for "jsii-calc": /dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IInterfaceImplementedByAbstractClass.cs 1`] = ` using Amazon.JSII.Runtime.Deputy; diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.ts.snap index 109605c061..198cf3c1b8 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-go.test.ts.snap @@ -4224,6 +4224,50 @@ func (a *jsiiProxy_AugmentableClass) MethodTwo() { ) } +type BaseClass interface { + Property() *string + Method() *float64 +} + +// The jsii proxy struct for BaseClass +type jsiiProxy_BaseClass struct { + _ byte // padding +} + +func (j *jsiiProxy_BaseClass) Property() *string { + var returns *string + _jsii_.Get( + j, + "property", + &returns, + ) + return returns +} + + +func NewBaseClass_Override(b BaseClass) { + _init_.Initialize() + + _jsii_.Create( + "jsii-calc.BaseClass", + nil, // no parameters + b, + ) +} + +func (b *jsiiProxy_BaseClass) Method() *float64 { + var returns *float64 + + _jsii_.Invoke( + b, + "method", + nil, // no parameters + &returns, + ) + + return returns +} + type BaseJsii976 interface { } @@ -7275,6 +7319,43 @@ type ExternalStruct struct { ReadonlyProperty *string \`json:"readonlyProperty" yaml:"readonlyProperty"\` } +type FullCombo interface { + BaseClass + IIndirectlyImplemented + Property() *string + Method() *float64 +} + +// The jsii proxy struct for FullCombo +type jsiiProxy_FullCombo struct { + jsiiProxy_BaseClass + jsiiProxy_IIndirectlyImplemented +} + +func (j *jsiiProxy_FullCombo) Property() *string { + var returns *string + _jsii_.Get( + j, + "property", + &returns, + ) + return returns +} + + +func (f *jsiiProxy_FullCombo) Method() *float64 { + var returns *float64 + + _jsii_.Invoke( + f, + "method", + nil, // no parameters + &returns, + ) + + return returns +} + type GiveMeStructs interface { StructLiteral() *scopejsiicalclib.StructWithOnlyOptionals DerivedToFirst(derived *DerivedStruct) *scopejsiicalclib.MyFirstStruct @@ -7804,6 +7885,39 @@ func (i *jsiiProxy_IFriendlyRandomGenerator) Next() *float64 { return returns } +type IIndirectlyImplemented interface { + Method() *float64 + Property() *string +} + +// The jsii proxy for IIndirectlyImplemented +type jsiiProxy_IIndirectlyImplemented struct { + _ byte // padding +} + +func (i *jsiiProxy_IIndirectlyImplemented) Method() *float64 { + var returns *float64 + + _jsii_.Invoke( + i, + "method", + nil, // no parameters + &returns, + ) + + return returns +} + +func (j *jsiiProxy_IIndirectlyImplemented) Property() *string { + var returns *string + _jsii_.Get( + j, + "property", + &returns, + ) + return returns +} + // awslabs/jsii#220 Abstract return type. type IInterfaceImplementedByAbstractClass interface { PropFromInterface() *string @@ -14683,6 +14797,17 @@ func init() { return &jsiiProxy_AugmentableClass{} }, ) + _jsii_.RegisterClass( + "jsii-calc.BaseClass", + reflect.TypeOf((*BaseClass)(nil)).Elem(), + []_jsii_.Member{ + _jsii_.MemberMethod{JsiiMethod: "method", GoMethod: "Method"}, + _jsii_.MemberProperty{JsiiProperty: "property", GoGetter: "Property"}, + }, + func() interface{} { + return &jsiiProxy_BaseClass{} + }, + ) _jsii_.RegisterClass( "jsii-calc.BaseJsii976", reflect.TypeOf((*BaseJsii976)(nil)).Elem(), @@ -15210,6 +15335,20 @@ func init() { "jsii-calc.ExternalStruct", reflect.TypeOf((*ExternalStruct)(nil)).Elem(), ) + _jsii_.RegisterClass( + "jsii-calc.FullCombo", + reflect.TypeOf((*FullCombo)(nil)).Elem(), + []_jsii_.Member{ + _jsii_.MemberMethod{JsiiMethod: "method", GoMethod: "Method"}, + _jsii_.MemberProperty{JsiiProperty: "property", GoGetter: "Property"}, + }, + func() interface{} { + j := jsiiProxy_FullCombo{} + _jsii_.InitJsiiProxy(&j.jsiiProxy_BaseClass) + _jsii_.InitJsiiProxy(&j.jsiiProxy_IIndirectlyImplemented) + return &j + }, + ) _jsii_.RegisterClass( "jsii-calc.GiveMeStructs", reflect.TypeOf((*GiveMeStructs)(nil)).Elem(), @@ -15371,6 +15510,17 @@ func init() { return &j }, ) + _jsii_.RegisterInterface( + "jsii-calc.IIndirectlyImplemented", + reflect.TypeOf((*IIndirectlyImplemented)(nil)).Elem(), + []_jsii_.Member{ + _jsii_.MemberMethod{JsiiMethod: "method", GoMethod: "Method"}, + _jsii_.MemberProperty{JsiiProperty: "property", GoGetter: "Property"}, + }, + func() interface{} { + return &jsiiProxy_IIndirectlyImplemented{} + }, + ) _jsii_.RegisterInterface( "jsii-calc.IInterfaceImplementedByAbstractClass", reflect.TypeOf((*IInterfaceImplementedByAbstractClass)(nil)).Elem(), diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.ts.snap index 9f790ee4a4..c53ae547ce 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-java.test.ts.snap @@ -3591,6 +3591,7 @@ exports[`Generated code for "jsii-calc": / 1`] = ` ┃ ┣━ 📄 AnonymousImplementationProvider.java ┃ ┣━ 📄 AsyncVirtualMethods.java ┃ ┣━ 📄 AugmentableClass.java + ┃ ┣━ 📄 BaseClass.java ┃ ┣━ 📄 BaseJsii976.java ┃ ┣━ 📄 Bell.java ┃ ┣━ 📄 BinaryOperation.java @@ -3657,6 +3658,7 @@ exports[`Generated code for "jsii-calc": / 1`] = ` ┃ ┣━ 📄 ExternalClass.java ┃ ┣━ 📄 ExternalEnum.java ┃ ┣━ 📄 ExternalStruct.java + ┃ ┣━ 📄 FullCombo.java ┃ ┣━ 📄 GiveMeStructs.java ┃ ┣━ 📄 Greetee.java ┃ ┣━ 📄 GreetingAugmenter.java @@ -3672,6 +3674,7 @@ exports[`Generated code for "jsii-calc": / 1`] = ` ┃ ┣━ 📄 IExternalInterface.java ┃ ┣━ 📄 IFriendlier.java ┃ ┣━ 📄 IFriendlyRandomGenerator.java + ┃ ┣━ 📄 IIndirectlyImplemented.java ┃ ┣━ 📄 IInterfaceImplementedByAbstractClass.java ┃ ┣━ 📄 IInterfaceThatShouldNotBeADataType.java ┃ ┣━ 📄 IInterfaceWithInternal.java @@ -5377,6 +5380,59 @@ public class AugmentableClass extends software.amazon.jsii.JsiiObject { `; +exports[`Generated code for "jsii-calc": /java/src/main/java/software/amazon/jsii/tests/calculator/BaseClass.java 1`] = ` +package software.amazon.jsii.tests.calculator; + +/** + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.BaseClass") +public abstract class BaseClass extends software.amazon.jsii.JsiiObject { + + protected BaseClass(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + protected BaseClass(final software.amazon.jsii.JsiiObject.InitializationMode initializationMode) { + super(initializationMode); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + protected BaseClass() { + super(software.amazon.jsii.JsiiObject.InitializationMode.JSII); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + public @org.jetbrains.annotations.NotNull java.lang.Number method() { + return software.amazon.jsii.Kernel.call(this, "method", software.amazon.jsii.NativeType.forClass(java.lang.Number.class)); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + public @org.jetbrains.annotations.NotNull java.lang.String getProperty() { + return software.amazon.jsii.Kernel.get(this, "property", software.amazon.jsii.NativeType.forClass(java.lang.String.class)); + } + + /** + * A proxy class which represents a concrete javascript instance of this type. + */ + @software.amazon.jsii.Internal + private static final class Jsii$Proxy extends software.amazon.jsii.tests.calculator.BaseClass { + protected Jsii$Proxy(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + } +} + +`; + exports[`Generated code for "jsii-calc": /java/src/main/java/software/amazon/jsii/tests/calculator/BaseJsii976.java 1`] = ` package software.amazon.jsii.tests.calculator; @@ -10615,6 +10671,27 @@ public interface ExternalStruct extends software.amazon.jsii.JsiiSerializable { `; +exports[`Generated code for "jsii-calc": /java/src/main/java/software/amazon/jsii/tests/calculator/FullCombo.java 1`] = ` +package software.amazon.jsii.tests.calculator; + +/** + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.FullCombo") +public class FullCombo extends software.amazon.jsii.tests.calculator.BaseClass implements software.amazon.jsii.tests.calculator.IIndirectlyImplemented { + + protected FullCombo(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + protected FullCombo(final software.amazon.jsii.JsiiObject.InitializationMode initializationMode) { + super(initializationMode); + } +} + +`; + exports[`Generated code for "jsii-calc": /java/src/main/java/software/amazon/jsii/tests/calculator/GiveMeStructs.java 1`] = ` package software.amazon.jsii.tests.calculator; @@ -11815,6 +11892,79 @@ public interface IFriendlyRandomGenerator extends software.amazon.jsii.JsiiSeria `; +exports[`Generated code for "jsii-calc": /java/src/main/java/software/amazon/jsii/tests/calculator/IIndirectlyImplemented.java 1`] = ` +package software.amazon.jsii.tests.calculator; + +/** + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.IIndirectlyImplemented") +@software.amazon.jsii.Jsii.Proxy(IIndirectlyImplemented.Jsii$Proxy.class) +@software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) +public interface IIndirectlyImplemented extends software.amazon.jsii.JsiiSerializable { + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + @org.jetbrains.annotations.NotNull java.lang.String getProperty(); + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + @org.jetbrains.annotations.NotNull java.lang.Number 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.IIndirectlyImplemented.Jsii$Default { + protected Jsii$Proxy(final software.amazon.jsii.JsiiObjectRef objRef) { + super(objRef); + } + + /** + */ + @Override + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + public final @org.jetbrains.annotations.NotNull java.lang.String getProperty() { + return software.amazon.jsii.Kernel.get(this, "property", software.amazon.jsii.NativeType.forClass(java.lang.String.class)); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + @Override + public final @org.jetbrains.annotations.NotNull java.lang.Number method() { + return software.amazon.jsii.Kernel.call(this, "method", software.amazon.jsii.NativeType.forClass(java.lang.Number.class)); + } + } + + /** + * Internal default implementation for {@link IIndirectlyImplemented}. + */ + @software.amazon.jsii.Internal + interface Jsii$Default extends IIndirectlyImplemented { + + /** + */ + @Override + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + default @org.jetbrains.annotations.NotNull java.lang.String getProperty() { + return software.amazon.jsii.Kernel.get(this, "property", software.amazon.jsii.NativeType.forClass(java.lang.String.class)); + } + + /** + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) + @Override + default @org.jetbrains.annotations.NotNull java.lang.Number method() { + return software.amazon.jsii.Kernel.call(this, "method", software.amazon.jsii.NativeType.forClass(java.lang.Number.class)); + } + } +} + +`; + exports[`Generated code for "jsii-calc": /java/src/main/java/software/amazon/jsii/tests/calculator/IInterfaceImplementedByAbstractClass.java 1`] = ` package software.amazon.jsii.tests.calculator; @@ -25674,6 +25824,7 @@ jsii-calc.AmbiguousParameters=software.amazon.jsii.tests.calculator.AmbiguousPar jsii-calc.AnonymousImplementationProvider=software.amazon.jsii.tests.calculator.AnonymousImplementationProvider jsii-calc.AsyncVirtualMethods=software.amazon.jsii.tests.calculator.AsyncVirtualMethods jsii-calc.AugmentableClass=software.amazon.jsii.tests.calculator.AugmentableClass +jsii-calc.BaseClass=software.amazon.jsii.tests.calculator.BaseClass 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 @@ -25733,6 +25884,7 @@ jsii-calc.ExtendsInternalInterface=software.amazon.jsii.tests.calculator.Extends jsii-calc.ExternalClass=software.amazon.jsii.tests.calculator.ExternalClass jsii-calc.ExternalEnum=software.amazon.jsii.tests.calculator.ExternalEnum jsii-calc.ExternalStruct=software.amazon.jsii.tests.calculator.ExternalStruct +jsii-calc.FullCombo=software.amazon.jsii.tests.calculator.FullCombo jsii-calc.GiveMeStructs=software.amazon.jsii.tests.calculator.GiveMeStructs jsii-calc.Greetee=software.amazon.jsii.tests.calculator.Greetee jsii-calc.GreetingAugmenter=software.amazon.jsii.tests.calculator.GreetingAugmenter @@ -25748,6 +25900,7 @@ jsii-calc.IExtendsPrivateInterface=software.amazon.jsii.tests.calculator.IExtend jsii-calc.IExternalInterface=software.amazon.jsii.tests.calculator.IExternalInterface jsii-calc.IFriendlier=software.amazon.jsii.tests.calculator.IFriendlier jsii-calc.IFriendlyRandomGenerator=software.amazon.jsii.tests.calculator.IFriendlyRandomGenerator +jsii-calc.IIndirectlyImplemented=software.amazon.jsii.tests.calculator.IIndirectlyImplemented jsii-calc.IInterfaceImplementedByAbstractClass=software.amazon.jsii.tests.calculator.IInterfaceImplementedByAbstractClass jsii-calc.IInterfaceThatShouldNotBeADataType=software.amazon.jsii.tests.calculator.IInterfaceThatShouldNotBeADataType jsii-calc.IInterfaceWithInternal=software.amazon.jsii.tests.calculator.IInterfaceWithInternal diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap index 947dde8d37..806b543cfa 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap @@ -3017,6 +3017,27 @@ class AugmentableClass(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.Augmentable return typing.cast(None, jsii.invoke(self, "methodTwo", [])) +class BaseClass(metaclass=jsii.JSIIAbstractClass, jsii_type="jsii-calc.BaseClass"): + def __init__(self) -> None: + jsii.create(self.__class__, self, []) + + @jsii.member(jsii_name="method") + def method(self) -> jsii.Number: + return typing.cast(jsii.Number, jsii.invoke(self, "method", [])) + + @builtins.property # type: ignore[misc] + @jsii.member(jsii_name="property") + def property(self) -> builtins.str: + return typing.cast(builtins.str, jsii.get(self, "property")) + + +class _BaseClassProxy(BaseClass): + pass + +# Adding a "__jsii_proxy_class__(): typing.Type" function to the abstract class +typing.cast(typing.Any, BaseClass).__jsii_proxy_class__ = lambda : _BaseClassProxy + + class BaseJsii976(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.BaseJsii976"): def __init__(self) -> None: jsii.create(self.__class__, self, []) @@ -5645,6 +5666,34 @@ class _IFriendlierProxy( typing.cast(typing.Any, IFriendlier).__jsii_proxy_class__ = lambda : _IFriendlierProxy +@jsii.interface(jsii_type="jsii-calc.IIndirectlyImplemented") +class IIndirectlyImplemented(typing_extensions.Protocol): + @builtins.property # type: ignore[misc] + @jsii.member(jsii_name="property") + def property(self) -> builtins.str: + ... + + @jsii.member(jsii_name="method") + def method(self) -> jsii.Number: + ... + + +class _IIndirectlyImplementedProxy: + __jsii_type__: typing.ClassVar[str] = "jsii-calc.IIndirectlyImplemented" + + @builtins.property # type: ignore[misc] + @jsii.member(jsii_name="property") + def property(self) -> builtins.str: + return typing.cast(builtins.str, jsii.get(self, "property")) + + @jsii.member(jsii_name="method") + def method(self) -> jsii.Number: + return typing.cast(jsii.Number, jsii.invoke(self, "method", [])) + +# Adding a "__jsii_proxy_class__(): typing.Type" function to the interface +typing.cast(typing.Any, IIndirectlyImplemented).__jsii_proxy_class__ = lambda : _IIndirectlyImplementedProxy + + @jsii.interface(jsii_type="jsii-calc.IInterfaceImplementedByAbstractClass") class IInterfaceImplementedByAbstractClass(typing_extensions.Protocol): '''awslabs/jsii#220 Abstract return type.''' @@ -9758,6 +9807,11 @@ class ClassWithPrivateConstructorAndAutomaticProperties( jsii.set(self, "readWriteString", value) +@jsii.implements(IIndirectlyImplemented) +class FullCombo(BaseClass, metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.FullCombo"): + pass + + @jsii.interface(jsii_type="jsii-calc.IFriendlyRandomGenerator") class IFriendlyRandomGenerator( IRandomNumberGenerator, @@ -9998,6 +10052,7 @@ __all__ = [ "AnonymousImplementationProvider", "AsyncVirtualMethods", "AugmentableClass", + "BaseClass", "BaseJsii976", "Bell", "BinaryOperation", @@ -10055,6 +10110,7 @@ __all__ = [ "ExternalClass", "ExternalEnum", "ExternalStruct", + "FullCombo", "GiveMeStructs", "Greetee", "GreetingAugmenter", @@ -10070,6 +10126,7 @@ __all__ = [ "IExternalInterface", "IFriendlier", "IFriendlyRandomGenerator", + "IIndirectlyImplemented", "IInterfaceImplementedByAbstractClass", "IInterfaceThatShouldNotBeADataType", "IInterfaceWithInternal", diff --git a/packages/jsii-reflect/lib/tree.ts b/packages/jsii-reflect/lib/tree.ts index d0a114c440..6533c509fa 100644 --- a/packages/jsii-reflect/lib/tree.ts +++ b/packages/jsii-reflect/lib/tree.ts @@ -1,5 +1,6 @@ import { Stability } from '@jsii/spec'; -import * as chalk from 'chalk'; +// eslint-disable-next-line @typescript-eslint/no-require-imports +import chalk = require('chalk'); import { AsciiTree } from 'oo-ascii-tree'; import { Assembly } from './assembly'; @@ -390,15 +391,15 @@ class FlagNode extends AsciiTree { * Invokes `block` with colors enabled/disabled and reverts to old value afterwards. */ function withColors(enabled: boolean, block: () => void) { - const oldChalkColorValue = process.env.FORCE_COLOR; + const oldLevel = chalk.level; try { if (!enabled) { - process.env.FORCE_COLOR = '0'; + chalk.level = 0; // No colors at all } block(); } finally { - process.env.FORCE_COLOR = oldChalkColorValue; + chalk.level = oldLevel; } } diff --git a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.ts.snap b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.ts.snap index c669dc5c8b..5aa58e66c2 100644 --- a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.ts.snap +++ b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.ts.snap @@ -718,6 +718,14 @@ exports[`jsii-tree --all 1`] = ` │ │ │ └── returns: void │ │ └─┬ methodTwo() method (stable) │ │ └── returns: void + │ ├─┬ class BaseClass (stable) + │ │ └─┬ members + │ │ ├── () initializer (stable) + │ │ ├─┬ method() method (stable) + │ │ │ └── returns: number + │ │ └─┬ property property (stable) + │ │ ├── immutable + │ │ └── type: string │ ├─┬ class BaseJsii976 (stable) │ │ └─┬ members │ │ └── () initializer (stable) @@ -1252,6 +1260,10 @@ exports[`jsii-tree --all 1`] = ` │ │ │ └── type: string │ │ └─┬ mutableProperty property (stable) │ │ └── type: Optional + │ ├─┬ class FullCombo (stable) + │ │ ├── base: BaseClass + │ │ ├── interfaces: IIndirectlyImplemented + │ │ └── members │ ├─┬ class GiveMeStructs (stable) │ │ └─┬ members │ │ ├── () initializer (stable) @@ -2612,6 +2624,15 @@ exports[`jsii-tree --all 1`] = ` │ │ │ ├── IRandomNumberGenerator │ │ │ └── IFriendly │ │ └── members + │ ├─┬ interface IIndirectlyImplemented (stable) + │ │ └─┬ members + │ │ ├─┬ method() method (stable) + │ │ │ ├── abstract + │ │ │ └── returns: number + │ │ └─┬ property property (stable) + │ │ ├── abstract + │ │ ├── immutable + │ │ └── type: string │ ├─┬ interface IInterfaceImplementedByAbstractClass (stable) │ │ └─┬ members │ │ └─┬ propFromInterface property (stable) @@ -3416,6 +3437,7 @@ exports[`jsii-tree --inheritance 1`] = ` │ │ └── interfaces: IAnonymousImplementationProvider │ ├── class AsyncVirtualMethods │ ├── class AugmentableClass + │ ├── class BaseClass │ ├── class BaseJsii976 │ ├─┬ class Bell │ │ └── interfaces: IBell @@ -3463,6 +3485,9 @@ exports[`jsii-tree --inheritance 1`] = ` │ ├── class ExperimentalClass │ ├── class ExportedBaseClass │ ├── class ExternalClass + │ ├─┬ class FullCombo + │ │ ├── base: BaseClass + │ │ └── interfaces: IIndirectlyImplemented │ ├── class GiveMeStructs │ ├── class GreetingAugmenter │ ├── class ImplementInternalInterface @@ -3607,6 +3632,7 @@ exports[`jsii-tree --inheritance 1`] = ` │ │ └─┬ interfaces │ │ ├── IRandomNumberGenerator │ │ └── IFriendly + │ ├── interface IIndirectlyImplemented │ ├── interface IInterfaceImplementedByAbstractClass │ ├─┬ interface IInterfaceThatShouldNotBeADataType │ │ └─┬ interfaces @@ -4098,6 +4124,11 @@ exports[`jsii-tree --members 1`] = ` │ │ ├── () initializer │ │ ├── methodOne() method │ │ └── methodTwo() method + │ ├─┬ class BaseClass + │ │ └─┬ members + │ │ ├── () initializer + │ │ ├── method() method + │ │ └── property property │ ├─┬ class BaseJsii976 │ │ └─┬ members │ │ └── () initializer @@ -4312,6 +4343,8 @@ exports[`jsii-tree --members 1`] = ` │ │ ├── method() method │ │ ├── readonlyProperty property │ │ └── mutableProperty property + │ ├─┬ class FullCombo + │ │ └── members │ ├─┬ class GiveMeStructs │ │ └─┬ members │ │ ├── () initializer @@ -4908,6 +4941,10 @@ exports[`jsii-tree --members 1`] = ` │ │ └── goodbye() method │ ├─┬ interface IFriendlyRandomGenerator │ │ └── members + │ ├─┬ interface IIndirectlyImplemented + │ │ └─┬ members + │ │ ├── method() method + │ │ └── property property │ ├─┬ interface IInterfaceImplementedByAbstractClass │ │ └─┬ members │ │ └── propFromInterface property @@ -5397,6 +5434,7 @@ exports[`jsii-tree --types 1`] = ` │ ├── class AnonymousImplementationProvider │ ├── class AsyncVirtualMethods │ ├── class AugmentableClass + │ ├── class BaseClass │ ├── class BaseJsii976 │ ├── class Bell │ ├── class BinaryOperation @@ -5435,6 +5473,7 @@ exports[`jsii-tree --types 1`] = ` │ ├── class ExperimentalClass │ ├── class ExportedBaseClass │ ├── class ExternalClass + │ ├── class FullCombo │ ├── class GiveMeStructs │ ├── class GreetingAugmenter │ ├── class ImplementInternalInterface @@ -5543,6 +5582,7 @@ exports[`jsii-tree --types 1`] = ` │ ├── interface IExternalInterface │ ├── interface IFriendlier │ ├── interface IFriendlyRandomGenerator + │ ├── interface IIndirectlyImplemented │ ├── interface IInterfaceImplementedByAbstractClass │ ├── interface IInterfaceThatShouldNotBeADataType │ ├── interface IInterfaceWithInternal diff --git a/packages/jsii-reflect/test/__snapshots__/tree.test.ts.snap b/packages/jsii-reflect/test/__snapshots__/tree.test.ts.snap index 3cfc31f733..e69a0d7e27 100644 --- a/packages/jsii-reflect/test/__snapshots__/tree.test.ts.snap +++ b/packages/jsii-reflect/test/__snapshots__/tree.test.ts.snap @@ -868,6 +868,14 @@ exports[`showAll 1`] = ` │ │ │ └── returns: void │ │ └─┬ methodTwo() method │ │ └── returns: void + │ ├─┬ class BaseClass + │ │ └─┬ members + │ │ ├── () initializer + │ │ ├─┬ method() method + │ │ │ └── returns: number + │ │ └─┬ property property + │ │ ├── immutable + │ │ └── type: string │ ├─┬ class BaseJsii976 │ │ └─┬ members │ │ └── () initializer @@ -1402,6 +1410,10 @@ exports[`showAll 1`] = ` │ │ │ └── type: string │ │ └─┬ mutableProperty property │ │ └── type: Optional + │ ├─┬ class FullCombo + │ │ ├── base: BaseClass + │ │ ├── interfaces: IIndirectlyImplemented + │ │ └── members │ ├─┬ class GiveMeStructs │ │ └─┬ members │ │ ├── () initializer @@ -2762,6 +2774,15 @@ exports[`showAll 1`] = ` │ │ │ ├── IRandomNumberGenerator │ │ │ └── IFriendly │ │ └── members + │ ├─┬ interface IIndirectlyImplemented + │ │ └─┬ members + │ │ ├─┬ method() method + │ │ │ ├── abstract + │ │ │ └── returns: number + │ │ └─┬ property property + │ │ ├── abstract + │ │ ├── immutable + │ │ └── type: string │ ├─┬ interface IInterfaceImplementedByAbstractClass │ │ └─┬ members │ │ └─┬ propFromInterface property @@ -3579,6 +3600,7 @@ exports[`types 1`] = ` │ ├── class AnonymousImplementationProvider │ ├── class AsyncVirtualMethods │ ├── class AugmentableClass + │ ├── class BaseClass │ ├── class BaseJsii976 │ ├── class Bell │ ├── class BinaryOperation @@ -3617,6 +3639,7 @@ exports[`types 1`] = ` │ ├── class ExperimentalClass │ ├── class ExportedBaseClass │ ├── class ExternalClass + │ ├── class FullCombo │ ├── class GiveMeStructs │ ├── class GreetingAugmenter │ ├── class ImplementInternalInterface @@ -3725,6 +3748,7 @@ exports[`types 1`] = ` │ ├── interface IExternalInterface │ ├── interface IFriendlier │ ├── interface IFriendlyRandomGenerator + │ ├── interface IIndirectlyImplemented │ ├── interface IInterfaceImplementedByAbstractClass │ ├── interface IInterfaceThatShouldNotBeADataType │ ├── interface IInterfaceWithInternal diff --git a/packages/jsii-reflect/test/__snapshots__/type-system.test.ts.snap b/packages/jsii-reflect/test/__snapshots__/type-system.test.ts.snap index f2b4fcd0ae..193d887b35 100644 --- a/packages/jsii-reflect/test/__snapshots__/type-system.test.ts.snap +++ b/packages/jsii-reflect/test/__snapshots__/type-system.test.ts.snap @@ -33,6 +33,7 @@ Array [ "jsii-calc.AnonymousImplementationProvider", "jsii-calc.AsyncVirtualMethods", "jsii-calc.AugmentableClass", + "jsii-calc.BaseClass", "jsii-calc.BaseJsii976", "jsii-calc.Bell", "jsii-calc.BinaryOperation", @@ -73,6 +74,7 @@ Array [ "jsii-calc.ExperimentalClass", "jsii-calc.ExportedBaseClass", "jsii-calc.ExternalClass", + "jsii-calc.FullCombo", "jsii-calc.GiveMeStructs", "jsii-calc.GreetingAugmenter", "jsii-calc.ImplementInternalInterface", diff --git a/packages/jsii-reflect/test/jsii-tree.test.ts b/packages/jsii-reflect/test/jsii-tree.test.ts index 5e2112a0a3..f5ff07412a 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.ts +++ b/packages/jsii-reflect/test/jsii-tree.test.ts @@ -26,7 +26,7 @@ async function jsiiTree(...args: string[]) { process.execPath, ...process.execArgv, path.join(__dirname, '..', 'bin', 'jsii-tree'), - args.join(' '), + ...args, '--no-colors', path.dirname(require.resolve('jsii-calc/package.json')), ].join(' '); diff --git a/packages/jsii/lib/node-bindings.ts b/packages/jsii/lib/node-bindings.ts index ae7721577f..625e062716 100644 --- a/packages/jsii/lib/node-bindings.ts +++ b/packages/jsii/lib/node-bindings.ts @@ -22,6 +22,13 @@ const setter = (object: T, node: ts.Node): T => { return object; }; +export function setRelatedNode( + object: any, + node: T, +) { + return STORAGE.set(object, node); +} + export const setClassRelatedNode: ( object: spec.ClassType, node: ts.ClassDeclaration, diff --git a/packages/jsii/lib/validator.ts b/packages/jsii/lib/validator.ts index 2c478c687c..878703c8a7 100644 --- a/packages/jsii/lib/validator.ts +++ b/packages/jsii/lib/validator.ts @@ -273,7 +273,20 @@ function _defaultValidations(): ValidationFunction[] { if (known.has(member.name)) { continue; } - result.push(member); + // The member is copied, so that its `overrides` property won't be + // altered, since this member is "borrowed" from a parent type. We + // only check it, but should not record `overrides` relationships to + // it as those could be invalid per the parent type (i.e: the parent + // member may not be able to implement an interface, if that type does + // not actually declare implementing that). + const memberCopy = { ...member }; + // Forward the related node if there's one, so diagnostics are bound. + const node = bindings.getRelatedNode(member); + if (node != null) { + bindings.setRelatedNode(memberCopy, node); + } + + result.push(memberCopy); known.add(member.name); } }