From a854fed79c8157b2d25937641db6ab382e942a5e Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 11 Dec 2024 22:22:35 +0000 Subject: [PATCH] [tsgen] Fix overriding Embind's ClassHandle clone method. The return type of `clone` should actually be `ThisType` to better match what the JS is actually doing. This also makes it possible to override the clone method. --- src/embind/embind_gen.js | 2 +- test/other/embind_tsgen.cpp | 12 ++++++++++++ test/other/embind_tsgen.d.ts | 9 ++++++++- test/other/embind_tsgen_ignore_1.d.ts | 9 ++++++++- test/other/embind_tsgen_ignore_2.d.ts | 9 ++++++++- test/other/embind_tsgen_ignore_3.d.ts | 9 ++++++++- test/other/embind_tsgen_module.d.ts | 9 ++++++++- 7 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/embind/embind_gen.js b/src/embind/embind_gen.js index 130e128e600e0..93a9b632553eb 100644 --- a/src/embind/embind_gen.js +++ b/src/embind/embind_gen.js @@ -417,7 +417,7 @@ var LibraryEmbind = { ' delete(): void;\n', ' deleteLater(): this;\n', ' isDeleted(): boolean;\n', - ' clone(): this;\n', + ' clone(): ThisType;\n', '}\n', ); } diff --git a/test/other/embind_tsgen.cpp b/test/other/embind_tsgen.cpp index 66bfe440d86ac..540ef7734cc06 100644 --- a/test/other/embind_tsgen.cpp +++ b/test/other/embind_tsgen.cpp @@ -39,6 +39,13 @@ class Foo { void process(const Test& input) {} }; +struct Override { + Override clone() const { + Override o; + return o; + } +}; + Test class_returning_fn() { return Test(); } std::unique_ptr class_unique_ptr_returning_fn() { @@ -251,6 +258,11 @@ EMSCRIPTEN_BINDINGS(Test) { .function("invoke", &Interface::invoke, pure_virtual()) .allow_subclass("InterfaceWrapper") ; + + // Override ClassHandle's clone method. + class_("Override") + .constructor(). + function("clone", &Override::clone); } int Test::static_property = 42; diff --git a/test/other/embind_tsgen.d.ts b/test/other/embind_tsgen.d.ts index df88531793f07..15a9fbc5c03d8 100644 --- a/test/other/embind_tsgen.d.ts +++ b/test/other/embind_tsgen.d.ts @@ -22,7 +22,7 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; - clone(): this; + clone(): ThisType; } export interface Test extends ClassHandle { x: number; @@ -100,6 +100,10 @@ export interface InterfaceWrapper extends Interface { notifyOnDestruction(): void; } +export interface Override extends ClassHandle { + clone(): Override; +} + export type ValArr = [ number, number, number ]; export type ValObj = { @@ -150,6 +154,9 @@ interface EmbindModule { extend(_0: EmbindString, _1: any): any; }; InterfaceWrapper: {}; + Override: { + new(): Override; + }; a_bool: boolean; an_int: number; optional_test(_0?: Foo): number | undefined; diff --git a/test/other/embind_tsgen_ignore_1.d.ts b/test/other/embind_tsgen_ignore_1.d.ts index a3526282d6aa2..a5264e7d3dbce 100644 --- a/test/other/embind_tsgen_ignore_1.d.ts +++ b/test/other/embind_tsgen_ignore_1.d.ts @@ -31,7 +31,7 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; - clone(): this; + clone(): ThisType; } export interface Test extends ClassHandle { x: number; @@ -109,6 +109,10 @@ export interface InterfaceWrapper extends Interface { notifyOnDestruction(): void; } +export interface Override extends ClassHandle { + clone(): Override; +} + export type ValArr = [ number, number, number ]; export type ValObj = { @@ -159,6 +163,9 @@ interface EmbindModule { extend(_0: EmbindString, _1: any): any; }; InterfaceWrapper: {}; + Override: { + new(): Override; + }; a_bool: boolean; an_int: number; optional_test(_0?: Foo): number | undefined; diff --git a/test/other/embind_tsgen_ignore_2.d.ts b/test/other/embind_tsgen_ignore_2.d.ts index f56a1d323f526..80d5955e6a8d3 100644 --- a/test/other/embind_tsgen_ignore_2.d.ts +++ b/test/other/embind_tsgen_ignore_2.d.ts @@ -8,7 +8,7 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; - clone(): this; + clone(): ThisType; } export interface Test extends ClassHandle { x: number; @@ -86,6 +86,10 @@ export interface InterfaceWrapper extends Interface { notifyOnDestruction(): void; } +export interface Override extends ClassHandle { + clone(): Override; +} + export type ValArr = [ number, number, number ]; export type ValObj = { @@ -136,6 +140,9 @@ interface EmbindModule { extend(_0: EmbindString, _1: any): any; }; InterfaceWrapper: {}; + Override: { + new(): Override; + }; a_bool: boolean; an_int: number; optional_test(_0?: Foo): number | undefined; diff --git a/test/other/embind_tsgen_ignore_3.d.ts b/test/other/embind_tsgen_ignore_3.d.ts index df88531793f07..15a9fbc5c03d8 100644 --- a/test/other/embind_tsgen_ignore_3.d.ts +++ b/test/other/embind_tsgen_ignore_3.d.ts @@ -22,7 +22,7 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; - clone(): this; + clone(): ThisType; } export interface Test extends ClassHandle { x: number; @@ -100,6 +100,10 @@ export interface InterfaceWrapper extends Interface { notifyOnDestruction(): void; } +export interface Override extends ClassHandle { + clone(): Override; +} + export type ValArr = [ number, number, number ]; export type ValObj = { @@ -150,6 +154,9 @@ interface EmbindModule { extend(_0: EmbindString, _1: any): any; }; InterfaceWrapper: {}; + Override: { + new(): Override; + }; a_bool: boolean; an_int: number; optional_test(_0?: Foo): number | undefined; diff --git a/test/other/embind_tsgen_module.d.ts b/test/other/embind_tsgen_module.d.ts index 1631d67bcde96..6e5c6dbdd3078 100644 --- a/test/other/embind_tsgen_module.d.ts +++ b/test/other/embind_tsgen_module.d.ts @@ -22,7 +22,7 @@ export interface ClassHandle { delete(): void; deleteLater(): this; isDeleted(): boolean; - clone(): this; + clone(): ThisType; } export interface Test extends ClassHandle { x: number; @@ -100,6 +100,10 @@ export interface InterfaceWrapper extends Interface { notifyOnDestruction(): void; } +export interface Override extends ClassHandle { + clone(): Override; +} + export type ValArr = [ number, number, number ]; export type ValObj = { @@ -150,6 +154,9 @@ interface EmbindModule { extend(_0: EmbindString, _1: any): any; }; InterfaceWrapper: {}; + Override: { + new(): Override; + }; a_bool: boolean; an_int: number; optional_test(_0?: Foo): number | undefined;