From a00cea46bf0bde788e6f92ae8f750bd9e32a2739 Mon Sep 17 00:00:00 2001 From: Ruslan Shestopalyuk Date: Fri, 27 Jan 2023 05:19:17 -0800 Subject: [PATCH] Add missing C++ include for prop conversion of complex array type (#35984) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/35984 [Changelog][Internal] Codegen for props parsing was failing to add a required include for the case when the type is an array of objects, which in turn use non-trivial types. Something like: ``` export type NativeProps = $ReadOnly<{ ...ViewProps, bounds: $ReadOnlyArray< $ReadOnly<{ height?: Float, left?: Float, top?: Float, width?: Float, }>, >, }>; ``` would cause compilation errors on C++ side, since the required header for the `Float` conversion wasn't included. Reviewed By: cipolleschi Differential Revision: D42781128 fbshipit-source-id: d5b133b931a60e414761db0b3ed09893d3fcc9aa --- .../components/ArrayPropsNativeComponent.js | 1 + .../GeneratePropsCpp-test.js.snap | 3 +- .../__snapshots__/GeneratePropsH-test.js.snap | 34 +++++++++++++++++++ .../GeneratePropsJavaDelegate-test.js.snap | 3 ++ .../GeneratePropsJavaInterface-test.js.snap | 1 + .../GenerateViewConfigJs-test.js.snap | 1 + .../components/ComponentsGeneratorUtils.js | 3 ++ .../__snapshots__/GeneratePropsH-test.js.snap | 2 ++ 8 files changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js b/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js index 0ed6169f523089..f9541da58f1f97 100644 --- a/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js +++ b/packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js @@ -39,6 +39,7 @@ type NativeProps = $ReadOnly<{| dimensions?: $ReadOnlyArray, sizes?: WithDefault<$ReadOnlyArray<'small' | 'large'>, 'small'>, object?: $ReadOnlyArray<$ReadOnly<{|prop: string|}>>, + arrayOfObjects?: $ReadOnlyArray<$ReadOnly<{|prop1: Float, prop2: Int32|}>>, |}>; export default (codegenNativeComponent( diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap index 03e37e2c3a3813..1b907467748503 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap @@ -36,7 +36,8 @@ ArrayPropsNativeComponentViewProps::ArrayPropsNativeComponentViewProps( edgeInsets(convertRawProp(context, rawProps, \\"edgeInsets\\", sourceProps.edgeInsets, {})), dimensions(convertRawProp(context, rawProps, \\"dimensions\\", sourceProps.dimensions, {})), sizes(convertRawProp(context, rawProps, \\"sizes\\", sourceProps.sizes, {static_cast(ArrayPropsNativeComponentViewSizes::Small)})), - object(convertRawProp(context, rawProps, \\"object\\", sourceProps.object, {})) + object(convertRawProp(context, rawProps, \\"object\\", sourceProps.object, {})), + arrayOfObjects(convertRawProp(context, rawProps, \\"arrayOfObjects\\", sourceProps.arrayOfObjects, {})) {} } // namespace react diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap index b5e76736d214a6..4666f4b9a34a5a 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap @@ -17,6 +17,7 @@ Object { #include #include #include +#include #include #include #include @@ -108,6 +109,38 @@ static inline void fromRawValue(const PropsParserContext& context, const RawValu } } + +struct ArrayPropsNativeComponentViewArrayOfObjectsStruct { + Float prop1; + int prop2; +}; + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ArrayPropsNativeComponentViewArrayOfObjectsStruct &result) { + auto map = (butter::map)value; + + auto tmp_prop1 = map.find(\\"prop1\\"); + if (tmp_prop1 != map.end()) { + fromRawValue(context, tmp_prop1->second, result.prop1); + } + auto tmp_prop2 = map.find(\\"prop2\\"); + if (tmp_prop2 != map.end()) { + fromRawValue(context, tmp_prop2->second, result.prop2); + } +} + +static inline std::string toString(const ArrayPropsNativeComponentViewArrayOfObjectsStruct &value) { + return \\"[Object ArrayPropsNativeComponentViewArrayOfObjectsStruct]\\"; +} + +static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector &result) { + auto items = (std::vector)value; + for (const auto &item : items) { + ArrayPropsNativeComponentViewArrayOfObjectsStruct newItem; + fromRawValue(context, item, newItem); + result.emplace_back(newItem); + } +} + class JSI_EXPORT ArrayPropsNativeComponentViewProps final : public ViewProps { public: ArrayPropsNativeComponentViewProps() = default; @@ -126,6 +159,7 @@ class JSI_EXPORT ArrayPropsNativeComponentViewProps final : public ViewProps { std::vector dimensions{}; ArrayPropsNativeComponentViewSizesMask sizes{static_cast(ArrayPropsNativeComponentViewSizes::Small)}; std::vector object{}; + std::vector arrayOfObjects{}; }; } // namespace react diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap index 058a451d860f56..23434676375b57 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap @@ -59,6 +59,9 @@ public class ArrayPropsNativeComponentViewManagerDelegate { void setDimensions(T view, @Nullable ReadableArray value); void setSizes(T view, @Nullable ReadableArray value); void setObject(T view, @Nullable ReadableArray value); + void setArrayOfObjects(T view, @Nullable ReadableArray value); } ", } diff --git a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap index 486057211e7a8c..5630f8db49b7c7 100644 --- a/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -40,6 +40,7 @@ export const __INTERNAL_VIEW_CONFIG = { dimensions: true, sizes: true, object: true, + arrayOfObjects: true, }, }; diff --git a/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js b/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js index 09e54a8420a76b..e9f4c057bed558 100644 --- a/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js +++ b/packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js @@ -276,8 +276,11 @@ function getLocalImports( typeAnnotation.type === 'ArrayTypeAnnotation' && typeAnnotation.elementType.type === 'ObjectTypeAnnotation' ) { + imports.add('#include '); const objectProps = typeAnnotation.elementType.properties; + // $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation const objectImports = getImports(objectProps); + // $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation const localImports = getLocalImports(objectProps); // $FlowFixMe[method-unbinding] added when improving typing for this parameters objectImports.forEach(imports.add, imports); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap index 99246753200328..2233888c128b24 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap @@ -17,6 +17,7 @@ Map { #include #include #include +#include #include #include #include @@ -236,6 +237,7 @@ Map { #include #include #include +#include #include #include #include