@@ -7,7 +7,13 @@ import * as vscode from 'vscode';
7
7
import * as lsp from 'vscode-languageserver-protocol' ;
8
8
import { RoslynLanguageServer } from '../server/roslynLanguageServer' ;
9
9
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' ;
11
17
12
18
export interface DocumentContext {
13
19
textDocument : lsp . TextDocumentIdentifier ;
@@ -63,30 +69,54 @@ export function registerCopilotContextProviders(
63
69
languageServer : RoslynLanguageServer ,
64
70
channel : vscode . LogOutputChannel
65
71
) {
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 ) {
71
74
return ;
72
75
}
73
76
74
- copilotApi . activate ( ) . then ( async ( api ) => {
77
+ devkit . activate ( ) . then ( async ( devKitExports ) => {
75
78
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
+ }
77
98
78
- if ( ! contextProviderApi ) {
99
+ if ( ! hasCapabilities ) {
79
100
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 } .`
81
102
) ;
82
103
return ;
83
104
}
84
105
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 ) {
88
108
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.'
90
120
) ;
91
121
return ;
92
122
}
@@ -101,12 +131,13 @@ export function registerCopilotContextProviders(
101
131
if ( ! contextResolveParam ) {
102
132
return [ ] ;
103
133
}
104
- const traits = await languageServer . sendRequest (
134
+ const items = await languageServer . sendRequest (
105
135
resolveContextRequest ,
106
136
contextResolveParam ,
107
137
token
108
138
) ;
109
- return traits ;
139
+ channel . trace ( `Copilot context provider resolved ${ items . length } items` ) ;
140
+ return items ;
110
141
} ,
111
142
} ,
112
143
} )
0 commit comments