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
This commit is contained in:
Родитель
eaf465d0df
Коммит
a00cea46bf
|
@ -39,6 +39,7 @@ type NativeProps = $ReadOnly<{|
|
|||
dimensions?: $ReadOnlyArray<DimensionValue>,
|
||||
sizes?: WithDefault<$ReadOnlyArray<'small' | 'large'>, 'small'>,
|
||||
object?: $ReadOnlyArray<$ReadOnly<{|prop: string|}>>,
|
||||
arrayOfObjects?: $ReadOnlyArray<$ReadOnly<{|prop1: Float, prop2: Int32|}>>,
|
||||
|}>;
|
||||
|
||||
export default (codegenNativeComponent<NativeProps>(
|
||||
|
|
|
@ -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<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
|
||||
|
|
|
@ -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/Point.h>
|
||||
#include <react/renderer/graphics/RectangleEdges.h>
|
||||
|
@ -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<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;
|
||||
|
@ -126,6 +159,7 @@ class JSI_EXPORT ArrayPropsNativeComponentViewProps final : public ViewProps {
|
|||
std::vector<YGValue> dimensions{};
|
||||
ArrayPropsNativeComponentViewSizesMask sizes{static_cast<ArrayPropsNativeComponentViewSizesMask>(ArrayPropsNativeComponentViewSizes::Small)};
|
||||
std::vector<ArrayPropsNativeComponentViewObjectStruct> object{};
|
||||
std::vector<ArrayPropsNativeComponentViewArrayOfObjectsStruct> arrayOfObjects{};
|
||||
};
|
||||
|
||||
} // namespace react
|
||||
|
|
|
@ -59,6 +59,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);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ public interface ArrayPropsNativeComponentViewManagerInterface<T extends View> {
|
|||
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);
|
||||
}
|
||||
",
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ export const __INTERNAL_VIEW_CONFIG = {
|
|||
dimensions: true,
|
||||
sizes: true,
|
||||
object: true,
|
||||
arrayOfObjects: true,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -276,8 +276,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);
|
||||
|
|
|
@ -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/Point.h>
|
||||
#include <react/renderer/imagemanager/primitives.h>
|
||||
|
@ -236,6 +237,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/Point.h>
|
||||
#include <react/renderer/imagemanager/primitives.h>
|
||||
|
|
Загрузка…
Ссылка в новой задаче