Skip to content

Commit fc91272

Browse files
committed
Some refactoring of how import specifiers are parsed as per code review feedback
1 parent b0f2265 commit fc91272

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

Diff for: src/compiler/parser.ts

+13-3
Original file line numberDiff line numberDiff line change
@@ -4656,11 +4656,21 @@ module ts {
46564656
// ImportSpecifier:
46574657
// ImportedBinding
46584658
// IdentifierName as ImportedBinding
4659-
if (lookAhead(nextTokenIsAsKeyword)) {
4660-
node.propertyName = parseIdentifierName();
4659+
var isfirstIdentifierNameNotAnIdentifier = isKeyword(token) && !isIdentifier();
4660+
var start = scanner.getTokenPos();
4661+
var identifierName = parseIdentifierName();
4662+
if (token === SyntaxKind.AsKeyword) {
4663+
node.propertyName = identifierName;
46614664
parseExpected(SyntaxKind.AsKeyword);
4665+
node.name = parseIdentifier();
4666+
}
4667+
else {
4668+
node.name = identifierName;
4669+
if (isfirstIdentifierNameNotAnIdentifier) {
4670+
// Report error identifier expected
4671+
parseErrorAtPosition(start, identifierName.end - start, Diagnostics.Identifier_expected);
4672+
}
46624673
}
4663-
node.name = parseIdentifier();
46644674
return finishNode(node);
46654675
}
46664676

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(3,10): error TS1003: Identifier expected.
2+
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(4,19): error TS1003: Identifier expected.
3+
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,21): error TS1003: Identifier expected.
4+
5+
6+
==== tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts (3 errors) ====
7+
8+
import { yield } from "somemodule"; // Allowed
9+
import { default } from "somemodule"; // Error - as this is keyword that is not allowed as identifier
10+
~~~~~~~
11+
!!! error TS1003: Identifier expected.
12+
import { yield as default } from "somemodule"; // error to use default as binding name
13+
~~~~~~~
14+
!!! error TS1003: Identifier expected.
15+
import { default as yield } from "somemodule"; // no error
16+
import { default as default } from "somemodule"; // default as is ok, error of default binding name
17+
~~~~~~~
18+
!!! error TS1003: Identifier expected.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @target: es6
2+
// @module: commonjs
3+
4+
import { yield } from "somemodule"; // Allowed
5+
import { default } from "somemodule"; // Error - as this is keyword that is not allowed as identifier
6+
import { yield as default } from "somemodule"; // error to use default as binding name
7+
import { default as yield } from "somemodule"; // no error
8+
import { default as default } from "somemodule"; // default as is ok, error of default binding name

0 commit comments

Comments
 (0)