Skip to content

Commit 92fc32a

Browse files
rshestRiccardo Cipolleschi
authored andcommitted
Add missing C++ include for prop conversion of complex array type (#35984)
Summary: Pull Request resolved: #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
1 parent 66a47e1 commit 92fc32a

File tree

8 files changed

+47
-1
lines changed

8 files changed

+47
-1
lines changed

packages/react-native-codegen/e2e/__test_fixtures__/components/ArrayPropsNativeComponent.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type NativeProps = $ReadOnly<{|
3535
// edgeInsets?: $ReadOnlyArray<EdgeInsetsValue>,
3636
sizes?: WithDefault<$ReadOnlyArray<'small' | 'large'>, 'small'>,
3737
object?: $ReadOnlyArray<$ReadOnly<{|prop: string|}>>,
38+
arrayOfObjects?: $ReadOnlyArray<$ReadOnly<{|prop1: Float, prop2: Int32|}>>,
3839
|}>;
3940

4041
export default (codegenNativeComponent<NativeProps>(

packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ ArrayPropsNativeComponentViewProps::ArrayPropsNativeComponentViewProps(
3333
srcs(convertRawProp(context, rawProps, \\"srcs\\", sourceProps.srcs, {})),
3434
points(convertRawProp(context, rawProps, \\"points\\", sourceProps.points, {})),
3535
sizes(convertRawProp(context, rawProps, \\"sizes\\", sourceProps.sizes, {static_cast<ArrayPropsNativeComponentViewSizesMask>(ArrayPropsNativeComponentViewSizes::Small)})),
36-
object(convertRawProp(context, rawProps, \\"object\\", sourceProps.object, {}))
36+
object(convertRawProp(context, rawProps, \\"object\\", sourceProps.object, {})),
37+
arrayOfObjects(convertRawProp(context, rawProps, \\"arrayOfObjects\\", sourceProps.arrayOfObjects, {}))
3738
{}
3839
3940
} // namespace react

packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Object {
1717
#include <jsi/jsi.h>
1818
#include <react/renderer/components/view/ViewProps.h>
1919
#include <react/renderer/core/PropsParserContext.h>
20+
#include <react/renderer/core/propsConversions.h>
2021
#include <react/renderer/graphics/Color.h>
2122
#include <react/renderer/graphics/Geometry.h>
2223
#include <react/renderer/imagemanager/primitives.h>
@@ -106,6 +107,38 @@ static inline void fromRawValue(const PropsParserContext& context, const RawValu
106107
}
107108
}
108109
110+
111+
struct ArrayPropsNativeComponentViewArrayOfObjectsStruct {
112+
Float prop1;
113+
int prop2;
114+
};
115+
116+
static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, ArrayPropsNativeComponentViewArrayOfObjectsStruct &result) {
117+
auto map = (butter::map<std::string, RawValue>)value;
118+
119+
auto tmp_prop1 = map.find(\\"prop1\\");
120+
if (tmp_prop1 != map.end()) {
121+
fromRawValue(context, tmp_prop1->second, result.prop1);
122+
}
123+
auto tmp_prop2 = map.find(\\"prop2\\");
124+
if (tmp_prop2 != map.end()) {
125+
fromRawValue(context, tmp_prop2->second, result.prop2);
126+
}
127+
}
128+
129+
static inline std::string toString(const ArrayPropsNativeComponentViewArrayOfObjectsStruct &value) {
130+
return \\"[Object ArrayPropsNativeComponentViewArrayOfObjectsStruct]\\";
131+
}
132+
133+
static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, std::vector<ArrayPropsNativeComponentViewArrayOfObjectsStruct> &result) {
134+
auto items = (std::vector<RawValue>)value;
135+
for (const auto &item : items) {
136+
ArrayPropsNativeComponentViewArrayOfObjectsStruct newItem;
137+
fromRawValue(context, item, newItem);
138+
result.emplace_back(newItem);
139+
}
140+
}
141+
109142
class JSI_EXPORT ArrayPropsNativeComponentViewProps final : public ViewProps {
110143
public:
111144
ArrayPropsNativeComponentViewProps() = default;
@@ -122,6 +155,7 @@ class JSI_EXPORT ArrayPropsNativeComponentViewProps final : public ViewProps {
122155
std::vector<Point> points{};
123156
ArrayPropsNativeComponentViewSizesMask sizes{static_cast<ArrayPropsNativeComponentViewSizesMask>(ArrayPropsNativeComponentViewSizes::Small)};
124157
std::vector<ArrayPropsNativeComponentViewObjectStruct> object{};
158+
std::vector<ArrayPropsNativeComponentViewArrayOfObjectsStruct> arrayOfObjects{};
125159
};
126160
127161
} // namespace react

packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaDelegate-test.js.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public class ArrayPropsNativeComponentViewManagerDelegate<T extends View, U exte
5353
case \\"object\\":
5454
mViewManager.setObject(view, (ReadableArray) value);
5555
break;
56+
case \\"arrayOfObjects\\":
57+
mViewManager.setArrayOfObjects(view, (ReadableArray) value);
58+
break;
5659
default:
5760
super.setProperty(view, propName, value);
5861
}

packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GeneratePropsJavaInterface-test.js.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public interface ArrayPropsNativeComponentViewManagerInterface<T extends View> {
2727
void setPoints(T view, @Nullable ReadableArray value);
2828
void setSizes(T view, @Nullable ReadableArray value);
2929
void setObject(T view, @Nullable ReadableArray value);
30+
void setArrayOfObjects(T view, @Nullable ReadableArray value);
3031
}
3132
",
3233
}

packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateViewConfigJs-test.js.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const __INTERNAL_VIEW_CONFIG = {
3838
points: true,
3939
sizes: true,
4040
object: true,
41+
arrayOfObjects: true,
4142
},
4243
};
4344

packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,11 @@ function getLocalImports(
270270
typeAnnotation.type === 'ArrayTypeAnnotation' &&
271271
typeAnnotation.elementType.type === 'ObjectTypeAnnotation'
272272
) {
273+
imports.add('#include <react/renderer/core/propsConversions.h>');
273274
const objectProps = typeAnnotation.elementType.properties;
275+
// $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation<PropTypeAnnotation>
274276
const objectImports = getImports(objectProps);
277+
// $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation<PropTypeAnnotation>
275278
const localImports = getLocalImports(objectProps);
276279
// $FlowFixMe[method-unbinding] added when improving typing for this parameters
277280
objectImports.forEach(imports.add, imports);

packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Map {
1717
#include <jsi/jsi.h>
1818
#include <react/renderer/components/view/ViewProps.h>
1919
#include <react/renderer/core/PropsParserContext.h>
20+
#include <react/renderer/core/propsConversions.h>
2021
#include <react/renderer/graphics/Color.h>
2122
#include <react/renderer/graphics/Geometry.h>
2223
#include <react/renderer/imagemanager/primitives.h>
@@ -234,6 +235,7 @@ Map {
234235
#include <react/renderer/components/image/conversions.h>
235236
#include <react/renderer/components/view/ViewProps.h>
236237
#include <react/renderer/core/PropsParserContext.h>
238+
#include <react/renderer/core/propsConversions.h>
237239
#include <react/renderer/graphics/Color.h>
238240
#include <react/renderer/graphics/Geometry.h>
239241
#include <react/renderer/imagemanager/primitives.h>

0 commit comments

Comments
 (0)