Move num(NativeModule flow interface) > 1 error into `buildModuleSchema`

Summary:
**Motivation:** After this change, we can show this ParserError using the React Native Module ESLint rule. Previously when we declared more than one NativeModule spec in a file, we incorrectly reported that there were *no* NativeModule specs in the file.

Changelog: [Internal]

Reviewed By: hramos

Differential Revision: D25163299

fbshipit-source-id: 92bc09d09cdbc323e0ac1f317c40a767880f5bc2
This commit is contained in:
Ramanpreet Nara 2020-12-04 14:19:27 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 1de76d2842
Коммит 3e5779ce93
4 изменённых файлов: 38 добавлений и 15 удалений

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

@ -77,14 +77,6 @@ function isModule(
return false; return false;
} }
if (moduleInterfaces.length > 1) {
throw new Error(
'File contains declarations of more than one module: ' +
moduleInterfaces.join(', ') +
'. Please declare exactly one module in this file.',
);
}
return true; return true;
} }

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

@ -12,7 +12,7 @@ exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_REA
exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_UNNAMED_PARAMS 1`] = `"Module NativeSampleTurboModule: All function parameters must be named."`; exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_UNNAMED_PARAMS 1`] = `"Module NativeSampleTurboModule: All function parameters must be named."`;
exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_EXTENDING_TURBO_MODULE 1`] = `"File contains declarations of more than one module: Spec, Spec2. Please declare exactly one module in this file."`; exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_EXTENDING_TURBO_MODULE 1`] = `"Module NativeSampleTurboModule: Every NativeModule spec file must declare exactly one NativeModule Flow interface. This file declares 2: 'Spec', and 'Spec2'. Please remove the extraneous Flow interface declarations."`;
exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_MODULES_EXPORTED_WITH_DEFAULT 1`] = `"File neither contains a module declaration, nor a component declaration. For module declarations, please make sure your file has an InterfaceDeclaration extending TurboModule. For component declarations, please make sure your file has a default export calling the codegenNativeComponent<Props>(...) macro."`; exports[`RN Codegen Flow Parser Fails with error message TWO_NATIVE_MODULES_EXPORTED_WITH_DEFAULT 1`] = `"File neither contains a module declaration, nor a component declaration. For module declarations, please make sure your file has an InterfaceDeclaration extending TurboModule. For component declarations, please make sure your file has a default export calling the codegenNativeComponent<Props>(...) macro."`;

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

@ -23,12 +23,33 @@ class MisnamedModuleFlowInterfaceParserError extends ParserError {
} }
} }
class ModuleFlowInterfaceNotParserError extends ParserError { class ModuleFlowInterfaceNotFoundParserError extends ParserError {
constructor(hasteModuleName: string, ast: $FlowFixMe) { constructor(hasteModuleName: string, ast: $FlowFixMe) {
super( super(
hasteModuleName, hasteModuleName,
ast, ast,
`Module ${hasteModuleName}: No Flow interfaces extending TurboModule were detected in this NativeNativeModule spec.`, 'No Flow interfaces extending TurboModule were detected in this NativeModule spec.',
);
}
}
class MoreThanOneModuleFlowInterfaceParserError extends ParserError {
constructor(
hasteModuleName: string,
flowModuleInterfaces: $ReadOnlyArray<$FlowFixMe>,
names: $ReadOnlyArray<string>,
) {
const finalName = names[names.length - 1];
const allButLastName = names.slice(0, -1);
const quote = x => `'${x}'`;
const nameStr =
allButLastName.map(quote).join(', ') + ', and ' + quote(finalName);
super(
hasteModuleName,
flowModuleInterfaces,
`Every NativeModule spec file must declare exactly one NativeModule Flow interface. This file declares ${names.length}: ${nameStr}. Please remove the extraneous Flow interface declarations.`,
); );
} }
} }
@ -294,7 +315,8 @@ class IncorrectModuleRegistryCallArgumentTypeParserError extends ParserError {
module.exports = { module.exports = {
IncorrectlyParameterizedFlowGenericParserError, IncorrectlyParameterizedFlowGenericParserError,
MisnamedModuleFlowInterfaceParserError, MisnamedModuleFlowInterfaceParserError,
ModuleFlowInterfaceNotParserError, ModuleFlowInterfaceNotFoundParserError,
MoreThanOneModuleFlowInterfaceParserError,
UnnamedFunctionParamParserError, UnnamedFunctionParamParserError,
UnsupportedArrayElementTypeAnnotationParserError, UnsupportedArrayElementTypeAnnotationParserError,
UnsupportedFlowGenericParserError, UnsupportedFlowGenericParserError,

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

@ -31,7 +31,8 @@ const {unwrapNullable, wrapNullable} = require('./utils');
const { const {
IncorrectlyParameterizedFlowGenericParserError, IncorrectlyParameterizedFlowGenericParserError,
MisnamedModuleFlowInterfaceParserError, MisnamedModuleFlowInterfaceParserError,
ModuleFlowInterfaceNotParserError, ModuleFlowInterfaceNotFoundParserError,
MoreThanOneModuleFlowInterfaceParserError,
UnnamedFunctionParamParserError, UnnamedFunctionParamParserError,
UnsupportedArrayElementTypeAnnotationParserError, UnsupportedArrayElementTypeAnnotationParserError,
UnsupportedFlowGenericParserError, UnsupportedFlowGenericParserError,
@ -580,8 +581,16 @@ function buildModuleSchema(
); );
}); });
if (moduleInterfaceNames.length !== 1) { if (moduleInterfaceNames.length === 0) {
throw new ModuleFlowInterfaceNotParserError(hasteModuleName, ast); throw new ModuleFlowInterfaceNotFoundParserError(hasteModuleName, ast);
}
if (moduleInterfaceNames.length > 1) {
throw new MoreThanOneModuleFlowInterfaceParserError(
hasteModuleName,
moduleInterfaceNames.map(name => types[name]),
moduleInterfaceNames,
);
} }
const [moduleInterfaceName] = moduleInterfaceNames; const [moduleInterfaceName] = moduleInterfaceNames;