Skip to content

Commit a854fed

Browse files
committed
[tsgen] Fix overriding Embind's ClassHandle clone method.
The return type of `clone` should actually be `ThisType<this>` to better match what the JS is actually doing. This also makes it possible to override the clone method.
1 parent 1171ada commit a854fed

File tree

7 files changed

+53
-6
lines changed

7 files changed

+53
-6
lines changed

src/embind/embind_gen.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ var LibraryEmbind = {
417417
' delete(): void;\n',
418418
' deleteLater(): this;\n',
419419
' isDeleted(): boolean;\n',
420-
' clone(): this;\n',
420+
' clone(): ThisType<this>;\n',
421421
'}\n',
422422
);
423423
}

test/other/embind_tsgen.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ class Foo {
3939
void process(const Test& input) {}
4040
};
4141

42+
struct Override {
43+
Override clone() const {
44+
Override o;
45+
return o;
46+
}
47+
};
48+
4249
Test class_returning_fn() { return Test(); }
4350

4451
std::unique_ptr<Test> class_unique_ptr_returning_fn() {
@@ -251,6 +258,11 @@ EMSCRIPTEN_BINDINGS(Test) {
251258
.function("invoke", &Interface::invoke, pure_virtual())
252259
.allow_subclass<InterfaceWrapper>("InterfaceWrapper")
253260
;
261+
262+
// Override ClassHandle's clone method.
263+
class_<Override>("Override")
264+
.constructor().
265+
function("clone", &Override::clone);
254266
}
255267

256268
int Test::static_property = 42;

test/other/embind_tsgen.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface ClassHandle {
2222
delete(): void;
2323
deleteLater(): this;
2424
isDeleted(): boolean;
25-
clone(): this;
25+
clone(): ThisType<this>;
2626
}
2727
export interface Test extends ClassHandle {
2828
x: number;
@@ -100,6 +100,10 @@ export interface InterfaceWrapper extends Interface {
100100
notifyOnDestruction(): void;
101101
}
102102

103+
export interface Override extends ClassHandle {
104+
clone(): Override;
105+
}
106+
103107
export type ValArr = [ number, number, number ];
104108

105109
export type ValObj = {
@@ -150,6 +154,9 @@ interface EmbindModule {
150154
extend(_0: EmbindString, _1: any): any;
151155
};
152156
InterfaceWrapper: {};
157+
Override: {
158+
new(): Override;
159+
};
153160
a_bool: boolean;
154161
an_int: number;
155162
optional_test(_0?: Foo): number | undefined;

test/other/embind_tsgen_ignore_1.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export interface ClassHandle {
3131
delete(): void;
3232
deleteLater(): this;
3333
isDeleted(): boolean;
34-
clone(): this;
34+
clone(): ThisType<this>;
3535
}
3636
export interface Test extends ClassHandle {
3737
x: number;
@@ -109,6 +109,10 @@ export interface InterfaceWrapper extends Interface {
109109
notifyOnDestruction(): void;
110110
}
111111

112+
export interface Override extends ClassHandle {
113+
clone(): Override;
114+
}
115+
112116
export type ValArr = [ number, number, number ];
113117

114118
export type ValObj = {
@@ -159,6 +163,9 @@ interface EmbindModule {
159163
extend(_0: EmbindString, _1: any): any;
160164
};
161165
InterfaceWrapper: {};
166+
Override: {
167+
new(): Override;
168+
};
162169
a_bool: boolean;
163170
an_int: number;
164171
optional_test(_0?: Foo): number | undefined;

test/other/embind_tsgen_ignore_2.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export interface ClassHandle {
88
delete(): void;
99
deleteLater(): this;
1010
isDeleted(): boolean;
11-
clone(): this;
11+
clone(): ThisType<this>;
1212
}
1313
export interface Test extends ClassHandle {
1414
x: number;
@@ -86,6 +86,10 @@ export interface InterfaceWrapper extends Interface {
8686
notifyOnDestruction(): void;
8787
}
8888

89+
export interface Override extends ClassHandle {
90+
clone(): Override;
91+
}
92+
8993
export type ValArr = [ number, number, number ];
9094

9195
export type ValObj = {
@@ -136,6 +140,9 @@ interface EmbindModule {
136140
extend(_0: EmbindString, _1: any): any;
137141
};
138142
InterfaceWrapper: {};
143+
Override: {
144+
new(): Override;
145+
};
139146
a_bool: boolean;
140147
an_int: number;
141148
optional_test(_0?: Foo): number | undefined;

test/other/embind_tsgen_ignore_3.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface ClassHandle {
2222
delete(): void;
2323
deleteLater(): this;
2424
isDeleted(): boolean;
25-
clone(): this;
25+
clone(): ThisType<this>;
2626
}
2727
export interface Test extends ClassHandle {
2828
x: number;
@@ -100,6 +100,10 @@ export interface InterfaceWrapper extends Interface {
100100
notifyOnDestruction(): void;
101101
}
102102

103+
export interface Override extends ClassHandle {
104+
clone(): Override;
105+
}
106+
103107
export type ValArr = [ number, number, number ];
104108

105109
export type ValObj = {
@@ -150,6 +154,9 @@ interface EmbindModule {
150154
extend(_0: EmbindString, _1: any): any;
151155
};
152156
InterfaceWrapper: {};
157+
Override: {
158+
new(): Override;
159+
};
153160
a_bool: boolean;
154161
an_int: number;
155162
optional_test(_0?: Foo): number | undefined;

test/other/embind_tsgen_module.d.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface ClassHandle {
2222
delete(): void;
2323
deleteLater(): this;
2424
isDeleted(): boolean;
25-
clone(): this;
25+
clone(): ThisType<this>;
2626
}
2727
export interface Test extends ClassHandle {
2828
x: number;
@@ -100,6 +100,10 @@ export interface InterfaceWrapper extends Interface {
100100
notifyOnDestruction(): void;
101101
}
102102

103+
export interface Override extends ClassHandle {
104+
clone(): Override;
105+
}
106+
103107
export type ValArr = [ number, number, number ];
104108

105109
export type ValObj = {
@@ -150,6 +154,9 @@ interface EmbindModule {
150154
extend(_0: EmbindString, _1: any): any;
151155
};
152156
InterfaceWrapper: {};
157+
Override: {
158+
new(): Override;
159+
};
153160
a_bool: boolean;
154161
an_int: number;
155162
optional_test(_0?: Foo): number | undefined;

0 commit comments

Comments
 (0)