Skip to content

Commit 1089424

Browse files
author
Andy
authored
Ensure getApplicableRefactors doesn't crash when given a position (#28361)
1 parent a6ef176 commit 1089424

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

src/server/session.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,7 +1811,7 @@ namespace ts.server {
18111811
return (<protocol.FileLocationRequestArgs>locationOrSpan).line !== undefined;
18121812
}
18131813

1814-
private extractPositionAndRange(args: protocol.FileLocationOrRangeRequestArgs, scriptInfo: ScriptInfo): { position: number, textRange: TextRange } {
1814+
private extractPositionOrRange(args: protocol.FileLocationOrRangeRequestArgs, scriptInfo: ScriptInfo): number | TextRange {
18151815
let position: number | undefined;
18161816
let textRange: TextRange | undefined;
18171817
if (this.isLocation(args)) {
@@ -1821,7 +1821,7 @@ namespace ts.server {
18211821
const { startPosition, endPosition } = this.getStartAndEndPosition(args, scriptInfo);
18221822
textRange = { pos: startPosition, end: endPosition };
18231823
}
1824-
return { position: position!, textRange: textRange! }; // TODO: GH#18217
1824+
return Debug.assertDefined(position === undefined ? textRange : position);
18251825

18261826
function getPosition(loc: protocol.FileLocationRequestArgs) {
18271827
return loc.position !== undefined ? loc.position : scriptInfo.lineOffsetToPosition(loc.line, loc.offset);
@@ -1831,19 +1831,16 @@ namespace ts.server {
18311831
private getApplicableRefactors(args: protocol.GetApplicableRefactorsRequestArgs): protocol.ApplicableRefactorInfo[] {
18321832
const { file, project } = this.getFileAndProject(args);
18331833
const scriptInfo = project.getScriptInfoForNormalizedPath(file)!;
1834-
const { position, textRange } = this.extractPositionAndRange(args, scriptInfo);
1835-
return project.getLanguageService().getApplicableRefactors(file, position || textRange, this.getPreferences(file));
1834+
return project.getLanguageService().getApplicableRefactors(file, this.extractPositionOrRange(args, scriptInfo), this.getPreferences(file));
18361835
}
18371836

18381837
private getEditsForRefactor(args: protocol.GetEditsForRefactorRequestArgs, simplifiedResult: boolean): RefactorEditInfo | protocol.RefactorEditInfo {
18391838
const { file, project } = this.getFileAndProject(args);
18401839
const scriptInfo = project.getScriptInfoForNormalizedPath(file)!;
1841-
const { position, textRange } = this.extractPositionAndRange(args, scriptInfo);
1842-
18431840
const result = project.getLanguageService().getEditsForRefactor(
18441841
file,
18451842
this.getFormatOptions(file),
1846-
position || textRange,
1843+
this.extractPositionOrRange(args, scriptInfo),
18471844
args.refactor,
18481845
args.action,
18491846
this.getPreferences(file),

src/testRunner/unittests/tsserverProjectSystem.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3433,7 +3433,17 @@ var x = 10;`
34333433
command: protocol.CommandTypes.GetApplicableRefactors,
34343434
arguments: { file: file2.path, startLine: 1, startOffset, endLine: 1, endOffset: startOffset + 1 }
34353435
});
3436+
});
34363437

3438+
describe("getApplicableRefactors", () => {
3439+
it("works when taking position", () => {
3440+
const aTs: File = { path: "/a.ts", content: "" };
3441+
const session = createSession(createServerHost([aTs]));
3442+
openFilesForSession([aTs], session);
3443+
const response = executeSessionRequest<protocol.GetApplicableRefactorsRequest, protocol.GetApplicableRefactorsResponse>(
3444+
session, protocol.CommandTypes.GetApplicableRefactors, { file: aTs.path, line: 1, offset: 1 });
3445+
assert.deepEqual<ReadonlyArray<protocol.ApplicableRefactorInfo> | undefined>(response, []);
3446+
});
34373447
});
34383448

34393449
describe("includes deferred files in the project context", () => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8895,7 +8895,7 @@ declare namespace ts.server {
88958895
private getFullNavigateToItems;
88968896
private getSupportedCodeFixes;
88978897
private isLocation;
8898-
private extractPositionAndRange;
8898+
private extractPositionOrRange;
88998899
private getApplicableRefactors;
89008900
private getEditsForRefactor;
89018901
private organizeImports;

0 commit comments

Comments
 (0)