diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index 29744c9d5e5..aea331e2f2a 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -73,8 +73,7 @@ static inline std::string toString(const ::_ENUM_NAME_:: &value) { } `.trim(); -const structTemplate = ` -struct ::_STRUCT_NAME_:: { +const structTemplate = `struct ::_STRUCT_NAME_:: { ::_FIELDS_:: }; @@ -84,12 +83,20 @@ static inline void fromRawValue(const RawValue &value, ::_STRUCT_NAME_:: &result ::_FROM_CASES_:: } - static inline std::string toString(const ::_STRUCT_NAME_:: &value) { return "[Object ::_STRUCT_NAME_::]"; } `.trim(); +const arrayConversionFunction = `static inline void fromRawValue(const RawValue &value, std::vector<::_STRUCT_NAME_::> &result) { + auto items = std::vector>{value}; + for (const auto &item : items) { + auto newItem = fromRawValue(item, ::_STRUCT_NAME_::{}) + result.push(newItem); + } +} +`; + const arrayEnumTemplate = ` using ::_ENUM_MASK_:: = uint32_t; @@ -187,6 +194,10 @@ function getNativeTypeFromAnnotation(componentName: string, prop): string { 'ArrayTypeAnnotation of type ArrayTypeAnnotation not supported', ); } + if (typeAnnotation.elementType.type === 'ObjectTypeAnnotation') { + const structName = generateStructName(componentName, [prop.name]); + return `std::vector<${structName}>`; + } if (typeAnnotation.elementType.type === 'StringEnumTypeAnnotation') { const enumName = getEnumName(componentName, prop.name); return getEnumMaskName(enumName); @@ -488,6 +499,19 @@ function generateStructs(componentName: string, component): string { [prop.name], prop.typeAnnotation.properties, ); + } else if ( + prop.typeAnnotation.type === 'ArrayTypeAnnotation' && + prop.typeAnnotation.elementType.type === 'ObjectTypeAnnotation' + ) { + const properties = prop.typeAnnotation.elementType.properties; + generateStruct(structs, componentName, [prop.name], properties); + structs.set( + `${componentName}ArrayStruct`, + arrayConversionFunction.replace( + /::_STRUCT_NAME_::/g, + generateStructName(componentName, [prop.name]), + ), + ); } }); @@ -534,6 +558,8 @@ function generateStruct( return; case 'StringEnumTypeAnnotation': return; + case 'DoubleTypeAnnotation': + return; case 'ObjectTypeAnnotation': const props = property.typeAnnotation.properties; if (props == null) { 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 53fed00dc25..33a12fbdf33 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 @@ -584,6 +584,26 @@ const ARRAY_PROPS: SchemaType = { }, }, }, + { + name: 'object', + optional: true, + typeAnnotation: { + type: 'ArrayTypeAnnotation', + elementType: { + type: 'ObjectTypeAnnotation', + properties: [ + { + name: 'stringProp', + optional: true, + typeAnnotation: { + type: 'StringTypeAnnotation', + default: '', + }, + }, + ], + }, + }, + }, ], commands: [], }, diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap index e6c3fb12f0a..ebe2c9dc604 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap @@ -28,7 +28,8 @@ ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( colors(convertRawProp(rawProps, \\"colors\\", sourceProps.colors, colors)), srcs(convertRawProp(rawProps, \\"srcs\\", sourceProps.srcs, srcs)), points(convertRawProp(rawProps, \\"points\\", sourceProps.points, points)), - sizes(convertRawProp(rawProps, \\"sizes\\", sourceProps.sizes, sizes)) + sizes(convertRawProp(rawProps, \\"sizes\\", sourceProps.sizes, sizes)), + object(convertRawProp(rawProps, \\"object\\", sourceProps.object, object)) {} } // namespace react 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 b4e01cde3ef..43058a238cf 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 @@ -76,6 +76,30 @@ static inline std::string toString(const ArrayPropsNativeComponentSizesMask &val } return result; } +struct ArrayPropsNativeComponentObjectStruct { + std::string stringProp; +}; + +static inline void fromRawValue(const RawValue &value, ArrayPropsNativeComponentObjectStruct &result) { + auto map = (better::map)value; + + auto stringProp = map.find(\\"stringProp\\"); + if (stringProp != map.end()) { + fromRawValue(stringProp->second, result.stringProp); + } +} + +static inline std::string toString(const ArrayPropsNativeComponentObjectStruct &value) { + return \\"[Object ArrayPropsNativeComponentObjectStruct]\\"; +} + +static inline void fromRawValue(const RawValue &value, std::vector &result) { + auto items = std::vector>{value}; + for (const auto &item : items) { + auto newItem = fromRawValue(item, ArrayPropsNativeComponentObjectStruct{}) + result.push(newItem); + } +} class ArrayPropsNativeComponentProps final : public ViewProps { public: @@ -92,6 +116,7 @@ class ArrayPropsNativeComponentProps final : public ViewProps { const std::vector srcs{}; const std::vector points{}; const ArrayPropsNativeComponentSizesMask sizes{static_cast(ArrayPropsNativeComponentSizes::Small)}; + const std::vector object{}; }; } // namespace react @@ -662,7 +687,6 @@ static inline void fromRawValue(const RawValue &value, ObjectPropsObjectPropObje } } - static inline std::string toString(const ObjectPropsObjectPropObjectArrayPropStruct &value) { return \\"[Object ObjectPropsObjectPropObjectArrayPropStruct]\\"; } @@ -690,7 +714,6 @@ static inline void fromRawValue(const RawValue &value, ObjectPropsObjectPropObje } } - static inline std::string toString(const ObjectPropsObjectPropObjectPrimitiveRequiredPropStruct &value) { return \\"[Object ObjectPropsObjectPropObjectPrimitiveRequiredPropStruct]\\"; } @@ -738,7 +761,6 @@ static inline void fromRawValue(const RawValue &value, ObjectPropsObjectPropStru } } - static inline std::string toString(const ObjectPropsObjectPropStruct &value) { return \\"[Object ObjectPropsObjectPropStruct]\\"; } 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 70721181504..cee946f49b4 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 @@ -43,6 +43,9 @@ public class ArrayPropsNativeComponentManagerDelegate { void setSrcs(T view, @Nullable ReadableArray value); void setPoints(T view, @Nullable ReadableArray value); void setSizes(T view, @Nullable ReadableArray value); + void setObject(T view, @Nullable ReadableArray value); } ", } 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 fa08f2b1502..8f889176d5e 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 @@ -28,6 +28,7 @@ const ArrayPropsNativeComponentViewConfig = { srcs: true, points: true, sizes: true, + object: true, }, };