diff --git a/ReactCommon/react/bridging/Class.h b/ReactCommon/react/bridging/Class.h index bb1afd00a8c..10baf4edd76 100644 --- a/ReactCommon/react/bridging/Class.h +++ b/ReactCommon/react/bridging/Class.h @@ -52,4 +52,14 @@ T callFromJs( } } +template +constexpr size_t getParameterCount(R (*)(Args...)) { + return sizeof...(Args); +} + +template +constexpr size_t getParameterCount(R (C::*)(Args...)) { + return sizeof...(Args); +} + } // namespace facebook::react::bridging diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index c7b394c6439..4ef9cbe34e9 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -15,6 +15,7 @@ import type { SchemaType, NativeModuleTypeAnnotation, NativeModuleFunctionTypeAnnotation, + NativeModulePropertyShape, } from '../../CodegenSchema'; import type {AliasResolver} from './Utils'; @@ -27,21 +28,58 @@ type FilesOutput = Map; const ModuleClassDeclarationTemplate = ({ hasteModuleName, moduleProperties, -}: $ReadOnly<{hasteModuleName: string, moduleProperties: string}>) => { +}: $ReadOnly<{hasteModuleName: string, moduleProperties: string[]}>) => { return `class JSI_EXPORT ${hasteModuleName}CxxSpecJSI : public TurboModule { protected: ${hasteModuleName}CxxSpecJSI(std::shared_ptr jsInvoker); public: - ${indent(moduleProperties, 2)} + ${indent(moduleProperties.join('\n'), 2)} };`; }; +const ModuleSpecClassDeclarationTemplate = ({ + hasteModuleName, + moduleName, + moduleProperties, +}: $ReadOnly<{ + hasteModuleName: string, + moduleName: string, + moduleProperties: string[], +}>) => { + return `template +class JSI_EXPORT ${hasteModuleName}CxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + ${hasteModuleName}CxxSpec(std::shared_ptr jsInvoker) + : TurboModule("${moduleName}", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public ${hasteModuleName}CxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + ${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + ${indent(moduleProperties.join('\n'), 4)} + + private: + T *instance_; + }; + + Delegate delegate_; +};`; +}; + const FileTemplate = ({ modules, }: $ReadOnly<{ - modules: string, + modules: string[], }>) => { return `/** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -55,11 +93,12 @@ const FileTemplate = ({ #pragma once #include +#include namespace facebook { namespace react { -${modules} +${modules.join('\n\n')} } // namespace react } // namespace facebook @@ -118,8 +157,52 @@ function translatePrimitiveJSTypeToCpp( } } -const propertyTemplate = - 'virtual ::_RETURN_VALUE_:: ::_PROPERTY_NAME_::(jsi::Runtime &rt::_ARGS_::) = 0;'; +function translatePropertyToCpp( + prop: NativeModulePropertyShape, + resolveAlias: AliasResolver, + abstract: boolean = false, +) { + const [propTypeAnnotation] = + unwrapNullable(prop.typeAnnotation); + + const params = propTypeAnnotation.params.map( + param => `std::move(${param.name})`, + ); + + const paramTypes = propTypeAnnotation.params.map(param => { + const translatedParam = translatePrimitiveJSTypeToCpp( + param.typeAnnotation, + typeName => + `Unsupported type for param "${param.name}" in ${prop.name}. Found: ${typeName}`, + resolveAlias, + ); + return `${translatedParam} ${param.name}`; + }); + + const returnType = translatePrimitiveJSTypeToCpp( + propTypeAnnotation.returnTypeAnnotation, + typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`, + resolveAlias, + ); + + // The first param will always be the runtime reference. + paramTypes.unshift('jsi::Runtime &rt'); + + const method = `${returnType} ${prop.name}(${paramTypes.join(', ')})`; + + if (abstract) { + return `virtual ${method} = 0;`; + } + + return `${method} override { + static_assert( + bridging::getParameterCount(&T::${prop.name}) == ${paramTypes.length}, + "Expected ${prop.name}(...) to have ${paramTypes.length} parameters"); + + return bridging::callFromJs<${returnType}>( + rt, &T::${prop.name}, jsInvoker_, ${['instance_', ...params].join(', ')}); +}`; +} module.exports = { generate( @@ -130,55 +213,30 @@ module.exports = { ): FilesOutput { const nativeModules = getModules(schema); - const modules = Object.keys(nativeModules) - .map(hasteModuleName => { - const { - aliases, - spec: {properties}, - } = nativeModules[hasteModuleName]; - const resolveAlias = createAliasResolver(aliases); + const modules = Object.keys(nativeModules).flatMap(hasteModuleName => { + const { + aliases, + spec: {properties}, + moduleNames: [moduleName], + } = nativeModules[hasteModuleName]; + const resolveAlias = createAliasResolver(aliases); - const traversedProperties = properties - .map(prop => { - const [propTypeAnnotation] = - unwrapNullable( - prop.typeAnnotation, - ); - const traversedArgs = propTypeAnnotation.params - .map(param => { - const translatedParam = translatePrimitiveJSTypeToCpp( - param.typeAnnotation, - typeName => - `Unsupported type for param "${param.name}" in ${prop.name}. Found: ${typeName}`, - resolveAlias, - ); - return `${translatedParam} ${param.name}`; - }) - .join(', '); - return propertyTemplate - .replace('::_PROPERTY_NAME_::', prop.name) - .replace( - '::_RETURN_VALUE_::', - translatePrimitiveJSTypeToCpp( - propTypeAnnotation.returnTypeAnnotation, - typeName => - `Unsupported return type for ${prop.name}. Found: ${typeName}`, - resolveAlias, - ), - ) - .replace( - '::_ARGS_::', - traversedArgs === '' ? '' : ', ' + traversedArgs, - ); - }) - .join('\n'); - - return ModuleClassDeclarationTemplate({ + return [ + ModuleClassDeclarationTemplate({ hasteModuleName, - moduleProperties: traversedProperties, - }); - }) - .join('\n'); + moduleProperties: properties.map(prop => + translatePropertyToCpp(prop, resolveAlias, true), + ), + }), + ModuleSpecClassDeclarationTemplate({ + hasteModuleName, + moduleName, + moduleProperties: properties.map(prop => + translatePropertyToCpp(prop, resolveAlias), + ), + }), + ]; + }); const fileName = `${libraryName}JSI.h`; const replacedTemplate = FileTemplate({modules}); diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap index f760cb7b8c6..8db29d323c6 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap @@ -14,6 +14,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -27,6 +28,33 @@ public: }; +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"SampleTurboModule\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ", @@ -47,6 +75,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -63,6 +92,64 @@ public: }; +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"SampleTurboModule\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + jsi::Object difficult(jsi::Runtime &rt, jsi::Object A) override { + static_assert( + bridging::getParameterCount(&T::difficult) == 2, + \\"Expected difficult(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::difficult, jsInvoker_, instance_, std::move(A)); + } + void optionals(jsi::Runtime &rt, jsi::Object A) override { + static_assert( + bridging::getParameterCount(&T::optionals) == 2, + \\"Expected optionals(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::optionals, jsInvoker_, instance_, std::move(A)); + } + void optionalMethod(jsi::Runtime &rt, jsi::Object options, jsi::Function callback, jsi::Array extras) override { + static_assert( + bridging::getParameterCount(&T::optionalMethod) == 4, + \\"Expected optionalMethod(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::optionalMethod, jsInvoker_, instance_, std::move(options), std::move(callback), std::move(extras)); + } + void getArrays(jsi::Runtime &rt, jsi::Object options) override { + static_assert( + bridging::getParameterCount(&T::getArrays) == 2, + \\"Expected getArrays(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getArrays, jsInvoker_, instance_, std::move(options)); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ", @@ -83,6 +170,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -96,6 +184,33 @@ public: }; +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"SampleTurboModule\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ", @@ -116,6 +231,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -130,6 +246,48 @@ public: }; +template +class JSI_EXPORT AliasTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + AliasTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"AliasTurboModule\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public AliasTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + AliasTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + \\"Expected getConstants(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + void cropImage(jsi::Runtime &rt, jsi::Object cropData) override { + static_assert( + bridging::getParameterCount(&T::cropImage) == 2, + \\"Expected cropImage(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::cropImage, jsInvoker_, instance_, std::move(cropData)); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ", @@ -150,6 +308,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -165,6 +324,65 @@ public: virtual jsi::Value deletePhotos(jsi::Runtime &rt, jsi::Array assets) = 0; }; + +template +class JSI_EXPORT NativeCameraRollManagerCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeCameraRollManagerCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"CameraRollManager\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeCameraRollManagerCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeCameraRollManagerCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + \\"Expected getConstants(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value getPhotos(jsi::Runtime &rt, jsi::Object params) override { + static_assert( + bridging::getParameterCount(&T::getPhotos) == 2, + \\"Expected getPhotos(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getPhotos, jsInvoker_, instance_, std::move(params)); + } + jsi::Value saveToCameraRoll(jsi::Runtime &rt, jsi::String uri, jsi::String type) override { + static_assert( + bridging::getParameterCount(&T::saveToCameraRoll) == 3, + \\"Expected saveToCameraRoll(...) to have 3 parameters\\"); + + return bridging::callFromJs( + rt, &T::saveToCameraRoll, jsInvoker_, instance_, std::move(uri), std::move(type)); + } + jsi::Value deletePhotos(jsi::Runtime &rt, jsi::Array assets) override { + static_assert( + bridging::getParameterCount(&T::deletePhotos) == 2, + \\"Expected deletePhotos(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::deletePhotos, jsInvoker_, instance_, std::move(assets)); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + class JSI_EXPORT NativeImagePickerIOSCxxSpecJSI : public TurboModule { protected: NativeImagePickerIOSCxxSpecJSI(std::shared_ptr jsInvoker); @@ -173,6 +391,41 @@ public: virtual void openCameraDialog(jsi::Runtime &rt, jsi::Object config, jsi::Function successCallback, jsi::Function cancelCallback) = 0; }; + +template +class JSI_EXPORT NativeImagePickerIOSCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeImagePickerIOSCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"ImagePickerIOS\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeImagePickerIOSCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeImagePickerIOSCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + void openCameraDialog(jsi::Runtime &rt, jsi::Object config, jsi::Function successCallback, jsi::Function cancelCallback) override { + static_assert( + bridging::getParameterCount(&T::openCameraDialog) == 4, + \\"Expected openCameraDialog(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::openCameraDialog, jsInvoker_, instance_, std::move(config), std::move(successCallback), std::move(cancelCallback)); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + class JSI_EXPORT NativeExceptionsManagerCxxSpecJSI : public TurboModule { protected: NativeExceptionsManagerCxxSpecJSI(std::shared_ptr jsInvoker); @@ -186,6 +439,72 @@ public: }; +template +class JSI_EXPORT NativeExceptionsManagerCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeExceptionsManagerCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"ExceptionsManager\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeExceptionsManagerCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeExceptionsManagerCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + void reportFatalException(jsi::Runtime &rt, jsi::String message, jsi::Array stack, double exceptionId) override { + static_assert( + bridging::getParameterCount(&T::reportFatalException) == 4, + \\"Expected reportFatalException(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::reportFatalException, jsInvoker_, instance_, std::move(message), std::move(stack), std::move(exceptionId)); + } + void reportSoftException(jsi::Runtime &rt, jsi::String message, jsi::Array stack, double exceptionId) override { + static_assert( + bridging::getParameterCount(&T::reportSoftException) == 4, + \\"Expected reportSoftException(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::reportSoftException, jsInvoker_, instance_, std::move(message), std::move(stack), std::move(exceptionId)); + } + void reportException(jsi::Runtime &rt, jsi::Object data) override { + static_assert( + bridging::getParameterCount(&T::reportException) == 2, + \\"Expected reportException(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::reportException, jsInvoker_, instance_, std::move(data)); + } + void updateExceptionMessage(jsi::Runtime &rt, jsi::String message, jsi::Array stack, double exceptionId) override { + static_assert( + bridging::getParameterCount(&T::updateExceptionMessage) == 4, + \\"Expected updateExceptionMessage(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::updateExceptionMessage, jsInvoker_, instance_, std::move(message), std::move(stack), std::move(exceptionId)); + } + void dismissRedbox(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::dismissRedbox) == 1, + \\"Expected dismissRedbox(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::dismissRedbox, jsInvoker_, instance_); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ", @@ -206,6 +525,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -229,6 +549,120 @@ public: }; +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"SampleTurboModule\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + \\"Expected getConstants(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + void voidFunc(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::voidFunc) == 1, + \\"Expected voidFunc(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::voidFunc, jsInvoker_, instance_); + } + bool getBool(jsi::Runtime &rt, bool arg) override { + static_assert( + bridging::getParameterCount(&T::getBool) == 2, + \\"Expected getBool(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getBool, jsInvoker_, instance_, std::move(arg)); + } + double getNumber(jsi::Runtime &rt, double arg) override { + static_assert( + bridging::getParameterCount(&T::getNumber) == 2, + \\"Expected getNumber(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getNumber, jsInvoker_, instance_, std::move(arg)); + } + jsi::String getString(jsi::Runtime &rt, jsi::String arg) override { + static_assert( + bridging::getParameterCount(&T::getString) == 2, + \\"Expected getString(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getString, jsInvoker_, instance_, std::move(arg)); + } + jsi::Array getArray(jsi::Runtime &rt, jsi::Array arg) override { + static_assert( + bridging::getParameterCount(&T::getArray) == 2, + \\"Expected getArray(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getArray, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getObject(jsi::Runtime &rt, jsi::Object arg) override { + static_assert( + bridging::getParameterCount(&T::getObject) == 2, + \\"Expected getObject(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getObject, jsInvoker_, instance_, std::move(arg)); + } + double getRootTag(jsi::Runtime &rt, double arg) override { + static_assert( + bridging::getParameterCount(&T::getRootTag) == 2, + \\"Expected getRootTag(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getRootTag, jsInvoker_, instance_, std::move(arg)); + } + jsi::Object getValue(jsi::Runtime &rt, double x, jsi::String y, jsi::Object z) override { + static_assert( + bridging::getParameterCount(&T::getValue) == 4, + \\"Expected getValue(...) to have 4 parameters\\"); + + return bridging::callFromJs( + rt, &T::getValue, jsInvoker_, instance_, std::move(x), std::move(y), std::move(z)); + } + void getValueWithCallback(jsi::Runtime &rt, jsi::Function callback) override { + static_assert( + bridging::getParameterCount(&T::getValueWithCallback) == 2, + \\"Expected getValueWithCallback(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getValueWithCallback, jsInvoker_, instance_, std::move(callback)); + } + jsi::Value getValueWithPromise(jsi::Runtime &rt, bool error) override { + static_assert( + bridging::getParameterCount(&T::getValueWithPromise) == 2, + \\"Expected getValueWithPromise(...) to have 2 parameters\\"); + + return bridging::callFromJs( + rt, &T::getValueWithPromise, jsInvoker_, instance_, std::move(error)); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ", @@ -249,6 +683,7 @@ Map { #pragma once #include +#include namespace facebook { namespace react { @@ -261,6 +696,41 @@ public: virtual void voidFunc(jsi::Runtime &rt) = 0; }; + +template +class JSI_EXPORT NativeSampleTurboModuleCxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeSampleTurboModuleCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"SampleTurboModule\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModuleCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModuleCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + void voidFunc(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::voidFunc) == 1, + \\"Expected voidFunc(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::voidFunc, jsInvoker_, instance_); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + class JSI_EXPORT NativeSampleTurboModule2CxxSpecJSI : public TurboModule { protected: NativeSampleTurboModule2CxxSpecJSI(std::shared_ptr jsInvoker); @@ -271,6 +741,48 @@ public: }; +template +class JSI_EXPORT NativeSampleTurboModule2CxxSpec : public TurboModule { +public: + jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.get(rt, propName); + } + +protected: + NativeSampleTurboModule2CxxSpec(std::shared_ptr jsInvoker) + : TurboModule(\\"SampleTurboModule2\\", jsInvoker), + delegate_(static_cast(this), jsInvoker) {} + +private: + class Delegate : public NativeSampleTurboModule2CxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeSampleTurboModule2CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {} + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + \\"Expected getConstants(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + void voidFunc(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::voidFunc) == 1, + \\"Expected voidFunc(...) to have 1 parameters\\"); + + return bridging::callFromJs( + rt, &T::voidFunc, jsInvoker_, instance_); + } + + private: + T *instance_; + }; + + Delegate delegate_; +}; + } // namespace react } // namespace facebook ",