Move isModuleInterface function (Flow, TypeScript) to the Flow and TypeScript parsers. (#36268)

Summary:
Task from https://github.com/facebook/react-native/issues/34872

> [Codegen 82] Move isModuleInterface function (Flow, TypeScript) to the Flow and TypeScript parsers.

## Changelog

[INTERNAL] [CHANGED] - Moved isModuleInterface function to to the Flow and TypeScript parsers.

Pull Request resolved: https://github.com/facebook/react-native/pull/36268

Test Plan: ` yarn test react-native-codegen`

Reviewed By: christophpurrer

Differential Revision: D43535948

Pulled By: rshest

fbshipit-source-id: 7a2db05008783499168b0ce3fa58fedbac2b4e79
This commit is contained in:
Kyaw Thura 2023-02-23 13:20:05 -08:00 коммит произвёл Facebook GitHub Bot
Родитель d528fe28a6
Коммит 85245af880
7 изменённых файлов: 78 добавлений и 20 удалений

Просмотреть файл

@ -67,6 +67,28 @@ describe('FlowParser', () => {
]);
});
});
describe('isModuleInterface', () => {
it('returns true if it is a valid node', () => {
const node = {
type: 'InterfaceDeclaration',
extends: [
{
type: 'InterfaceExtends',
id: {
name: 'TurboModule',
},
},
],
};
expect(parser.isModuleInterface(node)).toBe(true);
});
it('returns false if it is a invalid node', () => {
const node = {};
expect(parser.isModuleInterface(node)).toBe(false);
});
});
});
describe('TypeScriptParser', () => {
@ -116,4 +138,26 @@ describe('TypeScriptParser', () => {
]);
});
});
describe('isModuleInterface', () => {
it('returns true if it is a valid node', () => {
const node = {
type: 'TSInterfaceDeclaration',
extends: [
{
type: 'TSExpressionWithTypeArguments',
expression: {
name: 'TurboModule',
},
},
],
};
expect(parser.isModuleInterface(node)).toBe(true);
});
it('returns false if it is a invalid node', () => {
const node = {};
expect(parser.isModuleInterface(node)).toBe(false);
});
});
});

Просмотреть файл

@ -330,15 +330,6 @@ function translateTypeAnnotation(
}
}
function isModuleInterface(node: $FlowFixMe) {
return (
node.type === 'InterfaceDeclaration' &&
node.extends.length === 1 &&
node.extends[0].type === 'InterfaceExtends' &&
node.extends[0].id.name === 'TurboModule'
);
}
function buildModuleSchema(
hasteModuleName: string,
/**
@ -350,7 +341,7 @@ function buildModuleSchema(
): NativeModuleSchema {
const types = getTypes(ast);
const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
isModuleInterface,
t => parser.isModuleInterface(t),
);
throwIfModuleInterfaceNotFound(

Просмотреть файл

@ -196,6 +196,15 @@ class FlowParser implements Parser {
value: member.init?.value ?? member.id.name,
}));
}
isModuleInterface(node: $FlowFixMe): boolean {
return (
node.type === 'InterfaceDeclaration' &&
node.extends.length === 1 &&
node.extends[0].type === 'InterfaceExtends' &&
node.extends[0].id.name === 'TurboModule'
);
}
}
module.exports = {

Просмотреть файл

@ -152,4 +152,9 @@ export interface Parser {
* Calculates enum's members
*/
parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers;
/**
* Given a node, it returns true if it is a module interface
*/
isModuleInterface(node: $FlowFixMe): boolean;
}

Просмотреть файл

@ -159,4 +159,13 @@ export class MockedParser implements Parser {
},
];
}
isModuleInterface(node: $FlowFixMe): boolean {
return (
node.type === 'InterfaceDeclaration' &&
node.extends.length === 1 &&
node.extends[0].type === 'InterfaceExtends' &&
node.extends[0].id.name === 'TurboModule'
);
}
}

Просмотреть файл

@ -436,15 +436,6 @@ function translateTypeAnnotation(
}
}
function isModuleInterface(node: $FlowFixMe) {
return (
node.type === 'TSInterfaceDeclaration' &&
node.extends?.length === 1 &&
node.extends[0].type === 'TSExpressionWithTypeArguments' &&
node.extends[0].expression.name === 'TurboModule'
);
}
function buildModuleSchema(
hasteModuleName: string,
/**
@ -456,7 +447,7 @@ function buildModuleSchema(
): NativeModuleSchema {
const types = getTypes(ast);
const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
isModuleInterface,
t => parser.isModuleInterface(t),
);
throwIfModuleInterfaceNotFound(

Просмотреть файл

@ -192,6 +192,15 @@ class TypeScriptParser implements Parser {
value: member.initializer?.value ?? member.id.name,
}));
}
isModuleInterface(node: $FlowFixMe): boolean {
return (
node.type === 'TSInterfaceDeclaration' &&
node.extends?.length === 1 &&
node.extends[0].type === 'TSExpressionWithTypeArguments' &&
node.extends[0].expression.name === 'TurboModule'
);
}
}
module.exports = {
TypeScriptParser,