Skip to content

Commit 218195c

Browse files
authored
[embind] Better reflect the actual class hierarchy in TS. (#22734)
- All classes now extend from ClassHandle, which is what really happens in JS. - Add the missing methods that are available on ClassHandles. Fixes #22701
1 parent b53978e commit 218195c

File tree

5 files changed

+88
-89
lines changed

5 files changed

+88
-89
lines changed

src/embind/embind_gen.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ var LibraryEmbind = {
172172
out.push(`export interface ${this.name}`);
173173
if (this.base) {
174174
out.push(` extends ${this.base.name}`);
175+
} else {
176+
out.push(' extends ClassHandle');
175177
}
176178
out.push(' {\n');
177179
for (const property of this.properties) {
@@ -186,7 +188,6 @@ var LibraryEmbind = {
186188
method.printFunction(nameMap, out);
187189
out.push(';\n');
188190
}
189-
out.push(' delete(): void;\n');
190191
out.push('}\n\n');
191192
}
192193

@@ -402,6 +403,24 @@ var LibraryEmbind = {
402403

403404
print() {
404405
const out = [];
406+
let hadClass = false;
407+
for (const def of this.definitions) {
408+
if (def instanceof ClassDefinition) {
409+
hadClass = true;
410+
break;
411+
}
412+
}
413+
if (hadClass) {
414+
out.push(
415+
'export interface ClassHandle {\n',
416+
' isAliasOf(other: ClassHandle): boolean;\n',
417+
' delete(): void;\n',
418+
' deleteLater(): this;\n',
419+
' isDeleted(): boolean;\n',
420+
' clone(): this;\n',
421+
'}\n',
422+
);
423+
}
405424
for (const def of this.definitions) {
406425
if (!def.print) {
407426
continue;

test/other/embind_tsgen.d.ts

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,14 @@ interface WasmModule {
1717
}
1818

1919
type EmbindString = ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string;
20-
export interface Test {
20+
export interface ClassHandle {
21+
isAliasOf(other: ClassHandle): boolean;
22+
delete(): void;
23+
deleteLater(): this;
24+
isDeleted(): boolean;
25+
clone(): this;
26+
}
27+
export interface Test extends ClassHandle {
2128
x: number;
2229
readonly y: number;
2330
get stringProperty(): string;
@@ -30,11 +37,9 @@ export interface Test {
3037
longFn(_0: number): number;
3138
functionThree(_0: EmbindString): number;
3239
functionSix(str: EmbindString): number;
33-
delete(): void;
3440
}
3541

36-
export interface Obj {
37-
delete(): void;
42+
export interface Obj extends ClassHandle {
3843
}
3944

4045
export interface BarValue<T extends number> {
@@ -49,40 +54,34 @@ export type EmptyEnum = never/* Empty Enumerator */;
4954

5055
export type ValArrIx = [ Bar, Bar, Bar, Bar ];
5156

52-
export interface IntVec {
57+
export interface IntVec extends ClassHandle {
5358
push_back(_0: number): void;
5459
resize(_0: number, _1: number): void;
5560
size(): number;
5661
get(_0: number): number | undefined;
5762
set(_0: number, _1: number): boolean;
58-
delete(): void;
5963
}
6064

61-
export interface MapIntInt {
65+
export interface MapIntInt extends ClassHandle {
6266
keys(): IntVec;
6367
get(_0: number): number | undefined;
6468
set(_0: number, _1: number): void;
6569
size(): number;
66-
delete(): void;
6770
}
6871

69-
export interface Foo {
72+
export interface Foo extends ClassHandle {
7073
process(_0: Test): void;
71-
delete(): void;
7274
}
7375

74-
export interface ClassWithConstructor {
76+
export interface ClassWithConstructor extends ClassHandle {
7577
fn(_0: number): number;
76-
delete(): void;
7778
}
7879

79-
export interface ClassWithTwoConstructors {
80-
delete(): void;
80+
export interface ClassWithTwoConstructors extends ClassHandle {
8181
}
8282

83-
export interface ClassWithSmartPtrConstructor {
83+
export interface ClassWithSmartPtrConstructor extends ClassHandle {
8484
fn(_0: number): number;
85-
delete(): void;
8685
}
8786

8887
export type ValObj = {
@@ -91,24 +90,20 @@ export type ValObj = {
9190
callback: (message: string) => void
9291
};
9392

94-
export interface BaseClass {
93+
export interface BaseClass extends ClassHandle {
9594
fn(_0: number): number;
96-
delete(): void;
9795
}
9896

9997
export interface DerivedClass extends BaseClass {
10098
fn2(_0: number): number;
101-
delete(): void;
10299
}
103100

104-
export interface Interface {
101+
export interface Interface extends ClassHandle {
105102
invoke(_0: EmbindString): void;
106-
delete(): void;
107103
}
108104

109105
export interface InterfaceWrapper extends Interface {
110106
notifyOnDestruction(): void;
111-
delete(): void;
112107
}
113108

114109
export type ValArr = [ number, number, number ];

test/other/embind_tsgen_ignore_1.d.ts

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,14 @@ interface WasmModule {
2626
}
2727

2828
type EmbindString = ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string;
29-
export interface Test {
29+
export interface ClassHandle {
30+
isAliasOf(other: ClassHandle): boolean;
31+
delete(): void;
32+
deleteLater(): this;
33+
isDeleted(): boolean;
34+
clone(): this;
35+
}
36+
export interface Test extends ClassHandle {
3037
x: number;
3138
readonly y: number;
3239
get stringProperty(): string;
@@ -39,11 +46,9 @@ export interface Test {
3946
longFn(_0: number): number;
4047
functionThree(_0: EmbindString): number;
4148
functionSix(str: EmbindString): number;
42-
delete(): void;
4349
}
4450

45-
export interface Obj {
46-
delete(): void;
51+
export interface Obj extends ClassHandle {
4752
}
4853

4954
export interface BarValue<T extends number> {
@@ -58,40 +63,34 @@ export type EmptyEnum = never/* Empty Enumerator */;
5863

5964
export type ValArrIx = [ Bar, Bar, Bar, Bar ];
6065

61-
export interface IntVec {
66+
export interface IntVec extends ClassHandle {
6267
push_back(_0: number): void;
6368
resize(_0: number, _1: number): void;
6469
size(): number;
6570
get(_0: number): number | undefined;
6671
set(_0: number, _1: number): boolean;
67-
delete(): void;
6872
}
6973

70-
export interface MapIntInt {
74+
export interface MapIntInt extends ClassHandle {
7175
keys(): IntVec;
7276
get(_0: number): number | undefined;
7377
set(_0: number, _1: number): void;
7478
size(): number;
75-
delete(): void;
7679
}
7780

78-
export interface Foo {
81+
export interface Foo extends ClassHandle {
7982
process(_0: Test): void;
80-
delete(): void;
8183
}
8284

83-
export interface ClassWithConstructor {
85+
export interface ClassWithConstructor extends ClassHandle {
8486
fn(_0: number): number;
85-
delete(): void;
8687
}
8788

88-
export interface ClassWithTwoConstructors {
89-
delete(): void;
89+
export interface ClassWithTwoConstructors extends ClassHandle {
9090
}
9191

92-
export interface ClassWithSmartPtrConstructor {
92+
export interface ClassWithSmartPtrConstructor extends ClassHandle {
9393
fn(_0: number): number;
94-
delete(): void;
9594
}
9695

9796
export type ValObj = {
@@ -100,24 +99,20 @@ export type ValObj = {
10099
callback: (message: string) => void
101100
};
102101

103-
export interface BaseClass {
102+
export interface BaseClass extends ClassHandle {
104103
fn(_0: number): number;
105-
delete(): void;
106104
}
107105

108106
export interface DerivedClass extends BaseClass {
109107
fn2(_0: number): number;
110-
delete(): void;
111108
}
112109

113-
export interface Interface {
110+
export interface Interface extends ClassHandle {
114111
invoke(_0: EmbindString): void;
115-
delete(): void;
116112
}
117113

118114
export interface InterfaceWrapper extends Interface {
119115
notifyOnDestruction(): void;
120-
delete(): void;
121116
}
122117

123118
export type ValArr = [ number, number, number ];

test/other/embind_tsgen_ignore_2.d.ts

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@ interface WasmModule {
33
}
44

55
type EmbindString = ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string;
6-
export interface Test {
6+
export interface ClassHandle {
7+
isAliasOf(other: ClassHandle): boolean;
8+
delete(): void;
9+
deleteLater(): this;
10+
isDeleted(): boolean;
11+
clone(): this;
12+
}
13+
export interface Test extends ClassHandle {
714
x: number;
815
readonly y: number;
916
get stringProperty(): string;
@@ -16,11 +23,9 @@ export interface Test {
1623
longFn(_0: number): number;
1724
functionThree(_0: EmbindString): number;
1825
functionSix(str: EmbindString): number;
19-
delete(): void;
2026
}
2127

22-
export interface Obj {
23-
delete(): void;
28+
export interface Obj extends ClassHandle {
2429
}
2530

2631
export interface BarValue<T extends number> {
@@ -35,40 +40,34 @@ export type EmptyEnum = never/* Empty Enumerator */;
3540

3641
export type ValArrIx = [ Bar, Bar, Bar, Bar ];
3742

38-
export interface IntVec {
43+
export interface IntVec extends ClassHandle {
3944
push_back(_0: number): void;
4045
resize(_0: number, _1: number): void;
4146
size(): number;
4247
get(_0: number): number | undefined;
4348
set(_0: number, _1: number): boolean;
44-
delete(): void;
4549
}
4650

47-
export interface MapIntInt {
51+
export interface MapIntInt extends ClassHandle {
4852
keys(): IntVec;
4953
get(_0: number): number | undefined;
5054
set(_0: number, _1: number): void;
5155
size(): number;
52-
delete(): void;
5356
}
5457

55-
export interface Foo {
58+
export interface Foo extends ClassHandle {
5659
process(_0: Test): void;
57-
delete(): void;
5860
}
5961

60-
export interface ClassWithConstructor {
62+
export interface ClassWithConstructor extends ClassHandle {
6163
fn(_0: number): number;
62-
delete(): void;
6364
}
6465

65-
export interface ClassWithTwoConstructors {
66-
delete(): void;
66+
export interface ClassWithTwoConstructors extends ClassHandle {
6767
}
6868

69-
export interface ClassWithSmartPtrConstructor {
69+
export interface ClassWithSmartPtrConstructor extends ClassHandle {
7070
fn(_0: number): number;
71-
delete(): void;
7271
}
7372

7473
export type ValObj = {
@@ -77,24 +76,20 @@ export type ValObj = {
7776
callback: (message: string) => void
7877
};
7978

80-
export interface BaseClass {
79+
export interface BaseClass extends ClassHandle {
8180
fn(_0: number): number;
82-
delete(): void;
8381
}
8482

8583
export interface DerivedClass extends BaseClass {
8684
fn2(_0: number): number;
87-
delete(): void;
8885
}
8986

90-
export interface Interface {
87+
export interface Interface extends ClassHandle {
9188
invoke(_0: EmbindString): void;
92-
delete(): void;
9389
}
9490

9591
export interface InterfaceWrapper extends Interface {
9692
notifyOnDestruction(): void;
97-
delete(): void;
9893
}
9994

10095
export type ValArr = [ number, number, number ];

0 commit comments

Comments
 (0)