Merge pull request #7538 from loganfsmyth/unambiguous-import-meta

Make 'sourceType:unambiguous' use 'module' when import.meta is used.
This commit is contained in:
Logan Smyth 2018-03-09 15:00:13 -08:00 committed by GitHub
commit 8e030e28b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 193 additions and 15 deletions

View File

@ -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",
);
}

View File

@ -11,6 +11,7 @@ export default class BaseParser {
inModule: boolean;
plugins: { [key: string]: boolean };
filename: ?string;
sawUnambiguousESM: boolean = false;
// Initialized by Tokenizer
state: State;

View File

@ -957,6 +957,8 @@ export default class ExpressionParser extends LValParser {
{ code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED" },
);
}
this.sawUnambiguousESM = true;
return this.parseMetaProperty(node, id, "meta");
}

View File

@ -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);

View File

@ -0,0 +1 @@
console.log(import.meta);

View File

@ -0,0 +1,4 @@
{
"sourceType": "unambiguous",
"plugins": ["importMeta"]
}

View File

@ -0,0 +1,165 @@
{
"type": "File",
"start": 0,
"end": 25,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 25
}
},
"program": {
"type": "Program",
"start": 0,
"end": 25,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 25
}
},
"sourceType": "module",
"body": [
{
"type": "ExpressionStatement",
"start": 0,
"end": 25,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 25
}
},
"expression": {
"type": "CallExpression",
"start": 0,
"end": 24,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 24
}
},
"callee": {
"type": "MemberExpression",
"start": 0,
"end": 11,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 11
}
},
"object": {
"type": "Identifier",
"start": 0,
"end": 7,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 7
},
"identifierName": "console"
},
"name": "console"
},
"property": {
"type": "Identifier",
"start": 8,
"end": 11,
"loc": {
"start": {
"line": 1,
"column": 8
},
"end": {
"line": 1,
"column": 11
},
"identifierName": "log"
},
"name": "log"
},
"computed": false
},
"arguments": [
{
"type": "MetaProperty",
"start": 12,
"end": 23,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 23
}
},
"meta": {
"type": "Identifier",
"start": 12,
"end": 18,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 18
},
"identifierName": "import"
},
"name": "import"
},
"property": {
"type": "Identifier",
"start": 19,
"end": 23,
"loc": {
"start": {
"line": 1,
"column": 19
},
"end": {
"line": 1,
"column": 23
},
"identifierName": "meta"
},
"name": "meta"
}
}
]
}
}
],
"directives": []
}
}