Skip to content

Commit 4369bdb

Browse files
committed
Register relatedFilesProvider for C#
1 parent 15e7940 commit 4369bdb

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

src/lsptoolshost/copilot.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as vscode from 'vscode';
7+
import { CSharpExtensionId } from '../constants/csharpExtensionId';
8+
import { CopilotRelatedDocumentsReport, CopilotRelatedDocumentsRequest } from './roslynProtocol';
9+
import { RoslynLanguageServer } from './roslynLanguageServer';
10+
import { UriConverter } from './uriConverter';
11+
import { TextDocumentIdentifier } from 'vscode-languageserver-protocol';
12+
13+
export async function registerCopilotExtension(languageServer: RoslynLanguageServer, channel: vscode.OutputChannel) {
14+
const ext = vscode.extensions.getExtension('github.copilot');
15+
if (!ext) {
16+
channel.appendLine('GitHub Copilot extension not installed. Skipping call to `registerRelatedFilesProvider`');
17+
return;
18+
}
19+
await ext.activate();
20+
const relatedAPI = ext.exports as
21+
| {
22+
registerRelatedFilesProvider(
23+
providerId: { extensionId: string; languageId: string },
24+
callback: (
25+
uri: vscode.Uri
26+
) => Promise<{ entries: vscode.Uri[]; traits?: { name: string; value: string }[] }>
27+
): void;
28+
}
29+
| undefined;
30+
if (!relatedAPI) {
31+
channel.appendLine(
32+
'Incompatible GitHub Copilot extension installed. Skipping call to `registerRelatedFilesProvider`'
33+
);
34+
return;
35+
}
36+
channel.appendLine('registerRelatedFilesProvider succeeded.');
37+
38+
const id = {
39+
extensionId: CSharpExtensionId,
40+
languageId: 'csharp',
41+
};
42+
43+
relatedAPI.registerRelatedFilesProvider(id, async (uri) => {
44+
const writeOutput = (output: CopilotRelatedDocumentsReport[], builder: vscode.Uri[] | null) => {
45+
if (output) {
46+
for (const report of output) {
47+
if (report._vs_file_paths) {
48+
for (const filePath of report._vs_file_paths) {
49+
channel.appendLine('found related file: ' + filePath);
50+
builder?.push(vscode.Uri.file(filePath));
51+
}
52+
}
53+
}
54+
}
55+
};
56+
57+
const relatedFiles: vscode.Uri[] = [];
58+
const uriString = UriConverter.serialize(uri);
59+
const textDocument = TextDocumentIdentifier.create(uriString);
60+
const responsePromise = languageServer.sendRequestWithProgress(
61+
CopilotRelatedDocumentsRequest.type,
62+
{
63+
_vs_textDocument: textDocument,
64+
position: {
65+
line: 0,
66+
character: 0,
67+
},
68+
},
69+
async (p) => {
70+
writeOutput(p, relatedFiles);
71+
}
72+
);
73+
74+
await responsePromise.then(
75+
(result) => {
76+
writeOutput(result, null);
77+
return;
78+
},
79+
(err) => {
80+
channel.appendLine(err);
81+
return;
82+
}
83+
);
84+
85+
return {
86+
entries: relatedFiles,
87+
};
88+
});
89+
}

src/lsptoolshost/roslynLanguageServer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import { registerLanguageStatusItems } from './languageStatusBar';
6868
import { ProjectContextService } from './services/projectContextService';
6969
import { ProvideDynamicFileResponse } from '../razor/src/dynamicFile/provideDynamicFileResponse';
7070
import { ProvideDynamicFileParams } from '../razor/src/dynamicFile/provideDynamicFileParams';
71+
import { registerCopilotExtension } from './copilot';
7172

7273
let _channel: vscode.OutputChannel;
7374
let _traceChannel: vscode.OutputChannel;
@@ -1036,6 +1037,7 @@ export async function activateRoslynLanguageServer(
10361037
);
10371038

10381039
registerLanguageStatusItems(context, languageServer, languageServerEvents);
1040+
await registerCopilotExtension(languageServer, _channel);
10391041

10401042
// Register any commands that need to be handled by the extension.
10411043
registerCommands(context, languageServer, hostExecutableResolver, _channel);

src/lsptoolshost/roslynProtocol.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,16 @@ export interface ProjectNeedsRestoreName {
221221
projectFilePaths: string[];
222222
}
223223

224+
export interface CopilotRelatedDocumentsParams extends lsp.WorkDoneProgressParams, lsp.PartialResultParams {
225+
_vs_textDocument: lsp.TextDocumentIdentifier;
226+
position: lsp.Position;
227+
}
228+
229+
export interface CopilotRelatedDocumentsReport {
230+
_vs_resultId: string | null;
231+
_vs_file_paths: string[] | null;
232+
}
233+
224234
export namespace WorkspaceDebugConfigurationRequest {
225235
export const method = 'workspace/debugConfiguration';
226236
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.clientToServer;
@@ -330,3 +340,15 @@ export namespace ProjectNeedsRestoreRequest {
330340
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.serverToClient;
331341
export const type = new lsp.RequestType<ProjectNeedsRestoreName, void, void>(method);
332342
}
343+
344+
export namespace CopilotRelatedDocumentsRequest {
345+
export const method = 'copilot/_related_documents';
346+
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.clientToServer;
347+
export const type = new lsp.ProtocolRequestType<
348+
CopilotRelatedDocumentsParams,
349+
CopilotRelatedDocumentsReport[],
350+
CopilotRelatedDocumentsReport[],
351+
void,
352+
void
353+
>(method);
354+
}

0 commit comments

Comments
 (0)