Skip to content

Commit ea293d6

Browse files
add VS Code iconography to code lenses from SourceKit-LSP (#1347)
1 parent 5cd74b4 commit ea293d6

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/sourcekit-lsp/LanguageClientManager.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,20 @@ export class LanguageClientManager implements vscode.Disposable {
534534
workspaceFolder: workspaceFolder,
535535
outputChannel: new SwiftOutputChannel("SourceKit Language Server", false),
536536
middleware: {
537+
provideCodeLenses: async (document, token, next) => {
538+
const result = await next(document, token);
539+
return result?.map(codelens => {
540+
switch (codelens.command?.command) {
541+
case "swift.run":
542+
codelens.command.title = `$(play) ${codelens.command.title}`;
543+
break;
544+
case "swift.debug":
545+
codelens.command.title = `$(debug) ${codelens.command.title}`;
546+
break;
547+
}
548+
return codelens;
549+
});
550+
},
537551
provideDocumentSymbols: async (document, token, next) => {
538552
const result = await next(document, token);
539553
const documentSymbols = result as vscode.DocumentSymbol[];

test/unit-tests/sourcekit-lsp/LanguageClientManager.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,72 @@ suite("LanguageClientManager Suite", () => {
356356
expect(languageClientMock.start).to.have.been.calledOnce;
357357
});
358358

359+
test("adds VS Code iconography to CodeLenses", async () => {
360+
const codelensesFromSourceKitLSP = async (): Promise<vscode.CodeLens[]> => {
361+
return [
362+
{
363+
range: new vscode.Range(0, 0, 0, 0),
364+
command: {
365+
title: "Run",
366+
command: "swift.run",
367+
},
368+
isResolved: true,
369+
},
370+
{
371+
range: new vscode.Range(0, 0, 0, 0),
372+
command: {
373+
title: "Debug",
374+
command: "swift.debug",
375+
},
376+
isResolved: true,
377+
},
378+
{
379+
range: new vscode.Range(0, 0, 0, 0),
380+
command: {
381+
title: "Run",
382+
command: "some.other.command",
383+
},
384+
isResolved: true,
385+
},
386+
];
387+
};
388+
389+
new LanguageClientManager(instance(mockedWorkspace), languageClientFactoryMock);
390+
await waitForReturnedPromises(languageClientMock.start);
391+
392+
expect(languageClientFactoryMock.createLanguageClient).to.have.been.calledOnce;
393+
const middleware = languageClientFactoryMock.createLanguageClient.args[0][3].middleware!;
394+
expect(middleware).to.have.property("provideCodeLenses");
395+
await expect(
396+
middleware.provideCodeLenses!({} as any, {} as any, codelensesFromSourceKitLSP)
397+
).to.eventually.deep.equal([
398+
{
399+
range: new vscode.Range(0, 0, 0, 0),
400+
command: {
401+
title: "$(play) Run",
402+
command: "swift.run",
403+
},
404+
isResolved: true,
405+
},
406+
{
407+
range: new vscode.Range(0, 0, 0, 0),
408+
command: {
409+
title: "$(debug) Debug",
410+
command: "swift.debug",
411+
},
412+
isResolved: true,
413+
},
414+
{
415+
range: new vscode.Range(0, 0, 0, 0),
416+
command: {
417+
title: "Run",
418+
command: "some.other.command",
419+
},
420+
isResolved: true,
421+
},
422+
]);
423+
});
424+
359425
suite("SourceKit-LSP version doesn't support workspace folders", () => {
360426
let folder1: MockedObject<FolderContext>;
361427
let folder2: MockedObject<FolderContext>;

0 commit comments

Comments
 (0)