Skip to content

Commit

Permalink
Create the Parser interface (#35036)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: #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
  • Loading branch information
cipolleschi authored and facebook-github-bot committed Oct 25, 2022
1 parent c419b4f commit 5940d25
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 11 deletions.
15 changes: 7 additions & 8 deletions packages/react-native-codegen/src/parsers/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
'use strict';

const invariant = require('invariant');

import type {Parser} from './parser';
export type ParserType = 'Flow' | 'TypeScript';

class ParserError extends Error {
Expand Down Expand Up @@ -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;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -276,7 +279,7 @@ function translateTypeAnnotation(
throw new UnsupportedGenericParserError(
hasteModuleName,
typeAnnotation,
language,
parser,
);
}
}
Expand Down
23 changes: 23 additions & 0 deletions packages/react-native-codegen/src/parsers/flow/parser.js
Original file line number Diff line number Diff line change
@@ -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,
};
24 changes: 24 additions & 0 deletions packages/react-native-codegen/src/parsers/parser.js
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,10 @@ const {
throwIfUnsupportedFunctionReturnTypeAnnotationParserError,
} = require('../../error-utils');

const {TypeScriptParser} = require('../parser');

const language = 'TypeScript';
const parser = new TypeScriptParser();

function translateArrayTypeAnnotation(
hasteModuleName: string,
Expand Down Expand Up @@ -205,7 +208,7 @@ function translateTypeAnnotation(
throw new UnsupportedGenericParserError(
hasteModuleName,
typeAnnotation,
language,
parser,
);
}
}
Expand Down Expand Up @@ -290,7 +293,7 @@ function translateTypeAnnotation(
throw new UnsupportedGenericParserError(
hasteModuleName,
typeAnnotation,
language,
parser,
);
}
}
Expand Down
22 changes: 22 additions & 0 deletions packages/react-native-codegen/src/parsers/typescript/parser.js
Original file line number Diff line number Diff line change
@@ -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,
};

0 comments on commit 5940d25

Please sign in to comment.