From 1543999fa65d8344a4e09a159d3a18d089a2af3a Mon Sep 17 00:00:00 2001 From: "gel@microsoft.com" Date: Tue, 1 Apr 2025 19:08:14 -0700 Subject: [PATCH 1/5] Pass activeExperiments to context providers --- src/lsptoolshost/copilot/contextProviders.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lsptoolshost/copilot/contextProviders.ts b/src/lsptoolshost/copilot/contextProviders.ts index d9394d283d..eebe9d2d11 100644 --- a/src/lsptoolshost/copilot/contextProviders.ts +++ b/src/lsptoolshost/copilot/contextProviders.ts @@ -15,6 +15,8 @@ export const copilotLanguageServerExtensionComponentName = '@microsoft/visualstu export const copilotLanguageServerExtensionAssemblyName = 'Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll'; const copilotLanguageServerExtensionCapabilitiesFileName = 'capabilities.json'; +type ActiveExperiments = { [name: string]: string | number | boolean | string[] }; + export interface DocumentContext { textDocument: lsp.TextDocumentIdentifier; position: lsp.Position; @@ -25,6 +27,7 @@ export interface ContextResolveParam { completionId: string; timeBudget: number; data?: any; + activeExperiments: ActiveExperiments; } const resolveContextMethodName = 'roslyn/resolveContext'; @@ -60,6 +63,8 @@ function createContextResolveParam(request: ResolveRequest): ContextResolveParam }, completionId: request.completionId, timeBudget: request.timeBudget, + data: request.data, + activeExperiments: Object.fromEntries(request.activeExperiments), }; return contextResolveParam; } From 6258606cca221b8cfcada5fc891d4bb79861be8b Mon Sep 17 00:00:00 2001 From: "gel@microsoft.com" Date: Thu, 3 Apr 2025 13:21:35 -0700 Subject: [PATCH 2/5] Support new context resolve handler --- src/lsptoolshost/copilot/contextProviders.ts | 60 +++++++++++++------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/lsptoolshost/copilot/contextProviders.ts b/src/lsptoolshost/copilot/contextProviders.ts index eebe9d2d11..403576ec0c 100644 --- a/src/lsptoolshost/copilot/contextProviders.ts +++ b/src/lsptoolshost/copilot/contextProviders.ts @@ -30,10 +30,16 @@ export interface ContextResolveParam { activeExperiments: ActiveExperiments; } -const resolveContextMethodName = 'roslyn/resolveContext'; -const resolveContextMethodSupportedVersion = '1'; -const resolveContextRequest = new lsp.RequestType( - resolveContextMethodName, +const oldResolveContextMethodName = 'roslyn/resolveContext'; +const oldresolveContextMethodSupportedVersion = '1'; +const newResolveContextMethodName = 'roslyn/resolveContext@2'; +const newResolveContextMethodSupportedVersion = '1'; +const oldResolveContextRequest = new lsp.RequestType( + oldResolveContextMethodName, + lsp.ParameterStructures.auto +); +const newResolveContextRequest = new lsp.RequestType( + newResolveContextMethodName, lsp.ParameterStructures.auto ); @@ -82,7 +88,8 @@ export function registerCopilotContextProviders( devkit.activate().then(async (devKitExports) => { try { // Check if the Copilot Language Server extension is installed and has the correct capabilities - let hasCapabilities = false; + // 0 means not support, 1 means old version, 2 means new version + let hasCapabilities = 0; const copilotServerExtensionfolder = devKitExports.components[copilotLanguageServerExtensionComponentName]; if (copilotServerExtensionfolder) { const capabilitiesFilePath = path.join( @@ -90,18 +97,26 @@ export function registerCopilotContextProviders( copilotLanguageServerExtensionCapabilitiesFileName ); const capabilitiesContent = await readJsonSync(capabilitiesFilePath); - if ( - capabilitiesContent?.capabilities?.find( - (capability: any) => - capability?.method === resolveContextMethodName && - capability?.version === resolveContextMethodSupportedVersion - ) - ) { - hasCapabilities = true; + for (const capability of capabilitiesContent?.capabilities ?? []) { + if ( + capability.method === oldResolveContextMethodName && + capability.version === oldresolveContextMethodSupportedVersion + ) { + hasCapabilities = 1; + channel.debug(`supported 'roslyn/resolveContext' method found in capabilities.json`); + break; + } else if ( + capability.method === newResolveContextMethodName && + capability.version === newResolveContextMethodSupportedVersion + ) { + hasCapabilities = 2; + channel.debug(`supported 'roslyn/resolveContext@2' method found in capabilities.json`); + break; + } } } - if (!hasCapabilities) { + if (hasCapabilities === 0) { channel.debug( `Failed to find compatible version of context provider from installed version of ${csharpDevkitExtensionId}.` ); @@ -136,11 +151,18 @@ export function registerCopilotContextProviders( if (!contextResolveParam) { return []; } - const items = await languageServer.sendRequest( - resolveContextRequest, - contextResolveParam, - token - ); + const items = + hasCapabilities === 1 + ? await languageServer.sendRequest( + oldResolveContextRequest, + contextResolveParam, + token + ) + : await languageServer.sendRequest( + newResolveContextRequest, + contextResolveParam, + token + ); channel.trace(`Copilot context provider resolved ${items.length} items`); return items; }, From 8bb8dbb45c0e2fc873ad1b1843ee75b2d85d2958 Mon Sep 17 00:00:00 2001 From: akhera99 Date: Mon, 14 Apr 2025 13:30:29 -0700 Subject: [PATCH 3/5] update roslyn version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a562c12386..645bd9a875 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ } }, "defaults": { - "roslyn": "4.14.0-3.25178.1", + "roslyn": "5.0.0-1.25214.2", "omniSharp": "1.39.12", "razor": "9.0.0-preview.25177.4", "razorOmnisharp": "7.0.0-preview.23363.1", From c8bffe8b9d82d73aa77edb1b327bfeb8a8a3be46 Mon Sep 17 00:00:00 2001 From: akhera99 Date: Tue, 15 Apr 2025 10:28:14 -0700 Subject: [PATCH 4/5] fix tests --- package-lock.json | 4 ++-- package.json | 2 +- .../documentSymbolProvider.integration.test.ts | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index e8f8755507..da8b069d7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "csharp", - "version": "42.42.42-placeholder", + "version": "0.0.0-placeholder", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "csharp", - "version": "42.42.42-placeholder", + "version": "0.0.0-placeholder", "license": "SEE LICENSE IN RuntimeLicenses/license.txt", "dependencies": { "@github/copilot-language-server": "1.290.0", diff --git a/package.json b/package.json index 645bd9a875..07ff5902da 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "csharp", "publisher": "ms-dotnettools", - "version": "42.42.42-placeholder", + "version": "0.0.0-placeholder", "description": "Base language support for C#", "displayName": "C#", "author": "Microsoft Corporation", diff --git a/test/lsptoolshost/integrationTests/documentSymbolProvider.integration.test.ts b/test/lsptoolshost/integrationTests/documentSymbolProvider.integration.test.ts index 9e489bed97..3d0342f08b 100644 --- a/test/lsptoolshost/integrationTests/documentSymbolProvider.integration.test.ts +++ b/test/lsptoolshost/integrationTests/documentSymbolProvider.integration.test.ts @@ -50,11 +50,11 @@ describe(`Document Symbol Tests`, () => { expect(symbols[0].children[0].kind).toBe(vscode.SymbolKind.Field); // Finalize - expect(symbols[0].children[3].name).toBe('Finalize'); + expect(symbols[0].children[3].name).toBe('~C'); expect(symbols[0].children[3].kind).toBe(vscode.SymbolKind.Method); // Ctor - expect(symbols[0].children[4].name).toBe('.ctor'); + expect(symbols[0].children[4].name).toBe('C'); expect(symbols[0].children[4].kind).toBe(vscode.SymbolKind.Method); // EventHandler E1 @@ -62,17 +62,17 @@ describe(`Document Symbol Tests`, () => { expect(symbols[0].children[5].kind).toBe(vscode.SymbolKind.Event); // explicit operator int(C c1) - expect(symbols[0].children[11].name).toBe('op_Explicit'); + expect(symbols[0].children[11].name).toBe('explicit operator Int32'); expect(symbols[0].children[11].detail).toBe('explicit operator int(C c1)'); expect(symbols[0].children[11].kind).toBe(vscode.SymbolKind.Operator); // implicit operator int(C c1) - expect(symbols[0].children[12].name).toBe('op_Implicit'); + expect(symbols[0].children[12].name).toBe('implicit operator C'); expect(symbols[0].children[12].detail).toBe('implicit operator C(int i)'); expect(symbols[0].children[12].kind).toBe(vscode.SymbolKind.Operator); // implicit operator int(C c1) - expect(symbols[0].children[12].name).toBe('op_Implicit'); + expect(symbols[0].children[12].name).toBe('implicit operator C'); expect(symbols[0].children[12].detail).toBe('implicit operator C(int i)'); expect(symbols[0].children[12].kind).toBe(vscode.SymbolKind.Operator); @@ -82,7 +82,7 @@ describe(`Document Symbol Tests`, () => { expect(symbols[0].children[13].kind).toBe(vscode.SymbolKind.Method); // operator != - expect(symbols[0].children[14].name).toBe('op_Inequality'); + expect(symbols[0].children[14].name).toBe('operator !='); expect(symbols[0].children[14].detail).toBe('operator !=(C c1, int i)'); expect(symbols[0].children[14].kind).toBe(vscode.SymbolKind.Operator); From 05758b9850c0732aca15953e01a2ee3984cb2c5a Mon Sep 17 00:00:00 2001 From: akhera99 Date: Tue, 15 Apr 2025 14:33:34 -0700 Subject: [PATCH 5/5] fix random version changes --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index da8b069d7f..e8f8755507 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "csharp", - "version": "0.0.0-placeholder", + "version": "42.42.42-placeholder", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "csharp", - "version": "0.0.0-placeholder", + "version": "42.42.42-placeholder", "license": "SEE LICENSE IN RuntimeLicenses/license.txt", "dependencies": { "@github/copilot-language-server": "1.290.0", diff --git a/package.json b/package.json index 4dfb42e3f1..22fe669a80 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "csharp", "publisher": "ms-dotnettools", - "version": "0.0.0-placeholder", + "version": "42.42.42-placeholder", "description": "Base language support for C#", "displayName": "C#", "author": "Microsoft Corporation",