Skip to content

Commit fdd7032

Browse files
committed
Parsing for import * as ImportedBinding
1 parent 4f1b908 commit fdd7032

9 files changed

+99
-1
lines changed

src/compiler/parser.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4520,7 +4520,8 @@ module ts {
45204520

45214521
function parseImportDeclarationOrStatement(fullStart: number, modifiers: ModifiersArray): ImportEqualsDeclaration | ImportStatement {
45224522
parseExpected(SyntaxKind.ImportKeyword);
4523-
if (token === SyntaxKind.StringLiteral) {
4523+
if (token === SyntaxKind.StringLiteral ||
4524+
token === SyntaxKind.AsteriskToken) {
45244525
return parseImportStatement(fullStart, modifiers);
45254526
}
45264527

@@ -4564,7 +4565,12 @@ module ts {
45644565
setModifiers(node, modifiers);
45654566

45664567
// ImportDeclaration:
4568+
// import ImportClause ModuleSpecifier ;
45674569
// import ModuleSpecifier;
4570+
if (token !== SyntaxKind.StringLiteral) {
4571+
// ImportDeclaration:
4572+
node.importClause = parseImportClause();
4573+
}
45684574
node.moduleSpecifier = parseModuleSpecifier();
45694575
parseSemicolon();
45704576
return finishNode(node);
@@ -4583,6 +4589,30 @@ module ts {
45834589
parseErrorAtCurrentToken(Diagnostics.String_literal_expected);
45844590
}
45854591

4592+
function parseImportClause(): ImportClause {
4593+
//ImportClause:
4594+
// ImportedDefaultBinding from
4595+
// NameSpaceImport from
4596+
// NamedImports from
4597+
// ImportedDefaultBinding, NameSpaceImport from
4598+
// ImportedDefaultBinding, NamedImports from
4599+
4600+
var importClause = <ImportClause>createNode(SyntaxKind.ImportClause);
4601+
importClause.bindings = parseNamespaceImport();
4602+
parseExpected(SyntaxKind.FromKeyword);
4603+
return finishNode(importClause);
4604+
}
4605+
4606+
function parseNamespaceImport(): NamespaceImport {
4607+
// NameSpaceImport:
4608+
// * as ImportedBinding
4609+
var namespaceImport = <NamespaceImport>createNode(SyntaxKind.NamespaceImport);
4610+
parseExpected(SyntaxKind.AsteriskToken);
4611+
parseExpected(SyntaxKind.AsKeyword);
4612+
namespaceImport.name = parseIdentifier();
4613+
return finishNode(namespaceImport);
4614+
}
4615+
45864616
function parseExportAssignmentTail(fullStart: number, modifiers: ModifiersArray): ExportAssignment {
45874617
var node = <ExportAssignment>createNode(SyntaxKind.ExportAssignment, fullStart);
45884618
setModifiers(node, modifiers);
@@ -4612,6 +4642,8 @@ module ts {
46124642
// Not true keywords so ensure an identifier follows
46134643
return lookAhead(nextTokenIsIdentifierOrKeyword);
46144644
case SyntaxKind.ImportKeyword:
4645+
// Not true keywords so ensure an identifier follows or is string literal or asterisk
4646+
return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsterisk) ;
46154647
case SyntaxKind.ModuleKeyword:
46164648
// Not a true keyword so ensure an identifier or string literal follows
46174649
return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteral);
@@ -4642,6 +4674,12 @@ module ts {
46424674
return isIdentifierOrKeyword() || token === SyntaxKind.StringLiteral;
46434675
}
46444676

4677+
function nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsterisk() {
4678+
nextToken();
4679+
return isIdentifierOrKeyword() || token === SyntaxKind.StringLiteral ||
4680+
token === SyntaxKind.AsteriskToken;
4681+
}
4682+
46454683
function nextTokenIsEqualsTokenOrDeclarationStart() {
46464684
nextToken();
46474685
return token === SyntaxKind.EqualsToken || isDeclarationStart();

src/compiler/scanner.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ module ts {
3838

3939
var textToToken: Map<SyntaxKind> = {
4040
"any": SyntaxKind.AnyKeyword,
41+
"as": SyntaxKind.AsKeyword,
4142
"boolean": SyntaxKind.BooleanKeyword,
4243
"break": SyntaxKind.BreakKeyword,
4344
"case": SyntaxKind.CaseKeyword,
@@ -58,6 +59,7 @@ module ts {
5859
"false": SyntaxKind.FalseKeyword,
5960
"finally": SyntaxKind.FinallyKeyword,
6061
"for": SyntaxKind.ForKeyword,
62+
"from": SyntaxKind.FromKeyword,
6163
"function": SyntaxKind.FunctionKeyword,
6264
"get": SyntaxKind.GetKeyword,
6365
"if": SyntaxKind.IfKeyword,

src/compiler/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ module ts {
120120
WhileKeyword,
121121
WithKeyword,
122122
// Strict mode reserved words
123+
AsKeyword,
124+
FromKeyword,
123125
ImplementsKeyword,
124126
InterfaceKeyword,
125127
LetKeyword,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [tests/cases/compiler/es6ImportNameSpaceImport.ts] ////
2+
3+
//// [es6ImportNameSpaceImport_0.ts]
4+
5+
export var a = 10;
6+
7+
//// [es6ImportNameSpaceImport_1.ts]
8+
import * as nameSpaceBinding from "es6ImportNameSpaceImport_0";
9+
10+
//// [es6ImportNameSpaceImport_0.js]
11+
exports.a = 10;
12+
//// [es6ImportNameSpaceImport_1.js]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/compiler/es6ImportNameSpaceImport_0.ts ===
2+
3+
export var a = 10;
4+
>a : number
5+
6+
=== tests/cases/compiler/es6ImportNameSpaceImport_1.ts ===
7+
import * as nameSpaceBinding from "es6ImportNameSpaceImport_0";
8+
No type information for this code.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [tests/cases/compiler/es6ImportNameSpaceImportInEs5.ts] ////
2+
3+
//// [es6ImportNameSpaceImportInEs5_0.ts]
4+
5+
export var a = 10;
6+
7+
//// [es6ImportNameSpaceImportInEs5_1.ts]
8+
import * as nameSpaceBinding from "es6ImportNameSpaceImportInEs5_0";
9+
10+
//// [es6ImportNameSpaceImportInEs5_0.js]
11+
exports.a = 10;
12+
//// [es6ImportNameSpaceImportInEs5_1.js]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/compiler/es6ImportNameSpaceImportInEs5_0.ts ===
2+
3+
export var a = 10;
4+
>a : number
5+
6+
=== tests/cases/compiler/es6ImportNameSpaceImportInEs5_1.ts ===
7+
import * as nameSpaceBinding from "es6ImportNameSpaceImportInEs5_0";
8+
No type information for this code.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @target: es6
2+
// @module: commonjs
3+
4+
// @filename: es6ImportNameSpaceImport_0.ts
5+
export var a = 10;
6+
7+
// @filename: es6ImportNameSpaceImport_1.ts
8+
import * as nameSpaceBinding from "es6ImportNameSpaceImport_0";
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @target: es5
2+
// @module: commonjs
3+
4+
// @filename: es6ImportNameSpaceImportInEs5_0.ts
5+
export var a = 10;
6+
7+
// @filename: es6ImportNameSpaceImportInEs5_1.ts
8+
import * as nameSpaceBinding from "es6ImportNameSpaceImportInEs5_0";

0 commit comments

Comments
 (0)