Skip to content

Commit

Permalink
Add missing C++ include for prop conversion of complex array type (#3…
Browse files Browse the repository at this point in the history
…5984)

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
  • Loading branch information
rshest authored and Riccardo Cipolleschi committed Feb 13, 2023
1 parent 66a47e1 commit 92fc32a
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ type NativeProps = $ReadOnly<{|
// edgeInsets?: $ReadOnlyArray<EdgeInsetsValue>,
sizes?: WithDefault<$ReadOnlyArray<'small' | 'large'>, 'small'>,
object?: $ReadOnlyArray<$ReadOnly<{|prop: string|}>>,
arrayOfObjects?: $ReadOnlyArray<$ReadOnly<{|prop1: Float, prop2: Int32|}>>,
|}>;

export default (codegenNativeComponent<NativeProps>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ ArrayPropsNativeComponentViewProps::ArrayPropsNativeComponentViewProps(
srcs(convertRawProp(context, rawProps, \\"srcs\\", sourceProps.srcs, {})),
points(convertRawProp(context, rawProps, \\"points\\", sourceProps.points, {})),
sizes(convertRawProp(context, rawProps, \\"sizes\\", sourceProps.sizes, {static_cast<ArrayPropsNativeComponentViewSizesMask>(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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Object {
#include <jsi/jsi.h>
#include <react/renderer/components/view/ViewProps.h>
#include <react/renderer/core/PropsParserContext.h>
#include <react/renderer/core/propsConversions.h>
#include <react/renderer/graphics/Color.h>
#include <react/renderer/graphics/Geometry.h>
#include <react/renderer/imagemanager/primitives.h>
Expand Down Expand Up @@ -106,6 +107,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<std::string, RawValue>)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<ArrayPropsNativeComponentViewArrayOfObjectsStruct> &result) {
auto items = (std::vector<RawValue>)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;
Expand All @@ -122,6 +155,7 @@ class JSI_EXPORT ArrayPropsNativeComponentViewProps final : public ViewProps {
std::vector<Point> points{};
ArrayPropsNativeComponentViewSizesMask sizes{static_cast<ArrayPropsNativeComponentViewSizesMask>(ArrayPropsNativeComponentViewSizes::Small)};
std::vector<ArrayPropsNativeComponentViewObjectStruct> object{};
std::vector<ArrayPropsNativeComponentViewArrayOfObjectsStruct> arrayOfObjects{};
};
} // namespace react
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ public class ArrayPropsNativeComponentViewManagerDelegate<T extends View, U exte
case \\"object\\":
mViewManager.setObject(view, (ReadableArray) value);
break;
case \\"arrayOfObjects\\":
mViewManager.setArrayOfObjects(view, (ReadableArray) value);
break;
default:
super.setProperty(view, propName, value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public interface ArrayPropsNativeComponentViewManagerInterface<T extends View> {
void setPoints(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);
}
",
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export const __INTERNAL_VIEW_CONFIG = {
points: true,
sizes: true,
object: true,
arrayOfObjects: true,
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,11 @@ function getLocalImports(
typeAnnotation.type === 'ArrayTypeAnnotation' &&
typeAnnotation.elementType.type === 'ObjectTypeAnnotation'
) {
imports.add('#include <react/renderer/core/propsConversions.h>');
const objectProps = typeAnnotation.elementType.properties;
// $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation<PropTypeAnnotation>
const objectImports = getImports(objectProps);
// $FlowFixMe[incompatible-call] the type is guaranteed to be ObjectTypeAnnotation<PropTypeAnnotation>
const localImports = getLocalImports(objectProps);
// $FlowFixMe[method-unbinding] added when improving typing for this parameters
objectImports.forEach(imports.add, imports);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Map {
#include <jsi/jsi.h>
#include <react/renderer/components/view/ViewProps.h>
#include <react/renderer/core/PropsParserContext.h>
#include <react/renderer/core/propsConversions.h>
#include <react/renderer/graphics/Color.h>
#include <react/renderer/graphics/Geometry.h>
#include <react/renderer/imagemanager/primitives.h>
Expand Down Expand Up @@ -234,6 +235,7 @@ Map {
#include <react/renderer/components/image/conversions.h>
#include <react/renderer/components/view/ViewProps.h>
#include <react/renderer/core/PropsParserContext.h>
#include <react/renderer/core/propsConversions.h>
#include <react/renderer/graphics/Color.h>
#include <react/renderer/graphics/Geometry.h>
#include <react/renderer/imagemanager/primitives.h>
Expand Down

0 comments on commit 92fc32a

Please sign in to comment.