Skip to content

Commit e40d32b

Browse files
committed
Fix
1 parent a019e93 commit e40d32b

File tree

3 files changed

+55
-20
lines changed

3 files changed

+55
-20
lines changed

src/lsptoolshost/copilot/contextProviders.ts

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import * as vscode from 'vscode';
77
import * as lsp from 'vscode-languageserver-protocol';
88
import { RoslynLanguageServer } from '../server/roslynLanguageServer';
99
import { CSharpExtensionId } from '../../constants/csharpExtensionId';
10-
import { getCSharpDevKit } from '../../utils/getCSharpDevKit';
10+
import { csharpDevkitExtensionId, getCSharpDevKit } from '../../utils/getCSharpDevKit';
11+
import path from 'path';
12+
import { readJsonSync } from 'fs-extra';
13+
14+
export const copilotLanguageServerExtensionComponentName = '@microsoft/visualstudio.copilot.roslyn.languageserver';
15+
export const copilotLanguageServerExtensionAssemblyName = 'Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll';
16+
const copilotLanguageServerExtensionCapabilitiesFileName = 'capabilities.json';
1117

1218
export interface DocumentContext {
1319
textDocument: lsp.TextDocumentIdentifier;
@@ -63,30 +69,54 @@ export function registerCopilotContextProviders(
6369
languageServer: RoslynLanguageServer,
6470
channel: vscode.LogOutputChannel
6571
) {
66-
const copilotApi = vscode.extensions.getExtension<CopilotApi>('github.copilot');
67-
if (!copilotApi) {
68-
channel.debug(
69-
'Failed to find comnpatible version of GitHub Copilot extension installed. Skip registeration of Copilot context provider.'
70-
);
72+
const devkit = getCSharpDevKit();
73+
if (!devkit) {
7174
return;
7275
}
7376

74-
copilotApi.activate().then(async (api) => {
77+
devkit.activate().then(async (devKitExports) => {
7578
try {
76-
const contextProviderApi = await api.getContextProviderAPI('v1');
79+
// Check if the Copilot Language Server extension is installed and has the correct capabilities
80+
let hasCapabilities = false;
81+
const copilotServerExtensionfolder = devKitExports.components[copilotLanguageServerExtensionComponentName];
82+
if (copilotServerExtensionfolder) {
83+
const capabilitiesFilePath = path.join(
84+
copilotServerExtensionfolder,
85+
copilotLanguageServerExtensionCapabilitiesFileName
86+
);
87+
const capabilitiesContent = await readJsonSync(capabilitiesFilePath);
88+
if (
89+
capabilitiesContent?.capabilities?.find(
90+
(capability: any) =>
91+
capability?.method === resolveContextMethodName &&
92+
capability?.version === resolveContextMethodSupportedVersion
93+
)
94+
) {
95+
hasCapabilities = true;
96+
}
97+
}
7798

78-
if (!contextProviderApi) {
99+
if (!hasCapabilities) {
79100
channel.debug(
80-
'Incompatible GitHub Copilot extension installed. Skip registeration of C# context providers.'
101+
`Failed to find compatible version of context provider from installed version of ${csharpDevkitExtensionId}.`
81102
);
82103
return;
83104
}
84105

85-
const devkitExports = await getCSharpDevKit()?.activate();
86-
const contextResolveVersion = devkitExports?.copilotCapabilities?.get(resolveContextMethodName);
87-
if (contextResolveVersion === undefined || contextResolveVersion !== resolveContextMethodSupportedVersion) {
106+
const copilotApi = vscode.extensions.getExtension<CopilotApi>('github.copilot');
107+
if (!copilotApi) {
88108
channel.debug(
89-
'Unsupported resolveContext method version. Skip registration of Copilot context provider.'
109+
'Failed to find compatible version of GitHub Copilot extension installed. Skip registeration of Copilot context provider.'
110+
);
111+
return;
112+
}
113+
114+
const api = await copilotApi.activate();
115+
const contextProviderApi = await api.getContextProviderAPI('v1');
116+
117+
if (!contextProviderApi) {
118+
channel.debug(
119+
'Incompatible GitHub Copilot extension installed. Skip registeration of C# context providers.'
90120
);
91121
return;
92122
}
@@ -101,12 +131,13 @@ export function registerCopilotContextProviders(
101131
if (!contextResolveParam) {
102132
return [];
103133
}
104-
const traits = await languageServer.sendRequest(
134+
const items = await languageServer.sendRequest(
105135
resolveContextRequest,
106136
contextResolveParam,
107137
token
108138
);
109-
return traits;
139+
channel.trace(`Copilot context provider resolved ${items.length} items`);
140+
return items;
110141
},
111142
},
112143
})

src/lsptoolshost/copilot/relatedFilesProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export function registerCopilotRelatedFilesProvider(
9292
channel.appendLine(e.message);
9393
}
9494
}
95+
channel.trace(`Copilot related files provider returned ${relatedFiles.length} items`);
9596
return { entries: relatedFiles };
9697
})
9798
);

src/lsptoolshost/server/roslynLanguageServer.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ import { getProfilingEnvVars } from '../profiling/profiling';
6767
import { isString } from '../utils/isString';
6868
import { getServerPath } from '../activate';
6969
import { UriConverter } from '../utils/uriConverter';
70+
import {
71+
copilotLanguageServerExtensionAssemblyName,
72+
copilotLanguageServerExtensionComponentName,
73+
} from '../copilot/contextProviders';
7074

7175
// Flag indicating if C# Devkit was installed the last time we activated.
7276
// Used to determine if we need to restart the server on extension changes.
@@ -1028,16 +1032,15 @@ export class RoslynLanguageServer {
10281032
await exports.setupTelemetryEnvironmentAsync(env);
10291033
}
10301034

1031-
const copilotServerExtensionfolder =
1032-
exports.components['@microsoft/visualstudio.copilot.roslyn.languageserver'];
1035+
const copilotServerExtensionfolder = exports.components[copilotLanguageServerExtensionComponentName];
10331036
if (copilotServerExtensionfolder) {
10341037
const copilotServerExtensionFullPath = path.join(
10351038
copilotServerExtensionfolder,
1036-
'Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll'
1039+
copilotLanguageServerExtensionAssemblyName
10371040
);
10381041
additionalExtensionPaths.push(copilotServerExtensionFullPath);
10391042
channel.trace(
1040-
`CSharp DevKit contributes csharpCopilotExtensionLoadPath: ${copilotServerExtensionFullPath}`
1043+
`CSharp DevKit contributes Copilot langauge server extension: ${copilotServerExtensionFullPath}`
10411044
);
10421045
}
10431046
}

0 commit comments

Comments
 (0)