diff --git a/packages/react-native-codegen/src/generators/components/CppHelpers.js b/packages/react-native-codegen/src/generators/components/CppHelpers.js index a09b1d736004bf..b05293598b0a19 100644 --- a/packages/react-native-codegen/src/generators/components/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/components/CppHelpers.js @@ -96,8 +96,88 @@ function generateStructName( return `${componentName}${additional}Struct`; } +function getEnumName(componentName: string, propName: string): string { + const uppercasedPropName = toSafeCppString(propName); + return `${componentName}${uppercasedPropName}`; +} + +function getEnumMaskName(enumName: string): string { + return `${enumName}Mask`; +} + +function convertDefaultTypeToString( + componentName: string, + prop: PropTypeShape, +): string { + const typeAnnotation = prop.typeAnnotation; + switch (typeAnnotation.type) { + case 'BooleanTypeAnnotation': + return String(typeAnnotation.default); + case 'StringTypeAnnotation': + if (typeAnnotation.default == null) { + return ''; + } + return `"${typeAnnotation.default}"`; + case 'Int32TypeAnnotation': + return String(typeAnnotation.default); + case 'DoubleTypeAnnotation': + const defaultDoubleVal = typeAnnotation.default; + return parseInt(defaultDoubleVal, 10) === defaultDoubleVal + ? typeAnnotation.default.toFixed(1) + : String(typeAnnotation.default); + case 'FloatTypeAnnotation': + const defaultFloatVal = typeAnnotation.default; + return parseInt(defaultFloatVal, 10) === defaultFloatVal + ? typeAnnotation.default.toFixed(1) + : String(typeAnnotation.default); + case 'NativePrimitiveTypeAnnotation': + switch (typeAnnotation.name) { + case 'ColorPrimitive': + return ''; + case 'ImageSourcePrimitive': + return ''; + case 'PointPrimitive': + return ''; + default: + (typeAnnotation.name: empty); + throw new Error('Received unknown NativePrimitiveTypeAnnotation'); + } + case 'ArrayTypeAnnotation': { + switch (typeAnnotation.elementType.type) { + case 'StringEnumTypeAnnotation': + if (typeAnnotation.elementType.default == null) { + throw new Error( + 'A default is required for array StringEnumTypeAnnotation', + ); + } + const enumName = getEnumName(componentName, prop.name); + const enumMaskName = getEnumMaskName(enumName); + const defaultValue = `${enumName}::${toSafeCppString( + typeAnnotation.elementType.default || '', + )}`; + return `static_cast<${enumMaskName}>(${defaultValue})`; + default: + return ''; + } + } + case 'ObjectTypeAnnotation': { + return ''; + } + case 'StringEnumTypeAnnotation': + return `${getEnumName(componentName, prop.name)}::${toSafeCppString( + typeAnnotation.default, + )}`; + default: + (typeAnnotation: empty); + throw new Error('Received invalid typeAnnotation'); + } +} + module.exports = { + convertDefaultTypeToString, getCppTypeForAnnotation, + getEnumName, + getEnumMaskName, getImports, toSafeCppString, generateStructName, diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index 738715c2fb1133..2c190ce179b1a7 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -11,7 +11,7 @@ 'use strict'; import type {ComponentShape, SchemaType} from '../../CodegenSchema'; -const {getImports} = require('./CppHelpers'); +const {convertDefaultTypeToString, getImports} = require('./CppHelpers'); // File path -> contents type FilesOutput = Map; @@ -45,12 +45,13 @@ const componentTemplate = ` {} `.trim(); -function generatePropsString(component: ComponentShape) { +function generatePropsString(componentName: string, component: ComponentShape) { return component.props .map(prop => { + const defaultValue = convertDefaultTypeToString(componentName, prop); return `${prop.name}(convertRawProp(rawProps, "${ prop.name - }", sourceProps.${prop.name}, ${prop.name}))`; + }", sourceProps.${prop.name}, {${defaultValue}}))`; }) .join(',\n' + ' '); } @@ -104,7 +105,7 @@ module.exports = { const component = components[componentName]; const newName = `${componentName}Props`; - const propsString = generatePropsString(component); + const propsString = generatePropsString(componentName, component); const extendString = getClassExtendString(component); const imports = getImports(component.props); diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index 18808afe12e70e..9970f366888bb8 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -11,7 +11,10 @@ 'use strict'; const { + convertDefaultTypeToString, getCppTypeForAnnotation, + getEnumMaskName, + getEnumName, toSafeCppString, generateStructName, getImports, @@ -239,80 +242,6 @@ function getNativeTypeFromAnnotation( } } -function convertDefaultTypeToString(componentName: string, prop): string { - const typeAnnotation = prop.typeAnnotation; - switch (typeAnnotation.type) { - case 'BooleanTypeAnnotation': - return String(typeAnnotation.default); - case 'StringTypeAnnotation': - if (typeAnnotation.default == null) { - return ''; - } - return `"${typeAnnotation.default}"`; - case 'Int32TypeAnnotation': - return String(typeAnnotation.default); - case 'DoubleTypeAnnotation': - const defaultDoubleVal = typeAnnotation.default; - return parseInt(defaultDoubleVal, 10) === defaultDoubleVal - ? typeAnnotation.default.toFixed(1) - : String(typeAnnotation.default); - case 'FloatTypeAnnotation': - const defaultFloatVal = typeAnnotation.default; - return parseInt(defaultFloatVal, 10) === defaultFloatVal - ? typeAnnotation.default.toFixed(1) - : String(typeAnnotation.default); - case 'NativePrimitiveTypeAnnotation': - switch (typeAnnotation.name) { - case 'ColorPrimitive': - return ''; - case 'ImageSourcePrimitive': - return ''; - case 'PointPrimitive': - return ''; - default: - (typeAnnotation.name: empty); - throw new Error('Received unknown NativePrimitiveTypeAnnotation'); - } - case 'ArrayTypeAnnotation': { - switch (typeAnnotation.elementType.type) { - case 'StringEnumTypeAnnotation': - if (typeAnnotation.elementType.default == null) { - throw new Error( - 'A default is required for array StringEnumTypeAnnotation', - ); - } - const enumName = getEnumName(componentName, prop.name); - const enumMaskName = getEnumMaskName(enumName); - const defaultValue = `${enumName}::${toSafeCppString( - typeAnnotation.elementType.default || '', - )}`; - return `static_cast<${enumMaskName}>(${defaultValue})`; - default: - return ''; - } - } - case 'ObjectTypeAnnotation': { - return ''; - } - case 'StringEnumTypeAnnotation': - return `${getEnumName(componentName, prop.name)}::${toSafeCppString( - typeAnnotation.default, - )}`; - default: - (typeAnnotation: empty); - throw new Error('Received invalid typeAnnotation'); - } -} - -function getEnumName(componentName, propName): string { - const uppercasedPropName = toSafeCppString(propName); - return `${componentName}${uppercasedPropName}`; -} - -function getEnumMaskName(enumName: string): string { - return `${enumName}Mask`; -} - function convertValueToEnumOption(value: string): string { return toSafeCppString(value); } 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 4f81abf1dda663..bfc00ae64f2876 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 @@ -21,16 +21,16 @@ ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( const ArrayPropsNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - names(convertRawProp(rawProps, \\"names\\", sourceProps.names, names)), - disableds(convertRawProp(rawProps, \\"disableds\\", sourceProps.disableds, disableds)), - progress(convertRawProp(rawProps, \\"progress\\", sourceProps.progress, progress)), - radii(convertRawProp(rawProps, \\"radii\\", sourceProps.radii, radii)), - 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)), - object(convertRawProp(rawProps, \\"object\\", sourceProps.object, object)), - array(convertRawProp(rawProps, \\"array\\", sourceProps.array, array)) + names(convertRawProp(rawProps, \\"names\\", sourceProps.names, {})), + disableds(convertRawProp(rawProps, \\"disableds\\", sourceProps.disableds, {})), + progress(convertRawProp(rawProps, \\"progress\\", sourceProps.progress, {})), + radii(convertRawProp(rawProps, \\"radii\\", sourceProps.radii, {})), + colors(convertRawProp(rawProps, \\"colors\\", sourceProps.colors, {})), + srcs(convertRawProp(rawProps, \\"srcs\\", sourceProps.srcs, {})), + points(convertRawProp(rawProps, \\"points\\", sourceProps.points, {})), + sizes(convertRawProp(rawProps, \\"sizes\\", sourceProps.sizes, {static_cast(ArrayPropsNativeComponentSizes::Small)})), + object(convertRawProp(rawProps, \\"object\\", sourceProps.object, {})), + array(convertRawProp(rawProps, \\"array\\", sourceProps.array, {})) {} } // namespace react @@ -59,7 +59,7 @@ ArrayPropsNativeComponentProps::ArrayPropsNativeComponentProps( const ArrayPropsNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - nativePrimitives(convertRawProp(rawProps, \\"nativePrimitives\\", sourceProps.nativePrimitives, nativePrimitives)) + nativePrimitives(convertRawProp(rawProps, \\"nativePrimitives\\", sourceProps.nativePrimitives, {})) {} } // namespace react @@ -88,7 +88,7 @@ BooleanPropNativeComponentProps::BooleanPropNativeComponentProps( const BooleanPropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} } // namespace react @@ -117,7 +117,7 @@ ColorPropNativeComponentProps::ColorPropNativeComponentProps( const ColorPropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - tintColor(convertRawProp(rawProps, \\"tintColor\\", sourceProps.tintColor, tintColor)) + tintColor(convertRawProp(rawProps, \\"tintColor\\", sourceProps.tintColor, {})) {} } // namespace react @@ -175,7 +175,7 @@ CommandNativeComponentProps::CommandNativeComponentProps( const CommandNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - accessibilityHint(convertRawProp(rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, accessibilityHint)) + accessibilityHint(convertRawProp(rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, {\\"\\"})) {} } // namespace react @@ -204,12 +204,12 @@ DoublePropNativeComponentProps::DoublePropNativeComponentProps( const DoublePropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - blurRadius(convertRawProp(rawProps, \\"blurRadius\\", sourceProps.blurRadius, blurRadius)), - blurRadius2(convertRawProp(rawProps, \\"blurRadius2\\", sourceProps.blurRadius2, blurRadius2)), - blurRadius3(convertRawProp(rawProps, \\"blurRadius3\\", sourceProps.blurRadius3, blurRadius3)), - blurRadius4(convertRawProp(rawProps, \\"blurRadius4\\", sourceProps.blurRadius4, blurRadius4)), - blurRadius5(convertRawProp(rawProps, \\"blurRadius5\\", sourceProps.blurRadius5, blurRadius5)), - blurRadius6(convertRawProp(rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, blurRadius6)) + blurRadius(convertRawProp(rawProps, \\"blurRadius\\", sourceProps.blurRadius, {0.0})), + blurRadius2(convertRawProp(rawProps, \\"blurRadius2\\", sourceProps.blurRadius2, {0.001})), + blurRadius3(convertRawProp(rawProps, \\"blurRadius3\\", sourceProps.blurRadius3, {2.1})), + blurRadius4(convertRawProp(rawProps, \\"blurRadius4\\", sourceProps.blurRadius4, {0.0})), + blurRadius5(convertRawProp(rawProps, \\"blurRadius5\\", sourceProps.blurRadius5, {1.0})), + blurRadius6(convertRawProp(rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, {0.0})) {} } // namespace react @@ -238,7 +238,7 @@ EnumPropsNativeComponentProps::EnumPropsNativeComponentProps( const EnumPropsNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - alignment(convertRawProp(rawProps, \\"alignment\\", sourceProps.alignment, alignment)) + alignment(convertRawProp(rawProps, \\"alignment\\", sourceProps.alignment, {EnumPropsNativeComponentAlignment::Center})) {} } // namespace react @@ -267,7 +267,7 @@ EventsNestedObjectNativeComponentProps::EventsNestedObjectNativeComponentProps( const EventsNestedObjectNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} } // namespace react @@ -296,7 +296,7 @@ EventsNativeComponentProps::EventsNativeComponentProps( const EventsNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} } // namespace react @@ -354,12 +354,12 @@ FloatPropNativeComponentProps::FloatPropNativeComponentProps( const FloatPropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - blurRadius(convertRawProp(rawProps, \\"blurRadius\\", sourceProps.blurRadius, blurRadius)), - blurRadius2(convertRawProp(rawProps, \\"blurRadius2\\", sourceProps.blurRadius2, blurRadius2)), - blurRadius3(convertRawProp(rawProps, \\"blurRadius3\\", sourceProps.blurRadius3, blurRadius3)), - blurRadius4(convertRawProp(rawProps, \\"blurRadius4\\", sourceProps.blurRadius4, blurRadius4)), - blurRadius5(convertRawProp(rawProps, \\"blurRadius5\\", sourceProps.blurRadius5, blurRadius5)), - blurRadius6(convertRawProp(rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, blurRadius6)) + blurRadius(convertRawProp(rawProps, \\"blurRadius\\", sourceProps.blurRadius, {0.0})), + blurRadius2(convertRawProp(rawProps, \\"blurRadius2\\", sourceProps.blurRadius2, {0.001})), + blurRadius3(convertRawProp(rawProps, \\"blurRadius3\\", sourceProps.blurRadius3, {2.1})), + blurRadius4(convertRawProp(rawProps, \\"blurRadius4\\", sourceProps.blurRadius4, {0.0})), + blurRadius5(convertRawProp(rawProps, \\"blurRadius5\\", sourceProps.blurRadius5, {1.0})), + blurRadius6(convertRawProp(rawProps, \\"blurRadius6\\", sourceProps.blurRadius6, {0.0})) {} } // namespace react @@ -389,7 +389,7 @@ ImagePropNativeComponentProps::ImagePropNativeComponentProps( const ImagePropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - thumbImage(convertRawProp(rawProps, \\"thumbImage\\", sourceProps.thumbImage, thumbImage)) + thumbImage(convertRawProp(rawProps, \\"thumbImage\\", sourceProps.thumbImage, {})) {} } // namespace react @@ -418,9 +418,9 @@ IntegerPropNativeComponentProps::IntegerPropNativeComponentProps( const IntegerPropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - progress1(convertRawProp(rawProps, \\"progress1\\", sourceProps.progress1, progress1)), - progress2(convertRawProp(rawProps, \\"progress2\\", sourceProps.progress2, progress2)), - progress3(convertRawProp(rawProps, \\"progress3\\", sourceProps.progress3, progress3)) + progress1(convertRawProp(rawProps, \\"progress1\\", sourceProps.progress1, {0})), + progress2(convertRawProp(rawProps, \\"progress2\\", sourceProps.progress2, {-1})), + progress3(convertRawProp(rawProps, \\"progress3\\", sourceProps.progress3, {10})) {} } // namespace react @@ -449,7 +449,7 @@ InterfaceOnlyComponentProps::InterfaceOnlyComponentProps( const InterfaceOnlyComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - accessibilityHint(convertRawProp(rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, accessibilityHint)) + accessibilityHint(convertRawProp(rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, {\\"\\"})) {} } // namespace react @@ -479,10 +479,10 @@ ImageColorPropNativeComponentProps::ImageColorPropNativeComponentProps( const ImageColorPropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - thumbImage(convertRawProp(rawProps, \\"thumbImage\\", sourceProps.thumbImage, thumbImage)), - color(convertRawProp(rawProps, \\"color\\", sourceProps.color, color)), - thumbTintColor(convertRawProp(rawProps, \\"thumbTintColor\\", sourceProps.thumbTintColor, thumbTintColor)), - point(convertRawProp(rawProps, \\"point\\", sourceProps.point, point)) + thumbImage(convertRawProp(rawProps, \\"thumbImage\\", sourceProps.thumbImage, {})), + color(convertRawProp(rawProps, \\"color\\", sourceProps.color, {})), + thumbTintColor(convertRawProp(rawProps, \\"thumbTintColor\\", sourceProps.thumbTintColor, {})), + point(convertRawProp(rawProps, \\"point\\", sourceProps.point, {})) {} } // namespace react @@ -541,7 +541,7 @@ ObjectPropsProps::ObjectPropsProps( const ObjectPropsProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - objectProp(convertRawProp(rawProps, \\"objectProp\\", sourceProps.objectProp, objectProp)) + objectProp(convertRawProp(rawProps, \\"objectProp\\", sourceProps.objectProp, {})) {} } // namespace react @@ -570,7 +570,7 @@ PointPropNativeComponentProps::PointPropNativeComponentProps( const PointPropNativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - startPoint(convertRawProp(rawProps, \\"startPoint\\", sourceProps.startPoint, startPoint)) + startPoint(convertRawProp(rawProps, \\"startPoint\\", sourceProps.startPoint, {})) {} } // namespace react @@ -599,8 +599,8 @@ StringPropComponentProps::StringPropComponentProps( const StringPropComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - accessibilityHint(convertRawProp(rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, accessibilityHint)), - accessibilityRole(convertRawProp(rawProps, \\"accessibilityRole\\", sourceProps.accessibilityRole, accessibilityRole)) + accessibilityHint(convertRawProp(rawProps, \\"accessibilityHint\\", sourceProps.accessibilityHint, {\\"\\"})), + accessibilityRole(convertRawProp(rawProps, \\"accessibilityRole\\", sourceProps.accessibilityRole, {})) {} } // namespace react @@ -629,13 +629,13 @@ MultiFile1NativeComponentProps::MultiFile1NativeComponentProps( const MultiFile1NativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} MultiFile2NativeComponentProps::MultiFile2NativeComponentProps( const MultiFile2NativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {true})) {} } // namespace react @@ -664,13 +664,13 @@ MultiComponent1NativeComponentProps::MultiComponent1NativeComponentProps( const MultiComponent1NativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {false})) {} MultiComponent2NativeComponentProps::MultiComponent2NativeComponentProps( const MultiComponent2NativeComponentProps &sourceProps, const RawProps &rawProps): ViewProps(sourceProps, rawProps), - disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, disabled)) + disabled(convertRawProp(rawProps, \\"disabled\\", sourceProps.disabled, {true})) {} } // namespace react