Skip to content

Commit 3efc14b

Browse files
author
Andy Hanson
committed
Make RenameInfo a union
1 parent 3f98c51 commit 3efc14b

File tree

9 files changed

+88
-70
lines changed

9 files changed

+88
-70
lines changed

src/harness/client.ts

Lines changed: 33 additions & 23 deletions
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

Lines changed: 2 additions & 3 deletions
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

Lines changed: 10 additions & 8 deletions
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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,8 +1184,15 @@ namespace ts.server {
11841184
return { info: renameInfo, locs: this.toSpanGroups(locations) };
11851185
}
11861186

1187-
private mapRenameInfo({ canRename, fileToRename, localizedErrorMessage, displayName, fullDisplayName, kind, kindModifiers, triggerSpan }: RenameInfo, scriptInfo: ScriptInfo): protocol.RenameInfo {
1188-
return { canRename, fileToRename, localizedErrorMessage, displayName, fullDisplayName, kind, kindModifiers, triggerSpan: this.toLocationTextSpan(triggerSpan, scriptInfo) };
1187+
private mapRenameInfo(info: RenameInfo, scriptInfo: ScriptInfo): protocol.RenameInfo {
1188+
if (info.canRename) {
1189+
const { canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan } = info;
1190+
return identity<protocol.RenameInfoSuccess>(
1191+
{ canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan: this.toLocationTextSpan(triggerSpan, scriptInfo) });
1192+
}
1193+
else {
1194+
return info;
1195+
}
11891196
}
11901197

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

src/services/rename.ts

Lines changed: 3 additions & 14 deletions
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

Lines changed: 7 additions & 3 deletions
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

Lines changed: 0 additions & 5 deletions
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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5112,20 +5112,24 @@ declare namespace ts {
51125112
documentation?: SymbolDisplayPart[];
51135113
tags?: JSDocTagInfo[];
51145114
}
5115-
interface RenameInfo {
5116-
canRename: boolean;
5115+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
5116+
interface RenameInfoSuccess {
5117+
canRename: true;
51175118
/**
51185119
* File or directory to rename.
51195120
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
51205121
*/
51215122
fileToRename?: string;
5122-
localizedErrorMessage?: string;
51235123
displayName: string;
51245124
fullDisplayName: string;
51255125
kind: ScriptElementKind;
51265126
kindModifiers: string;
51275127
triggerSpan: TextSpan;
51285128
}
5129+
interface RenameInfoFailure {
5130+
canRename: false;
5131+
localizedErrorMessage: string;
5132+
}
51295133
interface SignatureHelpParameter {
51305134
name: string;
51315135
documentation: SymbolDisplayPart[];
@@ -6435,20 +6439,17 @@ declare namespace ts.server.protocol {
64356439
/**
64366440
* Information about the item to be renamed.
64376441
*/
6438-
interface RenameInfo {
6442+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
6443+
interface RenameInfoSuccess {
64396444
/**
64406445
* True if item can be renamed.
64416446
*/
6442-
canRename: boolean;
6447+
canRename: true;
64436448
/**
64446449
* File or directory to rename.
64456450
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
64466451
*/
64476452
fileToRename?: string;
6448-
/**
6449-
* Error message if item can not be renamed.
6450-
*/
6451-
localizedErrorMessage?: string;
64526453
/**
64536454
* Display name of the item to be renamed.
64546455
*/
@@ -6468,6 +6469,13 @@ declare namespace ts.server.protocol {
64686469
/** Span of text to rename. */
64696470
triggerSpan: TextSpan;
64706471
}
6472+
interface RenameInfoFailure {
6473+
canRename: false;
6474+
/**
6475+
* Error message if item can not be renamed.
6476+
*/
6477+
localizedErrorMessage: string;
6478+
}
64716479
/**
64726480
* A group of text spans, all in 'file'.
64736481
*/

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

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

0 commit comments

Comments
 (0)