@@ -39,6 +39,7 @@ interface CompletionContext {
39
39
40
40
readonly wordRange : vscode . Range | undefined ;
41
41
readonly line : string ;
42
+ readonly optionalReplacementRange : vscode . Range | undefined ;
42
43
}
43
44
44
45
type ResolvedCompletionItem = {
@@ -363,18 +364,25 @@ class MyCompletionItem extends vscode.CompletionItem {
363
364
364
365
private getRangeFromReplacementSpan ( tsEntry : Proto . CompletionEntry , completionContext : CompletionContext ) {
365
366
if ( ! tsEntry . replacementSpan ) {
366
- return ;
367
+ if ( completionContext . optionalReplacementRange ) {
368
+ return {
369
+ inserting : new vscode . Range ( completionContext . optionalReplacementRange . start , this . position ) ,
370
+ replacing : completionContext . optionalReplacementRange ,
371
+ } ;
372
+ }
373
+
374
+ return undefined ;
367
375
}
368
376
369
- let replaceRange = typeConverters . Range . fromTextSpan ( tsEntry . replacementSpan ) ;
377
+ // If TS returns an explicit replacement range on this item, we should use it for both types of completion
378
+
370
379
// Make sure we only replace a single line at most
380
+ let replaceRange = typeConverters . Range . fromTextSpan ( tsEntry . replacementSpan ) ;
371
381
if ( ! replaceRange . isSingleLine ) {
372
382
replaceRange = new vscode . Range ( replaceRange . start . line , replaceRange . start . character , replaceRange . start . line , completionContext . line . length ) ;
373
383
}
374
-
375
- // If TS returns an explicit replacement range, we should use it for both types of completion
376
384
return {
377
- inserting : new vscode . Range ( replaceRange . start , this . position ) ,
385
+ inserting : replaceRange ,
378
386
replacing : replaceRange ,
379
387
} ;
380
388
}
@@ -735,6 +743,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
735
743
let metadata : any | undefined ;
736
744
let response : ServerResponse . Response < Proto . CompletionInfoResponse > | undefined ;
737
745
let duration : number | undefined ;
746
+ let optionalReplacementRange : vscode . Range | undefined ;
738
747
if ( this . client . apiVersion . gte ( API . v300 ) ) {
739
748
const startTime = Date . now ( ) ;
740
749
try {
@@ -762,9 +771,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
762
771
metadata = response . metadata ;
763
772
764
773
if ( response . body . optionalReplacementSpan ) {
765
- for ( const entry of entries ) {
766
- entry . replacementSpan ??= response . body . optionalReplacementSpan ;
767
- }
774
+ optionalReplacementRange = typeConverters . Range . fromTextSpan ( response . body . optionalReplacementSpan ) ;
768
775
}
769
776
} else {
770
777
const response = await this . client . interruptGetErr ( ( ) => this . client . execute ( 'completions' , args , token ) ) ;
@@ -784,6 +791,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider<
784
791
wordRange,
785
792
line : line . text ,
786
793
completeFunctionCalls : completionConfiguration . completeFunctionCalls ,
794
+ optionalReplacementRange,
787
795
} ;
788
796
789
797
let includesPackageJsonImport = false ;
0 commit comments