Skip to content

Commit afbabff

Browse files
authored
feat(jsii): Erase un-exported base interfaces instead of prohibiting those (#426)
The previous version of interface erasure simply replaced un-exported interfaces with whatever their exported bases were (if any), but did not merge declarations of un-exported types into the exported ones. This merges declarations from the erased interfaces into the exported interface, and ignores any re-declaration that is hidden by an existing declaration in the exported type, or another erased interface. Fixes #417
1 parent d006f5c commit afbabff

34 files changed

+888
-216
lines changed

packages/jsii-calc/lib/compliance.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,8 +1464,8 @@ export class InternalClass {
14641464
/**
14651465
* @internal
14661466
*/
1467-
export interface IInternalInterface {
1468-
prop: string;
1467+
export interface InternalInterface {
1468+
readonly prop: string;
14691469
}
14701470

14711471
/**
@@ -1516,19 +1516,19 @@ interface IPrivateInterface {
15161516
private: string;
15171517
}
15181518

1519-
export interface ExtendsInternalInterface extends IInternalInterface {
1519+
export interface ExtendsInternalInterface extends InternalInterface {
15201520
readonly boom: boolean
15211521
}
15221522

1523-
export class ImplementInternalInterface implements IInternalInterface {
1523+
export class ImplementInternalInterface implements InternalInterface {
15241524
prop = 'implement me'
15251525
}
15261526

15271527
export class ImplementsPrivateInterface implements IPrivateInterface {
15281528
public private = 'i came from private into the light'
15291529
}
15301530

1531-
export interface ExtendsPrivateInterface extends IPrivateInterface {
1531+
export interface IExtendsPrivateInterface extends IPrivateInterface {
15321532
readonly moreThings: string[];
15331533
}
15341534

packages/jsii-calc/lib/erasures.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,17 @@ export class JSII417Derived extends JSII417PrivateBase {
2323
}
2424
public baz() { return; }
2525
}
26+
// Same thing with interfaces
27+
interface IJSII417PrivateRoot {
28+
readonly hasRoot: boolean;
29+
}
30+
export interface IJSII417PublicBaseOfBase extends IJSII417PrivateRoot {
31+
foo(): void;
32+
}
33+
interface IJSII417PrivateBase extends IJSII417PublicBaseOfBase {
34+
readonly property: string;
35+
bar(): void;
36+
}
37+
export interface IJSII417Derived extends IJSII417PrivateBase {
38+
baz(): void;
39+
}

packages/jsii-calc/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
"scripts": {
3131
"build": "jsii",
3232
"watch": "jsii -w",
33-
"test": "node test/test.calc.js && diff-test test/assembly.jsii .jsii"
33+
"test": "node test/test.calc.js && diff-test test/assembly.jsii .jsii",
34+
"test:update": "npm run build && UPDATE_DIFF=1 npm run test"
3435
},
3536
"bundledDependencies": [
3637
"jsii-calc-bundled"

packages/jsii-calc/test/assembly.jsii

Lines changed: 98 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,9 @@
11351135
},
11361136
{
11371137
"name": "b",
1138+
"overrides": {
1139+
"fqn": "jsii-calc.INonInternalInterface"
1140+
},
11381141
"type": {
11391142
"primitive": "string"
11401143
}
@@ -1181,6 +1184,9 @@
11811184
},
11821185
{
11831186
"name": "b",
1187+
"overrides": {
1188+
"fqn": "jsii-calc.INonInternalInterface"
1189+
},
11841190
"type": {
11851191
"primitive": "string"
11861192
}
@@ -1895,27 +1901,13 @@
18951901
"type": {
18961902
"primitive": "boolean"
18971903
}
1898-
}
1899-
]
1900-
},
1901-
"jsii-calc.ExtendsPrivateInterface": {
1902-
"assembly": "jsii-calc",
1903-
"datatype": true,
1904-
"fqn": "jsii-calc.ExtendsPrivateInterface",
1905-
"kind": "interface",
1906-
"name": "ExtendsPrivateInterface",
1907-
"properties": [
1904+
},
19081905
{
19091906
"abstract": true,
19101907
"immutable": true,
1911-
"name": "moreThings",
1908+
"name": "prop",
19121909
"type": {
1913-
"collection": {
1914-
"elementtype": {
1915-
"primitive": "string"
1916-
},
1917-
"kind": "array"
1918-
}
1910+
"primitive": "string"
19191911
}
19201912
}
19211913
]
@@ -2056,6 +2048,34 @@
20562048
}
20572049
]
20582050
},
2051+
"jsii-calc.IExtendsPrivateInterface": {
2052+
"assembly": "jsii-calc",
2053+
"fqn": "jsii-calc.IExtendsPrivateInterface",
2054+
"kind": "interface",
2055+
"name": "IExtendsPrivateInterface",
2056+
"properties": [
2057+
{
2058+
"abstract": true,
2059+
"immutable": true,
2060+
"name": "moreThings",
2061+
"type": {
2062+
"collection": {
2063+
"elementtype": {
2064+
"primitive": "string"
2065+
},
2066+
"kind": "array"
2067+
}
2068+
}
2069+
},
2070+
{
2071+
"abstract": true,
2072+
"name": "private",
2073+
"type": {
2074+
"primitive": "string"
2075+
}
2076+
}
2077+
]
2078+
},
20592079
"jsii-calc.IFriendlier": {
20602080
"assembly": "jsii-calc",
20612081
"docs": {
@@ -2257,6 +2277,59 @@
22572277
}
22582278
]
22592279
},
2280+
"jsii-calc.IJSII417Derived": {
2281+
"assembly": "jsii-calc",
2282+
"fqn": "jsii-calc.IJSII417Derived",
2283+
"interfaces": [
2284+
{
2285+
"fqn": "jsii-calc.IJSII417PublicBaseOfBase"
2286+
}
2287+
],
2288+
"kind": "interface",
2289+
"methods": [
2290+
{
2291+
"abstract": true,
2292+
"name": "bar"
2293+
},
2294+
{
2295+
"abstract": true,
2296+
"name": "baz"
2297+
}
2298+
],
2299+
"name": "IJSII417Derived",
2300+
"properties": [
2301+
{
2302+
"abstract": true,
2303+
"immutable": true,
2304+
"name": "property",
2305+
"type": {
2306+
"primitive": "string"
2307+
}
2308+
}
2309+
]
2310+
},
2311+
"jsii-calc.IJSII417PublicBaseOfBase": {
2312+
"assembly": "jsii-calc",
2313+
"fqn": "jsii-calc.IJSII417PublicBaseOfBase",
2314+
"kind": "interface",
2315+
"methods": [
2316+
{
2317+
"abstract": true,
2318+
"name": "foo"
2319+
}
2320+
],
2321+
"name": "IJSII417PublicBaseOfBase",
2322+
"properties": [
2323+
{
2324+
"abstract": true,
2325+
"immutable": true,
2326+
"name": "hasRoot",
2327+
"type": {
2328+
"primitive": "boolean"
2329+
}
2330+
}
2331+
]
2332+
},
22602333
"jsii-calc.IMutableObjectLiteral": {
22612334
"assembly": "jsii-calc",
22622335
"fqn": "jsii-calc.IMutableObjectLiteral",
@@ -2283,6 +2356,13 @@
22832356
"kind": "interface",
22842357
"name": "INonInternalInterface",
22852358
"properties": [
2359+
{
2360+
"abstract": true,
2361+
"name": "b",
2362+
"type": {
2363+
"primitive": "string"
2364+
}
2365+
},
22862366
{
22872367
"abstract": true,
22882368
"name": "c",
@@ -4800,5 +4880,5 @@
48004880
}
48014881
},
48024882
"version": "0.8.2",
4803-
"fingerprint": "5kMI3UzT9N2sovIndhAmSefEqtrUStnpb0hmWwfLjOs="
4883+
"fingerprint": "WJgwH2kAeJLVBMQx/Ek9JLty5tmfiy5sHAz0T8eMX7o="
48044884
}

packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii

Lines changed: 98 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,9 @@
11351135
},
11361136
{
11371137
"name": "b",
1138+
"overrides": {
1139+
"fqn": "jsii-calc.INonInternalInterface"
1140+
},
11381141
"type": {
11391142
"primitive": "string"
11401143
}
@@ -1181,6 +1184,9 @@
11811184
},
11821185
{
11831186
"name": "b",
1187+
"overrides": {
1188+
"fqn": "jsii-calc.INonInternalInterface"
1189+
},
11841190
"type": {
11851191
"primitive": "string"
11861192
}
@@ -1895,27 +1901,13 @@
18951901
"type": {
18961902
"primitive": "boolean"
18971903
}
1898-
}
1899-
]
1900-
},
1901-
"jsii-calc.ExtendsPrivateInterface": {
1902-
"assembly": "jsii-calc",
1903-
"datatype": true,
1904-
"fqn": "jsii-calc.ExtendsPrivateInterface",
1905-
"kind": "interface",
1906-
"name": "ExtendsPrivateInterface",
1907-
"properties": [
1904+
},
19081905
{
19091906
"abstract": true,
19101907
"immutable": true,
1911-
"name": "moreThings",
1908+
"name": "prop",
19121909
"type": {
1913-
"collection": {
1914-
"elementtype": {
1915-
"primitive": "string"
1916-
},
1917-
"kind": "array"
1918-
}
1910+
"primitive": "string"
19191911
}
19201912
}
19211913
]
@@ -2056,6 +2048,34 @@
20562048
}
20572049
]
20582050
},
2051+
"jsii-calc.IExtendsPrivateInterface": {
2052+
"assembly": "jsii-calc",
2053+
"fqn": "jsii-calc.IExtendsPrivateInterface",
2054+
"kind": "interface",
2055+
"name": "IExtendsPrivateInterface",
2056+
"properties": [
2057+
{
2058+
"abstract": true,
2059+
"immutable": true,
2060+
"name": "moreThings",
2061+
"type": {
2062+
"collection": {
2063+
"elementtype": {
2064+
"primitive": "string"
2065+
},
2066+
"kind": "array"
2067+
}
2068+
}
2069+
},
2070+
{
2071+
"abstract": true,
2072+
"name": "private",
2073+
"type": {
2074+
"primitive": "string"
2075+
}
2076+
}
2077+
]
2078+
},
20592079
"jsii-calc.IFriendlier": {
20602080
"assembly": "jsii-calc",
20612081
"docs": {
@@ -2257,6 +2277,59 @@
22572277
}
22582278
]
22592279
},
2280+
"jsii-calc.IJSII417Derived": {
2281+
"assembly": "jsii-calc",
2282+
"fqn": "jsii-calc.IJSII417Derived",
2283+
"interfaces": [
2284+
{
2285+
"fqn": "jsii-calc.IJSII417PublicBaseOfBase"
2286+
}
2287+
],
2288+
"kind": "interface",
2289+
"methods": [
2290+
{
2291+
"abstract": true,
2292+
"name": "bar"
2293+
},
2294+
{
2295+
"abstract": true,
2296+
"name": "baz"
2297+
}
2298+
],
2299+
"name": "IJSII417Derived",
2300+
"properties": [
2301+
{
2302+
"abstract": true,
2303+
"immutable": true,
2304+
"name": "property",
2305+
"type": {
2306+
"primitive": "string"
2307+
}
2308+
}
2309+
]
2310+
},
2311+
"jsii-calc.IJSII417PublicBaseOfBase": {
2312+
"assembly": "jsii-calc",
2313+
"fqn": "jsii-calc.IJSII417PublicBaseOfBase",
2314+
"kind": "interface",
2315+
"methods": [
2316+
{
2317+
"abstract": true,
2318+
"name": "foo"
2319+
}
2320+
],
2321+
"name": "IJSII417PublicBaseOfBase",
2322+
"properties": [
2323+
{
2324+
"abstract": true,
2325+
"immutable": true,
2326+
"name": "hasRoot",
2327+
"type": {
2328+
"primitive": "boolean"
2329+
}
2330+
}
2331+
]
2332+
},
22602333
"jsii-calc.IMutableObjectLiteral": {
22612334
"assembly": "jsii-calc",
22622335
"fqn": "jsii-calc.IMutableObjectLiteral",
@@ -2283,6 +2356,13 @@
22832356
"kind": "interface",
22842357
"name": "INonInternalInterface",
22852358
"properties": [
2359+
{
2360+
"abstract": true,
2361+
"name": "b",
2362+
"type": {
2363+
"primitive": "string"
2364+
}
2365+
},
22862366
{
22872367
"abstract": true,
22882368
"name": "c",
@@ -4800,5 +4880,5 @@
48004880
}
48014881
},
48024882
"version": "0.8.2",
4803-
"fingerprint": "5kMI3UzT9N2sovIndhAmSefEqtrUStnpb0hmWwfLjOs="
4883+
"fingerprint": "WJgwH2kAeJLVBMQx/Ek9JLty5tmfiy5sHAz0T8eMX7o="
48044884
}

0 commit comments

Comments
 (0)