-
Notifications
You must be signed in to change notification settings - Fork 24.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Throw Flow syntax errors instead of continuing to process the AST (#3…
…9035) Summary: Pull Request resolved: #39035 Changelog: [General][Fixed] Flow syntax errors in Codegen specs are no longer ignored. Instead of throwing errors like most parsers, the `flow-parser` package returns errors as part of the AST (along with a best-effort parse). It turns out that `react-native/codegen` ignores such errors and only detects a subset of them after the fact. Here we change the behaviour to immediately throwing a descriptive error message (containing the file name and a code frame). **This change is theoretically breaking** for any published packages that already contain broken Flow code (that somehow doesn't happen to affect the Codegen output today). Hopefully, anyone using Flow-flavoured RN Codegen is also typechecking with Flow and/or building with Metro (which would both flag the same errors), so the impact should be fairly contained. Reviewed By: huntie Differential Revision: D48385786 fbshipit-source-id: c7e1f5fb64a61fb0eb9e9f8f7501b43264c9626c
- Loading branch information
1 parent
5a7ae61
commit a74765e
Showing
10 changed files
with
124 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
82 changes: 82 additions & 0 deletions
82
packages/react-native-codegen/src/parsers/flow/parseFlowAndThrowErrors.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
/** | ||
* 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'; | ||
|
||
// $FlowFixMe[untyped-import] | ||
const {codeFrameColumns} = require('@babel/code-frame'); | ||
// $FlowFixMe[untyped-import] there's no flowtype flow-parser | ||
const flowParser = require('flow-parser'); | ||
|
||
class FlowParserSyntaxError extends Error { | ||
constructor( | ||
code: string, | ||
filename: ?string, | ||
errors: $ReadOnlyArray<{ | ||
loc: $ReadOnly<{ | ||
start: $ReadOnly<{line: number, column: number}>, | ||
end: $ReadOnly<{line: number, column: number}>, | ||
}>, | ||
message: string, | ||
}>, | ||
) { | ||
const firstError = errors[0]; | ||
const codeFrame = codeFrameColumns( | ||
code, | ||
{ | ||
start: { | ||
line: firstError.loc.start.line, | ||
// flow-parser returns 0-indexed columns but Babel expects 1-indexed | ||
column: firstError.loc.start.column + 1, | ||
}, | ||
end: { | ||
line: firstError.loc.end.line, | ||
// flow-parser returns 0-indexed columns but Babel expects 1-indexed | ||
column: firstError.loc.end.column + 1, | ||
}, | ||
}, | ||
{ | ||
forceColor: false, | ||
}, | ||
); | ||
const additionalErrorsMessage = errors.length | ||
? '\n\nand ' + | ||
errors.length + | ||
' other error' + | ||
(errors.length > 1 ? 's' : '') + | ||
' in the same file.' | ||
: ''; | ||
|
||
super( | ||
(filename != null ? `Syntax error in ${filename}: ` : 'Syntax error: ') + | ||
firstError.message + | ||
'\n' + | ||
codeFrame + | ||
additionalErrorsMessage, | ||
); | ||
} | ||
} | ||
|
||
function parseFlowAndThrowErrors( | ||
code: string, | ||
options: $ReadOnly<{filename?: ?string}> = {}, | ||
): $FlowFixMe { | ||
const ast = flowParser.parse(code, { | ||
enums: true, | ||
}); | ||
if (ast.errors && ast.errors.length) { | ||
throw new FlowParserSyntaxError(code, options.filename, ast.errors); | ||
} | ||
return ast; | ||
} | ||
|
||
module.exports = { | ||
parseFlowAndThrowErrors, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters