@@ -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 ,
@@ -668,6 +671,8 @@ namespace ts.Completions {
668671 }
669672
670673 const enum CompletionDataKind { Data , JsDocTagName , JsDocTag , JsDocParameterName }
674+ /** true: after the `=` sign but no identifier has been typed yet. Else is the Identifier after the initializer. */
675+ type IsJsxInitializer = boolean | Identifier ;
671676 interface CompletionData {
672677 readonly kind : CompletionDataKind . Data ;
673678 readonly symbols : ReadonlyArray < Symbol > ;
@@ -680,7 +685,7 @@ namespace ts.Completions {
680685 readonly symbolToOriginInfoMap : SymbolOriginInfoMap ;
681686 readonly recommendedCompletion : Symbol | undefined ;
682687 readonly previousToken : Node | undefined ;
683- readonly isJsxInitializer : boolean ;
688+ readonly isJsxInitializer : IsJsxInitializer ;
684689 }
685690 type Request = { readonly kind : CompletionDataKind . JsDocTagName | CompletionDataKind . JsDocTag } | { readonly kind : CompletionDataKind . JsDocParameterName , tag : JSDocParameterTag } ;
686691
@@ -862,7 +867,7 @@ namespace ts.Completions {
862867 let isRightOfDot = false ;
863868 let isRightOfOpenTag = false ;
864869 let isStartingCloseTag = false ;
865- let isJsxInitializer = false ;
870+ let isJsxInitializer : IsJsxInitializer = false ;
866871
867872 let location = getTouchingPropertyName ( sourceFile , position , insideJsDocTagTypeExpression ) ; // TODO: GH#15853
868873 if ( contextToken ) {
@@ -923,7 +928,15 @@ namespace ts.Completions {
923928 break ;
924929
925930 case SyntaxKind . JsxAttribute :
926- isJsxInitializer = previousToken . kind === SyntaxKind . EqualsToken ;
931+ switch ( previousToken . kind ) {
932+ case SyntaxKind . EqualsToken :
933+ isJsxInitializer = true ;
934+ break ;
935+ case SyntaxKind . Identifier :
936+ if ( previousToken !== ( parent as JsxAttribute ) . name ) {
937+ isJsxInitializer = previousToken as Identifier ;
938+ }
939+ }
927940 break ;
928941 }
929942 }
0 commit comments