From 958551fd890605515c82cff9ac4b1bacc99027fb Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Fri, 9 Mar 2018 14:35:55 -0800 Subject: [PATCH] Refactor unambiguous to track state during parsing. --- packages/babylon/src/index.js | 18 +++--------------- packages/babylon/src/parser/base.js | 1 + packages/babylon/src/parser/statement.js | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/babylon/src/index.js b/packages/babylon/src/index.js index 7071a312b3..a90f0af0f6 100755 --- a/packages/babylon/src/index.js +++ b/packages/babylon/src/index.js @@ -22,11 +22,12 @@ export function parse(input: string, options?: Options): File { options = Object.assign({}, options); try { options.sourceType = "module"; - const ast = getParser(options, input).parse(); + const parser = getParser(options, input); + const ast = parser.parse(); // Rather than try to parse as a script first, we opt to parse as a module and convert back // to a script where possible to avoid having to do a full re-parse of the input content. - if (!hasModuleSyntax(ast)) ast.program.sourceType = "script"; + if (!parser.sawUnambiguousESM) ast.program.sourceType = "script"; return ast; } catch (moduleError) { try { @@ -111,16 +112,3 @@ function getParserClass( } return cls; } - -function hasModuleSyntax(ast) { - return ast.program.body.some( - child => - (child.type === "ImportDeclaration" && - (!child.importKind || child.importKind === "value")) || - (child.type === "ExportNamedDeclaration" && - (!child.exportKind || child.exportKind === "value")) || - (child.type === "ExportAllDeclaration" && - (!child.exportKind || child.exportKind === "value")) || - child.type === "ExportDefaultDeclaration", - ); -} diff --git a/packages/babylon/src/parser/base.js b/packages/babylon/src/parser/base.js index 972d60c800..6e7ab90d65 100644 --- a/packages/babylon/src/parser/base.js +++ b/packages/babylon/src/parser/base.js @@ -11,6 +11,7 @@ export default class BaseParser { inModule: boolean; plugins: { [key: string]: boolean }; filename: ?string; + sawUnambiguousESM: boolean = false; // Initialized by Tokenizer state: State; diff --git a/packages/babylon/src/parser/statement.js b/packages/babylon/src/parser/statement.js index a014806c51..f86f7af9b9 100644 --- a/packages/babylon/src/parser/statement.js +++ b/packages/babylon/src/parser/statement.js @@ -146,8 +146,25 @@ export default class StatementParser extends ExpressionParser { let result; if (starttype == tt._import) { result = this.parseImport(node); + + if ( + result.type === "ImportDeclaration" && + (!result.importKind || result.importKind === "value") + ) { + this.sawUnambiguousESM = true; + } } else { result = this.parseExport(node); + + if ( + (result.type === "ExportNamedDeclaration" && + (!result.exportKind || result.exportKind === "value")) || + (result.type === "ExportAllDeclaration" && + (!result.exportKind || result.exportKind === "value")) || + result.type === "ExportDefaultDeclaration" + ) { + this.sawUnambiguousESM = true; + } } this.assertModuleNodeAllowed(node);