From 5940d25cc184241ed77aca85c62f4ee071210d9b Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Tue, 25 Oct 2022 05:01:19 -0700 Subject: [PATCH] Create the Parser interface (#35036) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/35036 This diff is the base to create a polimorphic behavior for TypeScript and Flow parser. This type will allow to share a lot of code between the parsers and also to keep their differences a part. It will be the base diff/PR for further tasks in the Codegen umbrella Issue ## Changelog: [General][Added] - Parser interface to divide parser logic. Reviewed By: cortinico Differential Revision: D40548707 fbshipit-source-id: e632ba52b00b43e50306e3a792a841e72e8c07f4 --- .../src/parsers/errors.js | 15 ++++++------ .../src/parsers/flow/modules/index.js | 5 +++- .../src/parsers/flow/parser.js | 23 ++++++++++++++++++ .../src/parsers/parser.js | 24 +++++++++++++++++++ .../src/parsers/typescript/modules/index.js | 7 ++++-- .../src/parsers/typescript/parser.js | 22 +++++++++++++++++ 6 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 packages/react-native-codegen/src/parsers/flow/parser.js create mode 100644 packages/react-native-codegen/src/parsers/parser.js create mode 100644 packages/react-native-codegen/src/parsers/typescript/parser.js 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, +};