Skip to content

Commit

Permalink
fix(parser): test import call both for module and script code
Browse files Browse the repository at this point in the history
  • Loading branch information
KFlash committed May 27, 2019
1 parent 64a54a8 commit 66fe1b0
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 29 deletions.
44 changes: 26 additions & 18 deletions src/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ export function parseStatementListItem(
nextToken(parser, context);
switch (parser.token) {
case Token.LeftParen:
return parseDynamicImportDeclaration(parser, context);
return parseImportCallDeclaration(parser, context);
default:
report(parser, Errors.InvalidImportExportSloppy, 'import');
}
Expand Down Expand Up @@ -516,10 +516,11 @@ export function parseExpressionOrLabelledStatement(
*
* CallExpression :
* 1. MemberExpression Arguments
* 2. CallExpression Arguments
* 3. CallExpression [ AssignmentExpression ]
* 4. CallExpression . IdentifierName
* 5. CallExpression TemplateLiteral
* 2. CallExpression ImportCall
* 3. CallExpression Arguments
* 4. CallExpression [ AssignmentExpression ]
* 5. CallExpression . IdentifierName
* 6. CallExpression TemplateLiteral
*
* UpdateExpression ::
* ('++' | '--')? LeftHandSideExpression
Expand Down Expand Up @@ -765,10 +766,11 @@ export function parseAsyncArrowOrAsyncFunctionDeclaration(
*
* CallExpression :
* 1. MemberExpression Arguments
* 2. CallExpression Arguments
* 3. CallExpression [ AssignmentExpression ]
* 4. CallExpression . IdentifierName
* 5. CallExpression TemplateLiteral
* 2. CallExpression ImportCall
* 3. CallExpression Arguments
* 4. CallExpression [ AssignmentExpression ]
* 5. CallExpression . IdentifierName
* 6. CallExpression TemplateLiteral
*
* UpdateExpression ::
* ('++' | '--')? LeftHandSideExpression
Expand Down Expand Up @@ -1632,7 +1634,7 @@ function parseImportDeclaration(
let source: ESTree.Literal;

if (parser.token === Token.LeftParen) {
return parseDynamicImportDeclaration(parser, context);
return parseImportCallDeclaration(parser, context);
}

const specifiers: (ESTree.ImportSpecifier | ESTree.ImportDefaultSpecifier | ESTree.ImportNamespaceSpecifier)[] = [];
Expand Down Expand Up @@ -1790,7 +1792,7 @@ function parseImportSpecifierOrNamedImports(
* @param parser Parser object
* @param context Context masks
*/
function parseDynamicImportDeclaration(parser: ParserState, context: Context) {
function parseImportCallDeclaration(parser: ParserState, context: Context) {
let expr: ESTree.ImportExpression = { type: 'Import' };

/** MemberExpression :
Expand All @@ -1801,10 +1803,11 @@ function parseDynamicImportDeclaration(parser: ParserState, context: Context) {
*
* CallExpression :
* 1. MemberExpression Arguments
* 2. CallExpression Arguments
* 3. CallExpression [ AssignmentExpression ]
* 4. CallExpression . IdentifierName
* 5. CallExpression TemplateLiteral
* 2. CallExpression ImportCall
* 3. CallExpression Arguments
* 4. CallExpression [ AssignmentExpression ]
* 5. CallExpression . IdentifierName
* 6. CallExpression TemplateLiteral
*
* UpdateExpression ::
* ('++' | '--')? LeftHandSideExpression
Expand Down Expand Up @@ -2780,7 +2783,7 @@ export function parsePrimaryExpressionExtended(
parser.assignable = AssignmentKind.CannotAssign;
return parseBigIntLiteral(parser, context);
case Token.ImportKeyword:
return parseDynamicImportExpression(parser, context, inNewExpression);
return parseImportCallExpression(parser, context, inNewExpression);
default:
if (
context & Context.Strict
Expand All @@ -2797,20 +2800,25 @@ export function parsePrimaryExpressionExtended(
}
}

function parseDynamicImportExpression(
function parseImportCallExpression(
parser: ParserState,
context: Context,
inNewExpression: 0 | 1
): ESTree.ImportExpression | ESTree.MetaProperty {
// ImportCall[Yield, Await]:
// import(AssignmentExpression[+In, ?Yield, ?Await])

nextToken(parser, context);

if (parser.token === Token.Period)
if (parser.token === Token.Period || parser.token === Token.RightBracket)
report(parser, Errors.UnexpectedToken, KeywordDescTable[parser.token & Token.Type]);

if (inNewExpression) report(parser, Errors.UnexpectedToken, KeywordDescTable[parser.token & Token.Type]);

let expr: ESTree.ImportExpression = { type: 'Import' };

parser.assignable = AssignmentKind.CannotAssign;

expr = parseMemberOrUpdateExpression(parser, context, expr as any, inNewExpression, /* isDynamicImport */ 1);

parser.assignable = AssignmentKind.CannotAssign;
Expand Down
40 changes: 29 additions & 11 deletions test/parser/next/import.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,36 @@ import { pass, fail } from '../../test-utils';
import * as t from 'assert';
import { parseSource } from '../../../src/parser';

describe('Next - Import', () => {
fail('Next - Import', [
describe('Next - Import call', () => {
fail('Next - Import call (fail)', [
['function failsParse() { return import.then(); }', Context.None],
['import(x, y).then(z);', Context.None],
['import.then(doLoad);', Context.None],
['import(', Context.None],
['import)', Context.None],
['import()', Context.None],
["import('x", Context.None],
["import('x']", Context.None],
["import['x')", Context.None],
['import("x', Context.None],
['import("x"]', Context.None],
['import["x")', Context.None],
['import = x', Context.None],
['import[', Context.None],
['import[]', Context.None],
['import]', Context.None],
['import[x]', Context.None],
['import{', Context.None],
['import{x', Context.None],
['import[]', Context.Strict | Context.Module],
['import]', Context.Strict | Context.Module],
['import[x]', Context.Strict | Context.Module],
['import{', Context.Strict | Context.Module],
['import{x', Context.Strict | Context.Module],
['import{x}', Context.None],
['import(x, y)', Context.None],
['import(...y)', Context.None],
['import(x,)', Context.None],
['import(,)', Context.None],
['import(,y)', Context.None],
['import(;)', Context.None],
['[import]', Context.None],
['{import}', Context.None],
['import+', Context.None],
['import = 1', Context.None],
Expand All @@ -44,13 +49,14 @@ describe('Next - Import', () => {
['(async () => await import())', Context.None],
['async function * f() { await new import("") }', Context.None],
['label: { import(); };', Context.None],
['do { import(...[""]); } while (false);', Context.None],
['do { import(...[""]); } while (false);', Context.Strict | Context.Module],
['function fn() { new import(""); }', Context.None],
['if (true) { import(...[""]); }', Context.None],
['(async () => await import())', Context.None],
['with (import(...[""])) {}', Context.None],
['import();', Context.None],
['import("", "");', Context.None],
['import("", "");', Context.Module | Context.Strict],
['import("",);', Context.None]
]);

Expand All @@ -63,13 +69,20 @@ describe('Next - Import', () => {
'async () => { await import(x) }',
'const importResult = import("test.js");',
'let Layout = () => import("../foo/bar/zoo.js")',
'import("lib.js").then(doThis);',
'function* a() { yield import("http"); }',
'"use strict"; import("test.js");',
'function loadImport(file) { return import(`test/${file}.js`); }',
'() => { import(x) }',
'(import(y=x))',
'{import(y=x)}',
'let f = () => import("");',
'(async () => await import(import(import("foo"))));',
'async function * f() { await import(import(import("foo"))) }',
'async function * f() { await import("foo") }',
'if (false) { } else { import(import(import("foo"))); }',
'if (true) import("foo");',
'function fn() { return import("foo"); }',
'let x = 0; while (!x) { x++; import(import(import("foo"))); };',
'import("foo");',
`import('./module.js')`,
'import(import(x))',
'x = import(x)',
Expand All @@ -80,12 +93,17 @@ describe('Next - Import', () => {
]) {
it(`${arg}`, () => {
t.doesNotThrow(() => {
parseSource(`${arg}`, undefined, Context.OptionsNext | Context.Module);
parseSource(`${arg}`, void 0, Context.OptionsNext | Context.Module | Context.Strict);
});
});
it(`${arg}`, () => {
t.doesNotThrow(() => {
parseSource(`${arg}`, void 0, Context.OptionsNext);
});
});
}

pass('Next - Import (pass)', [
pass('Next - Import call (pass)', [
[
`function* a() { yield import("http"); }`,
Context.Strict | Context.Module | Context.OptionsNext,
Expand Down

0 comments on commit 66fe1b0

Please sign in to comment.