diff --git a/packages/react-native-codegen/src/parsers/errors.js b/packages/react-native-codegen/src/parsers/errors.js index 4882a9bdb43ac6..3b85694a504f99 100644 --- a/packages/react-native-codegen/src/parsers/errors.js +++ b/packages/react-native-codegen/src/parsers/errors.js @@ -11,7 +11,7 @@ 'use strict'; const invariant = require('invariant'); - +import type {Parser} from './parser'; export type ParserType = 'Flow' | 'TypeScript'; class ParserError extends Error { @@ -110,23 +110,22 @@ class UnsupportedTypeAnnotationParserError extends ParserError { } class UnsupportedGenericParserError extends ParserError { - +genericName: string; + // +genericName: string; constructor( nativeModuleName: string, genericTypeAnnotation: $FlowFixMe, - language: ParserType, + parser: Parser, ) { - const genericName = - language === 'TypeScript' - ? genericTypeAnnotation.typeName.name - : genericTypeAnnotation.id.name; + const genericName = parser.nameForGenericTypeAnnotation( + genericTypeAnnotation, + ); super( nativeModuleName, genericTypeAnnotation, `Unrecognized generic type '${genericName}' in NativeModule spec.`, ); - this.genericName = genericName; + // this.genericName = genericName; } } 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 9e9f3e6abe3ddb..914bb27128bcff 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -81,7 +81,10 @@ const { throwIfMoreThanOneModuleInterfaceParserError, } = require('../../error-utils'); +const {FlowParser} = require('../parser.js'); + const language = 'Flow'; +const parser = new FlowParser(); function translateArrayTypeAnnotation( hasteModuleName: string, @@ -276,7 +279,7 @@ function translateTypeAnnotation( throw new UnsupportedGenericParserError( hasteModuleName, typeAnnotation, - language, + parser, ); } } diff --git a/packages/react-native-codegen/src/parsers/flow/parser.js b/packages/react-native-codegen/src/parsers/flow/parser.js new file mode 100644 index 00000000000000..47481c90378365 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/flow/parser.js @@ -0,0 +1,23 @@ +/** + * 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'; + +import type {Parser} from '../parser'; + +class FlowParser implements Parser { + nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string { + return typeAnnotation.id.name; + } +} + +module.exports = { + FlowParser, +}; diff --git a/packages/react-native-codegen/src/parsers/parser.js b/packages/react-native-codegen/src/parsers/parser.js new file mode 100644 index 00000000000000..e98b67872b2343 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/parser.js @@ -0,0 +1,24 @@ +/** + * 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'; + +/** + * This is the main interface for Parsers of various languages. + * It exposes all the methods that contain language-specific logic. + */ +export interface Parser { + /** + * Given a type annotation for a generic type, it returns the type name. + * @parameter typeAnnotation: the annotation for a type in the AST. + * @returns: the name of the type. + */ + nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string; +} 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 448ff4388ab11e..3c26d7ab84d0df 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -80,7 +80,10 @@ const { throwIfUnsupportedFunctionReturnTypeAnnotationParserError, } = require('../../error-utils'); +const {TypeScriptParser} = require('../parser'); + const language = 'TypeScript'; +const parser = new TypeScriptParser(); function translateArrayTypeAnnotation( hasteModuleName: string, @@ -205,7 +208,7 @@ function translateTypeAnnotation( throw new UnsupportedGenericParserError( hasteModuleName, typeAnnotation, - language, + parser, ); } } @@ -290,7 +293,7 @@ function translateTypeAnnotation( throw new UnsupportedGenericParserError( hasteModuleName, typeAnnotation, - language, + parser, ); } } diff --git a/packages/react-native-codegen/src/parsers/typescript/parser.js b/packages/react-native-codegen/src/parsers/typescript/parser.js new file mode 100644 index 00000000000000..1c9db6d8d175e2 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/typescript/parser.js @@ -0,0 +1,22 @@ +/** + * 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'; + +import type {Parser} from '../parser'; + +class TypeScriptParser implements Parser { + nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string { + return typeAnnotation.typeName.name; + } +} +module.exports = { + TypeScriptParser, +};