@@ -342,6 +342,7 @@ export interface CreateDeclarationOrDefinitionResult extends WorkspaceEditResult
342
342
343
343
export interface ExtractToFunctionParams extends SelectionParams {
344
344
extractAsGlobal : boolean ;
345
+ name : string ;
345
346
}
346
347
347
348
interface ShowMessageWindowParams {
@@ -3452,10 +3453,14 @@ export class DefaultClient implements Client {
3452
3453
return ;
3453
3454
}
3454
3455
3455
- // TODO: Show a quick pick to get the name before generating the code.
3456
- // That would allow the formatting to be done without waiting for the rename.
3457
- // Also, it's less error prone and eliminates a class of bugs in which the
3458
- // rename position can be incorrect.
3456
+ let functionName : string | undefined = await vscode . window . showInputBox ( {
3457
+ title : localize ( 'handle.extract.name' , 'Name the extracted function' ) ,
3458
+ placeHolder : localize ( 'handle.extract.new.function' , 'NewFunction' )
3459
+ } ) ;
3460
+
3461
+ if ( functionName === undefined || functionName === "" ) {
3462
+ functionName = "NewFunction" ;
3463
+ }
3459
3464
3460
3465
const params : ExtractToFunctionParams = {
3461
3466
uri : editor . document . uri . toString ( ) ,
@@ -3469,7 +3474,8 @@ export class DefaultClient implements Client {
3469
3474
line : editor . selection . end . line
3470
3475
}
3471
3476
} ,
3472
- extractAsGlobal
3477
+ extractAsGlobal,
3478
+ name : functionName
3473
3479
} ;
3474
3480
3475
3481
const result : WorkspaceEditResult = await this . languageClient . sendRequest ( ExtractToFunctionRequest , params ) ;
@@ -3482,15 +3488,15 @@ export class DefaultClient implements Client {
3482
3488
3483
3489
// Handle error messaging
3484
3490
if ( result . errorText ) {
3485
- void vscode . window . showErrorMessage ( result . errorText ) ;
3491
+ void vscode . window . showErrorMessage ( `${ localize ( "handle.extract.error" ,
3492
+ "Extract to function failed: {0}" , result . errorText ) } `) ;
3486
3493
return ;
3487
3494
}
3488
3495
3489
3496
let workspaceEdits : vscode . WorkspaceEdit = new vscode . WorkspaceEdit ( ) ;
3490
3497
let replaceEditRange : vscode . Range | undefined ;
3491
3498
let hasProcessedReplace : boolean = false ;
3492
3499
const formatUriAndRanges : VsCodeUriAndRange [ ] = [ ] ;
3493
- this . renameDataForExtractToFunction = [ ] ;
3494
3500
let lineOffset : number = 0 ;
3495
3501
let headerFileLineOffset : number = 0 ;
3496
3502
let isSourceFile : boolean = true ;
@@ -3515,7 +3521,7 @@ export class DefaultClient implements Client {
3515
3521
range = new vscode . Range ( new vscode . Position ( range . start . line + headerFileLineOffset , range . start . character ) ,
3516
3522
new vscode . Position ( range . end . line + headerFileLineOffset , range . end . character ) ) ;
3517
3523
}
3518
- const isReplace : boolean = ! range . isEmpty ;
3524
+ const isReplace : boolean = ! range . isEmpty && isSourceFile ;
3519
3525
lineOffset += nextLineOffset ;
3520
3526
nextLineOffset = ( edit . newText . match ( / \n / g) ?? [ ] ) . length ;
3521
3527
let rangeStartLine : number = range . start . line + lineOffset ;
@@ -3559,36 +3565,32 @@ export class DefaultClient implements Client {
3559
3565
new vscode . Position ( rangeStartLine + ( nextLineOffset < 0 ? 0 : nextLineOffset ) ,
3560
3566
isReplace ? range . end . character :
3561
3567
range . end . character + edit . newText . length - rangeStartCharacter ) ) } ) ;
3562
- const newFunctionString : string = "NewFunction" ;
3563
-
3564
- // Handle additional declaration lines added before the new function call.
3565
- let currentText : string = edit . newText . substring ( rangeStartCharacter ) ;
3566
- let currentTextNextLineStart : number = currentText . indexOf ( "\n" ) ;
3567
- let currentTextNewFunctionStart : number = currentText . indexOf ( newFunctionString ) ;
3568
- let currentTextNextLineStartUpdated : boolean = false ;
3569
- while ( currentTextNextLineStart !== - 1 && currentTextNextLineStart < currentTextNewFunctionStart ) {
3570
- ++ rangeStartLine ;
3571
- currentText = currentText . substring ( currentTextNextLineStart + 1 ) ;
3572
- currentTextNextLineStart = currentText . indexOf ( "\n" ) ;
3573
- currentTextNewFunctionStart = currentText . indexOf ( newFunctionString ) ;
3574
- currentTextNextLineStartUpdated = true ;
3575
- }
3576
- rangeStartCharacter = ( rangeStartCharacter === 0 && ! currentTextNextLineStartUpdated ? range . start . character : 0 ) +
3577
- currentTextNewFunctionStart ;
3578
- if ( rangeStartCharacter < 0 ) {
3579
- // newFunctionString is missing -- unexpected error.
3580
- void vscode . window . showErrorMessage ( `${ localize ( "invalid.edit" ,
3581
- "Extract to function failed. An invalid edit was generated: '{0}'" , edit . newText ) } `) ;
3582
- continue ;
3583
- }
3584
- const currentEditRange : vscode . Range = new vscode . Range (
3585
- new vscode . Position ( rangeStartLine , rangeStartCharacter ) ,
3586
- new vscode . Position ( rangeStartLine , rangeStartCharacter + newFunctionString . length ) ) ;
3587
3568
if ( isReplace ) {
3588
- replaceEditRange = currentEditRange ;
3569
+ // Handle additional declaration lines added before the new function call.
3570
+ let currentText : string = edit . newText . substring ( rangeStartCharacter ) ;
3571
+ let currentTextNextLineStart : number = currentText . indexOf ( "\n" ) ;
3572
+ let currentTextNewFunctionStart : number = currentText . indexOf ( functionName ) ;
3573
+ let currentTextNextLineStartUpdated : boolean = false ;
3574
+ while ( currentTextNextLineStart !== - 1 && currentTextNextLineStart < currentTextNewFunctionStart ) {
3575
+ ++ rangeStartLine ;
3576
+ currentText = currentText . substring ( currentTextNextLineStart + 1 ) ;
3577
+ currentTextNextLineStart = currentText . indexOf ( "\n" ) ;
3578
+ currentTextNewFunctionStart = currentText . indexOf ( functionName ) ;
3579
+ currentTextNextLineStartUpdated = true ;
3580
+ }
3581
+ rangeStartCharacter = ( rangeStartCharacter === 0 && ! currentTextNextLineStartUpdated ? range . start . character : 0 ) +
3582
+ currentTextNewFunctionStart ;
3583
+ if ( rangeStartCharacter < 0 ) {
3584
+ // functionName is missing -- unexpected error.
3585
+ void vscode . window . showErrorMessage ( `${ localize ( "invalid.edit" ,
3586
+ "Extract to function failed. An invalid edit was generated: '{0}'" , edit . newText ) } `) ;
3587
+ continue ;
3588
+ }
3589
+ replaceEditRange = new vscode . Range (
3590
+ new vscode . Position ( rangeStartLine , rangeStartCharacter ) ,
3591
+ new vscode . Position ( rangeStartLine , rangeStartCharacter + functionName . length ) ) ;
3589
3592
nextLineOffset -= range . end . line - range . start . line ;
3590
3593
}
3591
- this . renameDataForExtractToFunction . push ( { uri, range : currentEditRange } ) ;
3592
3594
}
3593
3595
}
3594
3596
@@ -3601,7 +3603,6 @@ export class DefaultClient implements Client {
3601
3603
3602
3604
const firstUri : vscode . Uri = formatUriAndRanges [ 0 ] . uri ;
3603
3605
await vscode . window . showTextDocument ( firstUri , { selection : replaceEditRange } ) ;
3604
- await vscode . commands . executeCommand ( "editor.action.rename" , firstUri , replaceEditRange . start ) ;
3605
3606
3606
3607
// Format the new text edits.
3607
3608
const formatEdits : vscode . WorkspaceEdit = new vscode . WorkspaceEdit ( ) ;
@@ -3645,8 +3646,6 @@ export class DefaultClient implements Client {
3645
3646
}
3646
3647
}
3647
3648
3648
- public renameDataForExtractToFunction : VsCodeUriAndRange [ ] = [ ] ;
3649
-
3650
3649
public onInterval ( ) : void {
3651
3650
// These events can be discarded until the language client is ready.
3652
3651
// Don't queue them up with this.notifyWhenLanguageClientReady calls.
0 commit comments