@@ -287,6 +287,7 @@ module ts {
287
287
TypeArguments , // Type arguments in type argument list
288
288
TupleElementTypes , // Element types in tuple element type list
289
289
HeritageClauses , // Heritage clauses for a class or interface declaration.
290
+ ImportSpecifiers , // Named import clause's import specifier list
290
291
Count // Number of parsing contexts
291
292
}
292
293
@@ -306,7 +307,7 @@ module ts {
306
307
case ParsingContext . TypeMembers : return Diagnostics . Property_or_signature_expected ;
307
308
case ParsingContext . ClassMembers : return Diagnostics . Unexpected_token_A_constructor_method_accessor_or_property_was_expected ;
308
309
case ParsingContext . EnumMembers : return Diagnostics . Enum_member_expected ;
309
- case ParsingContext . TypeReferences : return Diagnostics . Type_reference_expected ;
310
+ case ParsingContext . TypeReferences : return Diagnostics . Type_reference_expected ;
310
311
case ParsingContext . VariableDeclarations : return Diagnostics . Variable_declaration_expected ;
311
312
case ParsingContext . ObjectBindingElements : return Diagnostics . Property_destructuring_pattern_expected ;
312
313
case ParsingContext . ArrayBindingElements : return Diagnostics . Array_element_destructuring_pattern_expected ;
@@ -318,6 +319,7 @@ module ts {
318
319
case ParsingContext . TypeArguments : return Diagnostics . Type_argument_expected ;
319
320
case ParsingContext . TupleElementTypes : return Diagnostics . Type_expected ;
320
321
case ParsingContext . HeritageClauses : return Diagnostics . Unexpected_token_expected ;
322
+ case ParsingContext . ImportSpecifiers : return Diagnostics . Identifier_expected ;
321
323
}
322
324
} ;
323
325
@@ -1450,6 +1452,8 @@ module ts {
1450
1452
return token === SyntaxKind . CommaToken || isStartOfType ( ) ;
1451
1453
case ParsingContext . HeritageClauses :
1452
1454
return isHeritageClause ( ) ;
1455
+ case ParsingContext . ImportSpecifiers :
1456
+ return isIdentifierOrKeyword ( ) ;
1453
1457
}
1454
1458
1455
1459
Debug . fail ( "Non-exhaustive case in 'isListElement'." ) ;
@@ -1486,6 +1490,7 @@ module ts {
1486
1490
case ParsingContext . EnumMembers :
1487
1491
case ParsingContext . ObjectLiteralMembers :
1488
1492
case ParsingContext . ObjectBindingElements :
1493
+ case ParsingContext . ImportSpecifiers :
1489
1494
return token === SyntaxKind . CloseBraceToken ;
1490
1495
case ParsingContext . SwitchClauseStatements :
1491
1496
return token === SyntaxKind . CloseBraceToken || token === SyntaxKind . CaseKeyword || token === SyntaxKind . DefaultKeyword ;
@@ -4521,7 +4526,8 @@ module ts {
4521
4526
function parseImportDeclarationOrStatement ( fullStart : number , modifiers : ModifiersArray ) : ImportEqualsDeclaration | ImportStatement {
4522
4527
parseExpected ( SyntaxKind . ImportKeyword ) ;
4523
4528
if ( token === SyntaxKind . StringLiteral ||
4524
- token === SyntaxKind . AsteriskToken ) {
4529
+ token === SyntaxKind . AsteriskToken ||
4530
+ token === SyntaxKind . OpenBraceToken ) {
4525
4531
return parseImportStatement ( fullStart , modifiers ) ;
4526
4532
}
4527
4533
@@ -4598,7 +4604,7 @@ module ts {
4598
4604
// ImportedDefaultBinding, NamedImports from
4599
4605
4600
4606
var importClause = < ImportClause > createNode ( SyntaxKind . ImportClause ) ;
4601
- importClause . bindings = parseNamespaceImport ( ) ;
4607
+ importClause . bindings = token === SyntaxKind . AsteriskToken ? parseNamespaceImport ( ) : parseNamedImports ( ) ;
4602
4608
parseExpected ( SyntaxKind . FromKeyword ) ;
4603
4609
return finishNode ( importClause ) ;
4604
4610
}
@@ -4613,6 +4619,36 @@ module ts {
4613
4619
return finishNode ( namespaceImport ) ;
4614
4620
}
4615
4621
4622
+ function parseNamedImports ( ) : NamedImports {
4623
+ var namedImports = < NamedImports > createNode ( SyntaxKind . NamedImports ) ;
4624
+
4625
+ // NamedImports:
4626
+ // { }
4627
+ // { ImportsList }
4628
+ // { ImportsList, }
4629
+
4630
+ // ImportsList:
4631
+ // ImportSpecifier
4632
+ // ImportsList, ImportSpecifier
4633
+ parseExpected ( SyntaxKind . OpenBraceToken ) ;
4634
+ namedImports . elements = parseDelimitedList ( ParsingContext . ImportSpecifiers , parseImportSpecifier ) ;
4635
+ parseExpected ( SyntaxKind . CloseBraceToken ) ;
4636
+ return finishNode ( namedImports ) ;
4637
+ }
4638
+
4639
+ function parseImportSpecifier ( ) : ImportSpecifier {
4640
+ var node = < ImportSpecifier > createNode ( SyntaxKind . ImportSpecifier ) ;
4641
+ // ImportSpecifier:
4642
+ // ImportedBinding
4643
+ // IdentifierName as ImportedBinding
4644
+ if ( lookAhead ( nextTokenIsAsKeyword ) ) {
4645
+ node . propertyName = parseIdentifierName ( ) ;
4646
+ parseExpected ( SyntaxKind . AsKeyword ) ;
4647
+ }
4648
+ node . name = parseIdentifier ( ) ;
4649
+ return finishNode ( node ) ;
4650
+ }
4651
+
4616
4652
function parseExportAssignmentTail ( fullStart : number , modifiers : ModifiersArray ) : ExportAssignment {
4617
4653
var node = < ExportAssignment > createNode ( SyntaxKind . ExportAssignment , fullStart ) ;
4618
4654
setModifiers ( node , modifiers ) ;
@@ -4642,8 +4678,8 @@ module ts {
4642
4678
// Not true keywords so ensure an identifier follows
4643
4679
return lookAhead ( nextTokenIsIdentifierOrKeyword ) ;
4644
4680
case SyntaxKind . ImportKeyword :
4645
- // Not true keywords so ensure an identifier follows or is string literal or asterisk
4646
- return lookAhead ( nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsterisk ) ;
4681
+ // Not true keywords so ensure an identifier follows or is string literal or asterisk or open brace
4682
+ return lookAhead ( nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsteriskOrOpenBrace ) ;
4647
4683
case SyntaxKind . ModuleKeyword :
4648
4684
// Not a true keyword so ensure an identifier or string literal follows
4649
4685
return lookAhead ( nextTokenIsIdentifierOrKeywordOrStringLiteral ) ;
@@ -4674,10 +4710,10 @@ module ts {
4674
4710
return isIdentifierOrKeyword ( ) || token === SyntaxKind . StringLiteral ;
4675
4711
}
4676
4712
4677
- function nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsterisk ( ) {
4713
+ function nextTokenIsIdentifierOrKeywordOrStringLiteralOrAsteriskOrOpenBrace ( ) {
4678
4714
nextToken ( ) ;
4679
4715
return isIdentifierOrKeyword ( ) || token === SyntaxKind . StringLiteral ||
4680
- token === SyntaxKind . AsteriskToken ;
4716
+ token === SyntaxKind . AsteriskToken || token === SyntaxKind . OpenBraceToken ;
4681
4717
}
4682
4718
4683
4719
function nextTokenIsEqualsTokenOrDeclarationStart ( ) {
@@ -4690,6 +4726,10 @@ module ts {
4690
4726
return isDeclarationStart ( ) ;
4691
4727
}
4692
4728
4729
+ function nextTokenIsAsKeyword ( ) {
4730
+ return nextToken ( ) === SyntaxKind . AsKeyword ;
4731
+ }
4732
+
4693
4733
function parseDeclaration ( ) : ModuleElement {
4694
4734
var fullStart = getNodePos ( ) ;
4695
4735
var modifiers = parseModifiers ( ) ;
0 commit comments