From 43357df5cd518fdf79422b03518ea399727c6990 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 7 May 2019 06:25:50 -0700 Subject: [PATCH] Support hyphen symbols in enums Summary: This diff adds support for kebab-case enum properties by transforming them to KebabCase in cpp Reviewed By: mdvacca Differential Revision: D15218781 fbshipit-source-id: 0ec6d28f3ca0e5b8187fc7026e12a8d76be73a7c --- packages/react-native-codegen/src/Helpers.js | 19 ------------------- .../src/generators/CppHelpers.js | 12 ++++++++++++ .../src/generators/EventEmitterHelpers.js | 4 ++-- .../src/generators/GeneratePropsH.js | 11 +++++------ .../src/generators/GenerateTests.js | 4 ++-- .../generators/__test_fixtures__/fixtures.js | 2 +- .../__snapshots__/GeneratePropsH-test.js.snap | 6 +++--- .../__snapshots__/GenerateTests-test.js.snap | 8 ++++---- 8 files changed, 29 insertions(+), 37 deletions(-) delete mode 100644 packages/react-native-codegen/src/Helpers.js diff --git a/packages/react-native-codegen/src/Helpers.js b/packages/react-native-codegen/src/Helpers.js deleted file mode 100644 index a918475c7..000000000 --- a/packages/react-native-codegen/src/Helpers.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict - * @format - */ - -'use strict'; - -function upperCaseFirst(inString: string): string { - return inString[0].toUpperCase() + inString.slice(1); -} - -module.exports = { - upperCaseFirst, -}; diff --git a/packages/react-native-codegen/src/generators/CppHelpers.js b/packages/react-native-codegen/src/generators/CppHelpers.js index d81c88dca..4fd2c18cb 100644 --- a/packages/react-native-codegen/src/generators/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/CppHelpers.js @@ -11,6 +11,17 @@ 'use strict'; import type {ComponentShape} from '../CodegenSchema'; +function upperCaseFirst(inString: string): string { + return inString[0].toUpperCase() + inString.slice(1); +} + +function toSafeCppString(input: string): string { + return input + .split('-') + .map(upperCaseFirst) + .join(''); +} + function getCppTypeForAnnotation( type: | 'BooleanTypeAnnotation' @@ -72,4 +83,5 @@ function getImports(component: ComponentShape): Set { module.exports = { getCppTypeForAnnotation, getImports, + toSafeCppString, }; diff --git a/packages/react-native-codegen/src/generators/EventEmitterHelpers.js b/packages/react-native-codegen/src/generators/EventEmitterHelpers.js index e3783e0b5..b4f3a41a5 100644 --- a/packages/react-native-codegen/src/generators/EventEmitterHelpers.js +++ b/packages/react-native-codegen/src/generators/EventEmitterHelpers.js @@ -10,7 +10,7 @@ 'use strict'; -const {upperCaseFirst} = require('../Helpers.js'); +const {toSafeCppString} = require('./CppHelpers.js'); // import type {EventTypeShape} from './CodegenSchema'; @@ -18,7 +18,7 @@ function generateStructName( componentName: string, parts: $ReadOnlyArray = [], ) { - const additional = parts.map(upperCaseFirst).join(''); + const additional = parts.map(toSafeCppString).join(''); return `${componentName}${additional}Struct`; } diff --git a/packages/react-native-codegen/src/generators/GeneratePropsH.js b/packages/react-native-codegen/src/generators/GeneratePropsH.js index 2dd163e71..2e95c2c54 100644 --- a/packages/react-native-codegen/src/generators/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/GeneratePropsH.js @@ -10,8 +10,7 @@ 'use strict'; -const {getCppTypeForAnnotation} = require('./CppHelpers.js'); -const {upperCaseFirst} = require('../Helpers.js'); +const {getCppTypeForAnnotation, toSafeCppString} = require('./CppHelpers.js'); import type {PropTypeShape, SchemaType} from '../CodegenSchema'; @@ -165,7 +164,7 @@ function convertDefaultTypeToString(componentName: string, prop): string { return ''; } case 'StringEnumTypeAnnotation': - return `${getEnumName(componentName, prop.name)}::${upperCaseFirst( + return `${getEnumName(componentName, prop.name)}::${toSafeCppString( typeAnnotation.default, )}`; default: @@ -175,12 +174,12 @@ function convertDefaultTypeToString(componentName: string, prop): string { } function getEnumName(componentName, propName): string { - const uppercasedPropName = upperCaseFirst(propName); + const uppercasedPropName = toSafeCppString(propName); return `${componentName}${uppercasedPropName}`; } function convertValueToEnumOption(value: string): string { - return upperCaseFirst(value); + return toSafeCppString(value); } function generateEnumString(componentName: string, component): string { @@ -213,7 +212,7 @@ function generateEnumString(componentName: string, component): string { return enumTemplate .replace(/::_ENUM_NAME_::/g, enumName) - .replace('::_VALUES_::', values.map(upperCaseFirst).join(', ')) + .replace('::_VALUES_::', values.map(toSafeCppString).join(', ')) .replace('::_FROM_CASES_::', fromCases) .replace('::_TO_CASES_::', toCases); }) diff --git a/packages/react-native-codegen/src/generators/GenerateTests.js b/packages/react-native-codegen/src/generators/GenerateTests.js index 3aea6e66a..16ecefe5d 100644 --- a/packages/react-native-codegen/src/generators/GenerateTests.js +++ b/packages/react-native-codegen/src/generators/GenerateTests.js @@ -11,7 +11,7 @@ 'use strict'; import type {SchemaType} from '../CodegenSchema'; -const {getImports} = require('./CppHelpers'); +const {getImports, toSafeCppString} = require('./CppHelpers'); type FilesOutput = Map; type TestCase = $ReadOnly<{| @@ -52,7 +52,7 @@ function getTestCasesForProp(propName, typeAnnotation) { typeAnnotation.options.forEach(option => cases.push({ propName, - testName: `${propName}_${option.name}`, + testName: `${propName}_${toSafeCppString(option.name)}`, propValue: option.name, }), ); diff --git a/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js index b9fa3f012..669c637cc 100644 --- a/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js @@ -484,7 +484,7 @@ const ENUM_PROP: SchemaType = { name: 'center', }, { - name: 'bottom', + name: 'bottom-right', }, ], }, diff --git a/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GeneratePropsH-test.js.snap b/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GeneratePropsH-test.js.snap index 3f4e9bf47..17bf1608e 100644 --- a/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GeneratePropsH-test.js.snap +++ b/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GeneratePropsH-test.js.snap @@ -123,13 +123,13 @@ Map { namespace facebook { namespace react { -enum class EnumPropsNativeComponentAlignment { Top, Center, Bottom }; +enum class EnumPropsNativeComponentAlignment { Top, Center, BottomRight }; static inline void fromRawValue(const RawValue &value, EnumPropsNativeComponentAlignment &result) { auto string = (std::string)value; if (string == \\"top\\") { result = EnumPropsNativeComponentAlignment::Top; return; } if (string == \\"center\\") { result = EnumPropsNativeComponentAlignment::Center; return; } - if (string == \\"bottom\\") { result = EnumPropsNativeComponentAlignment::Bottom; return; } + if (string == \\"bottom-right\\") { result = EnumPropsNativeComponentAlignment::BottomRight; return; } abort(); } @@ -137,7 +137,7 @@ static inline std::string toString(const EnumPropsNativeComponentAlignment &valu switch (value) { case EnumPropsNativeComponentAlignment::Top: return \\"top\\"; case EnumPropsNativeComponentAlignment::Center: return \\"center\\"; - case EnumPropsNativeComponentAlignment::Bottom: return \\"bottom\\"; + case EnumPropsNativeComponentAlignment::BottomRight: return \\"bottom-right\\"; } } diff --git a/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateTests-test.js.snap b/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateTests-test.js.snap index 948fa1016..9103023cb 100644 --- a/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateTests-test.js.snap +++ b/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateTests-test.js.snap @@ -109,23 +109,23 @@ TEST(EnumPropsNativeComponentProps_DoesNotDie, etc) { EnumPropsNativeComponentProps(sourceProps, rawProps); } -TEST(EnumPropsNativeComponentProps_alignment_top, etc) { +TEST(EnumPropsNativeComponentProps_alignment_Top, etc) { auto const &sourceProps = EnumPropsNativeComponentProps(); auto const &rawProps = RawProps(folly::dynamic::object(\\"alignment\\", \\"top\\")); EnumPropsNativeComponentProps(sourceProps, rawProps); } -TEST(EnumPropsNativeComponentProps_alignment_center, etc) { +TEST(EnumPropsNativeComponentProps_alignment_Center, etc) { auto const &sourceProps = EnumPropsNativeComponentProps(); auto const &rawProps = RawProps(folly::dynamic::object(\\"alignment\\", \\"center\\")); EnumPropsNativeComponentProps(sourceProps, rawProps); } -TEST(EnumPropsNativeComponentProps_alignment_bottom, etc) { +TEST(EnumPropsNativeComponentProps_alignment_BottomRight, etc) { auto const &sourceProps = EnumPropsNativeComponentProps(); - auto const &rawProps = RawProps(folly::dynamic::object(\\"alignment\\", \\"bottom\\")); + auto const &rawProps = RawProps(folly::dynamic::object(\\"alignment\\", \\"bottom-right\\")); EnumPropsNativeComponentProps(sourceProps, rawProps); }",