@@ -167,7 +167,7 @@ namespace ts.Completions {
167167 origin : SymbolOriginInfo | undefined ,
168168 recommendedCompletion : Symbol | undefined ,
169169 propertyAccessToConvert : PropertyAccessExpression | undefined ,
170- isJsxInitializer : boolean ,
170+ isJsxInitializer : IsJsxInitializer ,
171171 includeInsertTextCompletions : boolean ,
172172 ) : CompletionEntry | undefined {
173173 const info = getCompletionEntryDisplayNameForSymbol ( symbol , target , origin , kind ) ;
@@ -193,6 +193,9 @@ namespace ts.Completions {
193193 if ( isJsxInitializer ) {
194194 if ( insertText === undefined ) insertText = name ;
195195 insertText = `{${ insertText } }` ;
196+ if ( typeof isJsxInitializer !== "boolean" ) {
197+ replacementSpan = createTextSpanFromNode ( isJsxInitializer , sourceFile ) ;
198+ }
196199 }
197200 }
198201
@@ -250,7 +253,7 @@ namespace ts.Completions {
250253 kind : CompletionKind ,
251254 includeInsertTextCompletions ?: boolean ,
252255 propertyAccessToConvert ?: PropertyAccessExpression | undefined ,
253- isJsxInitializer ?: boolean ,
256+ isJsxInitializer ?: IsJsxInitializer ,
254257 recommendedCompletion ?: Symbol ,
255258 symbolToOriginInfoMap ?: SymbolOriginInfoMap ,
256259 ) : Map < true > {
@@ -499,7 +502,7 @@ namespace ts.Completions {
499502 location : Node ;
500503 symbolToOriginInfoMap : SymbolOriginInfoMap ;
501504 previousToken : Node ;
502- readonly isJsxInitializer : boolean ;
505+ readonly isJsxInitializer : IsJsxInitializer ;
503506 }
504507 function getSymbolCompletionFromEntryId (
505508 typeChecker : TypeChecker ,
@@ -683,6 +686,8 @@ namespace ts.Completions {
683686 }
684687
685688 const enum CompletionDataKind { Data , JsDocTagName , JsDocTag , JsDocParameterName }
689+ /** true: after the `=` sign but no identifier has been typed yet. Else is the Identifier after the initializer. */
690+ type IsJsxInitializer = boolean | Identifier ;
686691 interface CompletionData {
687692 readonly kind : CompletionDataKind . Data ;
688693 readonly symbols : ReadonlyArray < Symbol > ;
@@ -695,7 +700,7 @@ namespace ts.Completions {
695700 readonly symbolToOriginInfoMap : SymbolOriginInfoMap ;
696701 readonly recommendedCompletion : Symbol | undefined ;
697702 readonly previousToken : Node | undefined ;
698- readonly isJsxInitializer : boolean ;
703+ readonly isJsxInitializer : IsJsxInitializer ;
699704 }
700705 type Request = { readonly kind : CompletionDataKind . JsDocTagName | CompletionDataKind . JsDocTag } | { readonly kind : CompletionDataKind . JsDocParameterName , tag : JSDocParameterTag } ;
701706
@@ -877,7 +882,7 @@ namespace ts.Completions {
877882 let isRightOfDot = false ;
878883 let isRightOfOpenTag = false ;
879884 let isStartingCloseTag = false ;
880- let isJsxInitializer = false ;
885+ let isJsxInitializer : IsJsxInitializer = false ;
881886
882887 let location = getTouchingPropertyName ( sourceFile , position , insideJsDocTagTypeExpression ) ; // TODO: GH#15853
883888 if ( contextToken ) {
@@ -938,7 +943,15 @@ namespace ts.Completions {
938943 break ;
939944
940945 case SyntaxKind . JsxAttribute :
941- isJsxInitializer = previousToken . kind === SyntaxKind . EqualsToken ;
946+ switch ( previousToken . kind ) {
947+ case SyntaxKind . EqualsToken :
948+ isJsxInitializer = true ;
949+ break ;
950+ case SyntaxKind . Identifier :
951+ if ( previousToken !== ( parent as JsxAttribute ) . name ) {
952+ isJsxInitializer = previousToken as Identifier ;
953+ }
954+ }
942955 break ;
943956 }
944957 }
0 commit comments