Skip to content

Commit 1c3259d

Browse files
author
Andy
authored
Add CompletionInfo command to protocol (microsoft#25080)
* Add CompletionInfo command to protocol * Add comments to protocol
1 parent 28e0fc5 commit 1c3259d

3 files changed

Lines changed: 51 additions & 17 deletions

File tree

src/server/protocol.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ namespace ts.server.protocol {
1414
GetSpanOfEnclosingComment = "getSpanOfEnclosingComment",
1515
Change = "change",
1616
Close = "close",
17+
/** @deprecated Prefer CompletionInfo -- see comment on CompletionsResponse */
1718
Completions = "completions",
19+
CompletionInfo = "completionInfo",
1820
/* @internal */
1921
CompletionsFull = "completions-full",
2022
CompletionDetails = "completionEntryDetails",
@@ -1943,10 +1945,22 @@ namespace ts.server.protocol {
19431945
source?: SymbolDisplayPart[];
19441946
}
19451947

1948+
/** @deprecated Prefer CompletionInfoResponse, which supports several top-level fields in addition to the array of entries. */
19461949
export interface CompletionsResponse extends Response {
19471950
body?: CompletionEntry[];
19481951
}
19491952

1953+
export interface CompletionInfoResponse extends Response {
1954+
body?: CompletionInfo;
1955+
}
1956+
1957+
export interface CompletionInfo {
1958+
readonly isGlobalCompletion: boolean;
1959+
readonly isMemberCompletion: boolean;
1960+
readonly isNewIdentifierLocation: boolean;
1961+
readonly entries: ReadonlyArray<CompletionEntry>;
1962+
}
1963+
19501964
export interface CompletionDetailsResponse extends Response {
19511965
body?: CompletionEntryDetails[];
19521966
}

src/server/session.ts

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,8 +1343,7 @@ namespace ts.server {
13431343
});
13441344
}
13451345

1346-
private getCompletions(args: protocol.CompletionsRequestArgs, simplifiedResult: boolean): ReadonlyArray<protocol.CompletionEntry> | CompletionInfo | undefined {
1347-
const prefix = args.prefix || "";
1346+
private getCompletions(args: protocol.CompletionsRequestArgs, kind: protocol.CommandTypes.CompletionInfo | protocol.CommandTypes.Completions | protocol.CommandTypes.CompletionsFull): ReadonlyArray<protocol.CompletionEntry> | protocol.CompletionInfo | CompletionInfo | undefined {
13481347
const { file, project } = this.getFileAndProject(args);
13491348
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file)!;
13501349
const position = this.getPosition(args, scriptInfo);
@@ -1355,19 +1354,27 @@ namespace ts.server {
13551354
includeExternalModuleExports: args.includeExternalModuleExports,
13561355
includeInsertTextCompletions: args.includeInsertTextCompletions
13571356
});
1358-
if (simplifiedResult) {
1359-
return mapDefined<CompletionEntry, protocol.CompletionEntry>(completions && completions.entries, entry => {
1360-
if (completions!.isMemberCompletion || startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) {
1361-
const { name, kind, kindModifiers, sortText, insertText, replacementSpan, hasAction, source, isRecommended } = entry;
1362-
const convertedSpan = replacementSpan ? this.toLocationTextSpan(replacementSpan, scriptInfo) : undefined;
1363-
// Use `hasAction || undefined` to avoid serializing `false`.
1364-
return { name, kind, kindModifiers, sortText, insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source, isRecommended };
1365-
}
1366-
}).sort((a, b) => compareStringsCaseSensitiveUI(a.name, b.name));
1367-
}
1368-
else {
1369-
return completions;
1370-
}
1357+
if (completions === undefined) return undefined;
1358+
1359+
if (kind === protocol.CommandTypes.CompletionsFull) return completions;
1360+
1361+
const prefix = args.prefix || "";
1362+
const entries = mapDefined<CompletionEntry, protocol.CompletionEntry>(completions.entries, entry => {
1363+
if (completions.isMemberCompletion || startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) {
1364+
const { name, kind, kindModifiers, sortText, insertText, replacementSpan, hasAction, source, isRecommended } = entry;
1365+
const convertedSpan = replacementSpan ? this.toLocationTextSpan(replacementSpan, scriptInfo) : undefined;
1366+
// Use `hasAction || undefined` to avoid serializing `false`.
1367+
return { name, kind, kindModifiers, sortText, insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source, isRecommended };
1368+
}
1369+
}).sort((a, b) => compareStringsCaseSensitiveUI(a.name, b.name));
1370+
1371+
if (kind === protocol.CommandTypes.Completions) return entries;
1372+
1373+
const res: protocol.CompletionInfo = {
1374+
...completions,
1375+
entries,
1376+
};
1377+
return res;
13711378
}
13721379

13731380
private getCompletionEntryDetails(args: protocol.CompletionDetailsRequestArgs, simplifiedResult: boolean): ReadonlyArray<protocol.CompletionEntryDetails> | ReadonlyArray<CompletionEntryDetails> {
@@ -2035,11 +2042,14 @@ namespace ts.server {
20352042
[CommandNames.FormatRangeFull]: (request: protocol.FormatRequest) => {
20362043
return this.requiredResponse(this.getFormattingEditsForRangeFull(request.arguments));
20372044
},
2045+
[CommandNames.CompletionInfo]: (request: protocol.CompletionsRequest) => {
2046+
return this.requiredResponse(this.getCompletions(request.arguments, CommandNames.CompletionInfo));
2047+
},
20382048
[CommandNames.Completions]: (request: protocol.CompletionsRequest) => {
2039-
return this.requiredResponse(this.getCompletions(request.arguments, /*simplifiedResult*/ true));
2049+
return this.requiredResponse(this.getCompletions(request.arguments, CommandNames.Completions));
20402050
},
20412051
[CommandNames.CompletionsFull]: (request: protocol.CompletionsRequest) => {
2042-
return this.requiredResponse(this.getCompletions(request.arguments, /*simplifiedResult*/ false));
2052+
return this.requiredResponse(this.getCompletions(request.arguments, CommandNames.CompletionsFull));
20432053
},
20442054
[CommandNames.CompletionDetails]: (request: protocol.CompletionDetailsRequest) => {
20452055
return this.requiredResponse(this.getCompletionEntryDetails(request.arguments, /*simplifiedResult*/ true));

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12175,6 +12175,7 @@ declare namespace ts.server.protocol {
1217512175
Change = "change",
1217612176
Close = "close",
1217712177
Completions = "completions",
12178+
CompletionInfo = "completionInfo",
1217812179
CompletionsFull = "completions-full",
1217912180
CompletionDetails = "completionEntryDetails",
1218012181
CompletionDetailsFull = "completionEntryDetails-full",
@@ -12876,6 +12877,15 @@ declare namespace ts.server.protocol {
1287612877
interface CompletionsResponse extends Response {
1287712878
body?: CompletionEntry[];
1287812879
}
12880+
interface CompletionInfoResponse extends Response {
12881+
body?: CompletionInfo;
12882+
}
12883+
interface CompletionInfo {
12884+
readonly isGlobalCompletion: boolean;
12885+
readonly isMemberCompletion: boolean;
12886+
readonly isNewIdentifierLocation: boolean;
12887+
readonly entries: ReadonlyArray<CompletionEntry>;
12888+
}
1287912889
interface CompletionDetailsResponse extends Response {
1288012890
body?: CompletionEntryDetails[];
1288112891
}

0 commit comments

Comments
 (0)