@@ -15,6 +15,8 @@ export const copilotLanguageServerExtensionComponentName = '@microsoft/visualstu
15
15
export const copilotLanguageServerExtensionAssemblyName = 'Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll' ;
16
16
const copilotLanguageServerExtensionCapabilitiesFileName = 'capabilities.json' ;
17
17
18
+ type ActiveExperiments = { [ name : string ] : string | number | boolean | string [ ] } ;
19
+
18
20
export interface DocumentContext {
19
21
textDocument : lsp . TextDocumentIdentifier ;
20
22
position : lsp . Position ;
@@ -25,12 +27,19 @@ export interface ContextResolveParam {
25
27
completionId : string ;
26
28
timeBudget : number ;
27
29
data ?: any ;
30
+ activeExperiments : ActiveExperiments ;
28
31
}
29
32
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 ,
34
43
lsp . ParameterStructures . auto
35
44
) ;
36
45
@@ -60,6 +69,8 @@ function createContextResolveParam(request: ResolveRequest): ContextResolveParam
60
69
} ,
61
70
completionId : request . completionId ,
62
71
timeBudget : request . timeBudget ,
72
+ data : request . data ,
73
+ activeExperiments : Object . fromEntries ( request . activeExperiments ) ,
63
74
} ;
64
75
return contextResolveParam ;
65
76
}
@@ -76,27 +87,35 @@ export function registerCopilotContextProviders(
76
87
77
88
devkit . activate ( ) . then ( async ( devKitExports ) => {
78
89
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 ;
81
92
const copilotServerExtensionfolder = devKitExports . components [ copilotLanguageServerExtensionComponentName ] ;
82
93
if ( copilotServerExtensionfolder ) {
83
94
const capabilitiesFilePath = path . join (
84
95
copilotServerExtensionfolder ,
85
96
copilotLanguageServerExtensionCapabilitiesFileName
86
97
) ;
87
98
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
+ }
96
115
}
97
116
}
98
117
99
- if ( ! hasCapabilities ) {
118
+ if ( ! resolveMethod ) {
100
119
channel . debug (
101
120
`Failed to find compatible version of context provider from installed version of ${ csharpDevkitExtensionId } .`
102
121
) ;
@@ -131,11 +150,7 @@ export function registerCopilotContextProviders(
131
150
if ( ! contextResolveParam ) {
132
151
return [ ] ;
133
152
}
134
- const items = await languageServer . sendRequest (
135
- resolveContextRequest ,
136
- contextResolveParam ,
137
- token
138
- ) ;
153
+ const items = await languageServer . sendRequest ( resolveMethod , contextResolveParam , token ) ;
139
154
channel . trace ( `Copilot context provider resolved ${ items . length } items` ) ;
140
155
return items ;
141
156
} ,
0 commit comments