From fdd7032c610f98625eeeaab91368800164a5d815 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 27 Jan 2015 16:04:11 -0800 Subject: [PATCH] Parsing for import * as ImportedBinding --- src/compiler/parser.ts | 40 ++++++++++++++++++- src/compiler/scanner.ts | 2 + src/compiler/types.ts | 2 + .../reference/es6ImportNameSpaceImport.js | 12 ++++++ .../reference/es6ImportNameSpaceImport.types | 8 ++++ .../es6ImportNameSpaceImportInEs5.js | 12 ++++++ .../es6ImportNameSpaceImportInEs5.types | 8 ++++ .../compiler/es6ImportNameSpaceImport.ts | 8 ++++ .../compiler/es6ImportNameSpaceImportInEs5.ts | 8 ++++ 9 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/es6ImportNameSpaceImport.js create mode 100644 tests/baselines/reference/es6ImportNameSpaceImport.types create mode 100644 tests/baselines/reference/es6ImportNameSpaceImportInEs5.js create mode 100644 tests/baselines/reference/es6ImportNameSpaceImportInEs5.types create mode 100644 tests/cases/compiler/es6ImportNameSpaceImport.ts create mode 100644 tests/cases/compiler/es6ImportNameSpaceImportInEs5.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 2e6132287d1..254e2cb12ca 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4520,7 +4520,8 @@ module ts { function parseImportDeclarationOrStatement(fullStart: number, modifiers: ModifiersArray): ImportEqualsDeclaration | ImportStatement { parseExpected(SyntaxKind.ImportKeyword); - if (token === SyntaxKind.StringLiteral) { + if (token === SyntaxKind.StringLiteral || + token === SyntaxKind.AsteriskToken) { return parseImportStatement(fullStart, modifiers); } @@ -4564,7 +4565,12 @@ module ts { setModifiers(node, modifiers); // ImportDeclaration: + // import ImportClause ModuleSpecifier ; // import ModuleSpecifier; + if (token !== SyntaxKind.StringLiteral) { + // ImportDeclaration: + node.importClause = parseImportClause(); + } node.moduleSpecifier = parseModuleSpecifier(); parseSemicolon(); return finishNode(node); @@ -4583,6 +4589,30 @@ module ts { parseErrorAtCurrentToken(Diagnostics.String_literal_expected); } + function parseImportClause(): ImportClause { + //ImportClause: + // ImportedDefaultBinding from + // NameSpaceImport from + // NamedImports from + // ImportedDefaultBinding, NameSpaceImport from + // ImportedDefaultBinding, NamedImports from + + var importClause = createNode(SyntaxKind.ImportClause); + importClause.bindings = parseNamespaceImport(); + parseExpected(SyntaxKind.FromKeyword); + return finishNode(importClause); + } + + function parseNamespaceImport(): NamespaceImport { + // NameSpaceImport: + // * as ImportedBinding + var namespaceImport = createNode(SyntaxKind.NamespaceImport); + parseExpected(SyntaxKind.AsteriskToken); + parseExpected(SyntaxKind.AsKeyword); + namespaceImport.name = parseIdentifier(); + return finishNode(namespaceImport); + } + function parseExportAssignmentTail(fullStart: number, modifiers: ModifiersArray): ExportAssignment { var node = createNode(SyntaxKind.ExportAssignment, fullStart); setModifiers(node, modifiers); @@ -4612,6 +4642,8 @@ module ts { // Not true keywords so ensure an identifier follows return lookAhead(nextTokenIsIdentifierOrKeyword); case SyntaxKind.ImportKeyword: + // Not true keywords so ensure an identifier follows or is string literal or asterisk + return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsterisk) ; case SyntaxKind.ModuleKeyword: // Not a true keyword so ensure an identifier or string literal follows return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteral); @@ -4642,6 +4674,12 @@ module ts { return isIdentifierOrKeyword() || token === SyntaxKind.StringLiteral; } + function nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsterisk() { + nextToken(); + return isIdentifierOrKeyword() || token === SyntaxKind.StringLiteral || + token === SyntaxKind.AsteriskToken; + } + function nextTokenIsEqualsTokenOrDeclarationStart() { nextToken(); return token === SyntaxKind.EqualsToken || isDeclarationStart(); diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 4aef773004b..3b9cd8b72f0 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -38,6 +38,7 @@ module ts { var textToToken: Map = { "any": SyntaxKind.AnyKeyword, + "as": SyntaxKind.AsKeyword, "boolean": SyntaxKind.BooleanKeyword, "break": SyntaxKind.BreakKeyword, "case": SyntaxKind.CaseKeyword, @@ -58,6 +59,7 @@ module ts { "false": SyntaxKind.FalseKeyword, "finally": SyntaxKind.FinallyKeyword, "for": SyntaxKind.ForKeyword, + "from": SyntaxKind.FromKeyword, "function": SyntaxKind.FunctionKeyword, "get": SyntaxKind.GetKeyword, "if": SyntaxKind.IfKeyword, diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 88d498695e7..3db028e56be 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -120,6 +120,8 @@ module ts { WhileKeyword, WithKeyword, // Strict mode reserved words + AsKeyword, + FromKeyword, ImplementsKeyword, InterfaceKeyword, LetKeyword, diff --git a/tests/baselines/reference/es6ImportNameSpaceImport.js b/tests/baselines/reference/es6ImportNameSpaceImport.js new file mode 100644 index 00000000000..c6daa3b1222 --- /dev/null +++ b/tests/baselines/reference/es6ImportNameSpaceImport.js @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/es6ImportNameSpaceImport.ts] //// + +//// [es6ImportNameSpaceImport_0.ts] + +export var a = 10; + +//// [es6ImportNameSpaceImport_1.ts] +import * as nameSpaceBinding from "es6ImportNameSpaceImport_0"; + +//// [es6ImportNameSpaceImport_0.js] +exports.a = 10; +//// [es6ImportNameSpaceImport_1.js] diff --git a/tests/baselines/reference/es6ImportNameSpaceImport.types b/tests/baselines/reference/es6ImportNameSpaceImport.types new file mode 100644 index 00000000000..d7cd562dc27 --- /dev/null +++ b/tests/baselines/reference/es6ImportNameSpaceImport.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/es6ImportNameSpaceImport_0.ts === + +export var a = 10; +>a : number + +=== tests/cases/compiler/es6ImportNameSpaceImport_1.ts === +import * as nameSpaceBinding from "es6ImportNameSpaceImport_0"; +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js b/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js new file mode 100644 index 00000000000..2c7785dec6e --- /dev/null +++ b/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/es6ImportNameSpaceImportInEs5.ts] //// + +//// [es6ImportNameSpaceImportInEs5_0.ts] + +export var a = 10; + +//// [es6ImportNameSpaceImportInEs5_1.ts] +import * as nameSpaceBinding from "es6ImportNameSpaceImportInEs5_0"; + +//// [es6ImportNameSpaceImportInEs5_0.js] +exports.a = 10; +//// [es6ImportNameSpaceImportInEs5_1.js] diff --git a/tests/baselines/reference/es6ImportNameSpaceImportInEs5.types b/tests/baselines/reference/es6ImportNameSpaceImportInEs5.types new file mode 100644 index 00000000000..7818a4568e0 --- /dev/null +++ b/tests/baselines/reference/es6ImportNameSpaceImportInEs5.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/es6ImportNameSpaceImportInEs5_0.ts === + +export var a = 10; +>a : number + +=== tests/cases/compiler/es6ImportNameSpaceImportInEs5_1.ts === +import * as nameSpaceBinding from "es6ImportNameSpaceImportInEs5_0"; +No type information for this code. \ No newline at end of file diff --git a/tests/cases/compiler/es6ImportNameSpaceImport.ts b/tests/cases/compiler/es6ImportNameSpaceImport.ts new file mode 100644 index 00000000000..9937606c41f --- /dev/null +++ b/tests/cases/compiler/es6ImportNameSpaceImport.ts @@ -0,0 +1,8 @@ +// @target: es6 +// @module: commonjs + +// @filename: es6ImportNameSpaceImport_0.ts +export var a = 10; + +// @filename: es6ImportNameSpaceImport_1.ts +import * as nameSpaceBinding from "es6ImportNameSpaceImport_0"; \ No newline at end of file diff --git a/tests/cases/compiler/es6ImportNameSpaceImportInEs5.ts b/tests/cases/compiler/es6ImportNameSpaceImportInEs5.ts new file mode 100644 index 00000000000..ca00ac3f981 --- /dev/null +++ b/tests/cases/compiler/es6ImportNameSpaceImportInEs5.ts @@ -0,0 +1,8 @@ +// @target: es5 +// @module: commonjs + +// @filename: es6ImportNameSpaceImportInEs5_0.ts +export var a = 10; + +// @filename: es6ImportNameSpaceImportInEs5_1.ts +import * as nameSpaceBinding from "es6ImportNameSpaceImportInEs5_0"; \ No newline at end of file