diff --git a/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js b/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js index 872f1aa0624..db591ef698d 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js @@ -24,7 +24,7 @@ import { } from '../parsers-commons'; import type {ParserType} from '../errors'; -const {Visitor} = require('../flow/Visitor'); +const {Visitor} = require('../parsers-primitives'); const {wrapComponentSchema} = require('../schema.js'); const {buildComponentSchema} = require('../flow/components'); const {buildModuleSchema} = require('../parsers-commons.js'); 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 66b7e3af66c..ee0a229bded 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 @@ -30,6 +30,7 @@ const { emitMixed, typeAliasResolution, typeEnumResolution, + Visitor, } = require('../parsers-primitives.js'); const {MockedParser} = require('../parserMock'); const {emitUnion} = require('../parsers-primitives'); @@ -1155,3 +1156,102 @@ describe('emitArrayType', () => { }); }); }); + +describe('Visitor', () => { + describe('CallExpression', () => { + it('sets isComponent to true if callee type is Identifier and callee name is codegenNativeComponent', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = { + callee: {type: 'Identifier', name: 'codegenNativeComponent'}, + }; + const visitor = Visitor(infoMap); + visitor.CallExpression(node); + + expect(infoMap.isComponent).toBe(true); + }); + + it('should not set isComponent to true if callee type is not Identifier or callee name is not codegenNativeComponent', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = { + callee: {type: '', name: ''}, + }; + const visitor = Visitor(infoMap); + visitor.CallExpression(node); + + expect(infoMap.isComponent).toBe(false); + }); + + it('sets isModule to true if isModuleRegistryCall', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + object: {type: 'Identifier', name: 'TurboModuleRegistry'}, + property: {type: 'Identifier', name: 'getEnforcing'}, + }, + }; + const visitor = Visitor(infoMap); + visitor.CallExpression(node); + + expect(infoMap.isModule).toBe(true); + }); + + it('should not set isModule to true if not isModuleRegistryCall', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = { + callee: { + type: 'Expression', + }, + }; + const visitor = Visitor(infoMap); + visitor.CallExpression(node); + + expect(infoMap.isModule).toBe(false); + }); + }); + + describe('InterfaceExtends', () => { + it('sets isModule to true if module interface extends TurboModule', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = {id: {name: 'TurboModule'}}; + + const visitor = Visitor(infoMap); + visitor.InterfaceExtends(node); + + expect(infoMap.isModule).toBe(true); + }); + + it('should not set isModule to true if module interface does not extends TurboModule', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = {id: {name: ''}}; + + const visitor = Visitor(infoMap); + visitor.InterfaceExtends(node); + + expect(infoMap.isModule).toBe(false); + }); + }); + + describe('TSInterfaceDeclaration', () => { + it('sets isModule to true if TypeScript Interface Declaration extends TurboModule', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = {extends: [{expression: {name: 'TurboModule'}}]}; + + const visitor = Visitor(infoMap); + visitor.TSInterfaceDeclaration(node); + + expect(infoMap.isModule).toBe(true); + }); + + it('should not set isModule to true if TypeScript Interface Declaration does not extends TurboModule', () => { + const infoMap = {isComponent: false, isModule: false}; + const node = {extends: [{expression: {name: ''}}]}; + + const visitor = Visitor(infoMap); + visitor.TSInterfaceDeclaration(node); + + expect(infoMap.isModule).toBe(false); + }); + }); +}); diff --git a/packages/react-native-codegen/src/parsers/flow/Visitor.js b/packages/react-native-codegen/src/parsers/flow/Visitor.js deleted file mode 100644 index 97ab6dea874..00000000000 --- a/packages/react-native-codegen/src/parsers/flow/Visitor.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and 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'; - -const {isModuleRegistryCall} = require('../utils'); - -function Visitor(infoMap: {isComponent: boolean, isModule: boolean}): { - [type: string]: (node: $FlowFixMe) => void, -} { - return { - CallExpression(node: $FlowFixMe) { - if ( - node.callee.type === 'Identifier' && - node.callee.name === 'codegenNativeComponent' - ) { - infoMap.isComponent = true; - } - - if (isModuleRegistryCall(node)) { - infoMap.isModule = true; - } - }, - InterfaceExtends(node: $FlowFixMe) { - if (node.id.name === 'TurboModule') { - infoMap.isModule = true; - } - }, - }; -} - -module.exports = { - Visitor, -}; diff --git a/packages/react-native-codegen/src/parsers/flow/parser.js b/packages/react-native-codegen/src/parsers/flow/parser.js index 5a694c7e44c..08f25eef140 100644 --- a/packages/react-native-codegen/src/parsers/flow/parser.js +++ b/packages/react-native-codegen/src/parsers/flow/parser.js @@ -31,7 +31,7 @@ const {flowTranslateTypeAnnotation} = require('./modules'); const flowParser = require('flow-parser'); const {buildSchema} = require('../parsers-commons'); -const {Visitor} = require('./Visitor'); +const {Visitor} = require('../parsers-primitives'); const {buildComponentSchema} = require('./components'); const {wrapComponentSchema} = require('../schema.js'); const {buildModuleSchema} = require('../parsers-commons.js'); diff --git a/packages/react-native-codegen/src/parsers/parsers-primitives.js b/packages/react-native-codegen/src/parsers/parsers-primitives.js index 9b225fbc85c..c87a749d72d 100644 --- a/packages/react-native-codegen/src/parsers/parsers-primitives.js +++ b/packages/react-native-codegen/src/parsers/parsers-primitives.js @@ -59,6 +59,8 @@ const { translateFunctionTypeAnnotation, } = require('./parsers-commons'); +const {isModuleRegistryCall} = require('./utils'); + function emitBoolean(nullable: boolean): Nullable { return wrapNullable(nullable, { type: 'BooleanTypeAnnotation', @@ -439,6 +441,40 @@ function emitArrayType( ); } +function Visitor(infoMap: {isComponent: boolean, isModule: boolean}): { + [type: string]: (node: $FlowFixMe) => void, +} { + return { + CallExpression(node: $FlowFixMe) { + if ( + node.callee.type === 'Identifier' && + node.callee.name === 'codegenNativeComponent' + ) { + infoMap.isComponent = true; + } + + if (isModuleRegistryCall(node)) { + infoMap.isModule = true; + } + }, + InterfaceExtends(node: $FlowFixMe) { + if (node.id.name === 'TurboModule') { + infoMap.isModule = true; + } + }, + TSInterfaceDeclaration(node: $FlowFixMe) { + if ( + Array.isArray(node.extends) && + node.extends.some( + extension => extension.expression.name === 'TurboModule', + ) + ) { + infoMap.isModule = true; + } + }, + }; +} + module.exports = { emitArrayType, emitBoolean, @@ -459,4 +495,5 @@ module.exports = { typeAliasResolution, typeEnumResolution, translateArrayTypeAnnotation, + Visitor, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/Visitor.js b/packages/react-native-codegen/src/parsers/typescript/Visitor.js deleted file mode 100644 index 3bd724c8c73..00000000000 --- a/packages/react-native-codegen/src/parsers/typescript/Visitor.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and 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'; - -const {isModuleRegistryCall} = require('../utils'); - -function Visitor(infoMap: {isComponent: boolean, isModule: boolean}): { - [type: string]: (node: $FlowFixMe) => void, -} { - return { - CallExpression(node: $FlowFixMe) { - if ( - node.callee.type === 'Identifier' && - node.callee.name === 'codegenNativeComponent' - ) { - infoMap.isComponent = true; - } - - if (isModuleRegistryCall(node)) { - infoMap.isModule = true; - } - }, - - TSInterfaceDeclaration(node: $FlowFixMe) { - if ( - Array.isArray(node.extends) && - node.extends.some( - extension => extension.expression.name === 'TurboModule', - ) - ) { - infoMap.isModule = true; - } - }, - }; -} - -module.exports = { - Visitor, -}; diff --git a/packages/react-native-codegen/src/parsers/typescript/parser.js b/packages/react-native-codegen/src/parsers/typescript/parser.js index fb707e4cae4..7da94e59275 100644 --- a/packages/react-native-codegen/src/parsers/typescript/parser.js +++ b/packages/react-native-codegen/src/parsers/typescript/parser.js @@ -31,7 +31,7 @@ const {typeScriptTranslateTypeAnnotation} = require('./modules'); const babelParser = require('@babel/parser'); const {buildSchema} = require('../parsers-commons'); -const {Visitor} = require('./Visitor'); +const {Visitor} = require('../parsers-primitives'); const {buildComponentSchema} = require('./components'); const {wrapComponentSchema} = require('../schema.js'); const {buildModuleSchema} = require('../parsers-commons.js');