@@ -7,7 +7,13 @@ import * as vscode from 'vscode';
77import * as lsp from 'vscode-languageserver-protocol' ;
88import { RoslynLanguageServer } from '../server/roslynLanguageServer' ;
99import { 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
1218export 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 } )
0 commit comments