diff --git a/packages/jsii-calc/lib/erasures.ts b/packages/jsii-calc/lib/erasures.ts index eaf6e1ebcf..fc1e40169c 100644 --- a/packages/jsii-calc/lib/erasures.ts +++ b/packages/jsii-calc/lib/erasures.ts @@ -37,3 +37,12 @@ interface IJSII417PrivateBase extends IJSII417PublicBaseOfBase { export interface IJSII417Derived extends IJSII417PrivateBase { baz(): void; } + +// +// Interfaces should be copied from erased classes to public classes +// https://github.com/awslabs/jsii/issues/487 +// +// tslint:disable-next-line:no-empty-interface +export interface IJsii487External { } +class Jsii487Internal implements IJsii487External { } +export class Jsii487Derived extends Jsii487Internal { } diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index dbed8880bd..eb15b37118 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -3035,6 +3035,16 @@ } ] }, + "jsii-calc.IJsii487External": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.IJsii487External", + "kind": "interface", + "locationInModule": { + "filename": "lib/erasures.ts", + "line": 46 + }, + "name": "IJsii487External" + }, "jsii-calc.IMutableObjectLiteral": { "assembly": "jsii-calc", "fqn": "jsii-calc.IMutableObjectLiteral", @@ -4038,6 +4048,20 @@ } ] }, + "jsii-calc.Jsii487Derived": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.Jsii487Derived", + "initializer": {}, + "interfaces": [ + "jsii-calc.IJsii487External" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/erasures.ts", + "line": 48 + }, + "name": "Jsii487Derived" + }, "jsii-calc.JsiiAgent": { "assembly": "jsii-calc", "docs": { @@ -6744,5 +6768,5 @@ } }, "version": "0.10.3", - "fingerprint": "HkyspjelXmNd6gQibMCkuk+WfsM6Q9e3uZLl2ee3kbY=" + "fingerprint": "CSE0eCLDxK7s+qnmR58ZJo0mcEROi4f8Sxlx2pHaBDs=" } 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 dbed8880bd..eb15b37118 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 @@ -3035,6 +3035,16 @@ } ] }, + "jsii-calc.IJsii487External": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.IJsii487External", + "kind": "interface", + "locationInModule": { + "filename": "lib/erasures.ts", + "line": 46 + }, + "name": "IJsii487External" + }, "jsii-calc.IMutableObjectLiteral": { "assembly": "jsii-calc", "fqn": "jsii-calc.IMutableObjectLiteral", @@ -4038,6 +4048,20 @@ } ] }, + "jsii-calc.Jsii487Derived": { + "assembly": "jsii-calc", + "fqn": "jsii-calc.Jsii487Derived", + "initializer": {}, + "interfaces": [ + "jsii-calc.IJsii487External" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/erasures.ts", + "line": 48 + }, + "name": "Jsii487Derived" + }, "jsii-calc.JsiiAgent": { "assembly": "jsii-calc", "docs": { @@ -6744,5 +6768,5 @@ } }, "version": "0.10.3", - "fingerprint": "HkyspjelXmNd6gQibMCkuk+WfsM6Q9e3uZLl2ee3kbY=" + "fingerprint": "CSE0eCLDxK7s+qnmR58ZJo0mcEROi4f8Sxlx2pHaBDs=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IIJsii487External.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IIJsii487External.cs new file mode 100644 index 0000000000..8ec02e4e4c --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IIJsii487External.cs @@ -0,0 +1,9 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiInterface(nativeType: typeof(IIJsii487External), fullyQualifiedName: "jsii-calc.IJsii487External")] + public interface IIJsii487External + { + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IJsii487ExternalProxy.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IJsii487ExternalProxy.cs new file mode 100644 index 0000000000..e076dfffe2 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/IJsii487ExternalProxy.cs @@ -0,0 +1,12 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiTypeProxy(nativeType: typeof(IIJsii487External), fullyQualifiedName: "jsii-calc.IJsii487External")] + internal sealed class IJsii487ExternalProxy : DeputyBase, IIJsii487External + { + private IJsii487ExternalProxy(ByRefValue reference): base(reference) + { + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Jsii487Derived.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Jsii487Derived.cs new file mode 100644 index 0000000000..9776081d92 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Jsii487Derived.cs @@ -0,0 +1,20 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + [JsiiClass(nativeType: typeof(Jsii487Derived), fullyQualifiedName: "jsii-calc.Jsii487Derived")] + public class Jsii487Derived : DeputyBase, IIJsii487External + { + public Jsii487Derived(): base(new DeputyProps(new object[]{})) + { + } + + protected Jsii487Derived(ByRefValue reference): base(reference) + { + } + + protected Jsii487Derived(DeputyProps props): base(props) + { + } + } +} \ No newline at end of file diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java index af1ca8db6d..dfc6a330b9 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/$Module.java @@ -67,6 +67,7 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException case "jsii-calc.IInterfaceWithPropertiesExtension": return software.amazon.jsii.tests.calculator.IInterfaceWithPropertiesExtension.class; case "jsii-calc.IJSII417Derived": return software.amazon.jsii.tests.calculator.IJSII417Derived.class; case "jsii-calc.IJSII417PublicBaseOfBase": return software.amazon.jsii.tests.calculator.IJSII417PublicBaseOfBase.class; + case "jsii-calc.IJsii487External": return software.amazon.jsii.tests.calculator.IJsii487External.class; case "jsii-calc.IMutableObjectLiteral": return software.amazon.jsii.tests.calculator.IMutableObjectLiteral.class; case "jsii-calc.INonInternalInterface": return software.amazon.jsii.tests.calculator.INonInternalInterface.class; case "jsii-calc.IPrivatelyImplemented": return software.amazon.jsii.tests.calculator.IPrivatelyImplemented.class; @@ -89,6 +90,7 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException case "jsii-calc.JSObjectLiteralToNative": return software.amazon.jsii.tests.calculator.JSObjectLiteralToNative.class; case "jsii-calc.JSObjectLiteralToNativeClass": return software.amazon.jsii.tests.calculator.JSObjectLiteralToNativeClass.class; case "jsii-calc.JavaReservedWords": return software.amazon.jsii.tests.calculator.JavaReservedWords.class; + case "jsii-calc.Jsii487Derived": return software.amazon.jsii.tests.calculator.Jsii487Derived.class; case "jsii-calc.JsiiAgent": return software.amazon.jsii.tests.calculator.JsiiAgent.class; case "jsii-calc.LoadBalancedFargateServiceProps": return software.amazon.jsii.tests.calculator.LoadBalancedFargateServiceProps.class; case "jsii-calc.Multiply": return software.amazon.jsii.tests.calculator.Multiply.class; diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/IJsii487External.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/IJsii487External.java new file mode 100644 index 0000000000..169008fc75 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/IJsii487External.java @@ -0,0 +1,14 @@ +package software.amazon.jsii.tests.calculator; + +@javax.annotation.Generated(value = "jsii-pacmak") +public interface IJsii487External extends software.amazon.jsii.JsiiSerializable { + + /** + * A proxy class which represents a concrete javascript instance of this type. + */ + final static class Jsii$Proxy extends software.amazon.jsii.JsiiObject implements software.amazon.jsii.tests.calculator.IJsii487External { + protected Jsii$Proxy(final software.amazon.jsii.JsiiObject.InitializationMode mode) { + super(mode); + } + } +} diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/Jsii487Derived.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/Jsii487Derived.java new file mode 100644 index 0000000000..5c8ed575b1 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/Jsii487Derived.java @@ -0,0 +1,13 @@ +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.Jsii487Derived") +public class Jsii487Derived extends software.amazon.jsii.JsiiObject implements software.amazon.jsii.tests.calculator.IJsii487External { + protected Jsii487Derived(final software.amazon.jsii.JsiiObject.InitializationMode mode) { + super(mode); + } + public Jsii487Derived() { + super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this); + } +} 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 36a13a26d8..3d822d8e48 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 @@ -1274,6 +1274,18 @@ def baz(self) -> None: return jsii.invoke(self, "baz", []) +@jsii.interface(jsii_type="jsii-calc.IJsii487External") +class IJsii487External(jsii.compat.Protocol): + @staticmethod + def __jsii_proxy_class__(): + return _IJsii487ExternalProxy + + pass + +class _IJsii487ExternalProxy(): + __jsii_type__ = "jsii-calc.IJsii487External" + pass + @jsii.interface(jsii_type="jsii-calc.IMutableObjectLiteral") class IMutableObjectLiteral(jsii.compat.Protocol): @staticmethod @@ -1955,6 +1967,12 @@ def while_(self, value: str): return jsii.set(self, "while", value) +@jsii.implements(IJsii487External) +class Jsii487Derived(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.Jsii487Derived"): + def __init__(self) -> None: + jsii.create(Jsii487Derived, self, []) + + class JsiiAgent(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.JsiiAgent"): """Host runtime version should be set via JSII_AGENT.""" def __init__(self) -> None: @@ -3272,6 +3290,6 @@ def parts(self, value: typing.List[scope.jsii_calc_lib.Value]): return jsii.set(self, "parts", value) -__all__ = ["AbstractClass", "AbstractClassBase", "AbstractClassReturner", "Add", "AllTypes", "AllTypesEnum", "AllowedMethodNames", "AsyncVirtualMethods", "AugmentableClass", "BinaryOperation", "Calculator", "CalculatorProps", "ClassThatImplementsTheInternalInterface", "ClassThatImplementsThePrivateInterface", "ClassWithDocs", "ClassWithMutableObjectLiteralProperty", "ClassWithPrivateConstructorAndAutomaticProperties", "ConstructorPassesThisOut", "Constructors", "ConsumersOfThisCrazyTypeSystem", "DefaultedConstructorArgument", "DerivedClassHasNoProperties", "DerivedStruct", "DoNotOverridePrivates", "DoNotRecognizeAnyAsOptional", "DocumentedClass", "DontComplainAboutVariadicAfterOptional", "DoubleTrouble", "EraseUndefinedHashValues", "EraseUndefinedHashValuesOptions", "ExportedBaseClass", "ExtendsInternalInterface", "GiveMeStructs", "Greetee", "GreetingAugmenter", "IAnotherPublicInterface", "IExtendsPrivateInterface", "IFriendlier", "IFriendlyRandomGenerator", "IInterfaceImplementedByAbstractClass", "IInterfaceThatShouldNotBeADataType", "IInterfaceWithInternal", "IInterfaceWithMethods", "IInterfaceWithOptionalMethodArguments", "IInterfaceWithProperties", "IInterfaceWithPropertiesExtension", "IJSII417Derived", "IJSII417PublicBaseOfBase", "IMutableObjectLiteral", "INonInternalInterface", "IPrivatelyImplemented", "IPublicInterface", "IPublicInterface2", "IRandomNumberGenerator", "IReturnsNumber", "ImplementInternalInterface", "ImplementsInterfaceWithInternal", "ImplementsInterfaceWithInternalSubclass", "ImplementsPrivateInterface", "ImplictBaseOfBase", "InbetweenClass", "InterfaceInNamespaceIncludesClasses", "InterfaceInNamespaceOnlyInterface", "JSII417Derived", "JSII417PublicBaseOfBase", "JSObjectLiteralForInterface", "JSObjectLiteralToNative", "JSObjectLiteralToNativeClass", "JavaReservedWords", "JsiiAgent", "LoadBalancedFargateServiceProps", "Multiply", "Negate", "NodeStandardLibrary", "NullShouldBeTreatedAsUndefined", "NullShouldBeTreatedAsUndefinedData", "NumberGenerator", "ObjectRefsInCollections", "Old", "OptionalConstructorArgument", "OptionalStruct", "OptionalStructConsumer", "OverrideReturnsObject", "PartiallyInitializedThisConsumer", "Polymorphism", "Power", "PublicClass", "PythonReservedWords", "ReferenceEnumFromScopedPackage", "ReturnsPrivateImplementationOfInterface", "RuntimeTypeChecking", "SingleInstanceTwoTypes", "StaticContext", "Statics", "StringEnum", "StripInternal", "Sum", "SyncVirtualMethods", "Thrower", "UnaryOperation", "UnionProperties", "UseBundledDependency", "UseCalcBase", "UsesInterfaceWithProperties", "VariadicMethod", "VirtualMethodPlayground", "VoidCallback", "__jsii_assembly__", "composition"] +__all__ = ["AbstractClass", "AbstractClassBase", "AbstractClassReturner", "Add", "AllTypes", "AllTypesEnum", "AllowedMethodNames", "AsyncVirtualMethods", "AugmentableClass", "BinaryOperation", "Calculator", "CalculatorProps", "ClassThatImplementsTheInternalInterface", "ClassThatImplementsThePrivateInterface", "ClassWithDocs", "ClassWithMutableObjectLiteralProperty", "ClassWithPrivateConstructorAndAutomaticProperties", "ConstructorPassesThisOut", "Constructors", "ConsumersOfThisCrazyTypeSystem", "DefaultedConstructorArgument", "DerivedClassHasNoProperties", "DerivedStruct", "DoNotOverridePrivates", "DoNotRecognizeAnyAsOptional", "DocumentedClass", "DontComplainAboutVariadicAfterOptional", "DoubleTrouble", "EraseUndefinedHashValues", "EraseUndefinedHashValuesOptions", "ExportedBaseClass", "ExtendsInternalInterface", "GiveMeStructs", "Greetee", "GreetingAugmenter", "IAnotherPublicInterface", "IExtendsPrivateInterface", "IFriendlier", "IFriendlyRandomGenerator", "IInterfaceImplementedByAbstractClass", "IInterfaceThatShouldNotBeADataType", "IInterfaceWithInternal", "IInterfaceWithMethods", "IInterfaceWithOptionalMethodArguments", "IInterfaceWithProperties", "IInterfaceWithPropertiesExtension", "IJSII417Derived", "IJSII417PublicBaseOfBase", "IJsii487External", "IMutableObjectLiteral", "INonInternalInterface", "IPrivatelyImplemented", "IPublicInterface", "IPublicInterface2", "IRandomNumberGenerator", "IReturnsNumber", "ImplementInternalInterface", "ImplementsInterfaceWithInternal", "ImplementsInterfaceWithInternalSubclass", "ImplementsPrivateInterface", "ImplictBaseOfBase", "InbetweenClass", "InterfaceInNamespaceIncludesClasses", "InterfaceInNamespaceOnlyInterface", "JSII417Derived", "JSII417PublicBaseOfBase", "JSObjectLiteralForInterface", "JSObjectLiteralToNative", "JSObjectLiteralToNativeClass", "JavaReservedWords", "Jsii487Derived", "JsiiAgent", "LoadBalancedFargateServiceProps", "Multiply", "Negate", "NodeStandardLibrary", "NullShouldBeTreatedAsUndefined", "NullShouldBeTreatedAsUndefinedData", "NumberGenerator", "ObjectRefsInCollections", "Old", "OptionalConstructorArgument", "OptionalStruct", "OptionalStructConsumer", "OverrideReturnsObject", "PartiallyInitializedThisConsumer", "Polymorphism", "Power", "PublicClass", "PythonReservedWords", "ReferenceEnumFromScopedPackage", "ReturnsPrivateImplementationOfInterface", "RuntimeTypeChecking", "SingleInstanceTwoTypes", "StaticContext", "Statics", "StringEnum", "StripInternal", "Sum", "SyncVirtualMethods", "Thrower", "UnaryOperation", "UnionProperties", "UseBundledDependency", "UseCalcBase", "UsesInterfaceWithProperties", "VariadicMethod", "VirtualMethodPlayground", "VoidCallback", "__jsii_assembly__", "composition"] publication.publish() diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst b/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst index 235d5b7150..70ee30a7b4 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst +++ b/packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst @@ -2819,6 +2819,35 @@ IJSII417PublicBaseOfBase (interface) :abstract: Yes +IJsii487External (interface) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. py:class:: IJsii487External + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.IJsii487External; + + .. code-tab:: javascript + + // IJsii487External is an interface + + .. code-tab:: typescript + + import { IJsii487External } from 'jsii-calc'; + + + + + IMutableObjectLiteral (interface) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3884,6 +3913,35 @@ JavaReservedWords :type: string +Jsii487Derived +^^^^^^^^^^^^^^ + +.. py:class:: Jsii487Derived() + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.Jsii487Derived; + + .. code-tab:: javascript + + const { Jsii487Derived } = require('jsii-calc'); + + .. code-tab:: typescript + + import { Jsii487Derived } from 'jsii-calc'; + + + + :implements: :py:class:`~jsii-calc.IJsii487External`\ + JsiiAgent ^^^^^^^^^ diff --git a/packages/jsii-reflect/test/classes.expected.txt b/packages/jsii-reflect/test/classes.expected.txt index 3c9c85b6c5..99422ecd6b 100644 --- a/packages/jsii-reflect/test/classes.expected.txt +++ b/packages/jsii-reflect/test/classes.expected.txt @@ -42,6 +42,7 @@ JSObjectLiteralForInterface JSObjectLiteralToNative JSObjectLiteralToNativeClass JavaReservedWords +Jsii487Derived JsiiAgent Multiply Negate diff --git a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt index 7e63e2b05a..8a8fdbddd2 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt @@ -635,6 +635,10 @@ assemblies │ │ │ └── returns: void │ │ └─┬ while property │ │ └── type: string + │ ├─┬ class Jsii487Derived + │ │ ├── interfaces: IJsii487External + │ │ └─┬ members + │ │ └── () initializer │ ├─┬ class JsiiAgent │ │ └─┬ members │ │ ├── () initializer @@ -1355,6 +1359,8 @@ assemblies │ │ ├── abstract │ │ ├── immutable │ │ └── type: boolean + │ ├─┬ interface IJsii487External + │ │ └── members │ ├─┬ interface IMutableObjectLiteral │ │ └─┬ members │ │ └─┬ value property diff --git a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt index 4891804cae..b7c104d770 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt @@ -59,6 +59,8 @@ assemblies │ ├── class JSObjectLiteralToNative │ ├── class JSObjectLiteralToNativeClass │ ├── class JavaReservedWords + │ ├─┬ class Jsii487Derived + │ │ └── interfaces: IJsii487External │ ├── class JsiiAgent │ ├─┬ class Multiply │ │ ├── base: BinaryOperation @@ -132,6 +134,7 @@ assemblies │ │ └─┬ interfaces │ │ └── IJSII417PublicBaseOfBase │ ├── interface IJSII417PublicBaseOfBase + │ ├── interface IJsii487External │ ├── interface IMutableObjectLiteral │ ├─┬ interface INonInternalInterface │ │ └─┬ interfaces diff --git a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt index b444edc34e..88cd99206a 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt @@ -295,6 +295,9 @@ assemblies │ │ ├── void() method │ │ ├── volatile() method │ │ └── while property + │ ├─┬ class Jsii487Derived + │ │ └─┬ members + │ │ └── () initializer │ ├─┬ class JsiiAgent │ │ └─┬ members │ │ ├── () initializer @@ -595,6 +598,8 @@ assemblies │ │ └─┬ members │ │ ├── foo() method │ │ └── hasRoot property + │ ├─┬ interface IJsii487External + │ │ └── members │ ├─┬ interface IMutableObjectLiteral │ │ └─┬ members │ │ └── value property diff --git a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt index f41abfa98c..546de865c0 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt @@ -43,6 +43,7 @@ assemblies │ ├── class JSObjectLiteralToNative │ ├── class JSObjectLiteralToNativeClass │ ├── class JavaReservedWords + │ ├── class Jsii487Derived │ ├── class JsiiAgent │ ├── class Multiply │ ├── class Negate @@ -95,6 +96,7 @@ assemblies │ ├── interface IInterfaceWithPropertiesExtension │ ├── interface IJSII417Derived │ ├── interface IJSII417PublicBaseOfBase + │ ├── interface IJsii487External │ ├── interface IMutableObjectLiteral │ ├── interface INonInternalInterface │ ├── interface IPrivatelyImplemented diff --git a/packages/jsii/lib/assembler.ts b/packages/jsii/lib/assembler.ts index 88a70aa9b4..e5dddb001d 100644 --- a/packages/jsii/lib/assembler.ts +++ b/packages/jsii/lib/assembler.ts @@ -450,10 +450,11 @@ export class Assembler implements Emitter { continue; } - /* - * Crawl up the inheritance tree if the current base type is not exported, so we identify the type(s) to be - * erased, and identify the closest exported base class, should there be one. - */ + // + // base classes ("extends foo") + + // Crawl up the inheritance tree if the current base type is not exported, so we identify the type(s) to be + // erased, and identify the closest exported base class, should there be one. // tslint:disable-next-line: no-bitwise while (base && this._isPrivateOrInternal(base.symbol)) { LOG.debug(`Base class of ${colors.green(jsiiType.fqn)} named ${colors.green(base.symbol.name)} is not exported, erasing it...`); @@ -482,15 +483,29 @@ export class Assembler implements Emitter { }); jsiiType.base = ref.fqn; } - for (const clause of (type.symbol.valueDeclaration as ts.ClassDeclaration).heritageClauses || []) { - if (clause.token === ts.SyntaxKind.ExtendsKeyword) { - // Handled by `getBaseTypes` - continue; - } else if (clause.token !== ts.SyntaxKind.ImplementsKeyword) { - this._diagnostic(clause, ts.DiagnosticCategory.Error, `Ignoring ${ts.SyntaxKind[clause.token]} heritage clause`); - continue; + + // + // base interfaces ("implements foo") + + // collect all "implements" declarations from the current type and all + // erased base types (because otherwise we lose them, see jsii#487) + const implementsClauses = new Array(); + for (const heritage of [ type, ...erasedBases ].map(t => (t.symbol.valueDeclaration as ts.ClassDeclaration).heritageClauses || [])) { + for (const clause of heritage) { + if (clause.token === ts.SyntaxKind.ExtendsKeyword) { + // Handled by `getBaseTypes` + continue; + } else if (clause.token !== ts.SyntaxKind.ImplementsKeyword) { + this._diagnostic(clause, ts.DiagnosticCategory.Error, `Ignoring ${ts.SyntaxKind[clause.token]} heritage clause`); + continue; + } + + implementsClauses.push(clause); } + } + // process all "implements" clauses + for (const clause of implementsClauses) { const { interfaces } = await this._processBaseInterfaces(fqn, clause.types.map(t => this._typeChecker.getTypeFromTypeNode(t))); jsiiType.interfaces = apply(interfaces, arr => arr.map(i => i.fqn)); if (interfaces) { @@ -512,7 +527,8 @@ export class Assembler implements Emitter { const allDeclarations: Array<{ decl: ts.Declaration, type: ts.InterfaceType | ts.BaseType }> = type.symbol.declarations.map(decl => ({ decl, type })); - // Considering erased bases' declarations, too, so they are "blended in" + + // Considering erased bases' declarations, too, so they are "blended in" for (const base of erasedBases) { allDeclarations.push(...base.symbol.declarations.map(decl => ({ decl, type: base }))); }