Skip to content

Commit 5af84b6

Browse files
Elad Ben-IsraelRomainMuller
andauthored
fix: copy non-hidden bases when erasing hidden interfaces (#392)
When a type inherits (extends/implements) from a hidden (private/internal) interface, and that interface extends a non-hidden interface, we need to copy the non-hidden interface to the consuming type so that it can be polymorphically used. Follow up on #390 Co-authored-by: RomainMuller <rmuller@amazon.com>
1 parent e232cb5 commit 5af84b6

26 files changed

+1163
-63
lines changed

packages/jsii-calc/lib/compliance.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,3 +1424,55 @@ export class ImplementsPrivateInterface implements IPrivateInterface {
14241424
export interface ExtendsPrivateInterface extends IPrivateInterface {
14251425
moreThings: string[];
14261426
}
1427+
1428+
//
1429+
// hidden (private/internal) base interface erasure will copy non-hidden bases from
1430+
// hidden to consuming type.
1431+
//
1432+
1433+
export interface IAnotherPublicInterface {
1434+
a: string;
1435+
1436+
}
1437+
1438+
/** @internal */
1439+
export interface IAnotherInternalInterface extends IAnotherPublicInterface {
1440+
b: string;
1441+
}
1442+
1443+
export interface INonInternalInterface extends IAnotherInternalInterface {
1444+
c: string;
1445+
}
1446+
1447+
/** @internal */
1448+
export interface IInternalInterfaceThatExtendsTheNonInternalOne extends INonInternalInterface {
1449+
d: string;
1450+
}
1451+
1452+
interface IPrivateInterfaceThatExtendsTheNonInternalOne extends INonInternalInterface {
1453+
e: string;
1454+
}
1455+
1456+
export class ClassThatImplementsTheInternalInterface implements IInternalInterfaceThatExtendsTheNonInternalOne, INonInternalInterface {
1457+
public a = 'a';
1458+
public b = 'b';
1459+
public c = 'c';
1460+
public d = 'd';
1461+
}
1462+
1463+
export class ClassThatImplementsThePrivateInterface implements IPrivateInterfaceThatExtendsTheNonInternalOne {
1464+
public a = 'a';
1465+
public b = 'b';
1466+
public c = 'c';
1467+
public e = 'e';
1468+
}
1469+
1470+
export class ConsumersOfThisCrazyTypeSystem {
1471+
public consumeAnotherPublicInterface(obj: IAnotherPublicInterface) {
1472+
return obj.a;
1473+
}
1474+
1475+
public consumeNonInternalInterface(obj: INonInternalInterface): any {
1476+
return { a: obj.a, b: obj.b, c: obj.c };
1477+
}
1478+
}

packages/jsii-calc/test/assembly.jsii

Lines changed: 167 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,98 @@
10401040
}
10411041
]
10421042
},
1043+
"jsii-calc.ClassThatImplementsTheInternalInterface": {
1044+
"assembly": "jsii-calc",
1045+
"fqn": "jsii-calc.ClassThatImplementsTheInternalInterface",
1046+
"initializer": {
1047+
"initializer": true
1048+
},
1049+
"interfaces": [
1050+
{
1051+
"fqn": "jsii-calc.INonInternalInterface"
1052+
}
1053+
],
1054+
"kind": "class",
1055+
"name": "ClassThatImplementsTheInternalInterface",
1056+
"properties": [
1057+
{
1058+
"name": "a",
1059+
"overrides": {
1060+
"fqn": "jsii-calc.IAnotherPublicInterface"
1061+
},
1062+
"type": {
1063+
"primitive": "string"
1064+
}
1065+
},
1066+
{
1067+
"name": "b",
1068+
"type": {
1069+
"primitive": "string"
1070+
}
1071+
},
1072+
{
1073+
"name": "c",
1074+
"overrides": {
1075+
"fqn": "jsii-calc.INonInternalInterface"
1076+
},
1077+
"type": {
1078+
"primitive": "string"
1079+
}
1080+
},
1081+
{
1082+
"name": "d",
1083+
"type": {
1084+
"primitive": "string"
1085+
}
1086+
}
1087+
]
1088+
},
1089+
"jsii-calc.ClassThatImplementsThePrivateInterface": {
1090+
"assembly": "jsii-calc",
1091+
"fqn": "jsii-calc.ClassThatImplementsThePrivateInterface",
1092+
"initializer": {
1093+
"initializer": true
1094+
},
1095+
"interfaces": [
1096+
{
1097+
"fqn": "jsii-calc.INonInternalInterface"
1098+
}
1099+
],
1100+
"kind": "class",
1101+
"name": "ClassThatImplementsThePrivateInterface",
1102+
"properties": [
1103+
{
1104+
"name": "a",
1105+
"overrides": {
1106+
"fqn": "jsii-calc.IAnotherPublicInterface"
1107+
},
1108+
"type": {
1109+
"primitive": "string"
1110+
}
1111+
},
1112+
{
1113+
"name": "b",
1114+
"type": {
1115+
"primitive": "string"
1116+
}
1117+
},
1118+
{
1119+
"name": "c",
1120+
"overrides": {
1121+
"fqn": "jsii-calc.INonInternalInterface"
1122+
},
1123+
"type": {
1124+
"primitive": "string"
1125+
}
1126+
},
1127+
{
1128+
"name": "e",
1129+
"type": {
1130+
"primitive": "string"
1131+
}
1132+
}
1133+
]
1134+
},
10431135
"jsii-calc.ClassWithMutableObjectLiteralProperty": {
10441136
"assembly": "jsii-calc",
10451137
"fqn": "jsii-calc.ClassWithMutableObjectLiteralProperty",
@@ -1140,6 +1232,45 @@
11401232
],
11411233
"name": "Constructors"
11421234
},
1235+
"jsii-calc.ConsumersOfThisCrazyTypeSystem": {
1236+
"assembly": "jsii-calc",
1237+
"fqn": "jsii-calc.ConsumersOfThisCrazyTypeSystem",
1238+
"initializer": {
1239+
"initializer": true
1240+
},
1241+
"kind": "class",
1242+
"methods": [
1243+
{
1244+
"name": "consumeAnotherPublicInterface",
1245+
"parameters": [
1246+
{
1247+
"name": "obj",
1248+
"type": {
1249+
"fqn": "jsii-calc.IAnotherPublicInterface"
1250+
}
1251+
}
1252+
],
1253+
"returns": {
1254+
"primitive": "string"
1255+
}
1256+
},
1257+
{
1258+
"name": "consumeNonInternalInterface",
1259+
"parameters": [
1260+
{
1261+
"name": "obj",
1262+
"type": {
1263+
"fqn": "jsii-calc.INonInternalInterface"
1264+
}
1265+
}
1266+
],
1267+
"returns": {
1268+
"primitive": "any"
1269+
}
1270+
}
1271+
],
1272+
"name": "ConsumersOfThisCrazyTypeSystem"
1273+
},
11431274
"jsii-calc.DefaultedConstructorArgument": {
11441275
"assembly": "jsii-calc",
11451276
"fqn": "jsii-calc.DefaultedConstructorArgument",
@@ -1611,6 +1742,21 @@
16111742
],
16121743
"name": "GreetingAugmenter"
16131744
},
1745+
"jsii-calc.IAnotherPublicInterface": {
1746+
"assembly": "jsii-calc",
1747+
"fqn": "jsii-calc.IAnotherPublicInterface",
1748+
"kind": "interface",
1749+
"name": "IAnotherPublicInterface",
1750+
"properties": [
1751+
{
1752+
"abstract": true,
1753+
"name": "a",
1754+
"type": {
1755+
"primitive": "string"
1756+
}
1757+
}
1758+
]
1759+
},
16141760
"jsii-calc.IFriendlier": {
16151761
"assembly": "jsii-calc",
16161762
"docs": {
@@ -1750,6 +1896,26 @@
17501896
],
17511897
"name": "IInterfaceWithOptionalMethodArguments"
17521898
},
1899+
"jsii-calc.INonInternalInterface": {
1900+
"assembly": "jsii-calc",
1901+
"fqn": "jsii-calc.INonInternalInterface",
1902+
"interfaces": [
1903+
{
1904+
"fqn": "jsii-calc.IAnotherPublicInterface"
1905+
}
1906+
],
1907+
"kind": "interface",
1908+
"name": "INonInternalInterface",
1909+
"properties": [
1910+
{
1911+
"abstract": true,
1912+
"name": "c",
1913+
"type": {
1914+
"primitive": "string"
1915+
}
1916+
}
1917+
]
1918+
},
17531919
"jsii-calc.IPrivatelyImplemented": {
17541920
"assembly": "jsii-calc",
17551921
"fqn": "jsii-calc.IPrivatelyImplemented",
@@ -4083,5 +4249,5 @@
40834249
}
40844250
},
40854251
"version": "0.7.15",
4086-
"fingerprint": "iMxRj3lsHKNzSiBrjCyBH6Pp7Uvo+1Sxh/jN3hW+3nA="
4252+
"fingerprint": "y7h6OQBzbQrvU43LHTizXl12OUAEOpXhqD02OJfmhWQ="
40874253
}

0 commit comments

Comments
 (0)