diff --git a/packages/react-native-codegen/src/CodegenSchema.d.ts b/packages/react-native-codegen/src/CodegenSchema.d.ts index d16379472fa..42f1a75143c 100644 --- a/packages/react-native-codegen/src/CodegenSchema.d.ts +++ b/packages/react-native-codegen/src/CodegenSchema.d.ts @@ -286,6 +286,11 @@ export interface UnsafeAnyTypeAnnotation { readonly type: 'AnyTypeAnnotation', } +export interface NativeModuleNumberLiteralTypeAnnotation { + readonly type: 'NumberLiteralTypeAnnotation'; + readonly value: number; +} + export interface NativeModuleStringTypeAnnotation { readonly type: 'StringTypeAnnotation'; } @@ -380,6 +385,7 @@ export type NativeModuleEventEmitterBaseTypeAnnotation = | NativeModuleFloatTypeAnnotation | NativeModuleInt32TypeAnnotation | NativeModuleNumberTypeAnnotation + | NativeModuleNumberLiteralTypeAnnotation | NativeModuleStringTypeAnnotation | NativeModuleStringLiteralTypeAnnotation | NativeModuleStringLiteralUnionTypeAnnotation @@ -399,6 +405,7 @@ export type NativeModuleBaseTypeAnnotation = | NativeModuleStringLiteralTypeAnnotation | NativeModuleStringLiteralUnionTypeAnnotation | NativeModuleNumberTypeAnnotation + | NativeModuleNumberLiteralTypeAnnotation | NativeModuleInt32TypeAnnotation | NativeModuleDoubleTypeAnnotation | NativeModuleFloatTypeAnnotation diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 6b3097804fa..505291700fe 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -37,6 +37,11 @@ export type Int32TypeAnnotation = $ReadOnly<{ type: 'Int32TypeAnnotation', }>; +export type NumberLiteralTypeAnnotation = $ReadOnly<{ + type: 'NumberLiteralTypeAnnotation', + value: number, +}>; + export type StringTypeAnnotation = $ReadOnly<{ type: 'StringTypeAnnotation', }>; @@ -366,6 +371,7 @@ type NativeModuleEventEmitterBaseTypeAnnotation = | FloatTypeAnnotation | Int32TypeAnnotation | NativeModuleNumberTypeAnnotation + | NumberLiteralTypeAnnotation | StringTypeAnnotation | StringLiteralTypeAnnotation | StringLiteralUnionTypeAnnotation @@ -385,6 +391,7 @@ export type NativeModuleBaseTypeAnnotation = | StringLiteralTypeAnnotation | StringLiteralUnionTypeAnnotation | NativeModuleNumberTypeAnnotation + | NumberLiteralTypeAnnotation | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js index 1aa3c73dbbb..3c4e9b4fe9f 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js @@ -186,6 +186,8 @@ function serializeArg( return wrap(val => `${val}.asNumber()`); case 'Int32TypeAnnotation': return wrap(val => `${val}.asNumber()`); + case 'NumberLiteralTypeAnnotation': + return wrap(val => `${val}.asNumber()`); case 'ArrayTypeAnnotation': return wrap(val => `${val}.asObject(rt).asArray(rt)`); case 'FunctionTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index f7c4d674881..691229f6893 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -179,6 +179,8 @@ function translatePrimitiveJSTypeToCpp( return wrapOptional('jsi::String', isRequired); case 'NumberTypeAnnotation': return wrapOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js index 779b9ac3f5f..8ff63e8c994 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js @@ -136,6 +136,7 @@ function translateEventEmitterTypeToJavaType( case 'StringLiteralUnionTypeAnnotation': return 'String'; case 'NumberTypeAnnotation': + case 'NumberLiteralTypeAnnotation': case 'FloatTypeAnnotation': case 'DoubleTypeAnnotation': case 'Int32TypeAnnotation': @@ -203,6 +204,8 @@ function translateFunctionParamToJavaType( return wrapOptional('String', isRequired); case 'NumberTypeAnnotation': return wrapOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': @@ -297,6 +300,8 @@ function translateFunctionReturnTypeToJavaType( return wrapOptional('String', isRequired); case 'NumberTypeAnnotation': return wrapOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': @@ -373,6 +378,8 @@ function getFalsyReturnStatementFromReturnType( return ''; case 'NumberTypeAnnotation': return nullable ? 'return null;' : 'return 0;'; + case 'NumberLiteralTypeAnnotation': + return nullable ? 'return null;' : 'return 0;'; case 'FloatTypeAnnotation': return nullable ? 'return null;' : 'return 0.0;'; case 'DoubleTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js index 3beb1c3fa1e..7d6de0a4f54 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js @@ -197,6 +197,8 @@ function translateReturnTypeToKind( } case 'NumberTypeAnnotation': return 'NumberKind'; + case 'NumberLiteralTypeAnnotation': + return 'NumberKind'; case 'DoubleTypeAnnotation': return 'NumberKind'; case 'FloatTypeAnnotation': @@ -280,6 +282,8 @@ function translateParamTypeToJniType( } case 'NumberTypeAnnotation': return !isRequired ? 'Ljava/lang/Double;' : 'D'; + case 'NumberLiteralTypeAnnotation': + return !isRequired ? 'Ljava/lang/Double;' : 'D'; case 'DoubleTypeAnnotation': return !isRequired ? 'Ljava/lang/Double;' : 'D'; case 'FloatTypeAnnotation': @@ -360,6 +364,8 @@ function translateReturnTypeToJniType( } case 'NumberTypeAnnotation': return nullable ? 'Ljava/lang/Double;' : 'D'; + case 'NumberLiteralTypeAnnotation': + return nullable ? 'Ljava/lang/Double;' : 'D'; case 'DoubleTypeAnnotation': return nullable ? 'Ljava/lang/Double;' : 'D'; case 'FloatTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js index 295514ca526..db243d9f302 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js @@ -23,6 +23,7 @@ import type { NativeModuleObjectTypeAnnotation, NativeModuleTypeAliasTypeAnnotation, Nullable, + NumberLiteralTypeAnnotation, ReservedTypeAnnotation, StringLiteralTypeAnnotation, StringLiteralUnionTypeAnnotation, @@ -63,6 +64,7 @@ export type StructTypeAnnotation = | StringLiteralTypeAnnotation | StringLiteralUnionTypeAnnotation | NativeModuleNumberTypeAnnotation + | NumberLiteralTypeAnnotation | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js index 9fe6e73fc70..9cee0665e8f 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js @@ -100,6 +100,8 @@ function toObjCType( return 'NSString *'; case 'NumberTypeAnnotation': return wrapCxxOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapCxxOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapCxxOptional('double', isRequired); case 'Int32TypeAnnotation': @@ -183,6 +185,8 @@ function toObjCValue( return value; case 'NumberTypeAnnotation': return wrapPrimitive('double'); + case 'NumberLiteralTypeAnnotation': + return wrapPrimitive('double'); case 'FloatTypeAnnotation': return wrapPrimitive('double'); case 'Int32TypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js index dbf0fbefb50..9fca06510ad 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js @@ -91,6 +91,8 @@ function toObjCType( return 'NSString *'; case 'NumberTypeAnnotation': return wrapCxxOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapCxxOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapCxxOptional('double', isRequired); case 'Int32TypeAnnotation': @@ -173,6 +175,8 @@ function toObjCValue( return RCTBridgingTo('String'); case 'NumberTypeAnnotation': return RCTBridgingTo('Double'); + case 'NumberLiteralTypeAnnotation': + return RCTBridgingTo('Double'); case 'FloatTypeAnnotation': return RCTBridgingTo('Double'); case 'Int32TypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js index ae3ff4e198e..fd1afff066f 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js @@ -25,6 +25,7 @@ function getEventEmitterTypeObjCType( case 'StringLiteralUnionTypeAnnotation': return 'NSString *_Nonnull'; case 'NumberTypeAnnotation': + case 'NumberLiteralTypeAnnotation': return 'NSNumber *_Nonnull'; case 'BooleanTypeAnnotation': return 'BOOL'; 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 3c024a65e44..8e0a56472ff 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js @@ -263,6 +263,8 @@ function getParamObjCType( return notStruct(wrapOptional('NSString *', !nullable)); case 'NumberTypeAnnotation': return notStruct(isRequired ? 'double' : 'NSNumber *'); + case 'NumberLiteralTypeAnnotation': + return notStruct(isRequired ? 'double' : 'NSNumber *'); case 'FloatTypeAnnotation': return notStruct(isRequired ? 'float' : 'NSNumber *'); case 'DoubleTypeAnnotation': @@ -344,6 +346,8 @@ function getReturnObjCType( return wrapOptional('NSString *', isRequired); case 'NumberTypeAnnotation': return wrapOptional('NSNumber *', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('NSNumber *', isRequired); case 'FloatTypeAnnotation': return wrapOptional('NSNumber *', isRequired); case 'DoubleTypeAnnotation': @@ -414,6 +418,8 @@ function getReturnJSType( return 'StringKind'; case 'NumberTypeAnnotation': return 'NumberKind'; + case 'NumberLiteralTypeAnnotation': + return 'NumberKind'; case 'FloatTypeAnnotation': return 'NumberKind'; case 'DoubleTypeAnnotation': diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js index 1130a84e9b2..45c9179f5ba 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js @@ -126,6 +126,7 @@ import * as TurboModuleRegistry from '../TurboModuleRegistry'; export interface Spec extends TurboModule { +passBool?: (arg: boolean) => void; +passNumber: (arg: number) => void; + +passNumberLiteral: (arg: 4) => void; +passString: (arg: string) => void; +passStringish: (arg: Stringish) => void; +passStringLiteral: (arg: 'A String Literal') => void; diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap index 0d107690879..56df331cbea 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap @@ -978,6 +978,26 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_BASIC_PA ] } }, + { + 'name': 'passNumberLiteral', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'VoidTypeAnnotation' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'NumberLiteralTypeAnnotation', + 'value': 4 + } + } + ] + } + }, { 'name': 'passString', 'optional': false, diff --git a/packages/react-native-codegen/src/parsers/flow/modules/index.js b/packages/react-native-codegen/src/parsers/flow/modules/index.js index 4c6d2ef2023..501264ca3d6 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -38,6 +38,7 @@ const { emitCommonTypes, emitDictionary, emitFunction, + emitNumberLiteral, emitPromise, emitRootTag, emitUnion, @@ -243,6 +244,9 @@ function translateTypeAnnotation( case 'UnionTypeAnnotation': { return emitUnion(nullable, hasteModuleName, typeAnnotation, parser); } + case 'NumberLiteralTypeAnnotation': { + return emitNumberLiteral(nullable, typeAnnotation.value); + } case 'StringLiteralTypeAnnotation': { return wrapNullable(nullable, { type: 'StringLiteralTypeAnnotation', diff --git a/packages/react-native-codegen/src/parsers/parsers-primitives.js b/packages/react-native-codegen/src/parsers/parsers-primitives.js index 5e366960201..a0fa2c3f0ec 100644 --- a/packages/react-native-codegen/src/parsers/parsers-primitives.js +++ b/packages/react-native-codegen/src/parsers/parsers-primitives.js @@ -31,6 +31,7 @@ import type { NativeModuleTypeAnnotation, NativeModuleUnionTypeAnnotation, Nullable, + NumberLiteralTypeAnnotation, ObjectTypeAnnotation, ReservedTypeAnnotation, StringLiteralTypeAnnotation, @@ -170,6 +171,16 @@ function emitMixed( }); } +function emitNumberLiteral( + nullable: boolean, + value: number, +): Nullable { + return wrapNullable(nullable, { + type: 'NumberLiteralTypeAnnotation', + value, + }); +} + function emitString(nullable: boolean): Nullable { return wrapNullable(nullable, { type: 'StringTypeAnnotation', @@ -762,6 +773,7 @@ module.exports = { emitInt32Prop, emitMixedProp, emitNumber, + emitNumberLiteral, emitGenericObject, emitDictionary, emitObject, diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js index 6927f6c77c6..1dead63de55 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js @@ -113,6 +113,7 @@ import * as TurboModuleRegistry from '../TurboModuleRegistry'; export interface Spec extends TurboModule { readonly passBool?: (arg: boolean) => void; readonly passNumber: (arg: number) => void; + readonly passNumberLiteral: (arg: 4) => void; readonly passString: (arg: string) => void; readonly passStringish: (arg: Stringish) => void; readonly passStringLiteral: (arg: 'A String Literal') => void; diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index 5ff8fc7f31f..7358482aa08 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -1123,6 +1123,26 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_BA ] } }, + { + 'name': 'passNumberLiteral', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'VoidTypeAnnotation' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'NumberLiteralTypeAnnotation', + 'value': 4 + } + } + ] + } + }, { 'name': 'passString', 'optional': false, diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index 8c4da2de883..aaab3ddeeae 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -37,6 +37,7 @@ const { emitCommonTypes, emitDictionary, emitFunction, + emitNumberLiteral, emitPromise, emitRootTag, emitStringLiteral, @@ -403,6 +404,9 @@ function translateTypeAnnotation( case 'StringLiteral': { return emitStringLiteral(nullable, literal.value); } + case 'NumericLiteral': { + return emitNumberLiteral(nullable, literal.value); + } default: { throw new UnsupportedTypeAnnotationParserError( hasteModuleName,