Skip to content

Commit df6ac80

Browse files
authored
[cherry-pick] Support new context resolve handler (#8262)
2 parents ad2c2fe + 82f2af9 commit df6ac80

File tree

1 file changed

+35
-20
lines changed

1 file changed

+35
-20
lines changed

src/lsptoolshost/copilot/contextProviders.ts

+35-20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export const copilotLanguageServerExtensionComponentName = '@microsoft/visualstu
1515
export const copilotLanguageServerExtensionAssemblyName = 'Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll';
1616
const copilotLanguageServerExtensionCapabilitiesFileName = 'capabilities.json';
1717

18+
type ActiveExperiments = { [name: string]: string | number | boolean | string[] };
19+
1820
export 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

Comments
 (0)