From e7240568dde004d05cb0cdc214fc906fc409973d Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 1 Sep 2026 17:17:45 -0700 Subject: [PATCH 1/2] Restore custom configuration provider checks --- Extension/src/LanguageServer/client.ts | 17 ++++++++++++- .../tests/languageServer.integration.test.ts | 24 ++++++++++++++----- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 67836f6f3..a74378064 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -2304,9 +2304,24 @@ export class DefaultClient implements Client { // Wrap the provider lookup in a single task, so we can apply a timeout to the entire duration. const provideConfigurationAsync: () => Thenable = async () => { + const supportedUris: vscode.Uri[] = []; + for (const uri of docUris) { + try { + if (!await provider.canProvideConfiguration(uri, tokenSource.token)) { + continue; + } + } catch { + console.warn("Caught exception from canProvideConfiguration"); + } + supportedUris.push(uri); + } + if (supportedUris.length === 0) { + return []; + } + let configs: util.Mutable[] = []; try { - configs = await provider.provideConfigurations(docUris, tokenSource.token); + configs = await provider.provideConfigurations(supportedUris, tokenSource.token); } catch { console.warn("Caught exception from provideConfigurations"); } diff --git a/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts index dff580139..e63e322ad 100644 --- a/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts +++ b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts @@ -133,6 +133,8 @@ async function changeCppProperties(cppProperties: config.ConfigurationJson, _dis suite("extensibility tests v3", function(): void { let cpptools: apit.CppToolsTestApi; let lastResult: api.SourceFileConfigurationItem[]; + let configurationProvidedBeforeCanProvide: boolean = false; + const supportedUris: Set = new Set(); const defaultConfig: api.SourceFileConfiguration = { includePath: [ "${workspaceFolder}", "/v3/folder" ], defines: [ "${workspaceFolder}" ], @@ -156,14 +158,19 @@ suite("extensibility tests v3", function(): void { const provider: api.CustomConfigurationProvider = { name: "cpptoolsTest-v3", extensionId: "ms-vscode.cpptools-test3", - canProvideConfiguration(_document: vscode.Uri): Thenable { + canProvideConfiguration(document: vscode.Uri): Thenable { + supportedUris.add(document.toString()); return Promise.resolve(true); }, provideConfigurations(uris: vscode.Uri[]): Thenable { const result: api.SourceFileConfigurationItem[] = []; uris.forEach(uri => { + const uriString: string = uri.toString(); + if (!supportedUris.has(uriString)) { + configurationProvidedBeforeCanProvide = true; + } result.push({ - uri: uri.toString(), + uri: uriString, configuration: defaultConfig }); }); @@ -220,10 +227,15 @@ suite("extensibility tests v3", function(): void { disposables.push(testHook.IntelliSenseStatusChanged(result => { result = result as apit.IntelliSenseStatus; if (result.filename === "main3.cpp" && result.status === apit.Status.IntelliSenseReady) { - const expected: api.SourceFileConfigurationItem[] = [ {uri: uri.toString(), configuration: defaultConfig} ]; - assert.deepEqual(lastResult, expected); - assert.deepEqual(lastBrowseResult, defaultFolderBrowseConfig); - resolve(); + try { + const expected: api.SourceFileConfigurationItem[] = [ {uri: uri.toString(), configuration: defaultConfig} ]; + assert.strictEqual(configurationProvidedBeforeCanProvide, false); + assert.deepEqual(lastResult, expected); + assert.deepEqual(lastBrowseResult, defaultFolderBrowseConfig); + resolve(); + } catch (error) { + reject(error); + } } })); setTimeout(() => { reject(new Error("timeout")); }, testHelpers.defaultTimeout); From 910bee689232dfbe5ccfed2592af500b0342d376 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 1 Sep 2026 19:00:16 -0700 Subject: [PATCH 2/2] Run custom provider regression test in CI --- .github/workflows/job-compile-and-test.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/job-compile-and-test.yml b/.github/workflows/job-compile-and-test.yml index bfab33592..0ccd4b3b4 100644 --- a/.github/workflows/job-compile-and-test.yml +++ b/.github/workflows/job-compile-and-test.yml @@ -97,6 +97,11 @@ jobs: run: yarn test --scenario=SingleRootProject working-directory: Extension + - name: Run SimpleCppProject tests (Windows) + if: ${{ inputs.platform == 'windows' }} + run: yarn test --scenario=SimpleCppProject + working-directory: Extension + - name: Run E2E IntelliSense features tests (Windows) if: ${{ inputs.platform == 'windows' }} run: yarn test --scenario=MultirootDeadlockTest @@ -117,6 +122,13 @@ jobs: run: yarn test --scenario=SingleRootProject working-directory: Extension + - name: Run SimpleCppProject tests (linux/macOS) + if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }} + uses: coactions/setup-xvfb@b6b4fcfb9f5a895edadc3bc76318fae0ac17c8b3 # v1.0.1 + with: + run: yarn test --scenario=SimpleCppProject + working-directory: Extension + - name: Run E2E IntelliSense features tests (linux/macOS) if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }} uses: coactions/setup-xvfb@b6b4fcfb9f5a895edadc3bc76318fae0ac17c8b3 # v1.0.1