Skip to content

Commit a09cc85

Browse files
author
Andy
committed
Make RenameInfo a union (#27382)
1 parent b77cb2a commit a09cc85

File tree

9 files changed

+88
-70
lines changed

9 files changed

+88
-70
lines changed

src/harness/client.ts

+33-23
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ namespace ts.server {
33
writeMessage(message: string): void;
44
}
55

6-
interface RenameEntry extends RenameInfo {
7-
fileName: string;
8-
position: number;
9-
locations: RenameLocation[];
10-
findInStrings: boolean;
11-
findInComments: boolean;
6+
interface RenameEntry {
7+
readonly renameInfo: RenameInfo;
8+
readonly inputs: {
9+
readonly fileName: string;
10+
readonly position: number;
11+
readonly findInStrings: boolean;
12+
readonly findInComments: boolean;
13+
};
14+
readonly locations: RenameLocation[];
1215
}
1316

1417
/* @internal */
@@ -395,29 +398,36 @@ namespace ts.server {
395398
}
396399
}
397400

398-
return this.lastRenameEntry = {
399-
canRename: body.info.canRename,
400-
fileToRename: body.info.fileToRename,
401-
displayName: body.info.displayName,
402-
fullDisplayName: body.info.fullDisplayName,
403-
kind: body.info.kind,
404-
kindModifiers: body.info.kindModifiers,
405-
localizedErrorMessage: body.info.localizedErrorMessage,
406-
triggerSpan: createTextSpanFromBounds(position, position),
407-
fileName,
408-
position,
409-
findInStrings: !!findInStrings,
410-
findInComments: !!findInComments,
401+
const renameInfo = body.info.canRename
402+
? identity<RenameInfoSuccess>({
403+
canRename: body.info.canRename,
404+
fileToRename: body.info.fileToRename,
405+
displayName: body.info.displayName,
406+
fullDisplayName: body.info.fullDisplayName,
407+
kind: body.info.kind,
408+
kindModifiers: body.info.kindModifiers,
409+
triggerSpan: createTextSpanFromBounds(position, position),
410+
})
411+
: identity<RenameInfoFailure>({ canRename: false, localizedErrorMessage: body.info.localizedErrorMessage });
412+
this.lastRenameEntry = {
413+
renameInfo,
414+
inputs: {
415+
fileName,
416+
position,
417+
findInStrings: !!findInStrings,
418+
findInComments: !!findInComments,
419+
},
411420
locations,
412421
};
422+
return renameInfo;
413423
}
414424

415425
findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] {
416426
if (!this.lastRenameEntry ||
417-
this.lastRenameEntry.fileName !== fileName ||
418-
this.lastRenameEntry.position !== position ||
419-
this.lastRenameEntry.findInStrings !== findInStrings ||
420-
this.lastRenameEntry.findInComments !== findInComments) {
427+
this.lastRenameEntry.inputs.fileName !== fileName ||
428+
this.lastRenameEntry.inputs.position !== position ||
429+
this.lastRenameEntry.inputs.findInStrings !== findInStrings ||
430+
this.lastRenameEntry.inputs.findInComments !== findInComments) {
421431
this.getRenameInfo(fileName, position, findInStrings, findInComments);
422432
}
423433

src/harness/fourslash.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1534,7 +1534,7 @@ Actual: ${stringify(fullActual)}`);
15341534
public verifyRenameInfoSucceeded(displayName: string | undefined, fullDisplayName: string | undefined, kind: string | undefined, kindModifiers: string | undefined, fileToRename: string | undefined, expectedRange: Range | undefined): void {
15351535
const renameInfo = this.languageService.getRenameInfo(this.activeFile.fileName, this.currentCaretPosition);
15361536
if (!renameInfo.canRename) {
1537-
this.raiseError("Rename did not succeed");
1537+
throw this.raiseError("Rename did not succeed");
15381538
}
15391539

15401540
this.validate("displayName", displayName, renameInfo.displayName);
@@ -1560,9 +1560,8 @@ Actual: ${stringify(fullActual)}`);
15601560
public verifyRenameInfoFailed(message?: string) {
15611561
const renameInfo = this.languageService.getRenameInfo(this.activeFile.fileName, this.currentCaretPosition);
15621562
if (renameInfo.canRename) {
1563-
this.raiseError("Rename was expected to fail");
1563+
throw this.raiseError("Rename was expected to fail");
15641564
}
1565-
15661565
this.validate("error", message, renameInfo.localizedErrorMessage);
15671566
}
15681567

src/server/protocol.ts

+10-8
Original file line numberDiff line numberDiff line change
@@ -1087,23 +1087,18 @@ namespace ts.server.protocol {
10871087
/**
10881088
* Information about the item to be renamed.
10891089
*/
1090-
export interface RenameInfo {
1090+
export type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
1091+
export interface RenameInfoSuccess {
10911092
/**
10921093
* True if item can be renamed.
10931094
*/
1094-
canRename: boolean;
1095-
1095+
canRename: true;
10961096
/**
10971097
* File or directory to rename.
10981098
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
10991099
*/
11001100
fileToRename?: string;
11011101

1102-
/**
1103-
* Error message if item can not be renamed.
1104-
*/
1105-
localizedErrorMessage?: string;
1106-
11071102
/**
11081103
* Display name of the item to be renamed.
11091104
*/
@@ -1127,6 +1122,13 @@ namespace ts.server.protocol {
11271122
/** Span of text to rename. */
11281123
triggerSpan: TextSpan;
11291124
}
1125+
export interface RenameInfoFailure {
1126+
canRename: false;
1127+
/**
1128+
* Error message if item can not be renamed.
1129+
*/
1130+
localizedErrorMessage: string;
1131+
}
11301132

11311133
/**
11321134
* A group of text spans, all in 'file'.

src/server/session.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -1165,8 +1165,15 @@ namespace ts.server {
11651165
return { info: renameInfo, locs: this.toSpanGroups(locations) };
11661166
}
11671167

1168-
private mapRenameInfo({ canRename, fileToRename, localizedErrorMessage, displayName, fullDisplayName, kind, kindModifiers, triggerSpan }: RenameInfo, scriptInfo: ScriptInfo): protocol.RenameInfo {
1169-
return { canRename, fileToRename, localizedErrorMessage, displayName, fullDisplayName, kind, kindModifiers, triggerSpan: this.toLocationTextSpan(triggerSpan, scriptInfo) };
1168+
private mapRenameInfo(info: RenameInfo, scriptInfo: ScriptInfo): protocol.RenameInfo {
1169+
if (info.canRename) {
1170+
const { canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan } = info;
1171+
return identity<protocol.RenameInfoSuccess>(
1172+
{ canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan: this.toLocationTextSpan(triggerSpan, scriptInfo) });
1173+
}
1174+
else {
1175+
return info;
1176+
}
11701177
}
11711178

11721179
private toSpanGroups(locations: ReadonlyArray<RenameLocation>): ReadonlyArray<protocol.SpanGroup> {

src/services/rename.ts

+3-14
Original file line numberDiff line numberDiff line change
@@ -56,37 +56,26 @@ namespace ts.Rename {
5656
fileToRename: name,
5757
kind,
5858
displayName: name,
59-
localizedErrorMessage: undefined,
6059
fullDisplayName: name,
6160
kindModifiers: ScriptElementKindModifier.none,
6261
triggerSpan,
6362
};
6463
}
6564

66-
function getRenameInfoSuccess(displayName: string, fullDisplayName: string, kind: ScriptElementKind, kindModifiers: string, node: Node, sourceFile: SourceFile): RenameInfo {
65+
function getRenameInfoSuccess(displayName: string, fullDisplayName: string, kind: ScriptElementKind, kindModifiers: string, node: Node, sourceFile: SourceFile): RenameInfoSuccess {
6766
return {
6867
canRename: true,
6968
fileToRename: undefined,
7069
kind,
7170
displayName,
72-
localizedErrorMessage: undefined,
7371
fullDisplayName,
7472
kindModifiers,
7573
triggerSpan: createTriggerSpanForNode(node, sourceFile)
7674
};
7775
}
7876

79-
function getRenameInfoError(diagnostic: DiagnosticMessage): RenameInfo {
80-
// TODO: GH#18217
81-
return {
82-
canRename: false,
83-
localizedErrorMessage: getLocaleSpecificMessage(diagnostic),
84-
displayName: undefined!,
85-
fullDisplayName: undefined!,
86-
kind: undefined!,
87-
kindModifiers: undefined!,
88-
triggerSpan: undefined!
89-
};
77+
function getRenameInfoError(diagnostic: DiagnosticMessage): RenameInfoFailure {
78+
return { canRename: false, localizedErrorMessage: getLocaleSpecificMessage(diagnostic) };
9079
}
9180

9281
function createTriggerSpanForNode(node: Node, sourceFile: SourceFile) {

src/services/types.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -819,20 +819,24 @@ namespace ts {
819819
tags?: JSDocTagInfo[];
820820
}
821821

822-
export interface RenameInfo {
823-
canRename: boolean;
822+
export type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
823+
export interface RenameInfoSuccess {
824+
canRename: true;
824825
/**
825826
* File or directory to rename.
826827
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
827828
*/
828829
fileToRename?: string;
829-
localizedErrorMessage?: string;
830830
displayName: string;
831831
fullDisplayName: string;
832832
kind: ScriptElementKind;
833833
kindModifiers: string;
834834
triggerSpan: TextSpan;
835835
}
836+
export interface RenameInfoFailure {
837+
canRename: false;
838+
localizedErrorMessage: string;
839+
}
836840

837841
export interface SignatureHelpParameter {
838842
name: string;

src/testRunner/unittests/tsserverProjectSystem.ts

-5
Original file line numberDiff line numberDiff line change
@@ -8298,7 +8298,6 @@ namespace ts.projectSystem {
82988298
fullDisplayName: '"/users/username/projects/a/c/fc".C',
82998299
kind: ScriptElementKind.constElement,
83008300
kindModifiers: ScriptElementKindModifier.exportedModifier,
8301-
localizedErrorMessage: undefined,
83028301
triggerSpan: span,
83038302
},
83048303
locs: [
@@ -9586,7 +9585,6 @@ export function Test2() {
95869585
fullDisplayName: aTs.path,
95879586
kind: ScriptElementKind.moduleElement,
95889587
kindModifiers: "",
9589-
localizedErrorMessage: undefined,
95909588
triggerSpan: protocolTextSpanFromSubstring(bTs.content, "a", { index: 1 }),
95919589
},
95929590
locs: [{ file: bTs.path, locs: [protocolTextSpanFromSubstring(bTs.content, "./a")] }],
@@ -10091,7 +10089,6 @@ declare class TestLib {
1009110089
fullDisplayName: "fnA",
1009210090
kind: ScriptElementKind.alias,
1009310091
kindModifiers: ScriptElementKindModifier.none,
10094-
localizedErrorMessage: undefined,
1009510092
triggerSpan: protocolTextSpanFromSubstring(userTs.content, "fnA", { index: 1 }),
1009610093
},
1009710094
locs: [renameUserTs(userTs), renameATs(aTs)],
@@ -10111,7 +10108,6 @@ declare class TestLib {
1011110108
fullDisplayName: '"/a/a".fnA',
1011210109
kind: ScriptElementKind.functionElement,
1011310110
kindModifiers: ScriptElementKindModifier.exportedModifier,
10114-
localizedErrorMessage: undefined,
1011510111
triggerSpan: protocolTextSpanFromSubstring(aTs.content, "fnA"),
1011610112
},
1011710113
locs: [renameATs(aTs), renameUserTs(userTs)],
@@ -10141,7 +10137,6 @@ declare class TestLib {
1014110137
fullDisplayName: "fnB",
1014210138
kind: ScriptElementKind.alias,
1014310139
kindModifiers: ScriptElementKindModifier.none,
10144-
localizedErrorMessage: undefined,
1014510140
triggerSpan: protocolTextSpanFromSubstring(userTs.content, "fnB", { index: 1 }),
1014610141
},
1014710142
locs: [

tests/baselines/reference/api/tsserverlibrary.d.ts

+17-9
Original file line numberDiff line numberDiff line change
@@ -5111,20 +5111,24 @@ declare namespace ts {
51115111
documentation?: SymbolDisplayPart[];
51125112
tags?: JSDocTagInfo[];
51135113
}
5114-
interface RenameInfo {
5115-
canRename: boolean;
5114+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
5115+
interface RenameInfoSuccess {
5116+
canRename: true;
51165117
/**
51175118
* File or directory to rename.
51185119
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
51195120
*/
51205121
fileToRename?: string;
5121-
localizedErrorMessage?: string;
51225122
displayName: string;
51235123
fullDisplayName: string;
51245124
kind: ScriptElementKind;
51255125
kindModifiers: string;
51265126
triggerSpan: TextSpan;
51275127
}
5128+
interface RenameInfoFailure {
5129+
canRename: false;
5130+
localizedErrorMessage: string;
5131+
}
51285132
interface SignatureHelpParameter {
51295133
name: string;
51305134
documentation: SymbolDisplayPart[];
@@ -6434,20 +6438,17 @@ declare namespace ts.server.protocol {
64346438
/**
64356439
* Information about the item to be renamed.
64366440
*/
6437-
interface RenameInfo {
6441+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
6442+
interface RenameInfoSuccess {
64386443
/**
64396444
* True if item can be renamed.
64406445
*/
6441-
canRename: boolean;
6446+
canRename: true;
64426447
/**
64436448
* File or directory to rename.
64446449
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
64456450
*/
64466451
fileToRename?: string;
6447-
/**
6448-
* Error message if item can not be renamed.
6449-
*/
6450-
localizedErrorMessage?: string;
64516452
/**
64526453
* Display name of the item to be renamed.
64536454
*/
@@ -6467,6 +6468,13 @@ declare namespace ts.server.protocol {
64676468
/** Span of text to rename. */
64686469
triggerSpan: TextSpan;
64696470
}
6471+
interface RenameInfoFailure {
6472+
canRename: false;
6473+
/**
6474+
* Error message if item can not be renamed.
6475+
*/
6476+
localizedErrorMessage: string;
6477+
}
64706478
/**
64716479
* A group of text spans, all in 'file'.
64726480
*/

tests/baselines/reference/api/typescript.d.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -5111,20 +5111,24 @@ declare namespace ts {
51115111
documentation?: SymbolDisplayPart[];
51125112
tags?: JSDocTagInfo[];
51135113
}
5114-
interface RenameInfo {
5115-
canRename: boolean;
5114+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
5115+
interface RenameInfoSuccess {
5116+
canRename: true;
51165117
/**
51175118
* File or directory to rename.
51185119
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
51195120
*/
51205121
fileToRename?: string;
5121-
localizedErrorMessage?: string;
51225122
displayName: string;
51235123
fullDisplayName: string;
51245124
kind: ScriptElementKind;
51255125
kindModifiers: string;
51265126
triggerSpan: TextSpan;
51275127
}
5128+
interface RenameInfoFailure {
5129+
canRename: false;
5130+
localizedErrorMessage: string;
5131+
}
51285132
interface SignatureHelpParameter {
51295133
name: string;
51305134
documentation: SymbolDisplayPart[];

0 commit comments

Comments
 (0)