@@ -3112,6 +3112,7 @@ namespace ts {
31123112 let node = currentToken ;
31133113 let isRightOfDot = false ;
31143114 let isRightOfOpenTag = false ;
3115+ let isStartingCloseTag = false ;
31153116
31163117 let location = getTouchingPropertyName ( sourceFile , position ) ;
31173118 if ( contextToken ) {
@@ -3137,9 +3138,14 @@ namespace ts {
31373138 return undefined ;
31383139 }
31393140 }
3140- else if ( kind === SyntaxKind . LessThanToken && sourceFile . languageVariant === LanguageVariant . JSX ) {
3141- isRightOfOpenTag = true ;
3142- location = contextToken ;
3141+ else if ( sourceFile . languageVariant === LanguageVariant . JSX ) {
3142+ if ( kind === SyntaxKind . LessThanToken ) {
3143+ isRightOfOpenTag = true ;
3144+ location = contextToken ;
3145+ }
3146+ else if ( kind === SyntaxKind . SlashToken && contextToken . parent . kind === SyntaxKind . JsxClosingElement ) {
3147+ isStartingCloseTag = true ;
3148+ }
31433149 }
31443150 }
31453151
@@ -3162,6 +3168,13 @@ namespace ts {
31623168 isMemberCompletion = true ;
31633169 isNewIdentifierLocation = false ;
31643170 }
3171+ else if ( isStartingCloseTag ) {
3172+ let tagName = ( < JsxElement > contextToken . parent . parent ) . openingElement . tagName ;
3173+ symbols = [ typeChecker . getSymbolAtLocation ( tagName ) ] ;
3174+
3175+ isMemberCompletion = true ;
3176+ isNewIdentifierLocation = false ;
3177+ }
31653178 else {
31663179 // For JavaScript or TypeScript, if we're not after a dot, then just try to get the
31673180 // global symbols in scope. These results should be valid for either language as
@@ -3318,11 +3331,29 @@ namespace ts {
33183331 let start = new Date ( ) . getTime ( ) ;
33193332 let result = isInStringOrRegularExpressionOrTemplateLiteral ( contextToken ) ||
33203333 isSolelyIdentifierDefinitionLocation ( contextToken ) ||
3321- isDotOfNumericLiteral ( contextToken ) ;
3334+ isDotOfNumericLiteral ( contextToken ) ||
3335+ isInJsxText ( contextToken ) ;
33223336 log ( "getCompletionsAtPosition: isCompletionListBlocker: " + ( new Date ( ) . getTime ( ) - start ) ) ;
33233337 return result ;
33243338 }
33253339
3340+ function isInJsxText ( contextToken : Node ) : boolean {
3341+ if ( contextToken . kind === SyntaxKind . JsxText ) {
3342+ return true ;
3343+ }
3344+
3345+ if ( contextToken . kind === SyntaxKind . GreaterThanToken && contextToken . parent ) {
3346+ if ( contextToken . parent . kind === SyntaxKind . JsxOpeningElement ) {
3347+ return true ;
3348+ }
3349+
3350+ if ( contextToken . parent . kind === SyntaxKind . JsxClosingElement || contextToken . parent . kind === SyntaxKind . JsxSelfClosingElement ) {
3351+ return contextToken . parent . parent && contextToken . parent . parent . kind === SyntaxKind . JsxElement ;
3352+ }
3353+ }
3354+ return false ;
3355+ }
3356+
33263357 function isNewIdentifierDefinitionLocation ( previousToken : Node ) : boolean {
33273358 if ( previousToken ) {
33283359 let containingNodeKind = previousToken . parent . kind ;
0 commit comments