From fc912729f54308c93b4c172aecf805e59a436a63 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 29 Jan 2015 14:14:05 -0800 Subject: [PATCH] Some refactoring of how import specifiers are parsed as per code review feedback --- src/compiler/parser.ts | 16 +++++++++++++--- ...ortNamedImportIdentifiersParsing.errors.txt | 18 ++++++++++++++++++ .../es6ImportNamedImportIdentifiersParsing.ts | 8 ++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/es6ImportNamedImportIdentifiersParsing.errors.txt create mode 100644 tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index a25f99d59b3..a808fb572f7 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4656,11 +4656,21 @@ module ts { // ImportSpecifier: // ImportedBinding // IdentifierName as ImportedBinding - if (lookAhead(nextTokenIsAsKeyword)) { - node.propertyName = parseIdentifierName(); + var isfirstIdentifierNameNotAnIdentifier = isKeyword(token) && !isIdentifier(); + var start = scanner.getTokenPos(); + var identifierName = parseIdentifierName(); + if (token === SyntaxKind.AsKeyword) { + node.propertyName = identifierName; parseExpected(SyntaxKind.AsKeyword); + node.name = parseIdentifier(); + } + else { + node.name = identifierName; + if (isfirstIdentifierNameNotAnIdentifier) { + // Report error identifier expected + parseErrorAtPosition(start, identifierName.end - start, Diagnostics.Identifier_expected); + } } - node.name = parseIdentifier(); return finishNode(node); } diff --git a/tests/baselines/reference/es6ImportNamedImportIdentifiersParsing.errors.txt b/tests/baselines/reference/es6ImportNamedImportIdentifiersParsing.errors.txt new file mode 100644 index 00000000000..7d0570aa716 --- /dev/null +++ b/tests/baselines/reference/es6ImportNamedImportIdentifiersParsing.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(3,10): error TS1003: Identifier expected. +tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(4,19): error TS1003: Identifier expected. +tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,21): error TS1003: Identifier expected. + + +==== tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts (3 errors) ==== + + import { yield } from "somemodule"; // Allowed + import { default } from "somemodule"; // Error - as this is keyword that is not allowed as identifier + ~~~~~~~ +!!! error TS1003: Identifier expected. + import { yield as default } from "somemodule"; // error to use default as binding name + ~~~~~~~ +!!! error TS1003: Identifier expected. + import { default as yield } from "somemodule"; // no error + import { default as default } from "somemodule"; // default as is ok, error of default binding name + ~~~~~~~ +!!! error TS1003: Identifier expected. \ No newline at end of file diff --git a/tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts b/tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts new file mode 100644 index 00000000000..e1be293e446 --- /dev/null +++ b/tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts @@ -0,0 +1,8 @@ +// @target: es6 +// @module: commonjs + +import { yield } from "somemodule"; // Allowed +import { default } from "somemodule"; // Error - as this is keyword that is not allowed as identifier +import { yield as default } from "somemodule"; // error to use default as binding name +import { default as yield } from "somemodule"; // no error +import { default as default } from "somemodule"; // default as is ok, error of default binding name \ No newline at end of file