@@ -71,6 +71,8 @@ namespace ts {
7171 case SyntaxKind . QualifiedName :
7272 return visitNode ( cbNode , ( < QualifiedName > node ) . left ) ||
7373 visitNode ( cbNode , ( < QualifiedName > node ) . right ) ;
74+ case SyntaxKind . ModuleReference :
75+ return visitNode ( cbNode , ( < ModuleReferenceNode > node ) . type ) ;
7476 case SyntaxKind . TypeParameter :
7577 return visitNode ( cbNode , ( < TypeParameterDeclaration > node ) . name ) ||
7678 visitNode ( cbNode , ( < TypeParameterDeclaration > node ) . constraint ) ||
@@ -1953,8 +1955,26 @@ namespace ts {
19531955 return createMissingList < T > ( ) ;
19541956 }
19551957
1958+ function parseModuleTypeOperator ( ) {
1959+ const node = createNode ( SyntaxKind . ModuleReference ) as ModuleReferenceNode ;
1960+ parseExpected ( SyntaxKind . ModuleKeyword ) ;
1961+ parseExpected ( SyntaxKind . OpenParenToken ) ;
1962+ node . type = parseType ( ) ;
1963+ parseExpected ( SyntaxKind . CloseParenToken ) ;
1964+ return finishNode ( node ) ;
1965+ }
1966+
19561967 function parseEntityName ( allowReservedWords : boolean , diagnosticMessage ?: DiagnosticMessage ) : EntityName {
1957- let entity : EntityName = allowReservedWords ? parseIdentifierName ( ) : parseIdentifier ( diagnosticMessage ) ;
1968+ let entity : EntityName ;
1969+ if ( token ( ) === SyntaxKind . ModuleKeyword ) {
1970+ entity = parseModuleTypeOperator ( ) ;
1971+ }
1972+ else if ( allowReservedWords ) {
1973+ entity = parseIdentifierName ( ) ;
1974+ }
1975+ else {
1976+ entity = parseIdentifier ( diagnosticMessage ) ;
1977+ }
19581978 let dotPos = scanner . getStartPos ( ) ;
19591979 while ( parseOptional ( SyntaxKind . DotToken ) ) {
19601980 if ( token ( ) === SyntaxKind . LessThanToken ) {
@@ -2691,6 +2711,7 @@ namespace ts {
26912711 return parseTupleType ( ) ;
26922712 case SyntaxKind . OpenParenToken :
26932713 return parseParenthesizedType ( ) ;
2714+ case SyntaxKind . ModuleKeyword : // Intentional fallthrough to default
26942715 default :
26952716 return parseTypeReference ( ) ;
26962717 }
@@ -2721,6 +2742,7 @@ namespace ts {
27212742 case SyntaxKind . FalseKeyword :
27222743 case SyntaxKind . ObjectKeyword :
27232744 case SyntaxKind . AsteriskToken :
2745+ case SyntaxKind . ModuleKeyword :
27242746 return true ;
27252747 case SyntaxKind . MinusToken :
27262748 return lookAhead ( nextTokenIsNumericLiteral ) ;
@@ -6719,7 +6741,7 @@ namespace ts {
67196741
67206742 function escapedTextsEqual ( a : EntityName , b : EntityName ) : boolean {
67216743 while ( ! ts . isIdentifier ( a ) || ! ts . isIdentifier ( b ) ) {
6722- if ( ! ts . isIdentifier ( a ) && ! ts . isIdentifier ( b ) && a . right . escapedText === b . right . escapedText ) {
6744+ if ( ts . isQualifiedName ( a ) && ts . isQualifiedName ( b ) && a . right . escapedText === b . right . escapedText ) {
67236745 a = a . left ;
67246746 b = b . left ;
67256747 }
@@ -6742,7 +6764,8 @@ namespace ts {
67426764 if ( canParseTag ) {
67436765 const child = tryParseChildTag ( target ) ;
67446766 if ( child && child . kind === SyntaxKind . JSDocParameterTag &&
6745- ( ts . isIdentifier ( child . name ) || ! escapedTextsEqual ( name , child . name . left ) ) ) {
6767+ // JSDoc entity names can never have module references
6768+ ( ts . isIdentifier ( child . name ) || ! escapedTextsEqual ( name , ( child . name as QualifiedName ) . left ) ) ) {
67466769 return false ;
67476770 }
67486771 return child ;
0 commit comments