Skip to content

Commit 9d10433

Browse files
authored
Merge pull request #7578 from genlu/relatedFiles
Register Copilot `relatedFilesProvider` for C#
2 parents 236f229 + abd21b3 commit 9d10433

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

src/lsptoolshost/copilot.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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+
import { languageServerOptions } from '../shared/options';
13+
14+
interface CopilotRelatedFilesProviderRegistration {
15+
registerRelatedFilesProvider(
16+
providerId: { extensionId: string; languageId: string },
17+
callback: (uri: vscode.Uri) => Promise<{ entries: vscode.Uri[]; traits?: { name: string; value: string }[] }>
18+
): void;
19+
}
20+
21+
export async function registerCopilotExtensionAsync(
22+
languageServer: RoslynLanguageServer,
23+
channel: vscode.OutputChannel
24+
) {
25+
const isTraceLogLevel =
26+
languageServerOptions.logLevel &&
27+
(languageServerOptions.logLevel === 'Trace' || languageServerOptions.logLevel === 'Debug');
28+
29+
const ext = vscode.extensions.getExtension('github.copilot');
30+
if (!ext) {
31+
if (isTraceLogLevel) {
32+
channel.appendLine(
33+
'GitHub Copilot extension not installed. Skip registeration of C# related files provider.'
34+
);
35+
}
36+
return;
37+
}
38+
await ext.activate();
39+
const relatedAPI = ext.exports as CopilotRelatedFilesProviderRegistration | undefined;
40+
if (!relatedAPI) {
41+
if (isTraceLogLevel) {
42+
channel.appendLine(
43+
'Incompatible GitHub Copilot extension installed. Skip registeration of C# related files provider.'
44+
);
45+
}
46+
return;
47+
}
48+
49+
if (isTraceLogLevel) {
50+
channel.appendLine('registeration of C# related files provider for GitHub Copilot extension succeeded.');
51+
}
52+
53+
const id = {
54+
extensionId: CSharpExtensionId,
55+
languageId: 'csharp',
56+
};
57+
58+
relatedAPI.registerRelatedFilesProvider(id, async (uri) => {
59+
const buildResult = (reports: CopilotRelatedDocumentsReport[], builder?: vscode.Uri[]) => {
60+
if (reports) {
61+
for (const report of reports) {
62+
if (report._vs_file_paths) {
63+
for (const filePath of report._vs_file_paths) {
64+
builder?.push(vscode.Uri.file(filePath));
65+
}
66+
}
67+
}
68+
}
69+
};
70+
const relatedFiles: vscode.Uri[] = [];
71+
const uriString = UriConverter.serialize(uri);
72+
const textDocument = TextDocumentIdentifier.create(uriString);
73+
try {
74+
await languageServer.sendRequestWithProgress(
75+
CopilotRelatedDocumentsRequest.type,
76+
{
77+
_vs_textDocument: textDocument,
78+
position: {
79+
line: 0,
80+
character: 0,
81+
},
82+
},
83+
async (r) => buildResult(r, relatedFiles)
84+
);
85+
} catch (e) {
86+
if (e instanceof Error) {
87+
channel.appendLine(e.message);
88+
}
89+
}
90+
return { entries: relatedFiles };
91+
});
92+
}

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 { registerCopilotExtensionAsync } 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 registerCopilotExtensionAsync(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: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,15 @@ 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_file_paths?: string[];
231+
}
232+
224233
export namespace WorkspaceDebugConfigurationRequest {
225234
export const method = 'workspace/debugConfiguration';
226235
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.clientToServer;
@@ -330,3 +339,15 @@ export namespace ProjectNeedsRestoreRequest {
330339
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.serverToClient;
331340
export const type = new lsp.RequestType<ProjectNeedsRestoreName, void, void>(method);
332341
}
342+
343+
export namespace CopilotRelatedDocumentsRequest {
344+
export const method = 'copilot/_related_documents';
345+
export const messageDirection: lsp.MessageDirection = lsp.MessageDirection.clientToServer;
346+
export const type = new lsp.ProtocolRequestType<
347+
CopilotRelatedDocumentsParams,
348+
CopilotRelatedDocumentsReport[],
349+
CopilotRelatedDocumentsReport[],
350+
void,
351+
void
352+
>(method);
353+
}

0 commit comments

Comments
 (0)