Skip to content

Commit efb2f9f

Browse files
authored
Add Re-Index Project Command (#964)
* Add Re-Index Project Command Adds a command to trigger a re-indexing of the open project. Should only be needed when background indexing is enabled and it gets out of sync. While that is a bug, this can act as a temporary workaround.
1 parent e52a9ce commit efb2f9f

File tree

6 files changed

+49
-2
lines changed

6 files changed

+49
-2
lines changed

package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@
152152
"title": "Restart LSP Server",
153153
"category": "Swift"
154154
},
155+
{
156+
"command": "swift.reindexProject",
157+
"title": "Re-Index Project",
158+
"category": "Swift"
159+
},
155160
{
156161
"command": "swift.switchPlatform",
157162
"title": "Select Target Platform...",
@@ -677,6 +682,10 @@
677682
{
678683
"command": "swift.attachDebugger",
679684
"when": "swift.lldbVSCodeAvailable"
685+
},
686+
{
687+
"command": "swift.reindexProject",
688+
"when": "swift.supportsReindexing"
680689
}
681690
],
682691
"editor/context": [

src/TestExplorer/LSPTestDiscovery.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ interface ILanguageClientManager {
4949
* these results.
5050
*/
5151
export class LSPTestDiscovery {
52-
private capCache = new Map<string, boolean>();
53-
5452
constructor(private languageClient: ILanguageClientManager) {}
5553

5654
/**

src/WorkspaceContext.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,14 @@ export class WorkspaceContext implements vscode.Disposable {
229229
} else {
230230
contextKeys.currentTargetType = undefined;
231231
}
232+
233+
// LSP can be configured per workspace to support reindexing
234+
this.languageClientManager.useLanguageClient(async client => {
235+
const experimentalCaps = client.initializeResult?.capabilities.experimental;
236+
contextKeys.supportsReindexing =
237+
experimentalCaps && experimentalCaps["workspace/triggerReindex"] !== undefined;
238+
});
239+
232240
setSnippetContextKey(this);
233241
}
234242

src/commands.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { SwiftExecOperation, TaskOperation } from "./tasks/TaskQueue";
3232
import { SwiftProjectTemplate } from "./toolchain/toolchain";
3333
import { showToolchainSelectionQuickPick, showToolchainError } from "./ui/ToolchainSelection";
3434
import { captureDiagnostics } from "./commands/captureDiagnostics";
35+
import { reindexProjectRequest } from "./sourcekit-lsp/lspExtensions";
3536

3637
/**
3738
* References:
@@ -656,6 +657,25 @@ function restartLSPServer(workspaceContext: WorkspaceContext): Promise<void> {
656657
return workspaceContext.languageClientManager.restart();
657658
}
658659

660+
/** Request that the SourceKit-LSP server reindexes the workspace */
661+
function reindexProject(workspaceContext: WorkspaceContext): Promise<unknown> {
662+
return workspaceContext.languageClientManager.useLanguageClient(async (client, token) => {
663+
try {
664+
return await client.sendRequest(reindexProjectRequest, {}, token);
665+
} catch (err) {
666+
const error = err as { code: number; message: string };
667+
// methodNotFound, version of sourcekit-lsp is likely too old.
668+
if (error.code === -32601) {
669+
vscode.window.showWarningMessage(
670+
"The installed version of SourceKit-LSP does not support background indexing."
671+
);
672+
} else {
673+
vscode.window.showWarningMessage(error.message);
674+
}
675+
}
676+
});
677+
}
678+
659679
/** Execute task and show UI while running */
660680
async function executeTaskWithUI(
661681
task: vscode.Task,
@@ -817,6 +837,7 @@ export function register(ctx: WorkspaceContext): vscode.Disposable[] {
817837
vscode.commands.registerCommand("swift.debugSnippet", () => debugSnippet(ctx)),
818838
vscode.commands.registerCommand("swift.runPluginTask", () => runPluginTask()),
819839
vscode.commands.registerCommand("swift.restartLSPServer", () => restartLSPServer(ctx)),
840+
vscode.commands.registerCommand("swift.reindexProject", () => reindexProject(ctx)),
820841
vscode.commands.registerCommand("swift.insertFunctionComment", () =>
821842
insertFunctionComment(ctx)
822843
),

src/contextKeys.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ const contextKeys = {
8080
set createNewProjectAvailable(value: boolean) {
8181
vscode.commands.executeCommand("setContext", "swift.createNewProjectAvailable", value);
8282
},
83+
84+
/**
85+
* Whether the SourceKit-LSP server supports reindexing the workspace.
86+
*/
87+
set supportsReindexing(value: boolean) {
88+
vscode.commands.executeCommand("setContext", "swift.supportsReindexing", value);
89+
},
8390
};
8491

8592
export default contextKeys;

src/sourcekit-lsp/lspExtensions.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,7 @@ export const textDocumentTestsRequest = new langclient.RequestType<
174174
LSPTestItem[],
175175
unknown
176176
>("textDocument/tests");
177+
178+
export const reindexProjectRequest = new langclient.RequestType<null, unknown, unknown>(
179+
"workspace/triggerReindex"
180+
);

0 commit comments

Comments
 (0)