| /* eslint-disable no-underscore-dangle */ |
| |
| export const DynamicImportKey = 'Import'; |
| |
| export default function injectDynamicImport(acorn) { |
| const tt = acorn.tokTypes; |
| |
| // NOTE: This allows `yield import()` to parse correctly. |
| tt._import.startsExpr = true; |
| |
| function parseDynamicImport() { |
| const node = this.startNode(); |
| this.next(); |
| if (this.type !== tt.parenL) { |
| this.unexpected(); |
| } |
| return this.finishNode(node, DynamicImportKey); |
| } |
| |
| function peekNext() { |
| return this.input[this.pos]; |
| } |
| |
| // eslint-disable-next-line no-param-reassign |
| acorn.plugins.dynamicImport = function dynamicImportPlugin(instance) { |
| instance.extend('parseStatement', nextMethod => ( |
| function parseStatement(...args) { |
| const node = this.startNode(); |
| if (this.type === tt._import) { |
| const nextToken = peekNext.call(this); |
| if (nextToken === tt.parenL.label) { |
| const expr = this.parseExpression(); |
| return this.parseExpressionStatement(node, expr); |
| } |
| } |
| |
| return nextMethod.apply(this, args); |
| } |
| )); |
| |
| instance.extend('parseExprAtom', nextMethod => ( |
| function parseExprAtom(refDestructuringErrors) { |
| if (this.type === tt._import) { |
| return parseDynamicImport.call(this); |
| } |
| return nextMethod.call(this, refDestructuringErrors); |
| } |
| )); |
| }; |
| |
| return acorn; |
| } |