diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js index defe5722f29a..34b5f476e995 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js @@ -32,10 +32,44 @@ const ModuleDeclarationTemplate = ({ structDeclarations: string, eventEmitters: string, protocolMethods: string, -}>) => `${structDeclarations} +}>) => { + // Split methods into required and optional groups + const methodLines = protocolMethods.split('\n'); + const requiredMethods = []; + const optionalMethods = []; + + let isOptional = false; + for (const line of methodLines) { + switch (line.trim()) { + case '@optional': + isOptional = true; + continue; + case '@required': + isOptional = false; + continue; + case '': + continue; + default: + if (isOptional) { + optionalMethods.push(line); + } else { + requiredMethods.push(line); + } + } + } + let protocolMethodsBody = requiredMethods.join('\n'); + if (optionalMethods.length > 0) { + if (protocolMethodsBody === '') { + protocolMethodsBody += optionalMethods.join('\n'); + } else { + protocolMethodsBody += `\n\n@optional\n${optionalMethods.join('\n')}`; + } + } + + return `${structDeclarations} @protocol ${hasteModuleName}Spec -${protocolMethods} +${protocolMethodsBody} @end @@ -57,6 +91,7 @@ namespace facebook::react { ${hasteModuleName}SpecJSI(const ObjCTurboModule::InitParams ¶ms); }; } // namespace facebook::react`; +}; const HeaderFileTemplate = ({ headerFileName, diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js index 8e0a56472ff8..e34dea2125fc 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js @@ -33,11 +33,16 @@ const ProtocolMethodTemplate = ({ returnObjCType, methodName, params, + isOptional, }: $ReadOnly<{ returnObjCType: string, methodName: string, params: string, -}>) => `- (${returnObjCType})${methodName}${params};`; + isOptional: boolean, +}>) => + `${ + isOptional ? '@optional\n' : '@required\n' + }- (${returnObjCType})${methodName}${params};`; export type StructParameterRecord = $ReadOnly<{ paramIndex: number, @@ -139,6 +144,7 @@ function serializeMethod( methodName, returnObjCType, params: objCParams, + isOptional: property.optional === true, }); /** @@ -517,6 +523,7 @@ function serializeConstantsProtocolMethods( methodName, returnObjCType, params: '', + isOptional: property.optional === true, }); return { diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap index 3cb576c6ad3a..654b848a3215 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap @@ -207,14 +207,16 @@ namespace JS { - (NSDictionary *)difficult:(JS::NativeSampleTurboModule::SpecDifficultA &)A; - (void)optionals:(JS::NativeSampleTurboModule::SpecOptionalsA &)A; -- (void)optionalMethod:(NSDictionary *)options - callback:(RCTResponseSenderBlock)callback - extras:(NSArray *)extras; - (void)getArrays:(JS::NativeSampleTurboModule::SpecGetArraysOptions &)options; - (NSDictionary * _Nullable)getNullableObject; - (NSDictionary * _Nullable)getNullableGenericObject; - (NSArray> * _Nullable)getNullableArray; +@optional +- (void)optionalMethod:(NSDictionary *)options + callback:(RCTResponseSenderBlock)callback + extras:(NSArray *)extras; + @end @interface NativeSampleTurboModuleSpecBase : NSObject { @@ -838,10 +840,12 @@ namespace JS { - (void)reportSoftException:(NSString *)message stack:(NSArray *)stack exceptionId:(double)exceptionId; -- (void)reportException:(JS::NativeExceptionsManager::ExceptionData &)data; - (void)updateExceptionMessage:(NSString *)message stack:(NSArray *)stack exceptionId:(double)exceptionId; + +@optional +- (void)reportException:(JS::NativeExceptionsManager::ExceptionData &)data; - (void)dismissRedbox; @end