diff --git a/packages/jsii-calc/lib/compliance.ts b/packages/jsii-calc/lib/compliance.ts index a01d9808a1..07b94a07da 100644 --- a/packages/jsii-calc/lib/compliance.ts +++ b/packages/jsii-calc/lib/compliance.ts @@ -1635,4 +1635,31 @@ export interface OptionalStruct { * @stable */ export class ClassWithDocs { -} \ No newline at end of file +} + +/** + * This is used to validate the ability to use `this` from within a static context. + * + * https://github.com/awslabs/aws-cdk/issues/2304 + */ +export class StaticContext { + private static _staticVariable = true; + + public static canAccessStaticContext(): boolean { + return this.staticContextAvailable(); + } + + private static staticContextAvailable() { + return true; + } + + public static get staticVariable() { + return this._staticVariable; + } + + public static set staticVariable(value: boolean) { + this._staticVariable = value; + } + + private constructor() { } +} diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index 658c2d8cf7..63b7d1bbe7 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -5597,6 +5597,48 @@ ], "name": "SingleInstanceTwoTypes" }, + "jsii-calc.StaticContext": { + "assembly": "jsii-calc", + "docs": { + "remarks": "https://github.com/awslabs/aws-cdk/issues/2304", + "summary": "This is used to validate the ability to use `this` from within a static context." + }, + "fqn": "jsii-calc.StaticContext", + "kind": "class", + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 1645 + }, + "methods": [ + { + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 1648 + }, + "name": "canAccessStaticContext", + "returns": { + "type": { + "primitive": "boolean" + } + }, + "static": true + } + ], + "name": "StaticContext", + "properties": [ + { + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 1656 + }, + "name": "staticVariable", + "static": true, + "type": { + "primitive": "boolean" + } + } + ] + }, "jsii-calc.Statics": { "assembly": "jsii-calc", "fqn": "jsii-calc.Statics", @@ -6655,5 +6697,5 @@ } }, "version": "0.9.0", - "fingerprint": "rheLw7bhMAmuMfbnzQ4tXZyQTSYIydCp59wiBfA8Gpo=" + "fingerprint": "7Kv5qQOHJ4CtCTKoLfaavS4jHjk/HJvT6aWOIZAHTvw=" } diff --git a/packages/jsii-kernel/lib/kernel.ts b/packages/jsii-kernel/lib/kernel.ts index 5a1d54589b..3c50fd4a48 100644 --- a/packages/jsii-kernel/lib/kernel.ts +++ b/packages/jsii-kernel/lib/kernel.ts @@ -269,10 +269,10 @@ export class Kernel { } const prototype = this._findSymbol(fqn); - const fn = prototype[method]; + const fn = prototype[method] as (...params: any[]) => any; const ret = this._ensureSync(`method '${fqn}.${method}'`, () => { - return this._wrapSandboxCode(() => fn.apply(null, this._toSandboxValues(args, ti.parameters))); + return this._wrapSandboxCode(() => fn.apply(prototype, this._toSandboxValues(args, ti.parameters))); }); this._debug('method returned:', ret); diff --git a/packages/jsii-kernel/test/test.kernel.ts b/packages/jsii-kernel/test/test.kernel.ts index 37d67c9927..cac631a623 100644 --- a/packages/jsii-kernel/test/test.kernel.ts +++ b/packages/jsii-kernel/test/test.kernel.ts @@ -996,6 +996,31 @@ defineTest('ObjRefs are labeled with the "most correct" type', async (test, sand } }); +/** + * This is used to validate the ability to use `this` from within a static context. + * + * https://github.com/awslabs/aws-cdk/issues/2304 + */ +defineTest('sinvoke allows access to the static context', async (test, sandbox) => { + test.doesNotThrow(() => { + const response = sandbox.sinvoke({ fqn: 'jsii-calc.StaticContext', method: 'canAccessStaticContext' }); + test.ok(response.result, 'The result should be true'); + }); +}); +defineTest('sget allows access to the static context', async (test, sandbox) => { + test.doesNotThrow(() => { + const response = sandbox.sget({ fqn: 'jsii-calc.StaticContext', property: 'staticVariable' }); + test.ok(response.value, 'The result should be true'); + }); +}); +defineTest('sset allows access to the static context', async (test, sandbox) => { + test.doesNotThrow(() => { + sandbox.sset({ fqn: 'jsii-calc.StaticContext', property: 'staticVariable', value: false }); + const response = sandbox.sget({ fqn: 'jsii-calc.StaticContext', property: 'staticVariable' }); + test.ok(!response.value, 'The result should be true'); + }); +}); + /* Test currently disabled because we don't have the infrastructure to make it pass. 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 658c2d8cf7..63b7d1bbe7 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 @@ -5597,6 +5597,48 @@ ], "name": "SingleInstanceTwoTypes" }, + "jsii-calc.StaticContext": { + "assembly": "jsii-calc", + "docs": { + "remarks": "https://github.com/awslabs/aws-cdk/issues/2304", + "summary": "This is used to validate the ability to use `this` from within a static context." + }, + "fqn": "jsii-calc.StaticContext", + "kind": "class", + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 1645 + }, + "methods": [ + { + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 1648 + }, + "name": "canAccessStaticContext", + "returns": { + "type": { + "primitive": "boolean" + } + }, + "static": true + } + ], + "name": "StaticContext", + "properties": [ + { + "locationInModule": { + "filename": "lib/compliance.ts", + "line": 1656 + }, + "name": "staticVariable", + "static": true, + "type": { + "primitive": "boolean" + } + } + ] + }, "jsii-calc.Statics": { "assembly": "jsii-calc", "fqn": "jsii-calc.Statics", @@ -6655,5 +6697,5 @@ } }, "version": "0.9.0", - "fingerprint": "rheLw7bhMAmuMfbnzQ4tXZyQTSYIydCp59wiBfA8Gpo=" + "fingerprint": "7Kv5qQOHJ4CtCTKoLfaavS4jHjk/HJvT6aWOIZAHTvw=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/StaticContext.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/StaticContext.cs new file mode 100644 index 0000000000..1e578afb91 --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/StaticContext.cs @@ -0,0 +1,31 @@ +using Amazon.JSII.Runtime.Deputy; + +namespace Amazon.JSII.Tests.CalculatorNamespace +{ + /// This is used to validate the ability to use `this` from within a static context. + /// https://github.com/awslabs/aws-cdk/issues/2304 + [JsiiClass(nativeType: typeof(StaticContext), fullyQualifiedName: "jsii-calc.StaticContext")] + public class StaticContext : DeputyBase + { + protected StaticContext(ByRefValue reference): base(reference) + { + } + + protected StaticContext(DeputyProps props): base(props) + { + } + + [JsiiProperty(name: "staticVariable", typeJson: "{\"primitive\":\"boolean\"}")] + public static bool StaticVariable + { + get => GetStaticProperty(typeof(StaticContext)); + set => SetStaticProperty(typeof(StaticContext), value); + } + + [JsiiMethod(name: "canAccessStaticContext", returnsJson: "{\"type\":{\"primitive\":\"boolean\"}}")] + public static bool CanAccessStaticContext() + { + return InvokeStaticMethod(typeof(StaticContext), new object[]{}); + } + } +} \ 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 f9ebbbc92d..689c74027f 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 @@ -112,6 +112,7 @@ protected Class resolveClass(final String fqn) throws ClassNotFoundException case "jsii-calc.ReturnsPrivateImplementationOfInterface": return software.amazon.jsii.tests.calculator.ReturnsPrivateImplementationOfInterface.class; case "jsii-calc.RuntimeTypeChecking": return software.amazon.jsii.tests.calculator.RuntimeTypeChecking.class; case "jsii-calc.SingleInstanceTwoTypes": return software.amazon.jsii.tests.calculator.SingleInstanceTwoTypes.class; + case "jsii-calc.StaticContext": return software.amazon.jsii.tests.calculator.StaticContext.class; case "jsii-calc.Statics": return software.amazon.jsii.tests.calculator.Statics.class; case "jsii-calc.StringEnum": return software.amazon.jsii.tests.calculator.StringEnum.class; case "jsii-calc.StripInternal": return software.amazon.jsii.tests.calculator.StripInternal.class; diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/StaticContext.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/StaticContext.java new file mode 100644 index 0000000000..d5047c2e3a --- /dev/null +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/StaticContext.java @@ -0,0 +1,26 @@ +package software.amazon.jsii.tests.calculator; + +/** + * This is used to validate the ability to use `this` from within a static context. + * + * https://github.com/awslabs/aws-cdk/issues/2304 + */ +@javax.annotation.Generated(value = "jsii-pacmak") +@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.StaticContext") +public class StaticContext extends software.amazon.jsii.JsiiObject { + protected StaticContext(final software.amazon.jsii.JsiiObject.InitializationMode mode) { + super(mode); + } + + public static java.lang.Boolean canAccessStaticContext() { + return software.amazon.jsii.JsiiObject.jsiiStaticCall(software.amazon.jsii.tests.calculator.StaticContext.class, "canAccessStaticContext", java.lang.Boolean.class); + } + + public static java.lang.Boolean getStaticVariable() { + return software.amazon.jsii.JsiiObject.jsiiStaticGet(software.amazon.jsii.tests.calculator.StaticContext.class, "staticVariable", java.lang.Boolean.class); + } + + public static void setStaticVariable(final java.lang.Boolean value) { + software.amazon.jsii.JsiiObject.jsiiStaticSet(software.amazon.jsii.tests.calculator.StaticContext.class, "staticVariable", java.util.Objects.requireNonNull(value, "staticVariable is required")); + } +} 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 516aecddb7..31bc290849 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 @@ -2128,6 +2128,22 @@ def interface2(self) -> "IPublicInterface": return jsii.invoke(self, "interface2", []) +class StaticContext(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.StaticContext"): + @jsii.member(jsii_name="canAccessStaticContext") + @classmethod + def can_access_static_context(cls) -> bool: + return jsii.sinvoke(cls, "canAccessStaticContext", []) + + @classproperty + @jsii.member(jsii_name="staticVariable") + def static_variable(cls) -> bool: + return jsii.sget(cls, "staticVariable") + + @static_variable.setter + def static_variable(cls, value: bool): + return jsii.sset(cls, "staticVariable", value) + + class Statics(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.Statics"): def __init__(self, value: str) -> None: jsii.create(Statics, self, [value]) @@ -2613,6 +2629,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", "Statics", "StringEnum", "StripInternal", "Sum", "SyncVirtualMethods", "Thrower", "UnaryOperation", "UnionProperties", "UseBundledDependency", "UseCalcBase", "UsesInterfaceWithProperties", "VariadicMethod", "VirtualMethodPlayground", "__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", "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", "__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 f169148b62..4ca83625bb 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 @@ -5344,6 +5344,52 @@ SingleInstanceTwoTypes :rtype: :py:class:`~jsii-calc.IPublicInterface`\ +StaticContext +^^^^^^^^^^^^^ + +.. py:class:: StaticContext + + **Language-specific names:** + + .. tabs:: + + .. code-tab:: c# + + using Amazon.JSII.Tests.CalculatorNamespace; + + .. code-tab:: java + + import software.amazon.jsii.tests.calculator.StaticContext; + + .. code-tab:: javascript + + const { StaticContext } = require('jsii-calc'); + + .. code-tab:: typescript + + import { StaticContext } from 'jsii-calc'; + + + + This is used to validate the ability to use `this` from within a static context. + + + + https://github.com/awslabs/aws-cdk/issues/2304 + + + + + .. py:staticmethod:: canAccessStaticContext() -> boolean + + :rtype: boolean + + + .. py:attribute:: staticVariable + + :type: boolean *(static)* + + Statics ^^^^^^^ diff --git a/packages/jsii-reflect/test/classes.expected.txt b/packages/jsii-reflect/test/classes.expected.txt index 30732595bf..d039b6e8a5 100644 --- a/packages/jsii-reflect/test/classes.expected.txt +++ b/packages/jsii-reflect/test/classes.expected.txt @@ -64,6 +64,7 @@ ReferenceEnumFromScopedPackage ReturnsPrivateImplementationOfInterface RuntimeTypeChecking SingleInstanceTwoTypes +StaticContext Statics StripInternal Sum 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 9bfbe206ef..d8587b00ee 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.all.expected.txt @@ -950,6 +950,14 @@ assemblies │ │ │ └── returns: jsii-calc.InbetweenClass │ │ └─┬ interface2() method │ │ └── returns: jsii-calc.IPublicInterface + │ ├─┬ class StaticContext + │ │ └─┬ members + │ │ ├─┬ canAccessStaticContext() method + │ │ │ ├── static + │ │ │ └── returns: boolean + │ │ └─┬ staticVariable property + │ │ ├── static + │ │ └── type: boolean │ ├─┬ class Statics │ │ └─┬ members │ │ ├─┬ (value) initializer 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 b7da2ff226..092c21aec5 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.inheritance.expected.txt @@ -84,6 +84,7 @@ assemblies │ ├── class ReturnsPrivateImplementationOfInterface │ ├── class RuntimeTypeChecking │ ├── class SingleInstanceTwoTypes + │ ├── class StaticContext │ ├── class Statics │ ├── class StripInternal │ ├─┬ class Sum 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 dfc2fcdca2..116a745a73 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.members.expected.txt @@ -433,6 +433,10 @@ assemblies │ │ ├── () initializer │ │ ├── interface1() method │ │ └── interface2() method + │ ├─┬ class StaticContext + │ │ └─┬ members + │ │ ├── canAccessStaticContext() method + │ │ └── staticVariable property │ ├─┬ class Statics │ │ └─┬ members │ │ ├── (value) initializer 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 36e05ae539..d12ec07943 100644 --- a/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt +++ b/packages/jsii-reflect/test/jsii-tree.test.types.expected.txt @@ -63,6 +63,7 @@ assemblies │ ├── class ReturnsPrivateImplementationOfInterface │ ├── class RuntimeTypeChecking │ ├── class SingleInstanceTwoTypes + │ ├── class StaticContext │ ├── class Statics │ ├── class StripInternal │ ├── class Sum