From 5f05b07d025d051a824c6c568c8dfed03df7dd47 Mon Sep 17 00:00:00 2001 From: MaeIg Date: Mon, 10 Oct 2022 04:23:30 -0700 Subject: [PATCH] Extract RootTag case of translateTypeAnnotation from the flow and typescript folders in parsers-primitives (#34901) Summary: This PR aims to reduce code duplication by extracting `emitRootTag` logic from the flow and typescript folders into a shared parsers-primitives file. It is a task of https://github.com/facebook/react-native/issues/34872: > Extract the content of the case 'RootTag' (Flow TypeScript) into a single emitRootTag function in the parsers-primitives.js file. Use the new function in the parsers. ~~Note that https://github.com/facebook/react-native/issues/34898 should be merged first. I rebased on it's branch.~~ ## Changelog [Internal] [Changed] - Extract RootTag case of translateTypeAnnotation from the flow and typescript folders in parsers-primitives Pull Request resolved: https://github.com/facebook/react-native/pull/34901 Test Plan: All tests are passing, with `yarn jest react-native-codegen`: image Reviewed By: cipolleschi Differential Revision: D40212553 Pulled By: cipolleschi fbshipit-source-id: eadbbfb5cf6dfa6c966f4c08a5d9372a3470b621 --- .../__tests__/parsers-primitives-test.js | 29 ++++++++++++++++++- .../src/parsers/flow/modules/index.js | 6 ++-- .../src/parsers/parsers-primitives.js | 9 ++++++ .../src/parsers/typescript/modules/index.js | 6 ++-- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js b/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js index 2d3cec0343..03bc6ab6dc 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js @@ -15,7 +15,8 @@ const { emitBoolean, emitNumber, emitInt32, -} = require('../parsers-primitives.js'); + emitRootTag, +} = require('../parsers-primitives'); describe('emitBoolean', () => { describe('when nullable is true', () => { @@ -94,3 +95,29 @@ describe('emitNumber', () => { }); }); }); + +describe('emitRootTag', () => { + const reservedTypeAnnotation = { + type: 'ReservedTypeAnnotation', + name: 'RootTag', + }; + + describe('when nullable is true', () => { + it('returns nullable type annotation', () => { + const result = emitRootTag(true); + + expect(result).toEqual({ + type: 'NullableTypeAnnotation', + typeAnnotation: reservedTypeAnnotation, + }); + }); + }); + + describe('when nullable is false', () => { + it('returns non nullable type annotation', () => { + const result = emitRootTag(false); + + expect(result).toEqual(reservedTypeAnnotation); + }); + }); +}); diff --git a/packages/react-native-codegen/src/parsers/flow/modules/index.js b/packages/react-native-codegen/src/parsers/flow/modules/index.js index b9a7e99f19..e53276b723 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -37,6 +37,7 @@ const { emitBoolean, emitNumber, emitInt32, + emitRootTag, } = require('../../parsers-primitives'); const { IncorrectlyParameterizedGenericParserError, @@ -87,10 +88,7 @@ function translateTypeAnnotation( case 'GenericTypeAnnotation': { switch (typeAnnotation.id.name) { case 'RootTag': { - return wrapNullable(nullable, { - type: 'ReservedTypeAnnotation', - name: 'RootTag', - }); + return emitRootTag(nullable); } case 'Promise': { assertGenericTypeAnnotationHasExactlyOneTypeParameter( diff --git a/packages/react-native-codegen/src/parsers/parsers-primitives.js b/packages/react-native-codegen/src/parsers/parsers-primitives.js index 96c727b80c..55c3e0de8d 100644 --- a/packages/react-native-codegen/src/parsers/parsers-primitives.js +++ b/packages/react-native-codegen/src/parsers/parsers-primitives.js @@ -15,6 +15,7 @@ import type { Int32TypeAnnotation, NativeModuleNumberTypeAnnotation, Nullable, + ReservedTypeAnnotation, } from '../CodegenSchema'; const {wrapNullable} = require('./parsers-commons'); @@ -39,8 +40,16 @@ function emitNumber( }); } +function emitRootTag(nullable: boolean): Nullable { + return wrapNullable(nullable, { + type: 'ReservedTypeAnnotation', + name: 'RootTag', + }); +} + module.exports = { emitBoolean, emitInt32, emitNumber, + emitRootTag, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index ec8ac8d9d5..97ea838a47 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -37,6 +37,7 @@ const { emitBoolean, emitNumber, emitInt32, + emitRootTag, } = require('../../parsers-primitives'); const { IncorrectlyParameterizedGenericParserError, @@ -199,10 +200,7 @@ function translateTypeAnnotation( case 'TSTypeReference': { switch (typeAnnotation.typeName.name) { case 'RootTag': { - return wrapNullable(nullable, { - type: 'ReservedTypeAnnotation', - name: 'RootTag', - }); + return emitRootTag(nullable); } case 'Promise': { assertGenericTypeAnnotationHasExactlyOneTypeParameter(