Merge pull request #7538 from loganfsmyth/unambiguous-import-meta
Make 'sourceType:unambiguous' use 'module' when import.meta is used.
This commit is contained in:
commit
8e030e28b3
@ -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",
|
||||
);
|
||||
}
|
||||
|
||||
@ -11,6 +11,7 @@ export default class BaseParser {
|
||||
inModule: boolean;
|
||||
plugins: { [key: string]: boolean };
|
||||
filename: ?string;
|
||||
sawUnambiguousESM: boolean = false;
|
||||
|
||||
// Initialized by Tokenizer
|
||||
state: State;
|
||||
|
||||
@ -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");
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
1
packages/babylon/test/fixtures/core/sourcetype-unambiguous/import-meta/input.js
vendored
Normal file
1
packages/babylon/test/fixtures/core/sourcetype-unambiguous/import-meta/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
console.log(import.meta);
|
||||
4
packages/babylon/test/fixtures/core/sourcetype-unambiguous/import-meta/options.json
vendored
Normal file
4
packages/babylon/test/fixtures/core/sourcetype-unambiguous/import-meta/options.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"sourceType": "unambiguous",
|
||||
"plugins": ["importMeta"]
|
||||
}
|
||||
165
packages/babylon/test/fixtures/core/sourcetype-unambiguous/import-meta/output.json
vendored
Normal file
165
packages/babylon/test/fixtures/core/sourcetype-unambiguous/import-meta/output.json
vendored
Normal 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": []
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user