@@ -15,6 +15,8 @@ export const copilotLanguageServerExtensionComponentName = '@microsoft/visualstu
1515export const copilotLanguageServerExtensionAssemblyName = 'Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll' ;
1616const copilotLanguageServerExtensionCapabilitiesFileName = 'capabilities.json' ;
1717
18+ type ActiveExperiments = { [ name : string ] : string | number | boolean | string [ ] } ;
19+
1820export interface DocumentContext {
1921 textDocument : lsp . TextDocumentIdentifier ;
2022 position : lsp . Position ;
@@ -25,12 +27,19 @@ export interface ContextResolveParam {
2527 completionId : string ;
2628 timeBudget : number ;
2729 data ?: any ;
30+ activeExperiments : ActiveExperiments ;
2831}
2932
30- const resolveContextMethodName = 'roslyn/resolveContext' ;
31- const resolveContextMethodSupportedVersion = '1' ;
32- const resolveContextRequest = new lsp . RequestType < ContextResolveParam , SupportedContextItem [ ] , void > (
33- resolveContextMethodName ,
33+ const oldResolveContextMethodName = 'roslyn/resolveContext' ;
34+ const oldresolveContextMethodSupportedVersion = '1' ;
35+ const newResolveContextMethodName = 'roslyn/resolveContext@2' ;
36+ const newResolveContextMethodSupportedVersion = '1' ;
37+ const oldResolveContextRequest = new lsp . RequestType < ContextResolveParam , SupportedContextItem [ ] , void > (
38+ oldResolveContextMethodName ,
39+ lsp . ParameterStructures . auto
40+ ) ;
41+ const newResolveContextRequest = new lsp . RequestType < ContextResolveParam , SupportedContextItem [ ] , void > (
42+ newResolveContextMethodName ,
3443 lsp . ParameterStructures . auto
3544) ;
3645
@@ -60,6 +69,8 @@ function createContextResolveParam(request: ResolveRequest): ContextResolveParam
6069 } ,
6170 completionId : request . completionId ,
6271 timeBudget : request . timeBudget ,
72+ data : request . data ,
73+ activeExperiments : Object . fromEntries ( request . activeExperiments ) ,
6374 } ;
6475 return contextResolveParam ;
6576}
@@ -76,27 +87,35 @@ export function registerCopilotContextProviders(
7687
7788 devkit . activate ( ) . then ( async ( devKitExports ) => {
7889 try {
79- // Check if the Copilot Language Server extension is installed and has the correct capabilities
80- let hasCapabilities = false ;
90+ let resolveMethod : lsp . RequestType < ContextResolveParam , SupportedContextItem [ ] , void > | undefined =
91+ undefined ;
8192 const copilotServerExtensionfolder = devKitExports . components [ copilotLanguageServerExtensionComponentName ] ;
8293 if ( copilotServerExtensionfolder ) {
8394 const capabilitiesFilePath = path . join (
8495 copilotServerExtensionfolder ,
8596 copilotLanguageServerExtensionCapabilitiesFileName
8697 ) ;
8798 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 ;
99+ for ( const capability of capabilitiesContent ?. capabilities ?? [ ] ) {
100+ if (
101+ capability . method === oldResolveContextMethodName &&
102+ capability . version === oldresolveContextMethodSupportedVersion
103+ ) {
104+ resolveMethod = oldResolveContextRequest ;
105+ channel . debug ( `supported 'roslyn/resolveContext' method found in capabilities.json` ) ;
106+ break ;
107+ } else if (
108+ capability . method === newResolveContextMethodName &&
109+ capability . version === newResolveContextMethodSupportedVersion
110+ ) {
111+ resolveMethod = newResolveContextRequest ;
112+ channel . debug ( `supported 'roslyn/resolveContext@2' method found in capabilities.json` ) ;
113+ break ;
114+ }
96115 }
97116 }
98117
99- if ( ! hasCapabilities ) {
118+ if ( ! resolveMethod ) {
100119 channel . debug (
101120 `Failed to find compatible version of context provider from installed version of ${ csharpDevkitExtensionId } .`
102121 ) ;
@@ -131,11 +150,7 @@ export function registerCopilotContextProviders(
131150 if ( ! contextResolveParam ) {
132151 return [ ] ;
133152 }
134- const items = await languageServer . sendRequest (
135- resolveContextRequest ,
136- contextResolveParam ,
137- token
138- ) ;
153+ const items = await languageServer . sendRequest ( resolveMethod , contextResolveParam , token ) ;
139154 channel . trace ( `Copilot context provider resolved ${ items . length } items` ) ;
140155 return items ;
141156 } ,
0 commit comments