Skip to content

Commit 17570a6

Browse files
author
Andy Hanson
committed
Make RenameInfo a union
1 parent 0a97663 commit 17570a6

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
@@ -1537,7 +1537,7 @@ Actual: ${stringify(fullActual)}`);
15371537
public verifyRenameInfoSucceeded(displayName: string | undefined, fullDisplayName: string | undefined, kind: string | undefined, kindModifiers: string | undefined, fileToRename: string | undefined, expectedRange: Range | undefined): void {
15381538
const renameInfo = this.languageService.getRenameInfo(this.activeFile.fileName, this.currentCaretPosition);
15391539
if (!renameInfo.canRename) {
1540-
this.raiseError("Rename did not succeed");
1540+
throw this.raiseError("Rename did not succeed");
15411541
}
15421542

15431543
this.validate("displayName", displayName, renameInfo.displayName);
@@ -1563,9 +1563,8 @@ Actual: ${stringify(fullActual)}`);
15631563
public verifyRenameInfoFailed(message?: string) {
15641564
const renameInfo = this.languageService.getRenameInfo(this.activeFile.fileName, this.currentCaretPosition);
15651565
if (renameInfo.canRename) {
1566-
this.raiseError("Rename was expected to fail");
1566+
throw this.raiseError("Rename was expected to fail");
15671567
}
1568-
15691568
this.validate("error", message, renameInfo.localizedErrorMessage);
15701569
}
15711570

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
@@ -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

+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
@@ -821,20 +821,24 @@ namespace ts {
821821
tags?: JSDocTagInfo[];
822822
}
823823

824-
export interface RenameInfo {
825-
canRename: boolean;
824+
export type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
825+
export interface RenameInfoSuccess {
826+
canRename: true;
826827
/**
827828
* File or directory to rename.
828829
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
829830
*/
830831
fileToRename?: string;
831-
localizedErrorMessage?: string;
832832
displayName: string;
833833
fullDisplayName: string;
834834
kind: ScriptElementKind;
835835
kindModifiers: string;
836836
triggerSpan: TextSpan;
837837
}
838+
export interface RenameInfoFailure {
839+
canRename: false;
840+
localizedErrorMessage: string;
841+
}
838842

839843
export interface SignatureHelpParameter {
840844
name: string;

src/testRunner/unittests/tsserverProjectSystem.ts

-5
Original file line numberDiff line numberDiff line change
@@ -8309,7 +8309,6 @@ namespace ts.projectSystem {
83098309
fullDisplayName: '"/users/username/projects/a/c/fc".C',
83108310
kind: ScriptElementKind.constElement,
83118311
kindModifiers: ScriptElementKindModifier.exportedModifier,
8312-
localizedErrorMessage: undefined,
83138312
triggerSpan: protocolTextSpanFromSubstring(cFile.content, "C"),
83148313
},
83158314
locs: [
@@ -9597,7 +9596,6 @@ export function Test2() {
95979596
fullDisplayName: aTs.path,
95989597
kind: ScriptElementKind.moduleElement,
95999598
kindModifiers: "",
9600-
localizedErrorMessage: undefined,
96019599
triggerSpan: protocolTextSpanFromSubstring(bTs.content, "a", { index: 1 }),
96029600
},
96039601
locs: [{ file: bTs.path, locs: [protocolRenameSpanFromSubstring(bTs.content, "./a")] }],
@@ -10131,7 +10129,6 @@ declare class TestLib {
1013110129
fullDisplayName: "fnA",
1013210130
kind: ScriptElementKind.alias,
1013310131
kindModifiers: ScriptElementKindModifier.none,
10134-
localizedErrorMessage: undefined,
1013510132
triggerSpan: protocolTextSpanFromSubstring(userTs.content, "fnA", { index: 1 }),
1013610133
},
1013710134
locs: [renameUserTs(userTs), renameATs(aTs)],
@@ -10151,7 +10148,6 @@ declare class TestLib {
1015110148
fullDisplayName: '"/a/a".fnA',
1015210149
kind: ScriptElementKind.functionElement,
1015310150
kindModifiers: ScriptElementKindModifier.exportedModifier,
10154-
localizedErrorMessage: undefined,
1015510151
triggerSpan: protocolTextSpanFromSubstring(aTs.content, "fnA"),
1015610152
},
1015710153
locs: [renameATs(aTs), renameUserTs(userTs)],
@@ -10181,7 +10177,6 @@ declare class TestLib {
1018110177
fullDisplayName: "fnB",
1018210178
kind: ScriptElementKind.alias,
1018310179
kindModifiers: ScriptElementKindModifier.none,
10184-
localizedErrorMessage: undefined,
1018510180
triggerSpan: protocolTextSpanFromSubstring(userTs.content, "fnB", { index: 1 }),
1018610181
},
1018710182
locs: [

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

+17-9
Original file line numberDiff line numberDiff line change
@@ -5114,20 +5114,24 @@ declare namespace ts {
51145114
documentation?: SymbolDisplayPart[];
51155115
tags?: JSDocTagInfo[];
51165116
}
5117-
interface RenameInfo {
5118-
canRename: boolean;
5117+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
5118+
interface RenameInfoSuccess {
5119+
canRename: true;
51195120
/**
51205121
* File or directory to rename.
51215122
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
51225123
*/
51235124
fileToRename?: string;
5124-
localizedErrorMessage?: string;
51255125
displayName: string;
51265126
fullDisplayName: string;
51275127
kind: ScriptElementKind;
51285128
kindModifiers: string;
51295129
triggerSpan: TextSpan;
51305130
}
5131+
interface RenameInfoFailure {
5132+
canRename: false;
5133+
localizedErrorMessage: string;
5134+
}
51315135
interface SignatureHelpParameter {
51325136
name: string;
51335137
documentation: SymbolDisplayPart[];
@@ -6437,20 +6441,17 @@ declare namespace ts.server.protocol {
64376441
/**
64386442
* Information about the item to be renamed.
64396443
*/
6440-
interface RenameInfo {
6444+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
6445+
interface RenameInfoSuccess {
64416446
/**
64426447
* True if item can be renamed.
64436448
*/
6444-
canRename: boolean;
6449+
canRename: true;
64456450
/**
64466451
* File or directory to rename.
64476452
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
64486453
*/
64496454
fileToRename?: string;
6450-
/**
6451-
* Error message if item can not be renamed.
6452-
*/
6453-
localizedErrorMessage?: string;
64546455
/**
64556456
* Display name of the item to be renamed.
64566457
*/
@@ -6470,6 +6471,13 @@ declare namespace ts.server.protocol {
64706471
/** Span of text to rename. */
64716472
triggerSpan: TextSpan;
64726473
}
6474+
interface RenameInfoFailure {
6475+
canRename: false;
6476+
/**
6477+
* Error message if item can not be renamed.
6478+
*/
6479+
localizedErrorMessage: string;
6480+
}
64736481
/**
64746482
* A group of text spans, all in 'file'.
64756483
*/

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

+7-3
Original file line numberDiff line numberDiff line change
@@ -5114,20 +5114,24 @@ declare namespace ts {
51145114
documentation?: SymbolDisplayPart[];
51155115
tags?: JSDocTagInfo[];
51165116
}
5117-
interface RenameInfo {
5118-
canRename: boolean;
5117+
type RenameInfo = RenameInfoSuccess | RenameInfoFailure;
5118+
interface RenameInfoSuccess {
5119+
canRename: true;
51195120
/**
51205121
* File or directory to rename.
51215122
* If set, `getEditsForFileRename` should be called instead of `findRenameLocations`.
51225123
*/
51235124
fileToRename?: string;
5124-
localizedErrorMessage?: string;
51255125
displayName: string;
51265126
fullDisplayName: string;
51275127
kind: ScriptElementKind;
51285128
kindModifiers: string;
51295129
triggerSpan: TextSpan;
51305130
}
5131+
interface RenameInfoFailure {
5132+
canRename: false;
5133+
localizedErrorMessage: string;
5134+
}
51315135
interface SignatureHelpParameter {
51325136
name: string;
51335137
documentation: SymbolDisplayPart[];

0 commit comments

Comments
 (0)