Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
@babel-core: parse should parse only (#10914)
* @babel/core: parse methods should parse only * Update Flow types
- Loading branch information
1 parent
875e961
commit ee5b79d
Showing
4 changed files
with
80 additions
and
81 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { parse } from "@babel/parser"; | ||
import { codeFrameColumns } from "@babel/code-frame"; | ||
import generateMissingPluginMessage from "./util/missing-plugin-helper"; | ||
|
||
type AstRoot = BabelNodeFile | BabelNodeProgram; | ||
|
||
export type ParseResult = AstRoot; | ||
|
||
export default function parser( | ||
pluginPasses: PluginPasses, | ||
{ parserOpts, highlightCode = true, filename = "unknown" }: Object, | ||
code: string, | ||
): ParseResult { | ||
try { | ||
const results = []; | ||
for (const plugins of pluginPasses) { | ||
for (const plugin of plugins) { | ||
const { parserOverride } = plugin; | ||
if (parserOverride) { | ||
const ast = parserOverride(code, parserOpts, parse); | ||
|
||
if (ast !== undefined) results.push(ast); | ||
} | ||
} | ||
} | ||
|
||
if (results.length === 0) { | ||
return parse(code, parserOpts); | ||
} else if (results.length === 1) { | ||
if (typeof results[0].then === "function") { | ||
throw new Error( | ||
`You appear to be using an async parser plugin, ` + | ||
`which your current version of Babel does not support. ` + | ||
`If you're using a published plugin, you may need to upgrade ` + | ||
`your @babel/core version.`, | ||
); | ||
} | ||
return results[0]; | ||
} | ||
throw new Error("More than one plugin attempted to override parsing."); | ||
} catch (err) { | ||
if (err.code === "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED") { | ||
err.message += | ||
"\nConsider renaming the file to '.mjs', or setting sourceType:module " + | ||
"or sourceType:unambiguous in your Babel config for this file."; | ||
// err.code will be changed to BABEL_PARSE_ERROR later. | ||
} | ||
|
||
const { loc, missingPlugin } = err; | ||
if (loc) { | ||
const codeFrame = codeFrameColumns( | ||
code, | ||
{ | ||
start: { | ||
line: loc.line, | ||
column: loc.column + 1, | ||
}, | ||
}, | ||
{ | ||
highlightCode, | ||
}, | ||
); | ||
if (missingPlugin) { | ||
err.message = | ||
`${filename}: ` + | ||
generateMissingPluginMessage(missingPlugin[0], loc, codeFrame); | ||
} else { | ||
err.message = `${filename}: ${err.message}\n\n` + codeFrame; | ||
} | ||
err.code = "BABEL_PARSE_ERROR"; | ||
} | ||
throw err; | ||
} | ||
} |
File renamed without changes.
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