From 825e1c087c314cb06345d6e6e521cb3739f7687b Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Tue, 13 Aug 2019 13:33:20 -0700 Subject: [PATCH] Commands: support Float arguments Summary: Support codegen'ing commands with Float arguments. Reviewed By: mdvacca Differential Revision: D16785534 fbshipit-source-id: 8174ae40762c1114b87a023cb2b69b2515dc6e23 --- .../react-native-codegen/src/CodegenSchema.js | 5 ++++ .../components/GenerateComponentHObjCpp.js | 8 +++++++ .../components/GeneratePropsJavaDelegate.js | 2 ++ .../components/GeneratePropsJavaInterface.js | 2 ++ .../components/__test_fixtures__/fixtures.js | 6 +++++ .../GenerateComponentHObjCpp-test.js.snap | 24 ++++++++++++------- .../GeneratePropsJavaDelegate-test.js.snap | 2 +- .../GeneratePropsJavaInterface-test.js.snap | 2 +- .../GenerateViewConfigJs-test.js.snap | 4 ++-- .../components/__test_fixtures__/fixtures.js | 3 ++- .../component-parser-test.js.snap | 6 +++++ .../src/parsers/flow/components/commands.js | 5 ++++ 12 files changed, 56 insertions(+), 13 deletions(-) diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index ee66a2ec920..bc7499f6764 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -23,8 +23,13 @@ export type CommandsFunctionTypeParamAnnotation = $ReadOnly<{| export type CommandsTypeAnnotation = | BooleanTypeAnnotation | Int32TypeAnnotation + | FloatTypeAnnotation | StringTypeAnnotation; +export type FloatTypeAnnotation = $ReadOnly<{| + type: 'FloatTypeAnnotation', +|}>; + export type BooleanTypeAnnotation = $ReadOnly<{| type: 'BooleanTypeAnnotation', |}>; diff --git a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js index 1d8c8e36e4b..2777f4383a3 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateComponentHObjCpp.js @@ -105,6 +105,8 @@ function getObjCParamType(param: CommandsFunctionTypeParamAnnotation): string { switch (param.typeAnnotation.type) { case 'BooleanTypeAnnotation': return 'BOOL'; + case 'FloatTypeAnnotation': + return 'float'; case 'Int32TypeAnnotation': return 'NSInteger'; case 'StringTypeAnnotation': @@ -121,6 +123,8 @@ function getObjCExpectedKindParamType( switch (param.typeAnnotation.type) { case 'BooleanTypeAnnotation': return '[NSNumber class]'; + case 'FloatTypeAnnotation': + return '[NSNumber class]'; case 'Int32TypeAnnotation': return '[NSNumber class]'; case 'StringTypeAnnotation': @@ -137,6 +141,8 @@ function getReadableExpectedKindParamType( switch (param.typeAnnotation.type) { case 'BooleanTypeAnnotation': return 'boolean'; + case 'FloatTypeAnnotation': + return 'float'; case 'Int32TypeAnnotation': return 'number'; case 'StringTypeAnnotation': @@ -154,6 +160,8 @@ function getObjCRightHandAssignmentParamType( switch (param.typeAnnotation.type) { case 'BooleanTypeAnnotation': return `[(NSNumber *)arg${index} boolValue]`; + case 'FloatTypeAnnotation': + return `[(NSNumber *)arg${index} floatValue]`; case 'Int32TypeAnnotation': return `[(NSNumber *)arg${index} intValue]`; case 'StringTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js index 89e770687f5..103db21f044 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaDelegate.js @@ -129,6 +129,8 @@ function getCommandArgJavaType(param) { switch (param.typeAnnotation.type) { case 'BooleanTypeAnnotation': return 'getBoolean'; + case 'FloatTypeAnnotation': + return 'getFloat'; case 'Int32TypeAnnotation': return 'getInt'; case 'StringTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js index d9e521b4058..0d64c971050 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsJavaInterface.js @@ -99,6 +99,8 @@ function getCommandArgJavaType(param) { switch (param.typeAnnotation.type) { case 'BooleanTypeAnnotation': return 'boolean'; + case 'FloatTypeAnnotation': + return 'float'; case 'Int32TypeAnnotation': return 'int'; case 'StringTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js index b65f1bb8f07..159988cdbc7 100644 --- a/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/components/__test_fixtures__/fixtures.js @@ -1068,6 +1068,12 @@ const COMMANDS: SchemaType = { type: 'Int32TypeAnnotation', }, }, + { + name: 'y', + typeAnnotation: { + type: 'FloatTypeAnnotation', + }, + }, { name: 'message', typeAnnotation: { diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap index 415a6315706..f3f69a5a8b8 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateComponentHObjCpp-test.js.snap @@ -86,7 +86,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol RCTCommandNativeComponentViewProtocol - (void)flashScrollIndicators; -- (void)allTypes:(NSInteger)x message:(NSString *)message animated:(BOOL)animated; +- (void)allTypes:(NSInteger)x y:(float)y message:(NSString *)message animated:(BOOL)animated; @end RCT_EXTERN inline void RCTCommandNativeComponentHandleCommand( @@ -110,8 +110,8 @@ RCT_EXTERN inline void RCTCommandNativeComponentHandleCommand( if ([commandName isEqualToString:@\\"allTypes\\"]) { #if RCT_DEBUG - if ([args count] != 3) { - RCTLogError(@\\"%@ command %@ received %d arguments, expected %d.\\", @\\"CommandNativeComponent\\", commandName, (int)[args count], 3); + if ([args count] != 4) { + RCTLogError(@\\"%@ command %@ received %d arguments, expected %d.\\", @\\"CommandNativeComponent\\", commandName, (int)[args count], 4); return; } #endif @@ -126,21 +126,29 @@ if ([commandName isEqualToString:@\\"allTypes\\"]) { #if RCT_DEBUG NSObject *arg1 = args[1]; - if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSString class], @\\"string\\", @\\"CommandNativeComponent\\", commandName, @\\"2nd\\")) { + if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSNumber class], @\\"float\\", @\\"CommandNativeComponent\\", commandName, @\\"2nd\\")) { return; } #endif - NSString * message = (NSString *)arg1; + float y = [(NSNumber *)arg1 floatValue]; #if RCT_DEBUG NSObject *arg2 = args[2]; - if (!RCTValidateTypeOfViewCommandArgument(arg2, [NSNumber class], @\\"boolean\\", @\\"CommandNativeComponent\\", commandName, @\\"3rd\\")) { + if (!RCTValidateTypeOfViewCommandArgument(arg2, [NSString class], @\\"string\\", @\\"CommandNativeComponent\\", commandName, @\\"3rd\\")) { return; } #endif - BOOL animated = [(NSNumber *)arg2 boolValue]; + NSString * message = (NSString *)arg2; - [componentView allTypes:x message:message animated:animated] +#if RCT_DEBUG + NSObject *arg3 = args[3]; + if (!RCTValidateTypeOfViewCommandArgument(arg3, [NSNumber class], @\\"boolean\\", @\\"CommandNativeComponent\\", commandName, @\\"4th\\")) { + return; + } +#endif + BOOL animated = [(NSNumber *)arg3 boolValue]; + + [componentView allTypes:x y:y message:message animated:animated] return; } diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap index 3dcd4e116e9..28f6c04fe84 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsJavaDelegate-test.js.snap @@ -138,7 +138,7 @@ public class CommandNativeComponentManagerDelegate { // No props void flashScrollIndicators(T view); - void allTypes(T view, int x, String message, boolean animated); + void allTypes(T view, int x, float y, String message, boolean animated); } ", } diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap index 8443ed35b79..354c16e2127 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -147,8 +147,8 @@ export const Commands = { dispatchCommand(ref, \\"flashScrollIndicators\\", []); }, - allTypes(ref, x, message, animated) { - dispatchCommand(ref, \\"allTypes\\", [x, message, animated]); + allTypes(ref, x, y, message, animated) { + dispatchCommand(ref, \\"allTypes\\", [x, y, message, animated]); } }; ", diff --git a/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js index 44feeff837a..c680a8cedf4 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/components/__test_fixtures__/fixtures.js @@ -670,7 +670,7 @@ const COMMANDS_DEFINED_WITH_ALL_TYPES = ` const codegenNativeCommands = require('codegenNativeCommands'); const codegenNativeComponent = require('codegenNativeComponent'); -import type {Int32} from 'CodegenTypes'; +import type {Int32, Float} from 'CodegenTypes'; import type {ViewProps} from 'ViewPropTypes'; import type {NativeComponent} from 'codegenNativeComponent'; @@ -678,6 +678,7 @@ interface NativeCommands { +hotspotUpdate: (viewRef: React.Ref<'RCTView'>, x: Int32, y: Int32) => void; +scrollTo: ( viewRef: React.Ref<'RCTView'>, + x: Float, y: Int32, animated: boolean, ) => void; diff --git a/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap b/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap index 6aebc437e5a..7aa45e6d474 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/components/__tests__/__snapshots__/component-parser-test.js.snap @@ -1747,6 +1747,12 @@ Object { "optional": false, "typeAnnotation": Object { "params": Array [ + Object { + "name": "x", + "typeAnnotation": Object { + "type": "FloatTypeAnnotation", + }, + }, Object { "name": "y", "typeAnnotation": Object { diff --git a/packages/react-native-codegen/src/parsers/flow/components/commands.js b/packages/react-native-codegen/src/parsers/flow/components/commands.js index 133cb09412c..e911ad14a5e 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/commands.js +++ b/packages/react-native-codegen/src/parsers/flow/components/commands.js @@ -57,6 +57,11 @@ function buildCommandSchema(property, types: TypeMap) { type: 'Int32TypeAnnotation', }; break; + case 'Float': + returnType = { + type: 'FloatTypeAnnotation', + }; + break; default: (type: empty); throw new Error(