diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js index b8ca7d2635a..a9c631a30e9 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeNullableTurboModule.js @@ -14,11 +14,11 @@ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { - +getBool: () => ?boolean; - +getNumber: () => ?number; - +getString: () => ?string; - +getArray: () => ?Array; - +getObject: () => ?Object; + +getBool: (a: ?boolean) => ?boolean; + +getNumber: (a: ?number) => ?number; + +getString: (a: ?number) => ?string; + +getArray: (a: ?Array) => ?Array; + +getObject: (a: ?Object) => ?Object; +getValueWithPromise: () => ?Promise; } diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleHObjCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleHObjCpp.js index 221979e2d97..110ec68a6c5 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleHObjCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleHObjCpp.js @@ -12,7 +12,7 @@ import type { SchemaType, - FunctionTypeAnnotationParamTypeAnnotation, + FunctionTypeAnnotationParam, FunctionTypeAnnotationReturn, ObjectParamTypeAnnotation, } from '../../CodegenSchema'; @@ -91,26 +91,29 @@ const constants = `- (facebook::react::ModuleConstants)getConstants;`; function translatePrimitiveJSTypeToObjCType( - type: FunctionTypeAnnotationParamTypeAnnotation, + param: FunctionTypeAnnotationParam, error: string, ) { - switch (type.type) { + function wrapIntoNullableIfNeeded(generatedType: string) { + return param.nullable ? `${generatedType} _Nullable` : generatedType; + } + switch (param.typeAnnotation.type) { case 'StringTypeAnnotation': - return 'NSString *'; + return wrapIntoNullableIfNeeded('NSString *'); case 'NumberTypeAnnotation': case 'FloatTypeAnnotation': case 'Int32TypeAnnotation': - return 'NSNumber *'; + return param.nullable ? 'NSNumber *' : 'double'; case 'BooleanTypeAnnotation': - return 'BOOL'; + return param.nullable ? 'NSNumber * _Nullable' : 'BOOL'; case 'GenericObjectTypeAnnotation': - return 'NSDictionary *'; + return wrapIntoNullableIfNeeded('NSDictionary *'); case 'ArrayTypeAnnotation': - return 'NSArray> *'; + return wrapIntoNullableIfNeeded('NSArray *'); case 'FunctionTypeAnnotation': return 'RCTResponseSenderBlock'; case 'ObjectTypeAnnotation': - return 'NSDictionary *'; + return wrapIntoNullableIfNeeded('NSDictionary *'); default: throw new Error(error); } @@ -193,7 +196,7 @@ module.exports = { }); } const paramObjCType = translatePrimitiveJSTypeToObjCType( - param.typeAnnotation, + param, `Unspopported type for param "${param.name}" in ${ prop.name }. Found: ${param.typeAnnotation.type}`, 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 b46d05b4e44..a00a4138d02 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 @@ -294,11 +294,11 @@ inline JS::NativeSampleTurboModule::Constants::Builder::Builder(Constants i) : _ - (facebook::react::ModuleConstants)getConstants; - (void) voidFunc; - (BOOL) getBool:(BOOL)arg; -- (NSNumber *) getNumber:(NSNumber *)arg; +- (NSNumber *) getNumber:(double)arg; - (NSString *) getString:(NSString *)arg; -- (NSArray> *) getArray:(NSArray> *)arg; +- (NSArray> *) getArray:(NSArray *)arg; - (NSDictionary *) getObject:(NSDictionary *)arg; -- (NSDictionary *) getValue:(NSNumber *)x +- (NSDictionary *) getValue:(double)x y:(NSString *)y z:(NSDictionary *)z; - (void) getValueWithCallback:(RCTResponseSenderBlock)callback;