From 874d32638227e9e438ad9512bc3af5f15c445aca Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:08:48 -0700 Subject: [PATCH 01/29] Use standard LSP notification for telemetry events (#14777) --- Extension/src/LanguageServer/client.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 60b095412..7e817e9b4 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -675,7 +675,6 @@ const RemoveCodeAnalysisProblemsNotification: NotificationType = new NotificationType('cpptools/reloadWindow'); const UpdateTrustedCompilersNotification: NotificationType = new NotificationType('cpptools/updateTrustedCompilersList'); -const LogTelemetryNotification: NotificationType = new NotificationType('cpptools/logTelemetry'); const ReportTagParseStatusNotification: NotificationType = new NotificationType('cpptools/reportTagParseStatus'); const ReportStatusNotification: NotificationType = new NotificationType('cpptools/reportStatus'); const DebugProtocolNotification: NotificationType = new NotificationType('cpptools/debugProtocol'); @@ -1825,7 +1824,7 @@ export class DefaultClient implements Client { const client = new rpc.LanguageClient(`cpptools`, serverOptions, clientOptions); client.onNotification(DebugProtocolNotification, logDebugProtocol); client.onNotification(DebugLogNotification, logLocalized); - client.onNotification(LogTelemetryNotification, (e) => void this.logTelemetry(e)); + client.onTelemetry((e: TelemetryPayload) => void this.logTelemetry(e)); client.onNotification(ShowMessageWindowNotification, showMessageWindow); client.registerProposedFeatures(); await client.start(); From 47188f56081efd07a67112a2cc1ccc0740070716 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:55:51 -0700 Subject: [PATCH 02/29] Fix issue with extension failing to load on arm64 Linux (#14782) --- Extension/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/src/main.ts b/Extension/src/main.ts index 45c1ef903..e26bb75c0 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -212,7 +212,7 @@ async function makeBinariesExecutable(): Promise { ]; oldMacBinaries.forEach(binary => promises.push(util.allowExecution(util.getExtensionFilePath(binary)))); } - } else if (os.arch() === "x64") { + } else { promises.push(util.allowExecution(util.getExtensionFilePath("./bin/libc.so"))); } } From a9b5a73eac7866d78f0c7923a089533ffe637791 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Thu, 17 Sep 2026 13:29:41 -0700 Subject: [PATCH 03/29] Update Actions tooling to ESLint 10.10.0 (#14780) --- .github/actions/AddComment/AddComment.ts | 2 +- .github/actions/AddComment/index.js | 2 +- .github/actions/AddComment/index.ts | 2 +- .github/actions/Locker/Locker.ts | 5 +- .github/actions/Locker/index.js | 2 +- .github/actions/Locker/index.ts | 2 +- .github/actions/Reopener/Reopener.ts | 9 +- .github/actions/Reopener/index.js | 2 +- .github/actions/Reopener/index.ts | 4 +- .github/actions/StaleCloser/index.js | 2 +- .github/actions/StaleCloser/index.ts | 2 +- .github/actions/api/octokit.js | 20 +- .github/actions/api/octokit.ts | 2 +- .github/actions/common/Action.js | 2 +- .github/actions/common/Action.ts | 4 +- .github/actions/eslint.config.js | 17 + .github/actions/package-lock.json | 1387 ++++++++++------------ .github/actions/package.json | 17 +- .github/actions/tsconfig.json | 5 +- 19 files changed, 709 insertions(+), 779 deletions(-) create mode 100644 .github/actions/eslint.config.js diff --git a/.github/actions/AddComment/AddComment.ts b/.github/actions/AddComment/AddComment.ts index 9dd36e1bb..e8ffab6af 100644 --- a/.github/actions/AddComment/AddComment.ts +++ b/.github/actions/AddComment/AddComment.ts @@ -5,7 +5,7 @@ import { GitHub } from '../api/api'; import { ActionBase } from '../common/ActionBase'; -import { daysAgoToHumanReadbleDate, daysAgoToTimestamp, safeLog } from '../common/utils'; +import { daysAgoToHumanReadbleDate, safeLog } from '../common/utils'; export class AddComment extends ActionBase { constructor( diff --git a/.github/actions/AddComment/index.js b/.github/actions/AddComment/index.js index e538e9e8a..266e7bec7 100644 --- a/.github/actions/AddComment/index.js +++ b/.github/actions/AddComment/index.js @@ -16,5 +16,5 @@ class AddCommentAction extends Action_1.Action { await new AddComment_1.AddComment(github, (0, utils_1.getInput)('createdAfter') || undefined, +((0, utils_1.getInput)('afterDays') || 0), (0, utils_1.getRequiredInput)('labels'), (0, utils_1.getInput)('addComment') || '', (0, utils_1.getInput)('addLabels') || undefined, (0, utils_1.getInput)('removeLabels') || undefined, (0, utils_1.getInput)('setMilestoneId') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999), (0, utils_1.getInput)('involves') || undefined).run(); } } -new AddCommentAction().run(); // eslint-disable-line +new AddCommentAction().run(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/.github/actions/AddComment/index.ts b/.github/actions/AddComment/index.ts index 6f7841584..c629a8ef9 100644 --- a/.github/actions/AddComment/index.ts +++ b/.github/actions/AddComment/index.ts @@ -33,4 +33,4 @@ class AddCommentAction extends Action { } } -new AddCommentAction().run(); // eslint-disable-line \ No newline at end of file +new AddCommentAction().run(); \ No newline at end of file diff --git a/.github/actions/Locker/Locker.ts b/.github/actions/Locker/Locker.ts index e205006e5..a47aaca92 100644 --- a/.github/actions/Locker/Locker.ts +++ b/.github/actions/Locker/Locker.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { GitHub, Issue } from '../api/api'; +import { GitHub } from '../api/api'; import { daysAgoToHumanReadbleDate, safeLog } from '../common/utils'; import { ActionBase } from '../common/ActionBase'; @@ -20,8 +20,7 @@ export class Locker extends ActionBase { ignoreMilestoneIds?: string, minimumVotes?: number, maximumVotes?: number - ) - { + ) { super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes); } diff --git a/.github/actions/Locker/index.js b/.github/actions/Locker/index.js index 6c6781833..d6a1a18d7 100644 --- a/.github/actions/Locker/index.js +++ b/.github/actions/Locker/index.js @@ -16,5 +16,5 @@ class LockerAction extends Action_1.Action { await new Locker_1.Locker(github, +(0, utils_1.getRequiredInput)('daysSinceClose'), +(0, utils_1.getRequiredInput)('daysSinceUpdate'), (0, utils_1.getInput)('labels') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999)).run(); } } -new LockerAction().run(); // eslint-disable-line +new LockerAction().run(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/.github/actions/Locker/index.ts b/.github/actions/Locker/index.ts index e238bfa47..b53bc90aa 100644 --- a/.github/actions/Locker/index.ts +++ b/.github/actions/Locker/index.ts @@ -28,4 +28,4 @@ class LockerAction extends Action { } } -new LockerAction().run(); // eslint-disable-line +new LockerAction().run(); diff --git a/.github/actions/Reopener/Reopener.ts b/.github/actions/Reopener/Reopener.ts index ac1f7caee..edc84fb33 100644 --- a/.github/actions/Reopener/Reopener.ts +++ b/.github/actions/Reopener/Reopener.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See LICENSE in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { GitHub, Issue } from '../api/api'; -import { daysAgoToHumanReadbleDate, safeLog } from '../common/utils'; +import { GitHub } from '../api/api'; +import { safeLog } from '../common/utils'; import { ActionBase } from '../common/ActionBase'; export class Reopener extends ActionBase { @@ -23,8 +23,7 @@ export class Reopener extends ActionBase { ignoreMilestoneIds?: string, minimumVotes?: number, maximumVotes?: number - ) - { + ) { super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes); } @@ -34,7 +33,7 @@ export class Reopener extends ActionBase { safeLog(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`); - const query = this.buildQuery((this.alsoApplyToOpenIssues ? "": "is:closed ") + "is:unlocked"); + const query = this.buildQuery((this.alsoApplyToOpenIssues ? "" : "is:closed ") + "is:unlocked"); for await (const page of this.github.query({ q: query })) { await Promise.all( diff --git a/.github/actions/Reopener/index.js b/.github/actions/Reopener/index.js index 184a9e76f..ff7d6e417 100644 --- a/.github/actions/Reopener/index.js +++ b/.github/actions/Reopener/index.js @@ -17,5 +17,5 @@ class ReopenerAction extends Action_1.Action { await new Reopener_1.Reopener(github, alsoApplyToOpenIssues != undefined && alsoApplyToOpenIssues.toLowerCase() == 'true', (0, utils_1.getInput)('addLabels') || undefined, (0, utils_1.getInput)('removeLabels') || undefined, (0, utils_1.getInput)('reopenComment') || '', (0, utils_1.getInput)('setMilestoneId') || undefined, (0, utils_1.getInput)('labels') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999)).run(); } } -new ReopenerAction().run(); // eslint-disable-line +new ReopenerAction().run(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/.github/actions/Reopener/index.ts b/.github/actions/Reopener/index.ts index f1cb5fffe..55427194b 100644 --- a/.github/actions/Reopener/index.ts +++ b/.github/actions/Reopener/index.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { OctoKit } from '../api/octokit'; -import { getInput, getRequiredInput } from '../common/utils'; +import { getInput } from '../common/utils'; import { Reopener } from './Reopener'; import { Action } from '../common/Action'; @@ -32,4 +32,4 @@ class ReopenerAction extends Action { } } -new ReopenerAction().run(); // eslint-disable-line +new ReopenerAction().run(); diff --git a/.github/actions/StaleCloser/index.js b/.github/actions/StaleCloser/index.js index 65bc3bac9..81c91113e 100644 --- a/.github/actions/StaleCloser/index.js +++ b/.github/actions/StaleCloser/index.js @@ -17,5 +17,5 @@ class StaleCloserAction extends Action_1.Action { await new StaleCloser_1.StaleCloser(github, +(0, utils_1.getRequiredInput)('closeDays'), (0, utils_1.getRequiredInput)('labels'), (0, utils_1.getInput)('closeComment') || '', +((0, utils_1.getInput)('pingDays') || 0), (0, utils_1.getInput)('pingComment') || '', ((_a = (0, utils_1.getInput)('additionalTeam')) !== null && _a !== void 0 ? _a : '').split(','), (0, utils_1.getInput)('addLabels') || undefined, (0, utils_1.getInput)('removeLabels') || undefined, (0, utils_1.getInput)('setMilestoneId') || undefined, (0, utils_1.getInput)('milestoneName') || undefined, (0, utils_1.getInput)('milestoneId') || undefined, (0, utils_1.getInput)('ignoreLabels') || undefined, (0, utils_1.getInput)('ignoreMilestoneNames') || undefined, (0, utils_1.getInput)('ignoreMilestoneIds') || undefined, +((0, utils_1.getInput)('minimumVotes') || 0), +((0, utils_1.getInput)('maximumVotes') || 9999999), (0, utils_1.getInput)('involves') || undefined).run(); } } -new StaleCloserAction().run(); // eslint-disable-line +new StaleCloserAction().run(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/.github/actions/StaleCloser/index.ts b/.github/actions/StaleCloser/index.ts index 70d32adaa..ab1d6e8cd 100644 --- a/.github/actions/StaleCloser/index.ts +++ b/.github/actions/StaleCloser/index.ts @@ -35,4 +35,4 @@ class StaleCloserAction extends Action { } } -new StaleCloserAction().run(); // eslint-disable-line +new StaleCloserAction().run(); diff --git a/.github/actions/api/octokit.js b/.github/actions/api/octokit.js index 3a09fbf28..e8c6ded88 100644 --- a/.github/actions/api/octokit.js +++ b/.github/actions/api/octokit.js @@ -163,7 +163,7 @@ class OctoKit { throw Error('Found directory at config path when expecting file' + JSON.stringify(data)); } catch (e) { - throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e)); + throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e), { cause: e }); } } async releaseContainsCommit(release, commit) { @@ -200,8 +200,8 @@ class OctoKit { const currentDate = new Date(); const possibleMilestones = allMilestones .filter((milestone) => new Date(milestone.due_on === null ? currentDate : milestone.due_on) > currentDate && - currentDate > new Date(milestone.created_at) && - !milestone.title.includes('Recovery')) + currentDate > new Date(milestone.created_at) && + !milestone.title.includes('Recovery')) .sort((a, b) => { var _a, _b; return +new Date((_a = a.due_on) !== null && _a !== void 0 ? _a : currentDate) - +new Date((_b = b.due_on) !== null && _b !== void 0 ? _b : currentDate); }); if (possibleMilestones.length === 0) { return undefined; @@ -255,14 +255,14 @@ class OctoKitIssue extends OctoKit { } await this.octokit.rest.issues .update({ - ...this.params, - issue_number: this.issueData.number, - state: 'closed', - state_reason: reason, - }) + ...this.params, + issue_number: this.issueData.number, + state: 'closed', + state_reason: reason, + }) .catch((e) => { - (0, utils_1.safeLog)('error closing issue:', e); - }); + (0, utils_1.safeLog)('error closing issue:', e); + }); } } async reopenIssue() { diff --git a/.github/actions/api/octokit.ts b/.github/actions/api/octokit.ts index a8bbedc0e..69bfea29d 100644 --- a/.github/actions/api/octokit.ts +++ b/.github/actions/api/octokit.ts @@ -184,7 +184,7 @@ export class OctoKit implements GitHub { } throw Error('Found directory at config path when expecting file' + JSON.stringify(data)); } catch (e) { - throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e)); + throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e), { cause: e }); } } diff --git a/.github/actions/common/Action.js b/.github/actions/common/Action.js index 4e2f9e0ea..de5edb47a 100644 --- a/.github/actions/common/Action.js +++ b/.github/actions/common/Action.js @@ -85,7 +85,7 @@ class Action { (0, utils_1.safeLog)((err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.message) || String(e)); } } - const usage = await (0, utils_1.getRateLimit)(this.token); + await (0, utils_1.getRateLimit)(this.token); } async error(error) { var _a; diff --git a/.github/actions/common/Action.ts b/.github/actions/common/Action.ts index f859eecb5..2d8e7b54e 100644 --- a/.github/actions/common/Action.ts +++ b/.github/actions/common/Action.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { OctoKit, OctoKitIssue, getNumRequests } from '../api/octokit'; +import { OctoKit, OctoKitIssue } from '../api/octokit'; import { context, getOctokit } from '@actions/github'; import { getRequiredInput, logErrorToIssue, getRateLimit, errorLoggingIssue, safeLog } from './utils'; import { getInput, setFailed } from '@actions/core'; @@ -98,7 +98,7 @@ export abstract class Action { } } - const usage = await getRateLimit(this.token); + await getRateLimit(this.token); } private async error(error: Error) { diff --git a/.github/actions/eslint.config.js b/.github/actions/eslint.config.js new file mode 100644 index 000000000..b5bc07d4b --- /dev/null +++ b/.github/actions/eslint.config.js @@ -0,0 +1,17 @@ +const { defineConfig } = require('eslint/config'); +const js = require('@eslint/js'); +const tseslint = require('@typescript-eslint/eslint-plugin'); + +module.exports = defineConfig([ + { + ignores: ['**/*.js'], + }, + { + files: ['**/*.ts'], + extends: [js.configs.recommended, tseslint.configs['flat/recommended']], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + }, + }, +]); \ No newline at end of file diff --git a/.github/actions/package-lock.json b/.github/actions/package-lock.json index 17ef37017..7d8f2ac9c 100644 --- a/.github/actions/package-lock.json +++ b/.github/actions/package-lock.json @@ -17,23 +17,22 @@ }, "devDependencies": { "@azure/storage-blob": "^12.13.0", + "@eslint/js": "^10.0.1", "@types/chai": "^4.3.3", "@types/mocha": "^9.1.1", "@types/uuid": "^8.3.4", "@types/yargs": "^17.0.11", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", + "@typescript-eslint/eslint-plugin": "^8.56.1", + "@typescript-eslint/parser": "^8.56.1", "chai": "^4.3.6", - "eslint": "^8.21.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^10.10.0", "husky": "^8.0.1", "mocha": "^10.0.0", "mongodb": "^4.17.0", "nock": "^13.2.9", "prettier": "2.7.1", "ts-node": "^10.9.1", - "typescript": "^4.7.4", + "typescript": "^4.9.5", "yargs": "^17.5.1" } }, @@ -801,6 +800,29 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser": { + "version": "5.7.2", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha1-/s0LBUxsEy/APauZSkE9p4Hg658=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/@aws/lambda-invoke-store": { "version": "0.2.3", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", @@ -1027,6 +1049,30 @@ "node": ">=20.0.0" } }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha1-cq64sFH21ZfRCshZW5StgwK9Ijk=", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha1-U0yRETqkj+Q7rtsWlVC27gcO8wM=", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1069,53 +1115,167 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha1-OIomnw8lwbatwxe1osVXFIlMcK0=", + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha1-VuhtJDBJGV2KzAwGobPf3D+j3pU=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha1-/ZVrvgt3JB6fFaxdzLHGOAYJaO8=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha1-Ce5KoHtz8FnsLUx0v0sv8CsyI3c=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha1-wdp80bgvqHh/mLVin7gRhIobY84=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha1-3mM9s+wu9qPIni8ZA4Bj6KEi4sI=", + "version": "10.0.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha1-HoqHb1ARevirZ+R9WtlNONZiJYM=", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha1-+5B2JN8yVtBLmqLfUNeql+xkh0g=", + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha1-iOm/TRHSsZwILnjr586IckpesJE=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha1-zHJozDZAWzMe+S2xvDeXHyHWb+E=", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha1-qCcsoDsqz0kmcCIrIyC2xCG/3mA=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha1-j4AMzME/T4zTEW4tnAqUk52j4+0=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha1-8qCfYgEjkLK/8/xvskjd7IwJoJA=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1132,12 +1292,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha1-Siho111taWPkI7z5C3/RvjQ0CdM=", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha1-wrnS43TuYsWG062+qHGZsdenpro=", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", @@ -1167,6 +1334,30 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha1-/IL6g5R+f/aMZ5jQiQfbhCdx7yw=", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha1-DAHdOjSDiCr3zzh41OcdUFyB/Eo=", + "dev": true, + "license": "MIT" + }, "node_modules/@mongodb-js/saslprep": { "version": "1.4.6", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz", @@ -1191,44 +1382,6 @@ ], "license": "MIT" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -2305,6 +2458,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha1-b2Nq+WL75hkbgwvWdrpZhpJrzOw=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha1-lYuRyZGxhnztMYvt6g4hXuBQcm4=", + "dev": true, + "license": "MIT" + }, "node_modules/@types/is-stream": { "version": "1.1.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/is-stream/-/is-stream-1.1.0.tgz", @@ -2343,13 +2510,6 @@ "integrity": "sha1-KzXsz87n04zXKtmSMvvVi/+zyE0=", "license": "MIT" }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha1-POOvGlUk7zJ9Lank/YttlcjXBSg=", - "dev": true, - "license": "MIT" - }, "node_modules/@types/uuid": { "version": "8.3.4", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/uuid/-/uuid-8.3.4.tgz", @@ -2393,122 +2553,159 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha1-ru8DKNFyueN9m6ttvBO4ftiJd9s=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha1-sc5gbYciHa7FceKTAJZ1mS8KrnY=", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha1-TLX2zX1MerA2VzjHrqiIuqbX79k=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha1-G2PQgthJovyuilaSSPvi7huKVsc=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha1-IdE7PUVv+whhTB1ou5pPjZI3zcc=", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha1-ZcjWRfAouSe/xJKFk7VOLs2AkkQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha1-2UV8zGoLjWs30OslKiMCJHjFRgw=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha1-JU35O1eJqHE1EzXdI+ILwWQGDyQ=", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha1-GvqDCw+tpYZd3KvcmTt5ARSoebc=", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha1-KG8DicQWgTds2tlrMJzt0X1wNGo=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha1-emxPq/Il1nRkSTHgBDAsu90vLiQ=", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha1-JYYH5g7/ownwZ2CJMcPfb+1B/S8=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha1-l15ZQr9UiVKRM3yRuRkfbrBjKrk=", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2516,78 +2713,127 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha1-fRd5S3f6vKxhXWpI+xQzMNli65s=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha1-O55X2BKahgxQhkxCGI92G97z6rA=", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha1-/ZVrvgt3JB6fFaxdzLHGOAYJaO8=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha1-FB6AnHFjbkp12qOfrtL7X0sQ34Y=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha1-Woasr58bTEqFpC7/shf3MFn23rc=", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha1-IXQBGRfOWCh1lU/+L2kS1ZMeNT4=", + "version": "8.56.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha1-UOA0dcM6QtEj3JnmOs8YQcAjH4c=", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha1-njyUiWl4JNLUzjqK0SYo+R6fWb4=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@typespec/ts-http-runtime": { "version": "0.3.3", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.3.tgz", @@ -2603,13 +2849,6 @@ "node": ">=20.0.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha1-0Gu7OE689sUF/eHD0O1N3/4Kr/g=", - "dev": true, - "license": "ISC" - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/acorn/-/acorn-8.16.0.tgz", @@ -2737,16 +2976,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2871,17 +3100,6 @@ "license": "MIT", "optional": true }, - "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha1-POdNiYhRNr4VNTQfjD1EJcKaXKs=", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/braces/-/braces-3.0.3.tgz", @@ -2940,6 +3158,20 @@ "ieee754": "^1.1.13" } }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha1-0ULUEEPlqGX2BTzHDvTjrQaL1c4=", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2953,16 +3185,6 @@ "node": ">= 0.4" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/camelcase/-/camelcase-6.3.0.tgz", @@ -3110,13 +3332,6 @@ "node": ">= 0.8" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "license": "MIT" - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/create-require/-/create-require-1.1.1.tgz", @@ -3208,32 +3423,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3324,110 +3513,64 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha1-ffEJZUq6fju+XI6uUzxeRh08bKk=", + "version": "10.10.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint/-/eslint-10.10.0.tgz", + "integrity": "sha1-FLHRhJ7tsu5oBfN1kFBHnOKyPXE=", "dev": true, "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", - "integrity": "sha1-BkLlNiXrxiwxwkcmsPBQ32vZei4=", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.5", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", - "integrity": "sha1-kco/LwGoTxJyzOBOlxdVBJTA/gY=", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "jiti": "*" }, "peerDependenciesMeta": { - "eslint-config-prettier": { + "jiti": { "optional": true } } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -3441,18 +3584,56 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha1-3rT5JWM5DzIAaJSvYqItuhxGQj8=", + "version": "9.1.2", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha1-ud5qzi+rHP8k0uWNhbdMj86jmAI=", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha1-njyUiWl4JNLUzjqK0SYo+R6fWb4=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3468,19 +3649,48 @@ "node": ">=4.0" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha1-/ZVrvgt3JB6fFaxdzLHGOAYJaO8=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/espree/-/espree-9.6.1.tgz", - "integrity": "sha1-oqF7jkNGkKVDLy+AGM5x0zGkjG8=", + "version": "11.2.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/espree/-/espree-11.2.0.tgz", + "integrity": "sha1-AdXkfcMyqrowWQCDYkVKjMNMyqU=", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha1-njyUiWl4JNLUzjqK0SYo+R6fWb4=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3532,16 +3742,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/esutils/-/esutils-2.0.3.tgz", @@ -3591,43 +3791,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha1-7OQH+lUKZNY4U2zXJ+EpxhYW4PA=", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha1-0G1YXOjbqQoWsFBcVDw8z7OuuBg=", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3680,27 +3843,14 @@ "fxparser": "src/cli/cli.js" } }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha1-ynUKENySW8ixiDn9ID4+9LPO1nU=", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=", + "version": "11.1.5", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha1-yCEOsFXeY+aGhcz7agF+OG1Fd9A=", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "flat-cache": "^6.1.23" } }, "node_modules/fill-range": { @@ -3744,18 +3894,15 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha1-LAwtUEDJmxYydxqdEFclwBFTY+4=", + "version": "6.1.23", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha1-c13IiMJxho1zAbO7uO26UCivth0=", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/flatted": { @@ -3945,43 +4092,6 @@ "node": ">=10" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/globals/-/globals-13.24.0.tgz", - "integrity": "sha1-hDKhnXjODB6DOUnDats0VAC7EXE=", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/globby/-/globby-11.1.0.tgz", - "integrity": "sha1-vUvpi7BC+D15b344EZkfvoKg00s=", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/gopd/-/gopd-1.2.0.tgz", @@ -3994,13 +4104,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha1-+y8dVeDjoYSa7/yQxPoN1ToOZsY=", - "dev": true, - "license": "MIT" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/has-flag/-/has-flag-4.0.0.tgz", @@ -4038,6 +4141,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha1-S6gq1UkRrGF0Z4cIRdV6n+UIpAA=", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/hasown/-/hasown-2.0.4.tgz", @@ -4060,6 +4176,13 @@ "he": "bin/he" } }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha1-sfr+qlSJzcKcuFVGqPg37U/7vLY=", + "dev": true, + "license": "MIT" + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -4135,23 +4258,6 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha1-nOy1ZQPAraHydB271lRuSxO1fM8=", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4252,16 +4358,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -4324,13 +4420,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha1-kziAKjDTtmBfvgYT4JQAjKjAWhM=", - "dev": true, - "license": "MIT" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4359,13 +4448,13 @@ "license": "MIT" }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha1-qHmpnilFL5QkOfKkBeOvizHU3pM=", + "version": "5.6.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha1-AwRAdMa00HLQpix7n6ZJU3uvAQU=", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/levn": { @@ -4398,13 +4487,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/log-symbols/-/log-symbols-4.1.0.tgz", @@ -4456,30 +4538,6 @@ "license": "MIT", "optional": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha1-1m+hjzpHB2eJMgubGvMr2G2fogI=", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/mime-db/-/mime-db-1.52.0.tgz", @@ -4501,19 +4559,6 @@ "node": ">= 0.6" } }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha1-WAyI+NVEXyvWqo88re+g3nn71p4=", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/mocha": { "version": "10.8.2", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/mocha/-/mocha-10.8.2.tgz", @@ -4663,13 +4708,6 @@ "dev": true, "license": "MIT" }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=", - "dev": true, - "license": "MIT" - }, "node_modules/nock": { "version": "13.5.6", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/nock/-/nock-13.5.6.tgz", @@ -4811,19 +4849,6 @@ "node": ">=8" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/path-exists/-/path-exists-4.0.0.tgz", @@ -4850,16 +4875,6 @@ "node": ">=14.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/path-key/-/path-key-3.1.1.tgz", @@ -4870,16 +4885,6 @@ "node": ">=8" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/pathval/-/pathval-1.1.1.tgz", @@ -4929,19 +4934,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", - "integrity": "sha1-ajH4ikutbHrdolPeErpO2uqA680=", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/propagate": { "version": "2.0.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/propagate/-/propagate-2.0.1.tgz", @@ -4971,25 +4963,24 @@ "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/qified/-/qified-0.10.1.tgz", + "integrity": "sha1-BkC/IbvmylQNspCtj1/eTYcLi9o=", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha1-HQJKwWaJc91bzEqWq5zNt2Oe+NQ=", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, "node_modules/readdirp": { @@ -5015,16 +5006,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/retry/-/retry-0.13.1.tgz", @@ -5034,78 +5015,6 @@ "node": ">= 4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha1-D+E7lSLhRz9RtVjueW4I8R+bSJ8=", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", - "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5172,16 +5081,6 @@ "node": ">=8" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/slash/-/slash-3.0.0.tgz", - "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -5286,12 +5185,53 @@ "node": ">=8" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha1-ViqabJ6ys7Ej05cZ+a9btE/NdjE=", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha1-7Sq5Z6MxreYvGNB32uGSaE1Q01A=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha1-YxM2ADTMs2s9xh7L3/eBIfkP4h8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -5319,6 +5259,19 @@ "node": ">=12" } }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha1-JpBXn5bSeQJTvc8co11WmtePmtg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ts-node/-/ts-node-10.9.2.tgz", @@ -5380,29 +5333,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "dev": true, - "license": "0BSD" - }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/tunnel/-/tunnel-0.0.6.tgz", @@ -5435,19 +5365,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/typescript/-/typescript-4.9.5.tgz", diff --git a/.github/actions/package.json b/.github/actions/package.json index 606844fef..bc6e51e8e 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -4,7 +4,7 @@ "description": "GitHub Actions used by VS Code cpptools for triaging issues", "scripts": { "build": "tsc", - "lint": "eslint -c .eslintrc --fix --ext .ts .", + "lint": "eslint --fix .", "watch": "tsc --watch" }, "keywords": [], @@ -19,28 +19,25 @@ }, "devDependencies": { "@azure/storage-blob": "^12.13.0", + "@eslint/js": "^10.0.1", "@types/chai": "^4.3.3", "@types/mocha": "^9.1.1", "@types/uuid": "^8.3.4", "@types/yargs": "^17.0.11", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", + "@typescript-eslint/eslint-plugin": "^8.56.1", + "@typescript-eslint/parser": "^8.56.1", "chai": "^4.3.6", - "eslint": "^8.21.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint": "^10.10.0", "husky": "^8.0.1", "mocha": "^10.0.0", "mongodb": "^4.17.0", "nock": "^13.2.9", "prettier": "2.7.1", "ts-node": "^10.9.1", - "typescript": "^4.7.4", + "typescript": "^4.9.5", "yargs": "^17.5.1" }, "overrides": { - "serialize-javascript": "^7.0.5", - "flatted": "^3.4.2", - "fast-xml-parser": "^5.5.7" + "serialize-javascript": "^7.0.5" } } diff --git a/.github/actions/tsconfig.json b/.github/actions/tsconfig.json index 2a86fd947..66e513f41 100644 --- a/.github/actions/tsconfig.json +++ b/.github/actions/tsconfig.json @@ -9,11 +9,12 @@ "skipLibCheck": true, "sourceMap": true, "lib": [ - "es2020" + "es2020", + "es2022.error" ] }, "exclude": [ "**/*.test.ts", "**/vm-filesystem/**" ] -} \ No newline at end of file +} From fc13e81e3797c80974320a1a2d974d13b69075fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:45:06 -0700 Subject: [PATCH 04/29] Bump the github-actions group with 2 updates (#14784) Bumps the github-actions group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action). Updates `github/codeql-action/init` from 4.37.9 to 4.38.0 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/cdf488f595d80d6e07e03d4674febd5ab45fa938...b96794f015dfd88f77b49b1c93e0fa7110f94c63) Updates `github/codeql-action/analyze` from 4.37.9 to 4.38.0 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/cdf488f595d80d6e07e03d4674febd5ab45fa938...b96794f015dfd88f77b49b1c93e0fa7110f94c63) --- updated-dependencies: - dependency-name: github/codeql-action/init dependency-version: 4.38.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: github/codeql-action/analyze dependency-version: 4.38.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a4448fe19..0dbfc4b8a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -63,7 +63,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9 + uses: github/codeql-action/init@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -91,7 +91,7 @@ jobs: exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9 + uses: github/codeql-action/analyze@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 with: category: "/language:${{matrix.language}}" From 961cf7ac1ba5de6d72e79a2059b9973aaf75f192 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 17 Sep 2026 18:27:29 -0700 Subject: [PATCH 05/29] Add plumbing for showUnused setting and tags in diagnostics (#14773) --- Extension/src/LanguageServer/client.ts | 3 +++ Extension/src/LanguageServer/settings.ts | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 7e817e9b4..0a7c56909 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -291,6 +291,7 @@ interface IntelliSenseDiagnostic { severity: vscode.DiagnosticSeverity; localizeStringParams: LocalizeStringParams; relatedInformation?: IntelliSenseDiagnosticRelatedInformation[]; + tags?: vscode.DiagnosticTag[]; } interface RefactorDiagnostic { @@ -1599,6 +1600,7 @@ export class DefaultClient implements Client { editorAutoClosingBrackets: otherSettings.editorAutoClosingBrackets, editorInlayHintsEnabled: otherSettings.editorInlayHintsEnabled, editorParameterHintsEnabled: otherSettings.editorParameterHintsEnabled, + showUnused: otherSettings.showUnused, refactoringIncludeHeader: settings.refactoringIncludeHeader }; return result; @@ -2665,6 +2667,7 @@ export class DefaultClient implements Client { const diagnostic: vscode.Diagnostic = new vscode.Diagnostic(makeVscodeRange(d.range), message, d.severity); diagnostic.code = d.code; diagnostic.source = CppSourceStr; + diagnostic.tags = d.tags; if (d.relatedInformation) { diagnostic.relatedInformation = []; for (const info of d.relatedInformation) { diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 502144300..a18b2cd61 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -140,6 +140,7 @@ export interface WorkspaceFolderSettingsParams { editorAutoClosingBrackets: string; editorInlayHintsEnabled: boolean; editorParameterHintsEnabled: boolean; + showUnused: boolean; refactoringIncludeHeader: string; } @@ -1090,6 +1091,7 @@ export class OtherSettings { public get filesAutoSaveAfterDelay(): boolean { return this.getAsString("files", "autoSave", this.resource, "off") === "afterDelay"; } public get editorInlayHintsEnabled(): boolean { return this.getAsString("editor.inlayHints", "enabled", this.resource, "on") !== "off"; } public get editorParameterHintsEnabled(): boolean { return this.getAsBoolean("editor.parameterHints", "enabled", this.resource, true); } + public get showUnused(): boolean { return this.getAsBoolean("editor", "showUnused", { uri: this.resource, languageId: "cpp" }, true); } private readonly defaultSearchExcludes = { "**/node_modules": true, "**/bower_components": true, From 29220333b109d40b3aa83202ff01040305c7dfab Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 17 Sep 2026 18:39:23 -0700 Subject: [PATCH 06/29] Implement provideDocumentRangesFormattingEdits (#14776) --- .../documentRangeFormattingEditProvider.ts | 42 ++++++++++--------- Extension/src/LanguageServer/client.ts | 1 + 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts b/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts index eec2158b4..b1279cc75 100644 --- a/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts +++ b/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts @@ -15,14 +15,34 @@ export class DocumentRangeFormattingEditProvider implements vscode.DocumentRange } public async provideDocumentRangeFormattingEdits(document: vscode.TextDocument, range: vscode.Range, + options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise { + return this.provideFormattingEdits(document, [range], options, token); + } + + public async provideDocumentRangesFormattingEdits(document: vscode.TextDocument, ranges: vscode.Range[], + options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise { + return this.provideFormattingEdits(document, ranges, options, token); + } + + private async provideFormattingEdits(document: vscode.TextDocument, ranges: vscode.Range[], options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise { const settings: CppSettings = new CppSettings(vscode.workspace.getWorkspaceFolder(document.uri)?.uri); - if (settings.formattingEngine === "disabled") { + if (settings.formattingEngine === "disabled" || ranges.length === 0) { return []; } const filePath: string = document.uri.fsPath; const useVcFormat: boolean = settings.useVcFormat(document); const configCallBack = async (editorConfigSettings: any | undefined) => { + const requestRanges = ranges.map(range => ({ + start: { + character: range.start.character, + line: range.start.line + }, + end: { + character: range.end.character, + line: range.end.line + } + })); const params: FormatParams = { editorConfigSettings: { ...editorConfigSettings }, useVcFormat: useVcFormat, @@ -30,16 +50,8 @@ export class DocumentRangeFormattingEditProvider implements vscode.DocumentRange insertSpaces: options.insertSpaces, tabSize: options.tabSize, character: "", - range: { - start: { - character: range.start.character, - line: range.start.line - }, - end: { - character: range.end.character, - line: range.end.line - } - }, + range: requestRanges[0], + ranges: requestRanges, onChanges: false }; let response: FormatResult; @@ -63,12 +75,4 @@ export class DocumentRangeFormattingEditProvider implements vscode.DocumentRange return configCallBack(editorConfigSettings); } } - - // TODO: This is needed for correct Extract to function formatting. - /* - public async provideDocumentRangesFormattingEdits(_document: vscode.TextDocument, _ranges: vscode.Range[], - _options: vscode.FormattingOptions, _token: vscode.CancellationToken): Promise { - return []; - } - */ } diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 0a7c56909..a3fe2cb08 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -351,6 +351,7 @@ export interface GetDocumentSymbolResult { } export interface FormatParams extends SelectionParams { + ranges?: Range[]; character: string; insertSpaces: boolean; tabSize: number; From 0437d24c3a65de892177135964c17d3b6d9bd147 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 17 Sep 2026 20:43:16 -0700 Subject: [PATCH 07/29] Use standard LSP for Folding Ranges (#14783) --- .../Providers/foldingRangeProvider.ts | 112 ------------------ Extension/src/LanguageServer/client.ts | 49 +------- .../src/LanguageServer/protocolFilter.ts | 6 +- 3 files changed, 9 insertions(+), 158 deletions(-) delete mode 100644 Extension/src/LanguageServer/Providers/foldingRangeProvider.ts diff --git a/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts b/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts deleted file mode 100644 index ce97b35d9..000000000 --- a/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ -import * as vscode from 'vscode'; -import { ResponseError } from 'vscode-languageclient'; -import { ManualPromise } from '../../Utility/Async/manualPromise'; -import { CppFoldingRange, DefaultClient, FoldingRangeKind, GetFoldingRangesParams, GetFoldingRangesRequest, GetFoldingRangesResult } from '../client'; -import { RequestCancelled, ServerCancelled } from '../protocolFilter'; -import { CppSettings } from '../settings'; - -interface FoldingRangeRequestInfo { - promise: ManualPromise | undefined; -} - -export class FoldingRangeProvider implements vscode.FoldingRangeProvider { - public onDidChangeFoldingRangesEvent = new vscode.EventEmitter(); - public onDidChangeFoldingRanges?: vscode.Event; - - // Mitigate an issue where VS Code sends us an inordinate number of requests - // for the same file without waiting for the prior request to complete or cancelling them. - private pendingRequests: Map = new Map(); - - constructor(private client: DefaultClient) { - this.onDidChangeFoldingRanges = this.onDidChangeFoldingRangesEvent.event; - } - - async provideFoldingRanges(document: vscode.TextDocument, context: vscode.FoldingContext, token: vscode.CancellationToken): Promise { - const settings: CppSettings = new CppSettings(); - if (!settings.codeFolding) { - return []; - } - - const pendingRequest: FoldingRangeRequestInfo | undefined = this.pendingRequests.get(document.uri.toString()); - if (pendingRequest !== undefined) { - if (pendingRequest.promise === undefined) { - pendingRequest.promise = new ManualPromise(); - } - console.log("Redundant folding ranges request received for: " + document.uri.toString()); - return pendingRequest.promise; - } - const foldingRangeRequestInfo: FoldingRangeRequestInfo = { - promise: undefined - }; - this.pendingRequests.set(document.uri.toString(), foldingRangeRequestInfo); - - const promise: Promise = this.requestRanges(document.uri.toString(), token); - await promise; - this.pendingRequests.delete(document.uri.toString()); - if (foldingRangeRequestInfo.promise !== undefined) { - promise.then(() => { - foldingRangeRequestInfo.promise?.resolve(promise); - }, () => { - foldingRangeRequestInfo.promise?.reject(new vscode.CancellationError()); - }); - } - return promise; - } - - private async requestRanges(uri: string, token: vscode.CancellationToken): Promise { - const params: GetFoldingRangesParams = { - uri - }; - - let response: GetFoldingRangesResult; - try { - response = await this.client.languageClient.sendRequest(GetFoldingRangesRequest, params, token); - } catch (e: any) { - if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { - throw new vscode.CancellationError(); - } - throw e; - } - if (token.isCancellationRequested) { - throw new vscode.CancellationError(); - } - const result: vscode.FoldingRange[] = []; - response.ranges.forEach((r: CppFoldingRange) => { - const foldingRange: vscode.FoldingRange = { - start: r.range.startLine, - end: r.range.endLine - }; - switch (r.kind) { - case FoldingRangeKind.Comment: - foldingRange.kind = vscode.FoldingRangeKind.Comment; - break; - case FoldingRangeKind.Imports: - foldingRange.kind = vscode.FoldingRangeKind.Imports; - break; - case FoldingRangeKind.Region: - foldingRange.kind = vscode.FoldingRangeKind.Region; - break; - default: - break; - } - result.push(foldingRange); - }); - return result; - } - - public refresh(): void { - // Consider all pending requests as being outdated. Cancel them all. - const oldPendingRequests: Map = this.pendingRequests; - this.pendingRequests = new Map(); - this.onDidChangeFoldingRangesEvent.fire(); - oldPendingRequests.forEach((value: FoldingRangeRequestInfo | undefined, _key: string) => { - if (value !== undefined && value.promise !== undefined) { - value.promise.reject(new vscode.CancellationError()); - } - }); - } -} diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index a3fe2cb08..77ac15102 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -13,7 +13,6 @@ import { DocumentFormattingEditProvider } from './Providers/documentFormattingEd import { DocumentRangeFormattingEditProvider } from './Providers/documentRangeFormattingEditProvider'; import { DocumentSymbolProvider } from './Providers/documentSymbolProvider'; import { FindAllReferencesProvider } from './Providers/findAllReferencesProvider'; -import { FoldingRangeProvider } from './Providers/foldingRangeProvider'; import { CppInlayHint, InlayHintsProvider } from './Providers/inlayHintProvider'; import { OnTypeFormattingEditProvider } from './Providers/onTypeFormattingEditProvider'; import { RenameProvider } from './Providers/renameProvider'; @@ -228,11 +227,6 @@ interface FileChangedParams extends WorkspaceFolderParams { uri: string; } -interface InputLineRange { - startLine: number; - endLine: number; -} - interface InputRegion { startLine: number; startColumn: number; @@ -364,26 +358,6 @@ export interface FormatResult { edits: TextEdit[]; } -export interface GetFoldingRangesParams { - uri: string; -} - -export enum FoldingRangeKind { - None = 0, - Comment = 1, - Imports = 2, - Region = 3 -} - -export interface CppFoldingRange { - kind: FoldingRangeKind; - range: InputLineRange; -} - -export interface GetFoldingRangesResult { - ranges: CppFoldingRange[]; -} - export interface IntelliSenseResult { uri: string; fileVersion: number; @@ -625,7 +599,6 @@ const SwitchHeaderSourceRequest: RequestType = new RequestType('cpptools/getTranslationUnitSourceCandidates'); const GetDiagnosticsRequest: RequestType = new RequestType('cpptools/getDiagnostics'); export const GetDocumentSymbolRequest: RequestType = new RequestType('cpptools/getDocumentSymbols'); -export const GetFoldingRangesRequest: RequestType = new RequestType('cpptools/getFoldingRanges'); export const FormatDocumentRequest: RequestType = new RequestType('cpptools/formatDocument'); export const FormatRangeRequest: RequestType = new RequestType('cpptools/formatRange'); export const FormatOnTypeRequest: RequestType = new RequestType('cpptools/formatOnType'); @@ -903,8 +876,6 @@ export class DefaultClient implements Client { private documentFormattingProviderDisposable: vscode.Disposable | undefined; private formattingRangeProviderDisposable: vscode.Disposable | undefined; private onTypeFormattingProviderDisposable: vscode.Disposable | undefined; - private codeFoldingProvider: FoldingRangeProvider | undefined; - private codeFoldingProviderDisposable: vscode.Disposable | undefined; private inlayHintsProvider: InlayHintsProvider | undefined; private semanticTokensProvider: SemanticTokensProvider | undefined; private semanticTokensProviderDisposable: vscode.Disposable | undefined; @@ -1431,16 +1402,12 @@ export class DefaultClient implements Client { this.disposables.push(vscode.languages.registerDocumentSymbolProvider(util.documentSelector, instrument(new DocumentSymbolProvider()), undefined)); this.disposables.push(vscode.languages.registerCodeActionsProvider(util.documentSelector, instrument(new CodeActionProvider(this)), undefined)); - // Because formatting and codeFolding can vary per folder, we need to register these providers once - // and leave them registered. The decision of whether to provide results needs to be made on a per folder basis, - // within the providers themselves. + // Because formatting can vary per folder, we need to register these providers once and leave them registered. + // The decision of whether to provide results needs to be made on a per folder basis, within the providers themselves. this.documentFormattingProviderDisposable = vscode.languages.registerDocumentFormattingEditProvider(util.documentSelector, instrument(new DocumentFormattingEditProvider(this))); this.formattingRangeProviderDisposable = vscode.languages.registerDocumentRangeFormattingEditProvider(util.documentSelector, instrument(new DocumentRangeFormattingEditProvider(this))); this.onTypeFormattingProviderDisposable = vscode.languages.registerOnTypeFormattingEditProvider(util.documentSelector, instrument(new OnTypeFormattingEditProvider(this)), ";", "}", "\n"); - this.codeFoldingProvider = new FoldingRangeProvider(this); - this.codeFoldingProviderDisposable = vscode.languages.registerFoldingRangeProvider(util.documentSelector, instrument(this.codeFoldingProvider)); - const settings: CppSettings = new CppSettings(); if (settings.isEnhancedColorizationEnabled && semanticTokensLegend) { this.semanticTokensProvider = instrument(new SemanticTokensProvider()); @@ -2648,7 +2615,7 @@ export class DefaultClient implements Client { this.inlayHintsProvider.deliverInlayHints(intelliSenseResult.uri, intelliSenseResult.inlayHints, intelliSenseResult.clearExistingInlayHint); } - this.updateInactiveRegions(intelliSenseResult.uri, intelliSenseResult.inactiveRegions, intelliSenseResult.clearExistingInactiveRegions, intelliSenseResult.isCompletePass); + this.updateInactiveRegions(intelliSenseResult.uri, intelliSenseResult.inactiveRegions, intelliSenseResult.clearExistingInactiveRegions); if (intelliSenseResult.clearExistingDiagnostics || intelliSenseResult.diagnostics.length > 0) { this.updateSquiggles(intelliSenseResult.uri, intelliSenseResult.diagnostics, intelliSenseResult.clearExistingDiagnostics); } @@ -2960,11 +2927,7 @@ export class DefaultClient implements Client { this.model.isParsingWorkspacePaused.Value = tagParseStatus.isPaused; } - private updateInactiveRegions(uriString: string, inactiveRegions: InputRegion[], startNewSet: boolean, updateFoldingRanges: boolean): void { - if (this.codeFoldingProvider && updateFoldingRanges) { - this.codeFoldingProvider.refresh(); - } - + private updateInactiveRegions(uriString: string, inactiveRegions: InputRegion[], startNewSet: boolean): void { const client: Client = clients.getClientFor(vscode.Uri.parse(uriString)); if (!(client instanceof DefaultClient) || (!startNewSet && inactiveRegions.length === 0)) { return; @@ -4291,10 +4254,6 @@ export class DefaultClient implements Client { this.onTypeFormattingProviderDisposable.dispose(); this.onTypeFormattingProviderDisposable = undefined; } - if (this.codeFoldingProviderDisposable) { - this.codeFoldingProviderDisposable.dispose(); - this.codeFoldingProviderDisposable = undefined; - } if (this.semanticTokensProviderDisposable) { this.semanticTokensProviderDisposable.dispose(); this.semanticTokensProviderDisposable = undefined; diff --git a/Extension/src/LanguageServer/protocolFilter.ts b/Extension/src/LanguageServer/protocolFilter.ts index 5b8cc98d8..d97481297 100644 --- a/Extension/src/LanguageServer/protocolFilter.ts +++ b/Extension/src/LanguageServer/protocolFilter.ts @@ -15,7 +15,7 @@ import { Client, DefaultClient, SymbolScope, workspaceReferences } from './clien import { clients } from './extension'; import { getLocalizedString, getLocalizedSymbolScope, LocalizeStringParams } from './localization'; import { CancellationSender } from './references'; -import { hasFileAssociation } from './settings'; +import { CppSettings, hasFileAssociation } from './settings'; import { shouldChangeFromCToCpp } from './utils'; export const RequestCancelled: number = -32800; @@ -227,6 +227,10 @@ export function createProtocolFilter(): Middleware { logCallHierarchyTelemetry("CallHierarchyCallsFrom", CallHierarchyRequestStatus.Succeeded); return result && result.length !== 0 ? result : undefined; }, + provideFoldingRanges: (document, context, token, next) => { + const settings: CppSettings = new CppSettings(); + return settings.codeFolding ? next(document, context, token) : []; + }, provideWorkspaceSymbols: async (query, token, next) => { if (!query) { return []; From 4d9f208a82003257cf48aadbd2e6b05db1ba0509 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Thu, 17 Sep 2026 21:30:48 -0700 Subject: [PATCH 08/29] Regenerate Actions utility helpers (#14781) * Regenerate Actions utility helpers * Fix Actions comment marker pairing --- .github/actions/common/utils.js | 14 ++- .github/actions/common/utils.test.js | 178 +++++++++++++++++++++++++++ .github/actions/common/utils.ts | 11 +- 3 files changed, 194 insertions(+), 9 deletions(-) create mode 100644 .github/actions/common/utils.test.js diff --git a/.github/actions/common/utils.js b/.github/actions/common/utils.js index 0948ea0b0..5de1e74ff 100644 --- a/.github/actions/common/utils.js +++ b/.github/actions/common/utils.js @@ -22,7 +22,6 @@ const normalizeIssue = (issue) => { const cleanse = (str) => { let out = str .toLowerCase() - .replace(//gu, '') .replace(/.* version: .*/gu, '') .replace(/issue type: .*/gu, '') .replace(/vs ?code/gu, '') @@ -32,6 +31,13 @@ const normalizeIssue = (issue) => { .replace(/!?\[[^\]]*\]\([^)]*\)/gu, '') .replace(/\s+/gu, ' ') .replace(/```[^`]*?```/gu, ''); + for (let start = out.indexOf('', start + 4); + if (end === -1) { + break; + } + out = out.slice(0, start) + out.slice(end + 3); + } while (out.includes(`
`) && out.includes('
') && out.indexOf(``) > out.indexOf(`
`)) { @@ -104,9 +110,9 @@ Repo: ${github_1.context.repo.owner}/${github_1.context.repo.repo} /gu, '--@>') - .replace(/\/|\\/gu, 'slash-')} + .replace(/ `); }; diff --git a/.github/actions/common/utils.test.js b/.github/actions/common/utils.test.js new file mode 100644 index 000000000..7b8e0bfd8 --- /dev/null +++ b/.github/actions/common/utils.test.js @@ -0,0 +1,178 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See LICENSE in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const assert = require('node:assert/strict'); +const { readFileSync } = require('node:fs'); +const path = require('node:path'); +const test = require('node:test'); +const vm = require('node:vm'); +const ts = require('typescript'); + +const configPath = path.join(__dirname, '..', 'tsconfig.json'); +const config = ts.readConfigFile(configPath, ts.sys.readFile); +assert.equal(config.error, undefined); +const project = ts.parseJsonConfigFileContent(config.config, ts.sys, path.dirname(configPath)); +assert.deepEqual(project.errors, []); +const compiled = ts.transpileModule(readFileSync(path.join(__dirname, 'utils.ts'), 'utf8'), { + fileName: 'utils.ts', + compilerOptions: project.options, + reportDiagnostics: true, +}); +assert.deepEqual(compiled.diagnostics, []); +const committed = readFileSync(path.join(__dirname, 'utils.js'), 'utf8'); + +function printJavaScript(source) { + const tree = ts.createSourceFile('utils.js', source, ts.ScriptTarget.ES2019, true, ts.ScriptKind.JS); + assert.deepEqual(tree.parseDiagnostics, []); + return ts.createPrinter({ removeComments: true }).printFile(tree); +} + +test('committed utils.js matches the TypeScript output', () => { + assert.equal(printJavaScript(committed), printJavaScript(compiled.outputText)); +}); + +function loadUtils(source, errorLogIssueNumber = '99') { + const context = { + repo: { owner: 'example', repo: 'triage' }, + workflow: 'Helper tests', + issue: { number: 7 }, + payload: { action: 'labeled' }, + }; + const requests = []; + const comments = []; + const delays = []; + const logs = []; + const modules = { + '@actions/core': { + getInput: (name) => name === 'errorLogIssueNumber' ? errorLogIssueNumber : '', + }, + '@actions/github': { context }, + axios: {}, + '../api/octokit': { + OctoKitIssue: class { + constructor(token, repo, issue) { + requests.push(JSON.parse(JSON.stringify({ token, repo, issue }))); + } + async postComment(body) { + comments.push(body); + } + }, + }, + }; + const exports = {}; + new vm.Script(source, { filename: 'utils.js' }).runInNewContext({ + exports, + require: (name) => { + assert.ok(Object.hasOwn(modules, name), `Unexpected dependency: ${name}`); + return modules[name]; + }, + console: { + log: (...args) => logs.push(args), + error: (error) => assert.fail(`Unexpected error: ${error}`), + }, + setTimeout: (callback, delay) => { + delays.push(delay); + callback(); + }, + }, { timeout: 1000 }); + return { utils: exports, context, requests, comments, delays, logs }; +} + +for (const [name, source] of [ + ['committed JavaScript', committed], + ['TypeScript output', compiled.outputText], +]) { + test(`${name}: normalizes ordinary issue text`, () => { + const { utils } = loadUtils(source); + const result = utils.normalizeIssue({ body: 'Ordinary body', title: 'Useful title' }); + assert.equal(result.body, 'ordinary body'); + assert.equal(result.title, 'useful title'); + assert.equal(result.issueType, 'unknown'); + }); + + test(`${name}: preserves text between separate comments`, () => { + const { utils } = loadUtils(source); + const result = utils.normalizeIssue({ + body: 'Start keep end', + title: 'A title', + }); + assert.equal(result.body, 'start keep end'); + assert.equal(result.title, 'a title'); + }); + + test(`${name}: removes ordinary multiline comments`, () => { + const { utils } = loadUtils(source); + const result = utils.normalizeIssue({ + body: 'Start end', + title: 'Title', + }); + assert.equal(result.body, 'start end'); + assert.equal(result.title, 'title'); + }); + + test(`${name}: removes comments after unrelated closing markers`, () => { + const { utils } = loadUtils(source); + const result = utils.normalizeIssue({ + body: 'Start --> keep middle --> text end', + title: 'Title --> text', + }); + assert.equal(result.body, 'start --> keep middle --> text end'); + assert.equal(result.title, 'title --> text'); + }); + + test(`${name}: preserves incomplete comment text`, () => { + const { utils } = loadUtils(source); + for (const [text, expected] of [ + ['Start --> end', 'start --> end'], + ['Start text text tail end', 'start end'], + ]) { + const result = utils.normalizeIssue({ body: text, title: text }); + assert.equal(result.body, expected); + assert.equal(result.title, expected); + } + }); + + test(`${name}: preserves issue classification`, () => { + const { utils } = loadUtils(source); + for (const [body, issueType] of [ + ['Issue Type: Bug', 'bug'], + ['Issue Type: Feature Request', 'feature_request'], + ['Ordinary issue', 'unknown'], + ]) { + assert.equal(utils.normalizeIssue({ body, title: 'Title' }).issueType, issueType); + } + }); + + test(`${name}: reports an ordinary error through the stubbed client`, async () => { + for (const ping of [false, true]) { + const runtime = loadUtils(source); + await runtime.utils.logErrorToIssue('Routine test failure', ping, ''); + assert.deepEqual(runtime.requests, [{ + token: '', + repo: { owner: 'example', repo: 'triage' }, + issue: { number: 99 }, + }]); + assert.deepEqual(runtime.delays, [10000]); + assert.equal(runtime.comments.length, 1); + const comment = runtime.comments[0]; + assert.ok(comment.includes('Workflow: Helper tests')); + assert.ok(comment.includes('Error: Routine test failure')); + assert.ok(comment.includes(`Issue: ${ping ? 'example/triage#' : ''}7`)); + assert.ok(comment.includes('Repo: example/triage')); + assert.ok(comment.includes(JSON.stringify(runtime.context, null, 2))); + } + }); + + test(`${name}: skips reporting when no destination is configured`, async () => { + const runtime = loadUtils(source, ''); + await runtime.utils.logErrorToIssue('Routine test failure', false, ''); + assert.deepEqual(runtime.requests, []); + assert.deepEqual(runtime.comments, []); + assert.deepEqual(runtime.logs, [['no error logging repo defined. swallowing error.']]); + }); +} diff --git a/.github/actions/common/utils.ts b/.github/actions/common/utils.ts index b1180f850..33dbc88e1 100644 --- a/.github/actions/common/utils.ts +++ b/.github/actions/common/utils.ts @@ -35,11 +35,12 @@ export const normalizeIssue = (issue: { .replace(/\s+/gu, ' ') .replace(/```[^`]*?```/gu, ''); - while ( - out.includes('') && - out.indexOf('-->') > out.indexOf('') + 3); + for (let start = out.indexOf('', start + 4); + if (end === -1) { + break; + } + out = out.slice(0, start) + out.slice(end + 3); } while ( out.includes(`
`) && From 4b95f405ce654c9c362674c6d4562d93e00d3ba0 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 18 Sep 2026 14:23:16 -0700 Subject: [PATCH 09/29] Fix Actions Octokit response types (#14785) * Fix Actions Octokit response types * Run Actions typechecks and offline tests in CI --- .github/actions/api/octokit.js | 22 +- .github/actions/api/octokit.test.js | 291 +++++++++++++++++++++++ .github/actions/api/octokit.ts | 26 +- .github/actions/common/OctokitTypings.ts | 14 +- .github/actions/package.json | 2 + .github/workflows/ci_actions.yml | 44 ++++ 6 files changed, 377 insertions(+), 22 deletions(-) create mode 100644 .github/actions/api/octokit.test.js create mode 100644 .github/workflows/ci_actions.yml diff --git a/.github/actions/api/octokit.js b/.github/actions/api/octokit.js index e8c6ded88..9c937c880 100644 --- a/.github/actions/api/octokit.js +++ b/.github/actions/api/octokit.js @@ -368,7 +368,9 @@ class OctoKitIssue extends OctoKit { numRequests++; const timelineEvents = event.data; for (const timelineEvent of timelineEvents) { - if (timelineEvent.event === 'assigned' && ((_a = timelineEvent.assignee) === null || _a === void 0 ? void 0 : _a.login) === assignee) { + if (timelineEvent.event === 'assigned' && + 'assignee' in timelineEvent && + ((_a = timelineEvent.assignee) === null || _a === void 0 ? void 0 : _a.login) === assignee) { assigner = (_b = timelineEvent.actor) === null || _b === void 0 ? void 0 : _b.login; } } @@ -401,7 +403,7 @@ class OctoKitIssue extends OctoKit { } } async getClosingInfo(alreadyChecked = []) { - var _a, _b, _c, _d, _e, _f, _g, _h; + var _a, _b, _c, _d, _e, _f, _g; if (alreadyChecked.includes(this.issueData.number)) { return undefined; } @@ -421,6 +423,7 @@ class OctoKitIssue extends OctoKit { const timelineEvents = event.data; for (const timelineEvent of timelineEvents) { if ((timelineEvent.event === 'closed' || timelineEvent.event === 'merged') && + 'commit_url' in timelineEvent && timelineEvent.created_at && timelineEvent.commit_id && ((_a = timelineEvent.commit_url) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) { @@ -432,9 +435,12 @@ class OctoKitIssue extends OctoKit { if (timelineEvent.event === 'reopened') { closingCommit = undefined; } - if (timelineEvent.created_at && - timelineEvent.event === 'commented' && - !((_b = timelineEvent.body) === null || _b === void 0 ? void 0 : _b.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE')) && + if (timelineEvent.event === 'commented' && + 'created_at' in timelineEvent && + timelineEvent.created_at && + 'body' in timelineEvent && + timelineEvent.body && + !timelineEvent.body.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE') && closingHashComment.test(timelineEvent.body)) { closingCommit = { hash: closingHashComment.exec(timelineEvent.body)[1], @@ -442,8 +448,8 @@ class OctoKitIssue extends OctoKit { }; } if (timelineEvent.event === 'cross-referenced' && - ((_d = (_c = timelineEvent.source) === null || _c === void 0 ? void 0 : _c.issue) === null || _d === void 0 ? void 0 : _d.number) && - ((_g = (_f = (_e = timelineEvent.source) === null || _e === void 0 ? void 0 : _e.issue) === null || _f === void 0 ? void 0 : _f.pull_request) === null || _g === void 0 ? void 0 : _g.url.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) { + ((_c = (_b = timelineEvent.source) === null || _b === void 0 ? void 0 : _b.issue) === null || _c === void 0 ? void 0 : _c.number) && + ((_f = (_e = (_d = timelineEvent.source) === null || _d === void 0 ? void 0 : _d.issue) === null || _e === void 0 ? void 0 : _e.pull_request) === null || _f === void 0 ? void 0 : _f.url.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) { crossReferencing.push(timelineEvent.source.issue.number); } } @@ -456,7 +462,7 @@ class OctoKitIssue extends OctoKit { number: id, }).getClosingInfo(alreadyChecked); if (closed) { - if (Math.abs(closed.timestamp - ((_h = (await this.getIssue()).closedAt) !== null && _h !== void 0 ? _h : 0)) < 5000) { + if (Math.abs(closed.timestamp - ((_g = (await this.getIssue()).closedAt) !== null && _g !== void 0 ? _g : 0)) < 5000) { closingCommit = closed; break; } diff --git a/.github/actions/api/octokit.test.js b/.github/actions/api/octokit.test.js new file mode 100644 index 000000000..3a6157ef0 --- /dev/null +++ b/.github/actions/api/octokit.test.js @@ -0,0 +1,291 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See LICENSE in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const test = require('node:test'); +const vm = require('node:vm'); +const ts = require('typescript'); + +const params = { owner: 'microsoft', repo: 'vscode-cpptools' }; +const timestamp = '2026-01-02T03:04:05Z'; +const commitUrl = 'https://api.github.com/repos/microsoft/vscode-cpptools/commits/abcdef0'; +const source = fs.readFileSync(path.join(__dirname, 'octokit.js'), 'utf8'); + +function issue(overrides = {}) { + return { + number: 1, + user: { login: 'author', type: 'User' }, + body: 'Issue body', + title: 'Issue title', + labels: ['bug', { name: 'triage' }, {}], + state: 'closed', + state_reason: 'duplicate', + locked: false, + comments: 2, + reactions: { '+1': 1, '-1': 0, laugh: 0, hooray: 0, confused: 0, heart: 0, rocket: 0, eyes: 0 }, + assignee: null, + assignees: [{ login: 'first' }, { login: 'second' }], + milestone: null, + created_at: timestamp, + updated_at: timestamp, + closed_at: timestamp, + ...overrides, + }; +} + +function adapter({ issues = { 1: issue() }, timelines = {}, search = [] } = {}) { + const requests = []; + const timelineEndpoint = () => assert.fail('Timeline endpoint must be paginated'); + const searchEndpoint = () => assert.fail('Search endpoint must be paginated'); + const client = { + rest: { + issues: { + get: async ({ owner, repo, issue_number }) => { + assert.deepEqual({ owner, repo }, params); + requests.push(['get', issue_number]); + assert.ok(issues[issue_number], `Unexpected issue read: ${issue_number}`); + return { data: issues[issue_number] }; + }, + listEventsForTimeline: timelineEndpoint, + }, + search: { issuesAndPullRequests: searchEndpoint }, + }, + paginate: { + async *iterator(endpoint, options) { + assert.ok(endpoint === timelineEndpoint || endpoint === searchEndpoint); + const pages = endpoint === timelineEndpoint ? timelines[options.issue_number] ?? [] : search; + if (endpoint === timelineEndpoint) { + assert.deepEqual({ owner: options.owner, repo: options.repo }, params); + } else { + assert.equal(options.q, 'is:issue repo:microsoft/vscode-cpptools'); + assert.equal(options.per_page, 100); + } + for (let page = 0; page < pages.length; page++) { + requests.push([endpoint === timelineEndpoint ? 'timeline' : 'search', options.issue_number, page]); + yield { data: pages[page] }; + } + }, + }, + }; + const exports = {}; + const dependencies = { + '@actions/github': { getOctokit: () => client }, + '../common/utils': { safeLog: () => { } }, + child_process: { exec: () => assert.fail('Unexpected subprocess') }, + }; + vm.runInThisContext(`(function(require, exports, setTimeout) {\n${source}\n})`, { + filename: path.join(__dirname, 'octokit.js'), + })( + (name) => { + assert.ok(Object.hasOwn(dependencies, name), `Unexpected dependency: ${name}`); + return dependencies[name]; + }, + exports, + () => assert.fail('Unexpected timer'), + ); + return { + repo: new exports.OctoKit('offline-test-token', params, { readonly: true }), + getIssue: (number = 1) => new exports.OctoKitIssue('offline-test-token', params, { number }, { readonly: true }), + requests, + }; +} + +function closed(event = 'closed', overrides = {}) { + return { event, created_at: timestamp, commit_id: 'abcdef0', commit_url: commitUrl, ...overrides }; +} + +function reference(number) { + return { + event: 'cross-referenced', + source: { issue: { number, pull_request: { url: `https://api.github.com/repos/microsoft/vscode-cpptools/pulls/${number}` } } }, + }; +} + +test('checked-in adapter JavaScript matches the locked TypeScript compiler', () => { + const fileName = path.join(__dirname, 'octokit.ts'); + const configPath = path.join(__dirname, '../tsconfig.json'); + const config = ts.readConfigFile(configPath, ts.sys.readFile); + assert.equal(config.error, undefined); + const parsed = ts.parseJsonConfigFileContent(config.config, ts.sys, path.dirname(configPath)); + assert.deepEqual(parsed.errors, []); + const generated = ts.transpileModule(fs.readFileSync(fileName, 'utf8'), { + fileName, + compilerOptions: parsed.options, + }).outputText; + const printer = ts.createPrinter({ removeComments: true, newLine: ts.NewLineKind.LineFeed }); + const normalize = (text) => printer.printFile(ts.createSourceFile('octokit.js', text, ts.ScriptTarget.ES2019, true, ts.ScriptKind.JS)); + assert.equal(normalize(source), normalize(generated)); +}); + +test('getIssue normalizes the current issue response, including duplicate state reasons', async () => { + const data = issue(); + const result = await adapter({ issues: { 1: data } }).getIssue().getIssue(); + assert.deepEqual(result, { + author: { name: 'author', isGitHubApp: false }, + body: 'Issue body', + number: 1, + title: 'Issue title', + isPr: false, + labels: ['bug', 'triage', ''], + open: false, + locked: false, + numComments: 2, + reactions: data.reactions, + assignee: 'first', + assignees: ['first', 'second'], + milestone: null, + createdAt: Date.parse(timestamp), + updatedAt: Date.parse(timestamp), + closedAt: Date.parse(timestamp), + }); +}); + +test('getIssue preserves nullable fields and milestone date normalization', async () => { + const data = issue({ + user: null, body: null, assignees: null, assignee: { login: 'assigned' }, closed_at: null, + state: 'open', pull_request: { html_url: 'https://github.com/microsoft/vscode-cpptools/pull/1' }, + milestone: { + number: 7, title: 'Milestone', created_at: timestamp, due_on: timestamp, closed_at: null, + description: null, closed_issues: 2, open_issues: 3, state: 'open', + }, + }); + const result = await adapter({ issues: { 1: data } }).getIssue().getIssue(); + assert.deepEqual(result.author, { name: 'unkown', isGitHubApp: false }); + assert.equal(result.body, ''); + assert.equal(result.assignee, 'assigned'); + assert.deepEqual(result.assignees, []); + assert.equal(result.closedAt, undefined); + assert.equal(result.open, true); + assert.equal(result.isPr, true); + assert.deepEqual(result.milestone, { + title: 'Milestone', milestoneId: 7, createdAt: new Date('2026-01-02'), dueOn: new Date('2026-01-02'), + closedAt: null, description: '', numClosedIssues: 2, numOpenIssues: 3, state: 'open', + }); +}); + +test('query accepts search responses with broader state reasons', async () => { + const data = issue({ state_reason: 'search-specific-reason' }); + const fixture = adapter({ search: [[data]] }); + const pages = []; + for await (const page of fixture.repo.query({ q: 'is:issue' })) pages.push(page); + assert.equal(pages.length, 1); + assert.equal(pages[0].length, 1); + assert.equal((await pages[0][0].getIssue()).number, 1); + assert.equal(fixture.requests[0][0], 'search'); +}); + +test('getAssigner keeps the last matching actor in the first matching page', async () => { + const assigned = (login, actor, event = 'assigned') => ({ event, assignee: { login }, actor: { login: actor } }); + const fixture = adapter({ + timelines: { + 1: [ + [{ event: 'committed', sha: 'abcdef0' }, assigned('other', 'ignored'), assigned('target', 'ignored', 'unassigned')], + [assigned('target', 'first'), assigned('target', 'last')], + [assigned('target', 'unvisited')], + ] + } + }); + assert.equal(await fixture.getIssue().getAssigner('target'), 'last'); + assert.deepEqual(fixture.requests, [['timeline', 1, 0], ['timeline', 1, 1]]); +}); + +test('getAssigner rejects timelines without a matching actor', async () => { + const fixture = adapter({ + timelines: { + 1: [[ + { event: 'assigned' }, { event: 'assigned', assignee: { login: 'target' }, actor: null }, + { event: 'reviewed', body: 'review' }, + ]] + } + }); + await assert.rejects(fixture.getIssue().getAssigner('target'), /Expected to find target in issue timeline/); +}); + +for (const event of ['closed', 'merged']) { + test(`getClosingInfo accepts ${event} commits from the same repository`, async () => { + const fixture = adapter({ timelines: { 1: [[closed(event, { commit_url: commitUrl.toUpperCase() })]] } }); + assert.deepEqual(await fixture.getIssue().getClosingInfo(), { hash: 'abcdef0', timestamp: Date.parse(timestamp) }); + }); +} + +test('getClosingInfo ignores unrelated, incomplete and foreign-repository events', async () => { + const fixture = adapter({ + timelines: { + 1: [[ + { event: 'committed', sha: 'abcdef0' }, { event: 'closed', created_at: timestamp, commit_id: 'abcdef0' }, + closed('closed', { created_at: '' }), closed('closed', { commit_id: null }), closed('closed', { commit_url: null }), + closed('closed', { commit_url: commitUrl.replace('/vscode-cpptools/', '/other/') }), closed('labeled'), + ]] + } + }); + assert.equal(await fixture.getIssue().getClosingInfo(), undefined); +}); + +test('reopening clears earlier closing information across pages', async () => { + const fixture = adapter({ timelines: { 1: [[closed()], [{ event: 'reopened' }]] } }); + assert.equal(await fixture.getIssue().getClosingInfo(), undefined); +}); + +test('a later close replaces earlier closing information', async () => { + const fixture = adapter({ timelines: { 1: [[closed(), { event: 'reopened' }], [closed('merged', { commit_id: '1234567' })]] } }); + assert.deepEqual(await fixture.getIssue().getClosingInfo(), { hash: '1234567', timestamp: Date.parse(timestamp) }); +}); + +for (const body of ['/closedWith abcdef0', '\\closedWith abcdef0', '/closedWith https://github.com/microsoft/vscode/commit/abcdef0']) { + test(`getClosingInfo honors ${body}`, async () => { + const fixture = adapter({ timelines: { 1: [[{ event: 'commented', created_at: timestamp, body }]] } }); + assert.deepEqual(await fixture.getIssue().getClosingInfo(), { hash: 'abcdef0', timestamp: Date.parse(timestamp) }); + }); +} + +test('empty, suppressed and non-comment bodies do not overwrite closing information', async () => { + const comments = [undefined, null, '', 'ordinary comment', 'UNABLE_TO_LOCATE_COMMIT_MESSAGE /closedWith 1234567']; + const fixture = adapter({ + timelines: { + 1: [[ + closed(), ...comments.map((body) => ({ event: 'commented', created_at: timestamp, body })), + { event: 'commented', body: '/closedWith 1234567' }, + { event: 'reviewed', created_at: timestamp, body: '/closedWith 1234567' }, + ]] + } + }); + assert.deepEqual(await fixture.getIssue().getClosingInfo(), { hash: 'abcdef0', timestamp: Date.parse(timestamp) }); +}); + +test('open issues and already-checked issues do not read timelines', async () => { + const fixture = adapter({ issues: { 1: issue({ state: 'open' }) } }); + assert.equal(await fixture.getIssue().getClosingInfo([1]), undefined); + assert.deepEqual(fixture.requests, []); + assert.equal(await fixture.getIssue().getClosingInfo(), undefined); + assert.deepEqual(fixture.requests, [['get', 1]]); +}); + +test('linked pull requests are checked newest first', async () => { + const fixture = adapter({ + issues: { 1: issue(), 2: issue({ number: 2 }), 3: issue({ number: 3 }) }, + timelines: { 1: [[reference(2), reference(3)]], 2: [[closed()]], 3: [[closed('merged', { commit_id: '1234567' })]] }, + }); + assert.deepEqual(await fixture.getIssue().getClosingInfo(), { hash: '1234567', timestamp: Date.parse(timestamp) }); + assert.equal(fixture.requests.some(([kind, number]) => kind === 'get' && number === 2), false); +}); + +for (const offset of [-5000, -4999, 4999, 5000]) { + test(`linked closing timestamps preserve the five-second boundary (${offset}ms)`, async () => { + const linkedTime = Date.parse(timestamp) + offset; + const fixture = adapter({ + issues: { 1: issue(), 2: issue({ number: 2 }) }, + timelines: { 1: [[reference(2)]], 2: [[closed('merged', { created_at: new Date(linkedTime).toISOString() })]] }, + }); + assert.deepEqual(await fixture.getIssue().getClosingInfo(), Math.abs(offset) < 5000 ? { hash: 'abcdef0', timestamp: linkedTime } : undefined); + }); +} + +test('cyclic cross references terminate without rereading the original issue', async () => { + const fixture = adapter({ issues: { 1: issue(), 2: issue({ number: 2 }) }, timelines: { 1: [[reference(2)]], 2: [[reference(1)]] } }); + assert.equal(await fixture.getIssue().getClosingInfo(), undefined); + assert.deepEqual(fixture.requests.filter(([kind]) => kind === 'get'), [['get', 1], ['get', 2]]); +}); diff --git a/.github/actions/api/octokit.ts b/.github/actions/api/octokit.ts index 69bfea29d..bf400b389 100644 --- a/.github/actions/api/octokit.ts +++ b/.github/actions/api/octokit.ts @@ -6,7 +6,7 @@ import { getOctokit } from '@actions/github'; import type { RequestError } from '@octokit/request-error'; import { exec } from 'child_process'; -import { IssueGetResponse, IssuesGetResponseMilestone } from '../common/OctokitTypings'; +import { IssueGetResponse, IssueSearchResult, IssuesGetResponseMilestone } from '../common/OctokitTypings'; import { safeLog } from '../common/utils'; import { Comment, GitHub, GitHubIssue, Issue, Milestone, Query, User } from './api'; @@ -83,7 +83,7 @@ export class OctoKit implements GitHub { if (!this.options.readonly) await this.octokit.rest.issues.create({ owner, repo, title, body }); } - protected octokitIssueToIssue(issue: IssueGetResponse): Issue { + protected octokitIssueToIssue(issue: IssueGetResponse | IssueSearchResult): Issue { return { author: { name: issue.user?.login ?? 'unkown', isGitHubApp: issue.user?.type === 'Bot' }, body: issue.body ?? '', @@ -95,8 +95,8 @@ export class OctoKit implements GitHub { locked: (issue as any).locked, numComments: issue.comments, reactions: (issue as any).reactions, - assignee: issue.assignee?.login ?? (issue as IssueGetResponse).assignees?.[0]?.login, - assignees: (issue as IssueGetResponse).assignees?.map((assignee) => assignee.login) ?? [], + assignee: issue.assignee?.login ?? issue.assignees?.[0]?.login, + assignees: issue.assignees?.map((assignee) => assignee.login) ?? [], milestone: issue.milestone ? this.octokitMilestoneToMilestone(issue.milestone) : null, createdAt: +new Date(issue.created_at), updatedAt: +new Date(issue.updated_at), @@ -417,7 +417,11 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue { numRequests++; const timelineEvents = event.data; for (const timelineEvent of timelineEvents) { - if (timelineEvent.event === 'assigned' && timelineEvent.assignee?.login === assignee) { + if ( + timelineEvent.event === 'assigned' && + 'assignee' in timelineEvent && + timelineEvent.assignee?.login === assignee + ) { assigner = timelineEvent.actor?.login; } } @@ -483,6 +487,7 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue { for (const timelineEvent of timelineEvents) { if ( (timelineEvent.event === 'closed' || timelineEvent.event === 'merged') && + 'commit_url' in timelineEvent && timelineEvent.created_at && timelineEvent.commit_id && timelineEvent.commit_url @@ -498,13 +503,16 @@ export class OctoKitIssue extends OctoKit implements GitHubIssue { closingCommit = undefined; } if ( - timelineEvent.created_at && timelineEvent.event === 'commented' && - !((timelineEvent as any).body as string)?.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE') && - closingHashComment.test((timelineEvent as any).body) + 'created_at' in timelineEvent && + timelineEvent.created_at && + 'body' in timelineEvent && + timelineEvent.body && + !timelineEvent.body.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE') && + closingHashComment.test(timelineEvent.body) ) { closingCommit = { - hash: closingHashComment.exec((timelineEvent as any).body)![1], + hash: closingHashComment.exec(timelineEvent.body)![1], timestamp: +new Date(timelineEvent.created_at), }; } diff --git a/.github/actions/common/OctokitTypings.ts b/.github/actions/common/OctokitTypings.ts index 2750a9066..77371dd58 100644 --- a/.github/actions/common/OctokitTypings.ts +++ b/.github/actions/common/OctokitTypings.ts @@ -3,14 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import type { RestEndpointMethodTypes } from '@octokit/rest'; +import type { getOctokit } from '@actions/github'; + +type Rest = ReturnType['rest']; // This file is just to re-export some octokit types as nicer names export type ActionsListWorkflowRunsResponseWorkflowRunsItem = - RestEndpointMethodTypes['actions']['listWorkflowRuns']['response']['data']['workflow_runs'][0]; + Awaited>['data']['workflow_runs'][0]; + +export type IssueGetResponse = Awaited>['data']; -export type IssueGetResponse = RestEndpointMethodTypes['issues']['get']['response']['data']; +export type IssueSearchResult = + Awaited>['data']['items'][0]; -export type IssuesGetResponseMilestone = - RestEndpointMethodTypes['issues']['get']['response']['data']['milestone']; +export type IssuesGetResponseMilestone = IssueGetResponse['milestone']; diff --git a/.github/actions/package.json b/.github/actions/package.json index bc6e51e8e..94f0ff644 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -5,6 +5,8 @@ "scripts": { "build": "tsc", "lint": "eslint --fix .", + "test": "node --test", + "typecheck": "tsc --noEmit", "watch": "tsc --watch" }, "keywords": [], diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml new file mode 100644 index 000000000..1bbcfb93c --- /dev/null +++ b/.github/workflows/ci_actions.yml @@ -0,0 +1,44 @@ +name: CI (Actions) + +on: + push: + branches: [main] + paths: + - ".github/actions/**" + - ".github/workflows/ci_actions.yml" + pull_request: + branches: [main, release, insiders] + paths: + - ".github/actions/**" + - ".github/workflows/ci_actions.yml" + +permissions: + contents: read + +jobs: + test: + name: Typecheck and test Actions + runs-on: ubuntu-24.04 + timeout-minutes: 10 + defaults: + run: + working-directory: .github/actions + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Use Node.js 24 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 24 + + - name: Install Actions dependencies + run: npm ci --include=dev --ignore-scripts --no-fund + + - name: Typecheck Actions + run: npm run typecheck + + - name: Test Actions + run: npm test From 63d00c60cf05aca3d92d5684d2dc7e09fd4357ea Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Sep 2026 12:36:00 -0700 Subject: [PATCH 10/29] Use locked VSCE installs and verify VSIX signatures (#14706) * Harden extension packaging verification * Restore base network allow policy for package pipelines * Supply release tooling through package artifacts --- Build/package/cpptools_extension_pack.yml | 4 +++- Build/package/cpptools_themes.yml | 4 +++- Build/package/jobs_package_vsix.yml | 24 ++++++++++++++++++----- Build/publish/jobs_publish_vsix.yml | 19 ++++++++++++++++-- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/Build/package/cpptools_extension_pack.yml b/Build/package/cpptools_extension_pack.yml index 0a7bc4511..1795e6058 100644 --- a/Build/package/cpptools_extension_pack.yml +++ b/Build/package/cpptools_extension_pack.yml @@ -32,7 +32,9 @@ extends: image: 1ESPT-Windows2025 os: windows settings: - networkIsolationPolicy: CFSClean,CFSClean2,CFSClean3 + # CFSClean* supplies deny rules only; a base allow policy is also needed + # for Azure DevOps authentication and package downloads. + networkIsolationPolicy: Permissive,CFSClean,CFSClean2,CFSClean3 stages: - stage: package diff --git a/Build/package/cpptools_themes.yml b/Build/package/cpptools_themes.yml index 75dcdc091..957e44dfa 100644 --- a/Build/package/cpptools_themes.yml +++ b/Build/package/cpptools_themes.yml @@ -32,7 +32,9 @@ extends: image: 1ESPT-Windows2025 os: windows settings: - networkIsolationPolicy: CFSClean,CFSClean2,CFSClean3 + # CFSClean* supplies deny rules only; a base allow policy is also needed + # for Azure DevOps authentication and package downloads. + networkIsolationPolicy: Permissive,CFSClean,CFSClean2,CFSClean3 stages: - stage: package diff --git a/Build/package/jobs_package_vsix.yml b/Build/package/jobs_package_vsix.yml index 9afc446eb..db94633d8 100644 --- a/Build/package/jobs_package_vsix.yml +++ b/Build/package/jobs_package_vsix.yml @@ -29,6 +29,10 @@ jobs: displayName: '${{ parameters.vsixName }}.vsix' targetPath: $(Build.ArtifactStagingDirectory)\vsix artifactName: vsix + - output: pipelineArtifact + displayName: Locked VSCE dependencies + targetPath: $(Build.ArtifactStagingDirectory)\vsce + artifactName: vsce steps: - checkout: self @@ -48,9 +52,9 @@ jobs: script: | export SRC_DIR=$(echo $BUILD_SOURCESDIRECTORY | sed 's|\\|/|g') cd "$SRC_DIR/${{ parameters.srcDir }}" - npm install + npm ci --include=dev --include=optional if [ $? -ne 0 ]; then - echo "npm install failed, sleeping for 30s before retrying..." + echo "npm ci failed, sleeping for 30s before retrying..." sleep 30 exit 1 fi @@ -59,9 +63,15 @@ jobs: - script: mkdir $(Build.ArtifactStagingDirectory)\vsix displayName: Create Staging Directory - - script: npm install --no-save --ignore-scripts=false --include=optional --force @vscode/vsce@4.0.0 - displayName: Install vsce - workingDirectory: $(Build.SourcesDirectory)\${{ parameters.srcDir }} + - task: CopyFiles@2 + displayName: Stage locked VSCE dependencies for publishing + inputs: + SourceFolder: $(Build.SourcesDirectory)\${{ parameters.srcDir }} + Contents: | + package.json + package-lock.json + .npmrc + TargetFolder: $(Build.ArtifactStagingDirectory)\vsce - script: npm rebuild @vscode/vsce-sign --ignore-scripts=false displayName: Rebuild vsce-sign binary @@ -93,3 +103,7 @@ jobs: inputs: solution: $(Build.SourcesDirectory)\Build\signing\SignVsix.proj msbuildArguments: /p:SignType=${{ parameters.signType }} + + - script: npx vsce verify-signature -i $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.vsix -m $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.manifest -s $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.signature.p7s + displayName: Verify VSIX signature + workingDirectory: $(Build.SourcesDirectory)\${{ parameters.srcDir }} diff --git a/Build/publish/jobs_publish_vsix.yml b/Build/publish/jobs_publish_vsix.yml index 6f12522ca..097d31921 100644 --- a/Build/publish/jobs_publish_vsix.yml +++ b/Build/publish/jobs_publish_vsix.yml @@ -14,6 +14,10 @@ jobs: pipeline: vsixBuild artifactName: vsix targetPath: $(Build.StagingDirectory)\vsix + - input: pipelineArtifact + pipeline: vsixBuild + artifactName: vsce + targetPath: $(Build.StagingDirectory)\vsce steps: - task: NodeTool@0 @@ -21,6 +25,9 @@ jobs: inputs: versionSpec: 22.x + - script: IF EXIST %SYSTEMDRIVE%\Users\%USERNAME%\.npmrc del %SYSTEMDRIVE%\Users\%USERNAME%\.npmrc + displayName: Delete .npmrc if it exists + - task: AzureCLI@2 displayName: Generate AAD_TOKEN inputs: @@ -31,16 +38,24 @@ jobs: $aadToken = az account get-access-token --query accessToken --resource $(AzureGuid) -o tsv Write-Host "##vso[task.setvariable variable=AAD_TOKEN;issecret=true]$aadToken" - - script: npm install --no-save --ignore-scripts=false --include=optional --force @vscode/vsce@4.0.0 - displayName: Install vsce + - script: npm ci --include=dev --include=optional + displayName: Install dependencies + workingDirectory: $(Build.StagingDirectory)\vsce - script: npm rebuild @vscode/vsce-sign --ignore-scripts=false displayName: Rebuild vsce-sign binary + workingDirectory: $(Build.StagingDirectory)\vsce - script: if not exist node_modules\@vscode\vsce-sign\bin\vsce-sign.exe (echo Missing vsce-sign.exe && exit 1) displayName: Verify vsce-sign binary exists + workingDirectory: $(Build.StagingDirectory)\vsce + + - script: npx vsce verify-signature -i $(Build.StagingDirectory)\vsix\${{ parameters.vsixName }}.vsix -m $(Build.StagingDirectory)\vsix\${{ parameters.vsixName }}.manifest -s $(Build.StagingDirectory)\vsix\${{ parameters.vsixName }}.signature.p7s + displayName: Verify VSIX signature + workingDirectory: $(Build.StagingDirectory)\vsce - script: npx vsce publish --skip-duplicate -i $(Build.StagingDirectory)\vsix\${{ parameters.vsixName }}.vsix --manifestPath $(Build.StagingDirectory)\vsix\${{ parameters.vsixName }}.manifest --signaturePath $(Build.StagingDirectory)\vsix\${{ parameters.vsixName }}.signature.p7s displayName: Publish to Marketplace + workingDirectory: $(Build.StagingDirectory)\vsce env: VSCE_PAT: $(AAD_TOKEN) From 2473d572894020d403953b30206cefa48eadcf6e Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Sep 2026 15:13:04 -0700 Subject: [PATCH 11/29] Update localization and fix translations (#14790) * Localization - Translated Strings * Fix localization translation errors * Fix Czech process filter sentence punctuation * Address localization review feedback --------- Co-authored-by: csigs --- Extension/i18n/chs/package.i18n.json | 3 +- .../chs/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/chs/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/chs/ui/settings.html.i18n.json | 2 -- Extension/i18n/cht/package.i18n.json | 3 +- .../cht/src/Debugger/processFilter.i18n.json | 8 +++++ .../cht/src/LanguageServer/devcmd.i18n.json | 2 +- .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/cht/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/cht/ui/settings.html.i18n.json | 2 -- Extension/i18n/csy/package.i18n.json | 3 +- .../csy/src/Debugger/processFilter.i18n.json | 8 +++++ .../csy/src/LanguageServer/client.i18n.json | 2 +- .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/csy/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/csy/ui/settings.html.i18n.json | 2 -- Extension/i18n/deu/package.i18n.json | 31 ++++++++++--------- .../deu/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/deu/src/nativeStrings.i18n.json | 6 ++-- Extension/i18n/deu/ui/settings.html.i18n.json | 2 -- Extension/i18n/esn/package.i18n.json | 3 +- .../esn/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/esn/src/nativeStrings.i18n.json | 6 ++-- Extension/i18n/esn/ui/settings.html.i18n.json | 2 -- Extension/i18n/fra/package.i18n.json | 3 +- .../fra/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/fra/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/fra/ui/settings.html.i18n.json | 2 -- Extension/i18n/ita/package.i18n.json | 5 +-- .../ita/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/ita/src/nativeStrings.i18n.json | 14 +++++---- Extension/i18n/ita/ui/settings.html.i18n.json | 2 -- Extension/i18n/jpn/package.i18n.json | 3 +- .../jpn/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/jpn/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/jpn/ui/settings.html.i18n.json | 2 -- Extension/i18n/kor/package.i18n.json | 3 +- .../kor/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/kor/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/kor/ui/settings.html.i18n.json | 2 -- Extension/i18n/plk/package.i18n.json | 3 +- .../plk/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/plk/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/plk/ui/settings.html.i18n.json | 2 -- Extension/i18n/ptb/package.i18n.json | 3 +- .../ptb/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/ptb/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/ptb/ui/settings.html.i18n.json | 2 -- Extension/i18n/rus/package.i18n.json | 3 +- .../rus/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/rus/src/nativeStrings.i18n.json | 4 ++- Extension/i18n/rus/ui/settings.html.i18n.json | 2 -- Extension/i18n/trk/package.i18n.json | 3 +- .../trk/src/Debugger/processFilter.i18n.json | 8 +++++ .../src/LanguageServer/extension.i18n.json | 5 +++ .../i18n/trk/src/nativeStrings.i18n.json | 6 ++-- Extension/i18n/trk/ui/settings.html.i18n.json | 2 -- 67 files changed, 259 insertions(+), 77 deletions(-) create mode 100644 Extension/i18n/chs/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/cht/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/csy/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/deu/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/esn/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/fra/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/ita/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/jpn/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/kor/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/plk/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/ptb/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/rus/src/Debugger/processFilter.i18n.json create mode 100644 Extension/i18n/trk/src/Debugger/processFilter.i18n.json diff --git a/Extension/i18n/chs/package.i18n.json b/Extension/i18n/chs/package.i18n.json index ab4cb058e..88ef47af1 100644 --- a/Extension/i18n/chs/package.i18n.json +++ b/Extension/i18n/chs/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "安装 C++ 编译器", "c_cpp.command.rescanCompilers.title": "重新扫描编译器", "c_cpp.command.switchHeaderSource.title": "切换标头/源", + "c_cpp.command.selectTranslationUnit.title": "选择翻译单元...", "c_cpp.command.enableErrorSquiggles.title": "启用错误波形曲线", "c_cpp.command.disableErrorSquiggles.title": "禁用错误波形曲线", "c_cpp.command.toggleDimInactiveRegions.title": "切换非活动区域着色", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "控制扩展是否将报告在 `c_cpp_properties.json` 中检测到的错误。", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "未设置 `customConfigurationVariables` 时要在配置中使用的值,或 `${default}` 在 `customConfigurationVariables` 中作为键存在时要插入的值。", "c_cpp.configuration.default.dotConfig.markdownDescription": "`dotConfig` 未指定或设置为 `${default}` 时要在配置中使用的值。", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "`recursiveIncludes.reduce` 未指定或设置为 `${default}` 时要在配置中使用的值。", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "`recursiveIncludes.priority` 未指定或设置为 `${default}` 时要在配置中使用的值。", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "`recursiveIncludes.order` 未指定或设置为 `${default}` 时要在配置中使用的值。", "c_cpp.configuration.experimentalFeatures.description": "控制“实验性”功能是否可用。", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "如果为 true,则禁用集成终端支持所需的调试对象控制台重定向。", "c_cpp.debuggers.sourceFileMap.markdownDescription": "传递到调试引擎的可选源文件映射。示例: `{ \"<原始源路径>\": \"<当前源路径>\" }`。", "c_cpp.debuggers.processId.anyOf.markdownDescription": "要将调试程序附加到的可选进程 ID。使用 `${command:pickProcess}` 获取要附加到的本地运行进程的列表。请注意,一些平台需要管理员权限才能附加到进程。", + "c_cpp.debuggers.processFilter.description": "可选正则表达式,用于按标签、描述或详细信息匹配远程附加候选项。如果恰好匹配一个进程,调试程序会自动附加。如果匹配多个进程,则进程选取器仅显示匹配的条目。如果没有进程匹配,则显示完整的进程选取器。如果正则表达式无效,会报告错误。", "c_cpp.debuggers.program.attach.markdownDescription": "程序可执行文件的完整路径。调试器将搜索与此可执行文件路径匹配的正在运行的进程并附加到该进程。如果多个进程匹配,将显示选择提示。加载附加进程的调试符号需要此字段。", "c_cpp.debuggers.symbolSearchPath.description": "用于搜索符号(即 pdb 或 .so)文件的目录的分号分隔列表。示例: \"c:\\dir1;c:\\dir2\"。", "c_cpp.debuggers.dumpPath.description": "指定程序的转储文件的可选完整路径。例如: \"c:\\temp\\app.dmp\"。默认为 null。", diff --git a/Extension/i18n/chs/src/Debugger/processFilter.i18n.json b/Extension/i18n/chs/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..11139e58b --- /dev/null +++ b/Extension/i18n/chs/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "{0} 正则表达式无效: {1}" +} diff --git a/Extension/i18n/chs/src/LanguageServer/extension.i18n.json b/Extension/i18n/chs/src/LanguageServer/extension.i18n.json index 2696c4998..5411e85d0 100644 --- a/Extension/i18n/chs/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/chs/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "了解如何使用 vcpkg 为此标头安装库", "copy.vcpkg.command": "将用于安装“{0}”的 vcpkg 命令复制到剪贴板", "on.disabled.command": "当 `C_Cpp.intelliSenseEngine` 设置为 `disabled` 时,无法执行与 IntelliSense 相关的命令。", + "find.translation.units": "正在查找翻译单元...", + "no.translation.units.found": "未找到活动文件的翻译单元。", + "current.translation.unit": "当前翻译单元", + "select.translation.unit": "选择翻译单元", + "select.translation.unit.placeholder": "选择一个源文件作为翻译单元", "switch.header.source": "正在切换标头/源...", "client.not.found": "未找到客户端", "ok": "确定", diff --git a/Extension/i18n/chs/src/nativeStrings.i18n.json b/Extension/i18n/chs/src/nativeStrings.i18n.json index 95a4af0aa..0aa8a01b9 100644 --- a/Extension/i18n/chs/src/nativeStrings.i18n.json +++ b/Extension/i18n/chs/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "等待 {0} 分析完成时超时", "failed_to_open_browse_db_lock_file": "未能打开浏览数据库锁定文件: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "未能锁定浏览数据库锁定文件: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "浏览数据库已禁用,因为其存储位置不支持 SQLite WAL 共享内存。将 browse.databaseFilename 设置为本地路径。" + "browse_database_disabled_incompatible_storage": "浏览数据库已禁用,因为其存储位置不支持 SQLite WAL 共享内存。将 browse.databaseFilename 设置为本地路径。", + "selected_translation_unit_not_include_file_previous": "所选翻译单元“{0}”不包含“{1}”。如果之前的翻译单元仍然可用,IntelliSense 将还原它;否则,将使用“{1}”作为仅包含头文件的翻译单元。", + "selected_translation_unit_not_include_file_header_only": "所选翻译单元“{0}”不包含“{1}”。没有可用的之前的翻译单元,因此 IntelliSense 将使用“{1}”作为仅包含头文件的翻译单元。" } diff --git a/Extension/i18n/chs/ui/settings.html.i18n.json b/Extension/i18n/chs/ui/settings.html.i18n.json index 9aacbe225..a6ec13952 100644 --- a/Extension/i18n/chs/ui/settings.html.i18n.json +++ b/Extension/i18n/chs/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "如果为 {0} (或已勾选),则标记分析器将仅分析在 {1} 中由源文件直接或间接包含的代码文件。如果为 {2} (或未选中),标记分析器将分析在 {3} 列表内指定路径中找到的所有代码文件。", "database.filename": "浏览: 数据库文件名", "database.filename.description": "所生成的符号数据库的路径。这指示扩展将标记分析器的符号数据库保存在工作区默认存储位置以外的其他位置。如果指定了相对路径,则它将相对于工作区的默认存储位置(而不是工作区文件夹本身)。{0} 变量可用于指定相对于工作区文件夹的路径(例如 {1})。", - "recursiveIncludes.reduce": "递归包括: 缩减", - "recursiveIncludes.reduce.description": "设置为 {0} 可将提供给 IntelliSense 的递归包含路径数减少到仅限当前由 #include 语句引用的路径。这需要首先分析文件以确定包含哪些文件。设置为 {1} 可将所有递归包含路径提供给 IntelliSense。当涉及到大量递归包含路径时,减少递归包含路径的数量可能会提高 IntelliSense 性能。如果不减少递归包含路径的数量,则可以通过避免需要分析文件以确定要提供的包含路径来提高 IntelliSense 性能。", "recursiveIncludes.priority": "递归包括: 优先级", "recursiveIncludes.priority.description": "递归包含路径的优先级。如果设置为 {0},则将在系统包含路径之前搜索递归包含路径。如果设置为 {1},则将在系统包含路径之后搜索递归包含路径。", "recursiveIncludes.order": "递归包括: 顺序", diff --git a/Extension/i18n/cht/package.i18n.json b/Extension/i18n/cht/package.i18n.json index 995ff4dea..760e1f119 100644 --- a/Extension/i18n/cht/package.i18n.json +++ b/Extension/i18n/cht/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "安裝 C++ 編譯器", "c_cpp.command.rescanCompilers.title": "掃描編譯器", "c_cpp.command.switchHeaderSource.title": "切換標頭/來源", + "c_cpp.command.selectTranslationUnit.title": "選取翻譯單位...", "c_cpp.command.enableErrorSquiggles.title": "啟用錯誤波浪線", "c_cpp.command.disableErrorSquiggles.title": "停用錯誤波浪線", "c_cpp.command.toggleDimInactiveRegions.title": "切換非使用中的區域著色", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "控制延伸模組是否會回報 `c_cpp_properties.json` 中偵測到的錯誤。", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "當未設定 `customConfigurationVariables` 時要在組態中使用的值,或當 `${default}` 在 `customConfigurationVariables` 中顯示為索引鍵時要插入的值。", "c_cpp.configuration.default.dotConfig.markdownDescription": "當 `dotConfig` 未指定或設定為 `${default}` 時,要在組態中使用的值。", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "當 `recursiveIncludes.reduce` 未指定或設定為 `${default}` 時,要在組態中使用的值。", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "當 `recursiveIncludes.priority` 未指定或設定為 `${default}` 時,要在組態中使用的值。", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "當 `recursiveIncludes.order` 未指定或設定為 `${default}` 時,要在組態中使用的值。", "c_cpp.configuration.experimentalFeatures.description": "控制「實驗性」功能是否可用。", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "若為 true,則停用整合式終端機支援需要的偵錯項目主控台重新導向。", "c_cpp.debuggers.sourceFileMap.markdownDescription": "傳遞至偵錯引擎的選擇性來源檔案對應。範例: `{ \"<原始來源路徑>\": \"<目前來源路徑>\" }`。", "c_cpp.debuggers.processId.anyOf.markdownDescription": "要附加偵錯工具的選擇性處理序識別碼。使用 `${command:pickProcess}` 可取得要附加的本機執行中處理序清單。請注意,某些平台需要系統管理員權限才能附加至處理序。", + "c_cpp.debuggers.processFilter.description": "用於依標籤、描述或詳細資料比對遠端附加候選項的選用規則運算式。如果只有一個處理序符合,偵錯工具就會自動附加。如果有多個處理序符合,系統只會顯示符合的項目供您選取。如果沒有處理序符合,則會顯示完整的處理序選擇器。無效的規則運算式會回報錯誤。", "c_cpp.debuggers.program.attach.markdownDescription": "程式可執行檔的完整路徑。偵錯工具會搜尋符合此可執行路徑的執行中處理序,並連結至該處理序。如果有多個處理序相符,將會顯示選取提示。這是載入已連結處理序之偵錯符號的必要欄位。", "c_cpp.debuggers.symbolSearchPath.description": "要用於搜尋符號 (即 pdb 或 .so) 檔案的目錄清單 (以分號分隔)。範例: \"c:\\dir1;c:\\dir2\"。", "c_cpp.debuggers.dumpPath.description": "指定程式之傾印檔案的選擇性完整路徑。範例: \"c:\\temp\\app.dmp\"。預設為 null。", diff --git a/Extension/i18n/cht/src/Debugger/processFilter.i18n.json b/Extension/i18n/cht/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..30188a913 --- /dev/null +++ b/Extension/i18n/cht/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "無效的 {0} 規則運算式: {1}" +} diff --git a/Extension/i18n/cht/src/LanguageServer/devcmd.i18n.json b/Extension/i18n/cht/src/LanguageServer/devcmd.i18n.json index 2d59ab5c9..4c31da49a 100644 --- a/Extension/i18n/cht/src/LanguageServer/devcmd.i18n.json +++ b/Extension/i18n/cht/src/LanguageServer/devcmd.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "no.context.provided": "未提供內容", - "not.windows": "“設定 Visual Studio 開發人員環境”命令僅可在 Windows 使用", + "not.windows": "\"設定 Visual Studio 開發人員環境\" 命令僅可在 Windows 使用", "error.no.vs": "找不到包含 C++ 編譯器的 Visual Studio 安裝", "operation.cancelled": "作業已取消", "no.hosts": "找不到主機", diff --git a/Extension/i18n/cht/src/LanguageServer/extension.i18n.json b/Extension/i18n/cht/src/LanguageServer/extension.i18n.json index 39f58c2c5..8dbbc337f 100644 --- a/Extension/i18n/cht/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/cht/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "了解如何使用 vcpkg 安裝此標頭的程式庫", "copy.vcpkg.command": "將用於安裝 '{0}' 的 vcpkg 命令複製到剪貼簿", "on.disabled.command": "當 `C_Cpp.intelliSenseEngine` 設為 `disabled` 時,無法執行IntelliSense 的相關命令。", + "find.translation.units": "正在尋找翻譯單位...", + "no.translation.units.found": "找不到目前檔案的任何翻譯單位。", + "current.translation.unit": "目前翻譯單位", + "select.translation.unit": "選取翻譯單位", + "select.translation.unit.placeholder": "選取要用作翻譯單位的來源檔案", "switch.header.source": "正在切換標頭/來源...", "client.not.found": "找不到用戶端", "ok": "確定", diff --git a/Extension/i18n/cht/src/nativeStrings.i18n.json b/Extension/i18n/cht/src/nativeStrings.i18n.json index 9416ae386..95617a500 100644 --- a/Extension/i18n/cht/src/nativeStrings.i18n.json +++ b/Extension/i18n/cht/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "等候 {0} 的分析完成時逾時", "failed_to_open_browse_db_lock_file": "無法開啟瀏覽資料庫鎖定檔案: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "無法鎖定瀏覽資料庫鎖定檔案: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "瀏覽資料庫已停用,因為其儲存位置不支援 SQLite WAL 共用記憶體。請將 browse.databaseFilename 設定為本機路徑。" + "browse_database_disabled_incompatible_storage": "瀏覽資料庫已停用,因為其儲存位置不支援 SQLite WAL 共用記憶體。請將 browse.databaseFilename 設定為本機路徑。", + "selected_translation_unit_not_include_file_previous": "選取的編譯單位 '{0}' 不包含 '{1}'。如果先前的編譯單位仍然可用,IntelliSense 將會還原;否則,它會使用 '{1}' 作為僅標頭的編譯單位。", + "selected_translation_unit_not_include_file_header_only": "所選的編譯單位 '{0}' 不包含 '{1}'。沒有可用的先前編譯單位,因此 IntelliSense 會將 '{1}' 當做僅標頭的編譯單位使用。" } diff --git a/Extension/i18n/cht/ui/settings.html.i18n.json b/Extension/i18n/cht/ui/settings.html.i18n.json index da1b9e38e..442ec872f 100644 --- a/Extension/i18n/cht/ui/settings.html.i18n.json +++ b/Extension/i18n/cht/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "若為 {0} (或已選取),標籤剖析器只會剖析 {1} 中原始程式檔直接或間接包含的程式碼檔。若為 {2} (或未選取),標籤剖析器會剖析在 {3} 清單中的指定路徑找到的所有程式碼檔。", "database.filename": "瀏覽: 資料庫檔案名稱", "database.filename.description": "產生符號資料庫路徑。這會指示延伸模組將標籤剖析器的符號資料庫儲存在工作區預設儲存位置以外的某處。如果指定了相對路徑,就會是相對於工作區預設儲存位置 (非工作區資料夾本身) 的路徑。{0} 變數可用於指定相對於工作區資料夾的路徑 (例如 {1})。", - "recursiveIncludes.reduce": "遞迴包含: 減少", - "recursiveIncludes.reduce.description": "設定為 {0},可使 IntelliSense 僅提供目前由 #include 陳述式參考的遞迴包含路徑。這需要先剖析檔案,以確定包含哪些檔案。設定為 {1} 以將所有遞迴包含路徑提供給 IntelliSense。當涉及非常大量的遞迴包含路徑時,減少遞迴包含路徑數目可能會改善 IntelliSense 的效能。不減少遞迴包含路徑的數量,可避免需要剖析檔案以決定要提供哪些包含路徑,從而 IntelliSense 效能。", "recursiveIncludes.priority": "遞迴包含: 優先順序", "recursiveIncludes.priority.description": "遞迴包含路徑的優先順序。如果設定為 {0},則會在系統包含路徑之前搜尋遞迴包含路徑。如果設定為 {1},則會在系統包含路徑之後搜尋遞迴包含路徑。", "recursiveIncludes.order": "遞迴包含: 順序", diff --git a/Extension/i18n/csy/package.i18n.json b/Extension/i18n/csy/package.i18n.json index d865f3bd4..14d8fb167 100644 --- a/Extension/i18n/csy/package.i18n.json +++ b/Extension/i18n/csy/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Instalace kompilátoru C++", "c_cpp.command.rescanCompilers.title": "Znovu prohledat kompilátory", "c_cpp.command.switchHeaderSource.title": "Přepnout hlavičku/zdroj", + "c_cpp.command.selectTranslationUnit.title": "Vyberte jednotku překladu...", "c_cpp.command.enableErrorSquiggles.title": "Povolit podtrhávání chyb vlnovkou", "c_cpp.command.disableErrorSquiggles.title": "Zakázat podtrhávání chyb vlnovkou", "c_cpp.command.toggleDimInactiveRegions.title": "Přepnout barvení neaktivních oblastí", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Určuje, jestli rozšíření ohlásí chyby zjištěné v souboru `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Hodnota, která se použije v konfiguraci, pokud se nenastaví `customConfigurationVariables`, nebo hodnoty, které se mají vložit, pokud se v `customConfigurationVariables` jako klíč nachází `${default}`.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Hodnota, která se použije v konfiguraci, pokud se nezadá `dotConfig` nebo pokud se nastaví na `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Hodnota, která se použije v konfiguraci, pokud se nezadá `recursiveIncludes.reduce` nebo pokud se nastaví na `${default}`", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Hodnota, která se použije v konfiguraci, pokud se nezadá `recursiveIncludes.priority` nebo pokud se nastaví na `${default}`", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Hodnota, která se použije v konfiguraci, pokud se nezadá `recursiveIncludes.order` nebo pokud se nastaví na `${default}`", "c_cpp.configuration.experimentalFeatures.description": "Určuje, jestli je možné použít experimentální funkce.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Pokud se nastaví na true, zakáže přesměrování konzoly laděného procesu, které se vyžaduje pro podporu integrovaného terminálu.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Ladicímu modulu se předala volitelná mapování zdrojových souborů. Příklad: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "Nepovinné ID procesu, ke kterému se má ladicí program připojit. Pokud chcete získat seznam místních spuštěných procesů, ke kterým se dá připojit, použijte `${command:pickProcess}`. Poznámka: Některé platformy vyžadují pro připojení k procesu oprávnění správce.", + "c_cpp.debuggers.processFilter.description": "Volitelný regulární výraz používaný k vyhledání kandidátů na vzdálené připojení podle popisku, popisu nebo podrobností. Pokud odpovídá právě jeden proces, ladicí program se připojí automaticky. Pokud odpovídá více procesů, zobrazí se výběr procesu pouze s odpovídajícími položkami. Pokud neodpovídá žádný proces, zobrazí se úplný výběr procesu. Neplatný regulární výraz způsobí chybu.", "c_cpp.debuggers.program.attach.markdownDescription": "Úplná cesta ke spustitelnému souboru programu. Ladicí program vyhledá spuštěný proces odpovídající této cestě spustitelného souboru a připojí se k němu. Pokud se více procesů shoduje, zobrazí se výzva k výběru. Toto pole se vyžaduje k načtení symbolů ladění pro připojený proces.", "c_cpp.debuggers.symbolSearchPath.description": "Seznam středníkem oddělených adresářů, ve kterých se budou hledat soubory symbolů (tj. soubory pdb nebo .so). Příklad: c:\\dir1;c:\\dir2.", "c_cpp.debuggers.dumpPath.description": "Volitelná úplná cesta k souboru výpisu pro zadaný program. Příklad: c:\\temp\\app.dmp. Výchozí hodnota je null.", diff --git a/Extension/i18n/csy/src/Debugger/processFilter.i18n.json b/Extension/i18n/csy/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..2b61cbe25 --- /dev/null +++ b/Extension/i18n/csy/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Neplatný regulární výraz {0}: {1}" +} diff --git a/Extension/i18n/csy/src/LanguageServer/client.i18n.json b/Extension/i18n/csy/src/LanguageServer/client.i18n.json index 12f00dbfc..68cd0c33b 100644 --- a/Extension/i18n/csy/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/csy/src/LanguageServer/client.i18n.json @@ -26,7 +26,7 @@ "loggingLevel.changed": "{0} se změnila na: {1}", "dismiss.button": "Zrušit", "disable.warnings.button": "Zakázat upozornění", - "unable.to.provide.configuration": "{0} nemůže poskytnout informace pro konfiguraci IntelliSense. Místo nich se použijí nastavení z konfigurace „{1}“.", + "unable.to.provide.configuration": "{0} nemůže poskytnout informace pro konfiguraci IntelliSense. Místo nich se použijí nastavení z konfigurace {1}.", "config.not.found": "Požadovaný název konfigurace se nenašel: {0}", "timed.out": "Po {0} ms vypršel časový limit.", "parsing.stats.large.project": "Byl zjištěn výčet {0} souborů s {1} zdrojovými soubory C/C++. Možná budete chtít zvážit vyloučení některých souborů pro zlepšení výkonu.", diff --git a/Extension/i18n/csy/src/LanguageServer/extension.i18n.json b/Extension/i18n/csy/src/LanguageServer/extension.i18n.json index 4ed8f1550..a92f1411e 100644 --- a/Extension/i18n/csy/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/csy/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Jak nainstalovat knihovnu pro tuto hlavičku pomocí vcpkg", "copy.vcpkg.command": "Zkopírovat příkaz vcpkg pro instalaci {0} do schránky", "on.disabled.command": "Příkazy související s IntelliSense se nedají spustit, když je `C_Cpp.intelliSenseEngine` nastavené na `disabled`.", + "find.translation.units": "Hledají se jednotky překladu...", + "no.translation.units.found": "Pro aktivní soubor nebyly nalezeny žádné jednotky překladu.", + "current.translation.unit": "Aktuální jednotka překladu", + "select.translation.unit": "Vybrat jednotku překladu", + "select.translation.unit.placeholder": "Vyberte zdrojový soubor, který se má použít jako jednotka překladu", "switch.header.source": "Přepínání záhlaví/zdroje...", "client.not.found": "klient se nenašel", "ok": "OK", diff --git a/Extension/i18n/csy/src/nativeStrings.i18n.json b/Extension/i18n/csy/src/nativeStrings.i18n.json index f4894bda8..2691adcaf 100644 --- a/Extension/i18n/csy/src/nativeStrings.i18n.json +++ b/Extension/i18n/csy/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "při čekání na dokončení analýzy souboru {0} vypršel časový limit", "failed_to_open_browse_db_lock_file": "Nepodařilo se otevřít soubor zámku databáze procházení: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Nepodařilo se uzamknout soubor zámku databáze procházení: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "Databáze procházení byla zakázána, protože její umístění úložiště nepodporuje sdílenou paměť SQLite WAL. Nastavte browse.databaseFilename na místní cestu." + "browse_database_disabled_incompatible_storage": "Databáze procházení byla zakázána, protože její umístění úložiště nepodporuje sdílenou paměť SQLite WAL. Nastavte browse.databaseFilename na místní cestu.", + "selected_translation_unit_not_include_file_previous": "Vybraná jednotka překladu '{0}' nezahrnuje '{1}'. IntelliSense obnoví předchozí jednotku překladu, pokud je stále k dispozici. V opačném případě použije '{1}' jako překladovou jednotku pouze pro záhlaví.", + "selected_translation_unit_not_include_file_header_only": "Vybraná jednotka překladu '{0}' neobsahuje '{1}'. Není k dispozici žádná předchozí jednotka překladu, takže IntelliSense použije '{1}' jako jednotku překladu jen pro hlavičku." } diff --git a/Extension/i18n/csy/ui/settings.html.i18n.json b/Extension/i18n/csy/ui/settings.html.i18n.json index 4d578a438..123f454ab 100644 --- a/Extension/i18n/csy/ui/settings.html.i18n.json +++ b/Extension/i18n/csy/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Když se nastaví na {0} (nebo zaškrtne), analyzátor značek bude parsovat jen soubory kódů, které přímo nebo nepřímo zahrnul zdrojový soubor v {1}. Když se nastaví na {2} (nebo nezaškrtne), analyzátor značek bude parsovat všechny soubory kódů nalezené na cestách zadaných v seznamu {3}.", "database.filename": "Procházení: název souboru databáze", "database.filename.description": "Cesta k vygenerované databázi symbolů. Na základě této možnosti bude rozšíření ukládat databázi symbolů analyzátoru značek někam jinam než do výchozího umístění úložiště pracovního prostoru. Pokud se zadá relativní cesta, bude relativní vzhledem k výchozímu umístění úložiště pracovního prostoru, nikoli k samotné složce pracovního prostoru. Pokud chcete zadat cestu relativní ke složce pracovního prostoru (třeba {1}), dá se použít proměnná {0}.", - "recursiveIncludes.reduce": "Rekurzivní soubory k zahrnutí: snížení", - "recursiveIncludes.reduce.description": "Nastavením na {0} se počet cest rekurzivních souborů k zahrnutí poskytovaných funkci IntelliSense vždy sníží pouze na ty cesty, na které aktuálně odkazují příkazy #include. K tomu je potřeba nejdříve analyzovat soubory a zjistit, které soubory jsou zahrnuty. Nastavením na {1} poskytnete funkci IntelliSense všechny cesty rekurzivních souborů k zahrnutí. Snížení počtu cest rekurzivních souborů k zahrnutí může zlepšit výkon funkce IntelliSense, pokud se jedná o velmi velký počet cest souborů k zahrnutí. Nesnižování počtu cest rekurzivních souborů k zahrnutí může zlepšit výkon funkce IntelliSense, protože se vyhnete nutnosti analyzovat soubory a určit, které cesty souborů k zahrnutí je třeba poskytnout.", "recursiveIncludes.priority": "Rekurzivní soubory k zahrnutí: priorita", "recursiveIncludes.priority.description": "Priorita cest rekurzivních souborů zahrnutí Pokud je nastavená hodnota {0}, budou se cesty rekurzivních souborů k zahrnutí prohledávat před cestami systémových souborů k zahrnutí. Pokud je nastavená hodnota {1}, budou se cesty rekurzivních souborů k zahrnutí prohledávat po cestách systémových souborů k zahrnutí.", "recursiveIncludes.order": "Rekurzivní soubory k zahrnutí: pořadí", diff --git a/Extension/i18n/deu/package.i18n.json b/Extension/i18n/deu/package.i18n.json index 4641d53a0..f5e5964a2 100644 --- a/Extension/i18n/deu/package.i18n.json +++ b/Extension/i18n/deu/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Installieren eines C++-Compilers", "c_cpp.command.rescanCompilers.title": "Erneut nach Compilern suchen", "c_cpp.command.switchHeaderSource.title": "Header/Quelle umschalten", + "c_cpp.command.selectTranslationUnit.title": "Übersetzungseinheit auswählen…", "c_cpp.command.enableErrorSquiggles.title": "Fehlerwellenlinien aktivieren", "c_cpp.command.disableErrorSquiggles.title": "Fehlerwellenlinien deaktivieren", "c_cpp.command.toggleDimInactiveRegions.title": "Farbgebung für inaktive Regionen umschalten", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Steuert, ob die Erweiterung in `c_cpp_properties.json` erkannte Fehler meldet.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Der Wert, der in einer Konfiguration verwendet werden soll, wenn `customConfigurationVariables` nicht festgelegt ist, oder die Werte, die eingefügt werden sollen, wenn `${default}` als Schlüssel in `customConfigurationVariables` vorhanden ist.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Der Wert, der in einer Konfiguration verwendet werden soll, wenn `dotConfig` entweder nicht angegeben oder auf `${default}` festgelegt ist.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Der Wert, der in einer Konfiguration verwendet werden soll, wenn `recursiveIncludes.reduce` entweder nicht angegeben oder auf `${default}` festgelegt ist.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Der Wert, der in einer Konfiguration verwendet werden soll, wenn `recursiveIncludes.priority` entweder nicht angegeben oder auf `${default}` festgelegt ist.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Der Wert, der in einer Konfiguration verwendet werden soll, wenn `recursiveIncludes.order` entweder nicht angegeben oder auf `${default}` festgelegt ist.", "c_cpp.configuration.experimentalFeatures.description": "Hiermit wird gesteuert, ob experimentelle Features verwendet werden können.", @@ -283,17 +283,17 @@ "c_cpp.debuggers.pipeTransport.pipeEnv.description": "Umgebungsvariablen, die an das Pipeprogramm übergeben werden.", "c_cpp.debuggers.pipeTransport.quoteArgs.description": "Gibt an, ob Anführungszeichen gesetzt werden sollen, wenn die einzelnen pipeProgram-Argumente Zeichen enthalten (z. B. Leerzeichen oder Tabstopps). Bei Einstellung auf \"false\" wird der Debuggerbefehl nicht mehr automatisch in Anführungszeichen gesetzt. Der Standardwert ist \"true\".", "c_cpp.debuggers.logging.description": "Optionale Flags zum Festlegen, welche Nachrichtentypen in der Debugging-Konsole protokolliert werden sollen.", - "c_cpp.debuggers.logging.exceptions.description": "Optionales Flag zum Festlegen, ob Ausnahmemeldungen in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist \"true\".", - "c_cpp.debuggers.logging.moduleLoad.description": "Optionales Flag zum Festlegen, ob Modulladeereignisse in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist \"true\".", - "c_cpp.debuggers.logging.programOutput.description": "Optionales Flag zum Festlegen, ob die Programmausgabe in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist \"true\".", - "c_cpp.debuggers.logging.engineLogging.description": "Optionales Flag zum Festlegen, ob Nachrichten der Diagnosedebug-Engine in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist \"false\".", - "c_cpp.debuggers.logging.trace.description": "Optionales Flag zum Festlegen, ob die Befehlsablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist \"false\".", - "c_cpp.debuggers.logging.traceResponse.description": "Optionales Flag zum Festlegen, ob die Befehls- und Antwortablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist \"false\".", + "c_cpp.debuggers.logging.exceptions.description": "Optionales Flag zum Festlegen, ob Ausnahmemeldungen in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist true.", + "c_cpp.debuggers.logging.moduleLoad.description": "Optionales Flag zum Festlegen, ob Modulladeereignisse in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist true.", + "c_cpp.debuggers.logging.programOutput.description": "Optionales Flag zum Festlegen, ob die Programmausgabe in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist true.", + "c_cpp.debuggers.logging.engineLogging.description": "Optionales Flag zum Festlegen, ob Nachrichten der Diagnosedebug-Engine in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist false.", + "c_cpp.debuggers.logging.trace.description": "Optionales Flag zum Festlegen, ob die Befehlsablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist false.", + "c_cpp.debuggers.logging.traceResponse.description": "Optionales Flag zum Festlegen, ob die Befehls- und Antwortablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist false.", "c_cpp.debuggers.cppvsdbg.logging.threadExit.description": "Optionales Flag zum Bestimmen, ob Meldungen zum Beenden des Threads in der Debugging-Konsole protokolliert werden sollen. Standardwert: \"false\".", "c_cpp.debuggers.cppvsdbg.logging.processExit.description": "Optionale Kennzeichnung zum Bestimmen, ob Meldungen zum Beenden des Zielprozesses in der Debugging-Konsole protokolliert werden sollen. Standardwert: \"true\".", "c_cpp.debuggers.text.description": "Der auszuführende Debuggerbefehl.", "c_cpp.debuggers.description.description": "Optionale Beschreibung des Befehls.", - "c_cpp.debuggers.ignoreFailures.description": "Wenn dieser Wert auf \"true\" festgelegt ist, werden durch den Befehl verursachte Fehler ignoriert. Der Standardwert ist \"false\".", + "c_cpp.debuggers.ignoreFailures.description": "Wenn dieser Wert auf true festgelegt ist, werden durch den Befehl verursachte Fehler ignoriert. Der Standardwert ist false.", "c_cpp.debuggers.program.description": "Vollständiger Pfad zur ausführbaren Programmdatei.", "c_cpp.debuggers.args.description": "Befehlszeilenargumente, die an das Programm übergeben werden.", "c_cpp.debuggers.targetArchitecture.description": "Die Architektur der zu debuggenden Komponente. Falls dieser Parameter nicht festgelegt ist, wird die Architektur automatisch erkannt. Zulässige Werte sind \"x86\", \"arm\", \"arm64\", \"mips\", \"x64\", \"amd64\" und \"x86_64\".", @@ -322,23 +322,24 @@ "c_cpp.debuggers.filterStderr.description": "stderr-Stream für ein vom Server gestartetes Muster suchen und stderr in der Debugausgabe protokollieren. Der Standardwert ist \"false\".", "c_cpp.debuggers.serverLaunchTimeout.description": "Optionale Zeit in Millisekunden, während der der Debugger auf den Start von debugServer wartet. Der Standardwert ist 10.000.", "c_cpp.debuggers.coreDumpPath.description": "Optionaler vollständiger Pfad zu einer Kern-Speicherabbilddatei für das angegebene Programm. Der Standardwert ist \"NULL\".", - "c_cpp.debuggers.cppdbg.externalConsole.description": "Wenn dieser Wert auf \"true\" festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei \"false\" wird die Komponente unter Linux und Windows in der integrierten Konsole angezeigt.", - "c_cpp.debuggers.cppvsdbg.externalConsole.description": "[Veraltet für 'console'] Wenn dieser Wert auf \"true\" festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei \"false\" wird keine Konsole gestartet.", + "c_cpp.debuggers.cppdbg.externalConsole.description": "Wenn dieser Wert auf true festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei false wird die Komponente unter Linux und Windows in der integrierten Konsole angezeigt.", + "c_cpp.debuggers.cppvsdbg.externalConsole.description": "[Veraltet für 'console'] Wenn dieser Wert auf true festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei false wird keine Konsole gestartet.", "c_cpp.debuggers.cppvsdbg.console.description": "Gibt an, wo das Debugziel gestartet wird. Wenn keine Angabe vorliegt, wird standardmäßig „internalConsole“ verwendet.", "c_cpp.debuggers.cppvsdbg.console.internalConsole.description": "Die Ausgabe an die Debugging-Konsole von VS Code. Das Lesen von Konsoleneingaben (z. B. `std::cin` oder `scanf`) wird nicht unterstützt.", "c_cpp.debuggers.cppvsdbg.console.integratedTerminal.description": "Das integrierte Terminal von VS Code.", "c_cpp.debuggers.cppvsdbg.console.externalTerminal.description": "Konsolenanwendungen werden in einem externen Terminalfenster gestartet. Das Fenster wird in Neustartszenarien erneut verwendet und beim Beenden der Anwendung nicht automatisch ausgeblendet.", "c_cpp.debuggers.cppvsdbg.console.newExternalWindow.description": "Konsolenanwendungen werden in ihrem eigenen externen Konsolenfenster gestartet, das beim Beenden der Anwendung ebenfalls beendet wird. Nicht-Konsolenanwendungen werden ohne Terminal ausgeführt, und stdout/stderr wird ignoriert.", - "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Wenn dieser Wert auf \"true\" festgelegt ist, wird für die zu debuggende Komponente die Konsolenumleitung deaktiviert, die für die Unterstützung des integrierten Terminals erforderlich ist.", + "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Wenn dieser Wert auf true festgelegt ist, wird für die zu debuggende Komponente die Konsolenumleitung deaktiviert, die für die Unterstützung des integrierten Terminals erforderlich ist.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Optionale Quelldateizuordnungen, die an die Debug-Engine übergeben werden. Beispiel: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "Optionale Prozess-ID, an die der Debugger angefügt werden soll. Verwenden Sie `${command:pickProcess}`, um eine Liste der lokalen ausgeführten Prozesse abzurufen, an die das Anfügen möglich ist. Beachten Sie, dass für einige Plattformen Administratorrechte erforderlich sind, damit an einen Prozess angefügt werden kann.", + "c_cpp.debuggers.processFilter.description": "Optionaler regulärer Ausdruck, der verwendet wird, um Kandidaten für das Remoting-Anfügen nach Bezeichnung, Beschreibung oder Detail abzugleichen. Wenn genau ein Prozess übereinstimmt, hängt der Debugger automatisch an. Wenn mehrere Prozesse übereinstimmen, wird die Prozessauswahl nur mit den passenden Einträgen angezeigt. Wenn kein Prozess übereinstimmt, wird die vollständige Prozessauswahl angezeigt. Ein ungültiger regulärer Ausdruck gibt einen Fehler aus.", "c_cpp.debuggers.program.attach.markdownDescription": "Vollständiger Pfad zur ausführbaren Programmdatei. Der Debugger sucht nach einem laufenden Prozess, der diesem ausführbaren Pfad entspricht, und bindet ihn an. Wenn mehrere Prozesse übereinstimmen, wird eine Auswahlaufforderung angezeigt. Dieses Feld ist erforderlich, um Debugsymbole für den angehängten Prozess zu laden.", "c_cpp.debuggers.symbolSearchPath.description": "Durch Semikolons getrennte Liste von Verzeichnissen, die für die Suche nach Symboldateien (d. h. PDB- oder .so-Dateien) verwendet werden sollen. Beispiel: „c:\\dir1;c:\\dir2“.", "c_cpp.debuggers.dumpPath.description": "Optionaler vollständiger Pfad zu einer Dumpdatei für das angegebene Programm. Beispiel: \"c:\\temp\\app.dmp\". Standardwert ist NULL.", - "c_cpp.debuggers.enableDebugHeap.description": "Wenn dieser Wert auf \"false\" festgelegt ist, wird der Prozess mit deaktiviertem Debug-Heap gestartet. Hiermit wird die Umgebungsvariable \"_NO_DEBUG_HEAP\" auf \"1\" festgelegt.", + "c_cpp.debuggers.enableDebugHeap.description": "Wenn dieser Wert auf false festgelegt ist, wird der Prozess mit deaktiviertem Debug-Heap gestartet. Hiermit wird die Umgebungsvariable \"_NO_DEBUG_HEAP\" auf \"1\" festgelegt.", "c_cpp.debuggers.symbolLoadInfo.description": "Explizite Steuerung des Symbolladevorgangs.", - "c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Bei \"true\" werden Symbole für alle Bibliotheken geladen, andernfalls werden keine solib-Symbole geladen. Der Standardwert ist \"true\".", - "c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Liste mit Dateinamen (Platzhalter zulässig), getrennt durch Semikolons `;`. Ändert das Verhalten von „LoadAll“. Wenn „LoadAll“ auf \"true\" festgelegt ist, werden keine Symbole für Bibliotheken geladen, die einem beliebigen Namen in der Liste entsprechen. Andernfalls werden nur Symbole für übereinstimmende Bibliotheken geladen. Beispiel: `foo.so;bar.so`.", + "c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Bei true werden Symbole für alle Bibliotheken geladen, andernfalls werden keine solib-Symbole geladen. Der Standardwert ist true.", + "c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Liste mit Dateinamen (Platzhalter zulässig), getrennt durch Semikolons ';'. Ändert das Verhalten von „LoadAll“. Wenn „LoadAll“ auf 'true' festgelegt ist, werden keine Symbole für Bibliotheken geladen, die einem beliebigen Namen in der Liste entsprechen. Andernfalls werden nur Symbole für übereinstimmende Bibliotheken geladen. Beispiel: 'foo.so;bar.so'.", "c_cpp.debuggers.requireExactSource.description": "Optionales Flag, um anzufordern, dass der aktuelle Quellcode mit der PDB-Datei übereinstimmt.", "c_cpp.debuggers.stopAtConnect.description": "Wenn \"true\", sollte der Debugger nach dem Herstellen einer Verbindung mit dem Ziel beendet werden. Wenn \"false\" wird der Debugger nach dem Herstellen der Verbindung fortgesetzt. Entspricht standardmäßig \"false\".", "c_cpp.debuggers.hardwareBreakpoints.description": "Explizite Steuerung des Hardwarehaltepunktverhaltens für Remoteziele.", @@ -389,7 +390,7 @@ "c_cpp.taskDefinitions.detail.description": "Zusätzliche Details zur Aufgabe.", "c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Dies sind die Pfade zu denselben Quellstrukturen – einmal aktuell und einmal zur Kompilierzeit. Im EditorPath gefundene Dateien werden zum Haltepunktabgleich dem CompileTimePath-Pfad zugeordnet. Bei der Anzeige von Speicherorten für die Stapelüberwachung erfolgt die Zuordnung vom CompileTimePath zum EditorPath.", "c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Der Pfad zur Quellstruktur, die vom Editor verwendet wird.", - "c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "\"false\", wenn dieser Eintrag nur für eine Stapelrahmen-Speicherortzuordnung verwendet wird. \"true\", wenn dieser Eintrag auch zum Angeben von Haltepunktpositionen verwendet werden soll.", + "c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "Auf „false“ setzen, wenn dieser Eintrag nur für die Zuordnung von Stapelrahmenpositionen verwendet wird. Auf „true“ setzen, wenn dieser Eintrag auch beim Angeben von Haltepunktpositionen verwendet werden soll.", "c_cpp.debuggers.symbolOptions.description": "Optionen zum Steuern, wie Symbole (PDB-Dateien) gefunden und geladen werden.", "c_cpp.debuggers.unknownBreakpointHandling.description": "Steuert, wie extern gesetzte Haltepunkte (normalerweise über rohe GDB-Befehle) behandelt werden, wenn ihnen begegnet wird.\nErlaubte Werte sind \"throw\", was sich so verhält, als ob eine Ausnahme von der Anwendung ausgelöst würde, und \"stop\", was die Debugsitzung nur pausiert. Der Standardwert ist \"throw\".", "c_cpp.debuggers.debuginfod.description": "Steuert das debuginfod-Verhalten von GDB beim Herunterladen von Debugsymbolen von debuginfod-Servern.", diff --git a/Extension/i18n/deu/src/Debugger/processFilter.i18n.json b/Extension/i18n/deu/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..51c1d5139 --- /dev/null +++ b/Extension/i18n/deu/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Ungültiger regulärer Ausdruck für {0}: {1}" +} diff --git a/Extension/i18n/deu/src/LanguageServer/extension.i18n.json b/Extension/i18n/deu/src/LanguageServer/extension.i18n.json index 29325fb22..1184ce8ef 100644 --- a/Extension/i18n/deu/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/deu/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Erfahren Sie, wie Sie mit vcpkg eine Bibliothek für diesen Header installieren.", "copy.vcpkg.command": "vcpkg-Befehl zum Installieren von \"{0}\" in die Zwischenablage kopieren", "on.disabled.command": "IntelliSense-bezogene Befehle können nicht ausgeführt werden, wenn `C_Cpp.intelliSenseEngine` auf `disabled` festgelegt ist.", + "find.translation.units": "Suche nach Übersetzungseinheiten…", + "no.translation.units.found": "Für die aktive Datei wurden keine Übersetzungseinheiten gefunden.", + "current.translation.unit": "Aktuelle Übersetzungseinheit", + "select.translation.unit": "Wählen Sie eine Übersetzungseinheit aus", + "select.translation.unit.placeholder": "Wählen Sie eine Quelldatei aus, die als Übersetzungseinheit verwendet werden soll.", "switch.header.source": "Header/Quelle wird gewechselt...", "client.not.found": "Client nicht gefunden.", "ok": "OK", diff --git a/Extension/i18n/deu/src/nativeStrings.i18n.json b/Extension/i18n/deu/src/nativeStrings.i18n.json index dd3385faa..afc4dadec 100644 --- a/Extension/i18n/deu/src/nativeStrings.i18n.json +++ b/Extension/i18n/deu/src/nativeStrings.i18n.json @@ -425,7 +425,7 @@ "check_requires_source": "„--check“ erfordert eine Quelldatei: --check=", "check_source_not_found": "Quelldatei nicht gefunden: {0}", "check_compile_commands_not_found": "compile_commands.json nicht gefunden: {0}", - "check_compile_commands_not_discovered": "compile_commands.json wurde in keinem übergeordneten Verzeichnis von {0} gefunden; übergeben Sie --check-compile-commands=, um den Pfad explizit anzugeben", + "check_compile_commands_not_discovered": "compile_commands.json wurde in keinem übergeordneten Verzeichnis von {0} gefunden; übergeben Sie --check-compile-commands=, um den Pfad explizit anzugeben", "check_engine_init_failed": "Fehler beim Initialisieren der Sprach-Engine", "check_no_workspace_folder": "Kein Arbeitsbereichsordner aufgelöst für {0}", "check_not_in_compile_commands": "{0} ist nicht vorhanden in {1}", @@ -434,5 +434,7 @@ "check_timed_out": "Timeout beim Warten auf den Abschluss der Analyse von {0}", "failed_to_open_browse_db_lock_file": "Fehler beim Öffnen der Sperrdatei der Browse-Datenbank: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Fehler beim Sperren der Sperrdatei der Browse-Datenbank: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "Die Browse-Datenbank wurde deaktiviert, da ihr Speicherort den gemeinsam genutzten Speicher von SQLite WAL nicht unterstützt. Legen Sie browse.databaseFilename auf einen lokalen Pfad fest." + "browse_database_disabled_incompatible_storage": "Die Browse-Datenbank wurde deaktiviert, da ihr Speicherort den gemeinsam genutzten Speicher von SQLite WAL nicht unterstützt. Legen Sie browse.databaseFilename auf einen lokalen Pfad fest.", + "selected_translation_unit_not_include_file_previous": "Die ausgewählte Übersetzungseinheit '{0}' enthält '{1}' nicht. IntelliSense stellt die vorherige Übersetzungseinheit wieder her, wenn sie noch verfügbar ist. Andernfalls wird '{1}' als reine Header-Übersetzungseinheit verwendet.", + "selected_translation_unit_not_include_file_header_only": "Die ausgewählte Übersetzungseinheit '{0}' enthält '{1}' nicht. Es ist keine vorherige Übersetzungseinheit verfügbar, weshalb IntelliSense '{1}' als reine Headerübersetzungseinheit verwendet." } diff --git a/Extension/i18n/deu/ui/settings.html.i18n.json b/Extension/i18n/deu/ui/settings.html.i18n.json index 9d3310433..de524d003 100644 --- a/Extension/i18n/deu/ui/settings.html.i18n.json +++ b/Extension/i18n/deu/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Wenn {0} (oder aktiviert) ist, analysiert der Tagparser nur Codedateien, die direkt oder indirekt von einer Quelldatei in {1} eingeschlossen wurden. Wenn {2} (oder nicht aktiviert) ist, analysiert der Tagparser alle Codedateien, die in den in der {3} Liste angegebenen Pfaden gefunden wurden.", "database.filename": "Durchsuchen: Datenbankdateiname", "database.filename.description": "Der Pfad zur generierten Symboldatenbank. Hiermit wird die Erweiterung angewiesen, die Symboldatenbank des Tagparsers an einem anderen Speicherort als dem Standardspeicherort des Arbeitsbereichs zu speichern. Bei Angabe eines relativen Pfads wird dieser relativ zum Standardspeicherort des Arbeitsbereichs und nicht zum Arbeitsbereichsordner selbst erstellt. Die Variable „{0}“ kann verwendet werden, um einen Pfad relativ zum Arbeitsbereichsordner (Beispiel: {1}) anzugeben.", - "recursiveIncludes.reduce": "Rekursive Umfasst: Reduzieren", - "recursiveIncludes.reduce.description": "Legen Sie diese Option auf „{0}“ fest, um die Anzahl der rekursiven Includepfade, die für IntelliSense bereitgestellt werden, auf die Pfade zu verringern, auf die derzeit von #include-Anweisungen verwiesen wird. Dazu müssen zuerst die Dateien analysiert werden, um zu bestimmen, welche Dateien eingeschlossen werden. Legen Sie diese Option auf „{1}“ fest, um alle rekursiven Includepfade für IntelliSense bereitzustellen. Wenn Sie die Anzahl rekursiver Includepfade verringern, kann sich die Leistung von IntelliSense verbessern, wenn eine sehr große Anzahl rekursiver Includepfade betroffen ist. Wenn Sie die Anzahl rekursiver Includepfade nicht verringern, kann die Leistung von IntelliSense verbessert werden, da die Dateien nicht analysiert werden müssen, um zu bestimmen, welche Includepfade bereitgestellt werden sollen.", "recursiveIncludes.priority": "„Rekursiv“ umfasst: Priorität", "recursiveIncludes.priority.description": "Die Priorität rekursiver Includepfade. Wenn sie auf „{0}“ festgelegt ist, werden die rekursiven Includepfade vor den systemseitigen Includepfaden durchsucht. Wenn sie auf „{1}“ festgelegt ist, werden die rekursiven Includepfade nach den systemseitigen Includepfaden durchsucht.", "recursiveIncludes.order": "Rekursiv umfasst: Reihenfolge", diff --git a/Extension/i18n/esn/package.i18n.json b/Extension/i18n/esn/package.i18n.json index df58f87dc..2f29783dc 100644 --- a/Extension/i18n/esn/package.i18n.json +++ b/Extension/i18n/esn/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Instalar un compilador de C++", "c_cpp.command.rescanCompilers.title": "Volver a examinar los compiladores", "c_cpp.command.switchHeaderSource.title": "Cambiar el encabezado o el origen", + "c_cpp.command.selectTranslationUnit.title": "Seleccionar una unidad de traducción...", "c_cpp.command.enableErrorSquiggles.title": "Habilitar el subrayado ondulado de errores", "c_cpp.command.disableErrorSquiggles.title": "Deshabilitar el subrayado ondulado de errores", "c_cpp.command.toggleDimInactiveRegions.title": "Alternar el coloreado de las regiones inactivas", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Controla si la extensión notificará los errores detectados en `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Valor que debe usarse en una configuración si no se establece `customConfigurationVariables`, o bien los valores que se deben insertar si se especifica `${default}` como clave en `customConfigurationVariables`.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Valor que debe usarse en una configuración si no se especifica `dotConfig` o si se establece en `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Valor que debe usarse en una configuración si no se ha especificado `recursiveIncludes.reduce` o se ha establecido en `${default}`.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Valor que debe usarse en una configuración si no se ha especificado `recursiveIncludes.priority` o se ha establecido en `${default}`.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Valor que debe usarse en una configuración si no se ha especificado `recursiveIncludes.order` o se ha establecido en `${default}`.", "c_cpp.configuration.experimentalFeatures.description": "Controla si se pueden usar las características \"experimentales\".", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Si se establece en true, se deshabilita la redirección de la consola del depurado necesaria para la compatibilidad con el terminal integrado.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Asignaciones de archivo de origen opcionales pasadas al motor de depuración. Ejemplo: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "Id. de proceso opcional al que debe asociarse el depurador. Use `${command:pickProcess}` para obtener una lista de los procesos locales en ejecución a los que se puede asociar. Tenga en cuenta que algunas plataformas requieren privilegios de administrador para poder asociar el depurador a un proceso.", + "c_cpp.debuggers.processFilter.description": "Expresión regular opcional que se usa para buscar coincidencias con candidatos de asociación remota por etiqueta, descripción o detalle. Si coincide exactamente un proceso, el depurador se asocia automáticamente. Si coinciden varios procesos, el selector de procesos se muestra solo con entradas coincidentes. Si no hay coincidencias de proceso, se muestra el selector de procesos completo. Una expresión regular no válida notifica un error.", "c_cpp.debuggers.program.attach.markdownDescription": "Ruta de acceso completa al ejecutable del programa. El depurador buscará un proceso en ejecución que coincida con esta ruta de acceso ejecutable y se asociará a él. Si coinciden varios procesos, se mostrará un mensaje de selección. Este campo es necesario para cargar símbolos de depuración para el proceso adjunto.", "c_cpp.debuggers.symbolSearchPath.description": "Lista separada por punto y coma de directorios que se van a usar para buscar archivos de símbolos (es decir, pdb o .so). Ejemplo: \"c:\\dir1;c:\\dir2\".", "c_cpp.debuggers.dumpPath.description": "Ruta de acceso completa opcional a un archivo de volcado de memoria para el programa especificado. Ejemplo: \"c:\\temp\\app.dmp\". El valor predeterminado es null.", diff --git a/Extension/i18n/esn/src/Debugger/processFilter.i18n.json b/Extension/i18n/esn/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..fc6ec544a --- /dev/null +++ b/Extension/i18n/esn/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Expresión regular no válida para {0}: {1}" +} diff --git a/Extension/i18n/esn/src/LanguageServer/extension.i18n.json b/Extension/i18n/esn/src/LanguageServer/extension.i18n.json index c2e1e224e..0476fbf24 100644 --- a/Extension/i18n/esn/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/esn/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Más información sobre el modo de instalar una biblioteca para este encabezado con vcpkg", "copy.vcpkg.command": "Copie el comando vcpkg para instalar \"{0}\" en el Portapapeles", "on.disabled.command": "Los comandos relacionados con IntelliSense no se pueden ejecutar cuando `C_Cpp.intelliSenseEngine` está establecido en `disabled`.", + "find.translation.units": "Buscando unidades de traducción...", + "no.translation.units.found": "No se encontraron unidades de traducción para el archivo activo.", + "current.translation.unit": "Unidad de traducción actual", + "select.translation.unit": "Seleccionar una unidad de traducción", + "select.translation.unit.placeholder": "Seleccione un archivo de origen para usarlo como unidad de traducción", "switch.header.source": "Cambiando encabezado/origen...", "client.not.found": "No se encuentra el cliente", "ok": "Aceptar", diff --git a/Extension/i18n/esn/src/nativeStrings.i18n.json b/Extension/i18n/esn/src/nativeStrings.i18n.json index b95aadcb0..1d85c06c3 100644 --- a/Extension/i18n/esn/src/nativeStrings.i18n.json +++ b/Extension/i18n/esn/src/nativeStrings.i18n.json @@ -425,7 +425,7 @@ "check_requires_source": "--check requiere un archivo de origen: --check=", "check_source_not_found": "no se encuentra el archivo de origen: {0}", "check_compile_commands_not_found": "No se encontró compile_commands.json: {0}", - "check_compile_commands_not_discovered": "no se pudo encontrar compile_commands.json en ningún directorio padre de {0}; pase --check-compile-commands= para indicarlo explícitamente", + "check_compile_commands_not_discovered": "no se pudo encontrar compile_commands.json en ningún directorio padre de {0}; pase --check-compile-commands= para indicarlo explícitamente", "check_engine_init_failed": "no se pudo inicializar el motor de lenguaje", "check_no_workspace_folder": "no se resolvió ninguna carpeta del área de trabajo para {0}", "check_not_in_compile_commands": "{0} no se encuentra en {1}", @@ -434,5 +434,7 @@ "check_timed_out": "se agotó el tiempo de espera para finalizar el análisis de {0}", "failed_to_open_browse_db_lock_file": "No se pudo abrir el archivo de bloqueo de la base de datos de exploración: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "No se pudo bloquear el archivo de bloqueo de la base de datos de exploración: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "La base de datos de exploración se deshabilitó porque su ubicación de almacenamiento no admite la memoria compartida de SQLite WAL. Establezca browse.databaseFilename en una ruta de acceso local." + "browse_database_disabled_incompatible_storage": "La base de datos de exploración se deshabilitó porque su ubicación de almacenamiento no admite la memoria compartida de SQLite WAL. Establezca browse.databaseFilename en una ruta de acceso local.", + "selected_translation_unit_not_include_file_previous": "La unidad de traducción seleccionada '{0}' no incluye '{1}'. IntelliSense restaurará la unidad de traducción anterior si aún está disponible; de lo contrario, usará '{1}' como una unidad de traducción de solo encabezado.", + "selected_translation_unit_not_include_file_header_only": "La unidad de traducción seleccionada '{0}' no incluye '{1}'. No hay ninguna unidad de traducción anterior disponible, por lo que IntelliSense usará '{1}' como unidad de traducción de solo encabezado." } diff --git a/Extension/i18n/esn/ui/settings.html.i18n.json b/Extension/i18n/esn/ui/settings.html.i18n.json index 46da000cd..6f0129713 100644 --- a/Extension/i18n/esn/ui/settings.html.i18n.json +++ b/Extension/i18n/esn/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Cuando {0} (o activado), el analizador de etiquetas solo analizará los archivos de código que un archivo de código fuente haya incluido directa o indirectamente en {1}. Cuando {2} (o no está activado), el analizador de etiquetas analizará todos los archivos de código que se encuentran en las rutas de acceso especificadas en la lista de {3} .", "database.filename": "Examinar: nombre del archivo de base de datos", "database.filename.description": "La ruta de acceso a la base de datos de símbolos generada. Esto indica a la extensión que guarde la base de datos de símbolos del analizador de etiquetas en una ubicación distinta de la ubicación de almacenamiento predeterminada del área de trabajo. Si se especifica una ruta de acceso relativa, será relativa a la ubicación de almacenamiento predeterminada del área de trabajo, no a la carpeta del área de trabajo en sí. La variable {0} se puede usar para especificar una ruta de acceso relativa a la carpeta del área de trabajo (por ejemplo, {1}).", - "recursiveIncludes.reduce": "Inclusiones recursivas: orden: reducción", - "recursiveIncludes.reduce.description": "Establézcalo en {0} para reducir siempre el número de rutas de inclusión recursivas proporcionadas a IntelliSense solo a aquellas rutas a las que hacen referencia actualmente las instrucciones #include. Esto requiere primero analizar los archivos para determinar qué archivos se incluyen. Establézcalo en {1} para proporcionar todas las rutas de inclusión recursivas a IntelliSense. Reducir el número de rutas de inclusiones recursivas puede mejorar el rendimiento de IntelliSense cuando hay un gran número de rutas de inclusión recursivas involucradas. No reducir el número de rutas de inclusión recursivas puede mejorar el rendimiento de IntelliSense al evitar la necesidad de analizar archivos para determinar qué rutas de inclusión proporcionar.", "recursiveIncludes.priority": "Inclusión recursiva: prioridad", "recursiveIncludes.priority.description": "La prioridad de las rutas de acceso de inclusión recursivas. Si se establece en {0}, se buscarán las rutas de inclusión recursivas antes que las rutas de inclusión del sistema. Si se establece en {1}, se buscarán las rutas de inclusión recursivas después de las rutas de inclusión del sistema.", "recursiveIncludes.order": "Inclusiones recursivas: orden", diff --git a/Extension/i18n/fra/package.i18n.json b/Extension/i18n/fra/package.i18n.json index d8564d1fb..214abd3b2 100644 --- a/Extension/i18n/fra/package.i18n.json +++ b/Extension/i18n/fra/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Installer un compilateur C++", "c_cpp.command.rescanCompilers.title": "Relancer l’analyse des compilateurs", "c_cpp.command.switchHeaderSource.title": "Basculer l'en-tête/la source", + "c_cpp.command.selectTranslationUnit.title": "Sélectionnez une unité de traduction…", "c_cpp.command.enableErrorSquiggles.title": "Activer les tildes d'erreur", "c_cpp.command.disableErrorSquiggles.title": "Désactiver les tildes d'erreur", "c_cpp.command.toggleDimInactiveRegions.title": "Activer/désactiver la colorisation des régions inactives", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Contrôle si l'extension signale les erreurs détectées dans `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Valeur à utiliser dans une configuration si `customConfigurationVariables` n'est pas défini, ou valeurs à insérer si `${default}` est présent dans `customConfigurationVariables`.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Valeur à utiliser dans une configuration si `dotConfig` n'est pas spécifié ou est défini sur `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Valeur à utiliser dans une configuration si `recursiveIncludes.reduce` n’est pas spécifié ou est défini sur `${default}`.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Valeur à utiliser dans une configuration si `recursiveIncludes.priority` n’est pas spécifié ou est défini sur `${default}`.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Valeur à utiliser dans une configuration si `recursiveIncludes.order` n’est pas spécifié ou est défini sur `${default}`.", "c_cpp.configuration.experimentalFeatures.description": "Contrôle si les fonctionnalités \"expérimentales\" sont utilisables.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Si la valeur est true, désactive la redirection de la console de l'élément débogué nécessaire pour prendre en charge le terminal intégré.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Mappages de fichiers sources facultatifs passés au moteur de débogage. Exemple : `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "ID de processus facultatif auquel attacher le débogueur. Utilisez `${command:pickProcess}` pour obtenir la liste des processus locaux en cours d'exécution à attacher. Notez que certaines plateformes nécessitent des privilèges d'administrateur(-trice) pour attacher un processus.", + "c_cpp.debuggers.processFilter.description": "Expression régulière facultative utilisée pour faire correspondre les candidats de l’attachement à distance par étiquette, description ou détail. Si un seul processus correspond, le débogueur s’y attache automatiquement. Si plusieurs processus correspondent, le sélecteur de processus s’affiche avec les entrées correspondantes uniquement. Si aucun processus ne correspond, le sélecteur de processus complet s’affiche. Une expression régulière non valide signale une erreur.", "c_cpp.debuggers.program.attach.markdownDescription": "Chemin complet du programme exécutable. Le débogueur recherche un processus en cours d’exécution correspondant à ce chemin et s’y attache. Si plusieurs processus correspondent, une invite de sélection s’affiche. Ce champ est obligatoire pour charger les symboles de débogage du processus attaché.", "c_cpp.debuggers.symbolSearchPath.description": "Liste de répertoires séparés par des points-virgules à utiliser pour rechercher les fichiers de symboles (c'est-à-dire, pdb ou .so). Exemple : « c:\\dir1;c:\\dir2 ».", "c_cpp.debuggers.dumpPath.description": "Chemin complet facultatif d'un fichier d'image mémoire pour le programme spécifié. Exemple : \"c:\\temp\\app.dmp\". La valeur par défaut est null.", diff --git a/Extension/i18n/fra/src/Debugger/processFilter.i18n.json b/Extension/i18n/fra/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..e95780572 --- /dev/null +++ b/Extension/i18n/fra/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Expression régulière {0} non valide : {1}" +} diff --git a/Extension/i18n/fra/src/LanguageServer/extension.i18n.json b/Extension/i18n/fra/src/LanguageServer/extension.i18n.json index 69160615f..29b920430 100644 --- a/Extension/i18n/fra/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/fra/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Découvrir comment installer une bibliothèque pour cet en-tête avec vcpkg", "copy.vcpkg.command": "Copier la commande vcpkg pour installer '{0}' dans le Presse-papiers", "on.disabled.command": "Les commandes liées à IntelliSense ne peuvent pas être exécutées quand `C_Cpp.intelliSenseEngine` a la valeur `disabled`.", + "find.translation.units": "Recherche des unités de traduction en cours…", + "no.translation.units.found": "Aucune unité de traduction n’a été trouvée pour le fichier actif.", + "current.translation.unit": "Unité de traduction actuelle", + "select.translation.unit": "Sélectionner une unité de traduction", + "select.translation.unit.placeholder": "Sélectionner un fichier source à utiliser comme unité de traduction", "switch.header.source": "Changement d’en-tête/source en cours... Merci de patienter.", "client.not.found": "client introuvable", "ok": "OK", diff --git a/Extension/i18n/fra/src/nativeStrings.i18n.json b/Extension/i18n/fra/src/nativeStrings.i18n.json index 9efb53d19..8d057e651 100644 --- a/Extension/i18n/fra/src/nativeStrings.i18n.json +++ b/Extension/i18n/fra/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "Délai d’attente dépassé en attendant la fin de l’analyse de {0}", "failed_to_open_browse_db_lock_file": "Échec de l’ouverture du fichier de verrouillage de la base de données de navigation : {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Échec du verrouillage du fichier de verrouillage de la base de données de navigation : {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "La base de données de navigation a été désactivée, car son emplacement de stockage ne prend pas en charge la mémoire partagée SQLite WAL. Définissez browse.databaseFilename sur un chemin local." + "browse_database_disabled_incompatible_storage": "La base de données de navigation a été désactivée, car son emplacement de stockage ne prend pas en charge la mémoire partagée SQLite WAL. Définissez browse.databaseFilename sur un chemin local.", + "selected_translation_unit_not_include_file_previous": "L’unité de traduction sélectionnée « {0} » n’inclut pas « {1} ». IntelliSense restaurera l’unité de traduction précédente si elle est encore disponible. Sinon, il utilisera « {1} » comme unité de traduction d’en-tête uniquement.", + "selected_translation_unit_not_include_file_header_only": "L’unité de traduction sélectionnée '{0}' n’inclut pas '{1}'. Aucune unité de traduction précédente n’est disponible ; IntelliSense utilisera donc '{1}' comme unité de traduction d’en-tête uniquement." } diff --git a/Extension/i18n/fra/ui/settings.html.i18n.json b/Extension/i18n/fra/ui/settings.html.i18n.json index 02109892a..54f0d0e04 100644 --- a/Extension/i18n/fra/ui/settings.html.i18n.json +++ b/Extension/i18n/fra/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Lorsque {0} (ou activé), l’analyseur de balise analyse uniquement les fichiers de code qui ont été inclus directement ou indirectement par un fichier source dans {1}. Lorsque {2} (ou non activé), l’analyseur de balise analyse tous les fichiers de code trouvés dans les chemins d’accès spécifiés dans la liste {3} .", "database.filename": "Parcourir : nom de fichier de base de données", "database.filename.description": "Chemin de la base de données de symboles générée. Cela indique à l'extension d'enregistrer la base de données de symboles de l'analyseur de balises à un emplacement autre que l'emplacement de stockage par défaut de l'espace de travail. Si un chemin relatif est spécifié, il est relatif à l'emplacement de stockage par défaut de l'espace de travail et non au dossier d'espace de travail lui-même. La variable {0} peut être utilisée pour spécifier un chemin relatif au dossier d'espace de travail (par ex., {1}).", - "recursiveIncludes.reduce": "Inclusions récursives : réduire", - "recursiveIncludes.reduce.description": "Affectez la valeur {0} pour toujours réduire le nombre de chemins d’accès d’inclusion récursive fournis à IntelliSense uniquement aux chemins actuellement référencés par des instructions #include. Pour cela, vous devez d’abord analyser les fichiers pour déterminer lesquels sont inclus. Affectez la valeur {1} pour fournir tous les chemins d’accès d’inclusion récursive à IntelliSense. La réduction du nombre de chemins d’accès d’inclusion récursive peut améliorer les performances d’IntelliSense lorsque de très nombreux chemins d’accès d’inclusion récursive sont impliqués. Ne pas réduire le nombre de chemins d’accès d’inclusion récursive peut améliorer les performances d’IntelliSense en évitant la nécessité d’analyser les fichiers pour déterminer quels chemins d’accès d’inclusion fournir.", "recursiveIncludes.priority": "Inclusions récursives : priorité", "recursiveIncludes.priority.description": "Priorité des chemins d’accès d’inclusion récursive. Si la valeur est {0}, les chemins d’accès d’inclusion récursive seront recherchés avant les chemins d’accès d’inclusion système. Si la valeur est {1}, les chemins d’accès d’inclusion récursive seront recherchés après les chemins d’accès d’inclusion système.", "recursiveIncludes.order": "Inclusions récursives : trier", diff --git a/Extension/i18n/ita/package.i18n.json b/Extension/i18n/ita/package.i18n.json index d4cea0efe..db19543d7 100644 --- a/Extension/i18n/ita/package.i18n.json +++ b/Extension/i18n/ita/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Installare un compilatore C++", "c_cpp.command.rescanCompilers.title": "Ripeti analisi dei compilatori", "c_cpp.command.switchHeaderSource.title": "Scambia intestazione/origine", + "c_cpp.command.selectTranslationUnit.title": "Selezionare un'unità di traduzione...", "c_cpp.command.enableErrorSquiggles.title": "Abilita i segni di revisione per gli errori", "c_cpp.command.disableErrorSquiggles.title": "Disabilita i segni di revisione per gli errori", "c_cpp.command.toggleDimInactiveRegions.title": "Attiva/Disattiva colorazione delle aree inattive", @@ -82,7 +83,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Percorso completo dell'eseguibile `clang-tidy`. Se non specificato, e se `clang-tidy` è disponibile nel percorso dell'ambiente, questo verrà utilizzato, a meno che la versione inclusa con l'estensione non sia più recente. Se non viene trovato nel percorso dell'ambiente, verrà usato `clang-tidy` in bundle con l'estensione.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Specifica una configurazione `clang-tidy` in formato YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{chiave: x, valore: y}]}`. Quando il valore è vuoto, `clang-tidy` tenterà di trovare un file denominato `.clang-tidy` per ogni file di origine nelle directory padre.", "c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "Specifica una configurazione `clang-tidy` in formato YAML/JSON da usare come fallback quando `#C_Cpp.codeAnalysis.clangTidy.config#` non è impostato e non è stato trovato alcun file `.clang-tidy`: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{chiave: x, valore: y}]}`.", - "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "Espressione regolare estesa POSIX (ERE) corrispondente ai nomi delle intestazioni da cui eseguire la diagnostica di output. La diagnostica dal file principale di ogni unità di conversione viene sempre visualizzata. La variabile `${workspaceFolder}` è supportata e viene usata come valore di fallback predefinito se non esiste alcun file `.clang-tidy`. Se questa opzione non è `null` (vuota), esegue l'override dell'opzione `HeaderFilterRegex` in un file `.clang-tidy`, se presente.", + "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "Espressione regolare estesa POSIX (ERE) corrispondente ai nomi delle intestazioni da cui eseguire la diagnostica di output. La diagnostica dal file principale di ogni unità di traduzione viene sempre visualizzata. La variabile `${workspaceFolder}` è supportata e viene usata come valore di fallback predefinito se non esiste alcun file `.clang-tidy`. Se questa opzione non è `null` (vuota), esegue l'override dell'opzione `HeaderFilterRegex` in un file `.clang-tidy`, se presente.", "c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": "Argomenti aggiuntivi della riga di comando da passare a `clang-tidy`. Hanno la precedenza sulle impostazioni equivalenti di `C_Cpp.codeAnalysis.clangTidy.*`.", "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "Se `true` e `compileCommands` sono impostati, l'argomento `-p=` viene passato a `clang-tidy` anziché agli argomenti di compilazione passati dopo `--`. Questa operazione potrebbe non funzionare se le variabili di ambiente non sono impostate in modo da poter trovare direttive include di sistema.", "c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "Elenco dei controlli `clang-tidy` abilitati. I valori vengono accodati a `Checks` in un file `.clang-tidy` o `#C_Cpp.codeAnalysis.clangTidy.config#`, se presente. Viene sempre usato il controllo predefinito `clang-analyzer-core.*` a meno che non venga disabilitato in modo esplicito.", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Controlla se l'estensione segnala errori rilevati in `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Valore da usare in una configurazione se `customConfigurationVariables` non è impostato oppure valori da inserire se `${default}` è presente come chiave in `customConfigurationVariables`.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Il valore da usare in una configurazione se `dotConfig` non è specificato o impostato su `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Il valore da usare in una configurazione se `recursiveIncludes.reduce` non è specificato o impostato su `${default}`.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Il valore da usare in una configurazione se `recursiveIncludes.priority` non è specificato o impostato su `${default}`.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Il valore da usare in una configurazione se `recursiveIncludes.order` non è specificato o impostato su `${default}`.", "c_cpp.configuration.experimentalFeatures.description": "Controlla se le funzionalità \"sperimentali\" sono utilizzabili.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Se è true, disabilita il reindirizzamento della console dell'oggetto del debug richiesto per il supporto del terminale integrato.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Mapping di file di origine facoltativi passati al motore di debug. Esempio: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "ID processo facoltativo a cui collegare il debugger. Usare `${command:pickProcess}` per ottenere un elenco dei processi locali in esecuzione a cui collegarsi. Tenere presente che alcune piattaforme richiedono privilegi di amministratore per collegarsi a un processo.", + "c_cpp.debuggers.processFilter.description": "Espressione regolare facoltativa usata per trovare corrispondenze con candidati di collegamento remoto in base a etichetta, descrizione o dettaglio. Se esattamente un processo corrisponde, il debugger si connette automaticamente. Se più processi corrispondono, la selezione processi viene visualizzata solo con le voci corrispondenti. Se nessun processo corrisponde, viene visualizzata la selezione completa del processo. Un'espressione regolare non valida segnala un errore.", "c_cpp.debuggers.program.attach.markdownDescription": "Percorso completo dell'eseguibile del programma. Il debugger cercherà un processo in esecuzione che corrisponde a questo percorso dell'eseguibile e vi si collegherà. Se più processi corrispondono, verrà mostrato un prompt per la selezione. Questo campo è necessario per caricare i simboli di debug del processo collegato.", "c_cpp.debuggers.symbolSearchPath.description": "Elenco di directory delimitate da punto e virgola da usare per la ricerca di file di simboli, ovvero PDB o .SO. Esempio: \"c:\\dir1;c:\\dir2\".", "c_cpp.debuggers.dumpPath.description": "Percorso completo facoltativo di un file dump per il programma specificato. Esempio: \"c:\\temp\\app.dmp\". L'impostazione predefinita è Null.", diff --git a/Extension/i18n/ita/src/Debugger/processFilter.i18n.json b/Extension/i18n/ita/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..c7fd37d7f --- /dev/null +++ b/Extension/i18n/ita/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Espressione regolare {0} non valida: {1}" +} diff --git a/Extension/i18n/ita/src/LanguageServer/extension.i18n.json b/Extension/i18n/ita/src/LanguageServer/extension.i18n.json index 01f519d09..b8c81d801 100644 --- a/Extension/i18n/ita/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/ita/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Informazioni su come installare una libreria per questa intestazione con vcpkg", "copy.vcpkg.command": "Copiare il comando vcpkg per installare '{0}' negli Appunti", "on.disabled.command": "Non è possibile eseguire comandi correlati a IntelliSense quando `C_Cpp.intelliSenseEngine` è impostato su `disabled`.", + "find.translation.units": "Ricerca delle unità di traduzione in corso...", + "no.translation.units.found": "Non sono state trovate unità di traduzione per il file attivo.", + "current.translation.unit": "Unità di traduzione corrente", + "select.translation.unit": "Selezionare un'unità di traduzione", + "select.translation.unit.placeholder": "Selezionare un file di origine da usare come unità di traduzione", "switch.header.source": "Scambio intestazione/origine in corso...", "client.not.found": "client non trovato", "ok": "OK", diff --git a/Extension/i18n/ita/src/nativeStrings.i18n.json b/Extension/i18n/ita/src/nativeStrings.i18n.json index 9a1f2ed14..21d6c6814 100644 --- a/Extension/i18n/ita/src/nativeStrings.i18n.json +++ b/Extension/i18n/ita/src/nativeStrings.i18n.json @@ -13,8 +13,8 @@ "disable_error_squiggles": "Disabilita i segni di revisione per gli errori", "enable_error_squiggles": "Abilita i segni di revisione per gli errori", "include_errors_update_include_path_squiggles_disabled2": "Sono stati rilevati errori #include. Aggiornare includePath. Gli errori di sintassi per questo file non verranno segnalati finché non vengono trovati i file inclusi.", - "include_errors_update_include_path_intellisense_disabled": "Sono stati rilevati errori #include. Aggiornare includePath. Le funzionalità IntelliSense per questa unità di conversione ({0}) verranno fornite dal parser di tag.", - "include_errors_update_compile_commands_or_include_path_intellisense_disabled": "Sono stati rilevati errori #include. Provare ad aggiornare il file compile_commands.json o includePath. Le funzionalità IntelliSense per questa unità di conversione ({0}) verranno fornite dal parser di tag.", + "include_errors_update_include_path_intellisense_disabled": "Sono stati rilevati errori #include. Aggiornare includePath. Le funzionalità IntelliSense per questa unità di traduzione ({0}) verranno fornite dal parser di tag.", + "include_errors_update_compile_commands_or_include_path_intellisense_disabled": "Sono stati rilevati errori #include. Provare ad aggiornare il file compile_commands.json o includePath. Le funzionalità IntelliSense per questa unità di traduzione ({0}) verranno fornite dal parser di tag.", "could_not_parse_compile_commands": "Non è stato possibile analizzare \"{0}\". In alternativa, verrà usato 'includePath' del file c_cpp_properties.json nella cartella '{1}'.", "could_not_find_compile_commands": "Non è stato possibile trovare \"{0}\". In alternativa, verrà usato 'includePath' del file c_cpp_properties.json nella cartella '{1}'.", "file_not_found_in_path": "\"{0}\" non è stato trovato in \"{1}\". In alternativa per questo file verrà usato 'includePath' del file c_cpp_properties.json nella cartella '{2}'.", @@ -113,7 +113,7 @@ "request_cancelled": "Richiesta annullata: {0}", "intellisense_client_not_available_go_to_definition": "Il client IntelliSense non è disponibile. Verrà usato il parser di tag per passare alla definizione.", "error_squiggle_count": "Errore nel conteggio dei segni di revisione per gli errori: {0}", - "queueing_update_intellisense": "Accodamento dell'aggiornamento IntelliSense per i file nell'unità di conversione di {0}", + "queueing_update_intellisense": "Accodamento dell'aggiornamento IntelliSense per i file nell'unità di traduzione di {0}", "formatting_document": "Formattazione del documento: {0}", "formatting_input_label": "Formattazione dell'input:", "formatting_raw_output_label": "Formattazione dell'output non elaborato:", @@ -159,7 +159,7 @@ "fallback_to_64_bit_mode2": "Non è stato possibile eseguire una query sul compilatore. Verrà eseguito il fallback a intelliSenseMode a 64 bit.", "fallback_to_no_bitness": "Non è stato possibile eseguire una query sul compilatore. Verrà eseguito il fallback alla modalità senza numero di bit.", "intellisense_client_creation_aborted": "La creazione del client IntelliSense è stata interrotta: {0}", - "include_errors_config_provider_intellisense_disabled": "Sono stati rilevati errori #include sulla base delle informazioni fornite dall'impostazione configurationProvider. Le funzionalità IntelliSense per questa unità di conversione ({0}) verranno fornite dal parser di tag.", + "include_errors_config_provider_intellisense_disabled": "Sono stati rilevati errori #include sulla base delle informazioni fornite dall'impostazione configurationProvider. Le funzionalità IntelliSense per questa unità di traduzione ({0}) verranno fornite dal parser di tag.", "include_errors_config_provider_squiggles_disabled2": "Sono stati rilevati errori #include sulla base delle informazioni fornite dall'impostazione configurationProvider. Gli errori di sintassi per questo file non verranno segnalati finché non vengono trovati i file inclusi.", "preprocessor_keyword": "parola chiave del preprocessore", "c_keyword": "parola chiave C", @@ -425,7 +425,7 @@ "check_requires_source": "--check richiede un file di origine: --check=", "check_source_not_found": "file di origine non trovato: {0}", "check_compile_commands_not_found": "compile_commands.json non trovato: {0}", - "check_compile_commands_not_discovered": "non è stato possibile trovare compile_commands.json in alcuna directory padre di {0}; passare --check-compile-commands= per specificarlo in modo esplicito", + "check_compile_commands_not_discovered": "non è stato possibile trovare compile_commands.json in alcuna directory padre di {0}; passare --check-compile-commands= per specificarlo in modo esplicito", "check_engine_init_failed": "non è stato possibile inizializzare il motore del linguaggio", "check_no_workspace_folder": "non è stata risolta alcuna cartella dell'area di lavoro per {0}", "check_not_in_compile_commands": "{0} non è presente in {1}", @@ -434,5 +434,7 @@ "check_timed_out": "timeout durante l'attesa del completamento dell'analisi di {0}", "failed_to_open_browse_db_lock_file": "Non è stato possibile aprire il file di blocco del database di esplorazione: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Non è stato possibile bloccare il file di blocco del database di esplorazione: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "Il database di esplorazione è stato disabilitato perché la posizione di archiviazione non supporta la memoria condivisa richiesta da SQLite WAL. Impostare browse.databaseFilename su un percorso locale." + "browse_database_disabled_incompatible_storage": "Il database di esplorazione è stato disabilitato perché la posizione di archiviazione non supporta la memoria condivisa richiesta da SQLite WAL. Impostare browse.databaseFilename su un percorso locale.", + "selected_translation_unit_not_include_file_previous": "L'unità di traduzione selezionata '{0}' non include '{1}'. IntelliSense ripristinerà l'unità di traduzione precedente, se è ancora disponibile; in caso contrario, utilizzerà '{1}' come unità di traduzione di sola intestazione.", + "selected_translation_unit_not_include_file_header_only": "L'unità di traduzione selezionata '{0}' non include '{1}'. Non è disponibile alcuna unità di traduzione precedente, quindi IntelliSense userà '{1}' come unità di traduzione di sola intestazione." } diff --git a/Extension/i18n/ita/ui/settings.html.i18n.json b/Extension/i18n/ita/ui/settings.html.i18n.json index 833abb1a3..c68daa176 100644 --- a/Extension/i18n/ita/ui/settings.html.i18n.json +++ b/Extension/i18n/ita/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Quando è impostato su {0} (o selezionato), il parser tag analizzerà solo i file di codice che sono stati inclusi direttamente o indirettamente da un file di origine in {1}. Quando è impostato su {2} (o non è selezionato), il parser tag analizzerà tutti i file di codice trovati nei percorsi specificati nell'elenco di {3}.", "database.filename": "Sfoglia: nome del file di database", "database.filename.description": "Percorso del database dei simboli generato. Indica all'estensione di salvare il database dei simboli del parser di tag in una posizione diversa da quella di archiviazione predefinita dell'area di lavoro. Se viene specificato un percorso relativo, sarà relativo alla posizione di archiviazione predefinita dell'area di lavoro e non alla cartella dell'area di lavoro. È possibile usare la variabile {0} per specificare un percorso relativo alla cartella dell'area di lavoro, ad esempio {1}.", - "recursiveIncludes.reduce": "Inclusioni ricorsive: riduzione", - "recursiveIncludes.reduce.description": "Imposta su {0} per ridurre il numero di percorsi di inclusione ricorsivi forniti a IntelliSense, limitandoli solo ai percorsi attualmente referenziati da istruzioni #include. Per determinare quali file sono inclusi, è necessario prima analizzare i file. Imposta su {1} per fornire tutti i percorsi di inclusione ricorsivi a IntelliSense. La riduzione del numero di percorsi di inclusione ricorsivi può migliorare le prestazioni di IntelliSense in caso di un numero molto elevato di percorsi di inclusione ricorsivi. Non ridurre il numero di percorsi di inclusione ricorsivi può migliorare le prestazioni di IntelliSense evitando la necessità di analizzare i file per determinare quali percorsi di inclusione fornire.", "recursiveIncludes.priority": "Inclusioni ricorsive: priorità", "recursiveIncludes.priority.description": "La priorità dei percorsi di inclusione ricorsivi. Se impostato su {0}, i percorsi di inclusione ricorsivi verranno cercati prima dei percorsi di inclusione di sistema. Se impostato su {1}, i percorsi di inclusione ricorsivi verranno cercati dopo i percorsi di inclusione di sistema.", "recursiveIncludes.order": "Inclusioni ricorsive: ordine", diff --git a/Extension/i18n/jpn/package.i18n.json b/Extension/i18n/jpn/package.i18n.json index b2e754bde..137401e64 100644 --- a/Extension/i18n/jpn/package.i18n.json +++ b/Extension/i18n/jpn/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "C++ コンパイラのインストール", "c_cpp.command.rescanCompilers.title": "コンパイラの再スキャン", "c_cpp.command.switchHeaderSource.title": "ヘッダー/ソースの切り替え", + "c_cpp.command.selectTranslationUnit.title": "翻訳単位を選択...", "c_cpp.command.enableErrorSquiggles.title": "エラーの波線を有効にする", "c_cpp.command.disableErrorSquiggles.title": "エラーの波線を無効にする", "c_cpp.command.toggleDimInactiveRegions.title": "非アクティブな領域の色づけの切り替え", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "拡張機能が、`c_cpp_properties.json` で検出されたエラーを報告するかどうかを制御します。", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "`customConfigurationVariables` が設定されていない場合に構成で使用される値、または `customConfigurationVariables` 内に `${default}` がキーとして存在する場合に挿入される値。", "c_cpp.configuration.default.dotConfig.markdownDescription": "`dotConfig` が指定されていないか、`${default}` に設定されている場合に、構成で使用される値。", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "`recursiveIncludes.reduce` が指定されていないか、`${default}` に設定されている場合に、構成で使用される値。", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "`recursiveIncludes.priority` が指定されていないか、`${default}` に設定されている場合に、構成で使用される値。", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "`recursiveIncludes.order` が指定されていないか、`${default}` に設定されている場合に、構成で使用される値。", "c_cpp.configuration.experimentalFeatures.description": "\"experimental\" の機能を使用できるかどうかを制御します。", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "true の場合、統合ターミナルのサポートに必要なデバッグ対象のコンソール リダイレクトが無効になります。", "c_cpp.debuggers.sourceFileMap.markdownDescription": "デバッグ エンジンに渡されるオプションのソース ファイル マッピング。例: `{ \"<元のソース パス>\": \"<現在のソース パス>\" }`。", "c_cpp.debuggers.processId.anyOf.markdownDescription": "デバッガーをアタッチするためのオプションのプロセス ID。ローカルで実行される、アタッチ先プロセスのリストを取得するには、`${command:pickProcess}` を使用します。一部のプラットフォームでは、プロセスにアタッチするために管理者特権が必要となることに注意してください。", + "c_cpp.debuggers.processFilter.description": "ラベル、説明、または詳細でリモートアタッチ候補を照合するために使用されるオプションの正規表現。1 つのプロセスが一致する場合、デバッガーは自動的にアタッチされます。複数のプロセスが一致する場合、一致するエントリのみが含まれるプロセス ピッカーが表示されます。一致するプロセスがない場合は、完全なプロセス ピッカーが表示されます。正規表現が無効な場合、エラーが報告されます。", "c_cpp.debuggers.program.attach.markdownDescription": "プログラム実行可能ファイルへの完全なパス。デバッガーは、この実行可能ファイルのパスに一致する実行中のプロセスを検索し、アタッチします。複数のプロセスが一致する場合は、選択プロンプトが表示されます。アタッチされたプロセスのデバッグ シンボルを読み込むには、このフィールドが必要です。", "c_cpp.debuggers.symbolSearchPath.description": "シンボル (つまり pdb または .so) ファイルの検索に使用する、セミコロンで区切られたディレクトリの一覧です。例: \"c:\\dir1;c:\\dir2\"。", "c_cpp.debuggers.dumpPath.description": "指定したプログラムのダンプ ファイルへの完全なパスです (オプション)。例: \"c:\\temp\\app.dmp\"。既定値は null です。", diff --git a/Extension/i18n/jpn/src/Debugger/processFilter.i18n.json b/Extension/i18n/jpn/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..563d96dd8 --- /dev/null +++ b/Extension/i18n/jpn/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "無効な {0} 正規表現: {1}" +} diff --git a/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json b/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json index f936f939f..b9522ae2b 100644 --- a/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "このヘッダーのライブラリを vcpkg でインストールする方法の詳細", "copy.vcpkg.command": "'{0}' をインストールするための vcpkg コマンドをクリップボードにコピーする", "on.disabled.command": "`C_Cpp.intelliSenseEngine` が `disabled` に設定されている場合、IntelliSense 関連のコマンドは実行できません。", + "find.translation.units": "翻訳単位を検索しています...", + "no.translation.units.found": "アクティブ ファイルに対する翻訳単位が見つかりませんでした。", + "current.translation.unit": "現在の翻訳単位", + "select.translation.unit": "翻訳単位を選択してください", + "select.translation.unit.placeholder": "翻訳単位として使用するソース ファイルを選択してください", "switch.header.source": "ヘッダー/ソースを切り替えています...", "client.not.found": "クライアントが見つかりませんでした", "ok": "OK", diff --git a/Extension/i18n/jpn/src/nativeStrings.i18n.json b/Extension/i18n/jpn/src/nativeStrings.i18n.json index 18b9f7dfb..fb173bb0c 100644 --- a/Extension/i18n/jpn/src/nativeStrings.i18n.json +++ b/Extension/i18n/jpn/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "{0} の分析が完了するのを待機中にタイムアウトしました", "failed_to_open_browse_db_lock_file": "参照データベースのロック ファイルを開けませんでした: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "参照データベースのロック ファイルをロックできませんでした: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "参照データベースは、保存場所が SQLite WAL の共有メモリをサポートしていないため、無効になりました。browse.databaseFilename をローカル パスに設定してください。" + "browse_database_disabled_incompatible_storage": "参照データベースは、保存場所が SQLite WAL の共有メモリをサポートしていないため、無効になりました。browse.databaseFilename をローカル パスに設定してください。", + "selected_translation_unit_not_include_file_previous": "選択された翻訳単位 '{0}' には '{1}' が含まれていません。IntelliSense は、以前の翻訳単位がまだ使用できる場合はそれを復元します。そうでない場合は、'{1}' をヘッダーのみの翻訳単位として使用します。", + "selected_translation_unit_not_include_file_header_only": "選択された翻訳単位 '{0}' には '{1}' が含まれていません。以前の翻訳単位を使用できないため、IntelliSense は '{1}' をヘッダーのみの翻訳単位として使用します。" } diff --git a/Extension/i18n/jpn/ui/settings.html.i18n.json b/Extension/i18n/jpn/ui/settings.html.i18n.json index 67a260ac7..2ad5dd3eb 100644 --- a/Extension/i18n/jpn/ui/settings.html.i18n.json +++ b/Extension/i18n/jpn/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "{0} (またはチェックボックスがオン) の場合、タグ パーサーは、{1} のソース ファイルによって直接的または間接的にインクルードされたコード ファイルのみを解析します。{2} (またはチェック ボックスがオフ) の場合、タグ パーサーは、{3} の一覧に指定されたパスで見つかったすべてのコード ファイルを解析します。", "database.filename": "参照: データベース ファイル名", "database.filename.description": "生成されたシンボル データベースへのパスです。これは、タグ パーサーのシンボル データベースをワークスペースの既定のストレージの場所以外に保存するように拡張機能に指示します。相対パスを指定した場合、ワークスペース フォルダー自体ではなく、ワークスペースの既定のストレージの場所に対する相対パスになります。{0} 変数を使用して、ワークスペース フォルダーに対する相対パスを指定することもできます (例: {1})。", - "recursiveIncludes.reduce": "再帰的インクルード: 縮小", - "recursiveIncludes.reduce.description": "{0} に設定すると、IntelliSense に提供される再帰インクルード パスの数は #include ステートメントによって現在参照されているパスのみに減らされます。これには、まずファイルを解析して、どのファイルが含まれているかを判断する必要があります。すべての再帰インクルード パスを IntelliSense に提供するには、{1} に設定します。非常に多数の再帰インクルード パスが関係している場合、再帰インクルード パスの数を減らすと、IntelliSense のパフォーマンスが向上する可能性があります。再帰インクルード パスの数を減らさないことで、どのインクルード パスを提供するかを判断するためのファイル解析が不要になり、IntelliSense のパフォーマンスが向上する場合があります。", "recursiveIncludes.priority": "再帰インクルード: 優先度", "recursiveIncludes.priority.description": "再帰インクルード パスの優先順位。{0} に設定すると、再帰インクルード パスはシステム インクルード パスの前に検索されます。{1} に設定すると、再帰インクルード パスはシステム インクルード パスの後に検索されます。", "recursiveIncludes.order": "再帰的インクルード: 順序", diff --git a/Extension/i18n/kor/package.i18n.json b/Extension/i18n/kor/package.i18n.json index 76e9c6edb..9c677d0f0 100644 --- a/Extension/i18n/kor/package.i18n.json +++ b/Extension/i18n/kor/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "C++ 컴파일러 설치", "c_cpp.command.rescanCompilers.title": "컴파일러 관련 재검사", "c_cpp.command.switchHeaderSource.title": "헤더/소스 전환", + "c_cpp.command.selectTranslationUnit.title": "변환 단위 선택...", "c_cpp.command.enableErrorSquiggles.title": "오류 표시선 사용", "c_cpp.command.disableErrorSquiggles.title": "오류 표시선 사용 안 함", "c_cpp.command.toggleDimInactiveRegions.title": "비활성 영역 색 지정 설정/해제", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "확장이 `c_cpp_properties.json`에서 검색된 오류를 보고하도록 할지를 제어합니다.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "`customConfigurationVariables`가 설정되지 않은 경우 구성에서 사용할 값 또는 `${default}`가 `customConfigurationVariables`에 키로 존재하는 경우 삽입할 값입니다.", "c_cpp.configuration.default.dotConfig.markdownDescription": "`dotConfig`가 지정되지 않았거나 `${default}`로 설정된 경우 구성에 사용할 값입니다.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "`recursiveIncludes.reduce`가 지정되지 않았거나 `${default}`로 설정된 경우 구성에 사용할 값입니다.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "`recursiveIncludes.priority`가 지정되지 않았거나 `${default}`로 설정된 경우 구성에 사용할 값입니다.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "`recursiveIncludes.order`가 지정되지 않았거나 `${default}`로 설정된 경우 구성에 사용할 값입니다.", "c_cpp.configuration.experimentalFeatures.description": "\"실험적\" 기능을 사용할 수 있는지 여부를 제어합니다.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "true이면 통합 터미널 지원에 필요한 디버기 콘솔 리디렉션을 사용하지 않도록 설정합니다.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "디버그 엔진에 전달되는 선택적 소스 파일 매핑입니다. 예: `{ \"<원래 소스 경로>\": \"<현재 소스 경로>\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "디버거를 연결할 선택적 프로세스 ID입니다. `${command:pickProcess}`를 사용하여 연결할 로컬 실행 프로세스 목록을 가져옵니다. 일부 플랫폼에서는 프로세스에 연결하기 위해 관리자 권한이 필요합니다.", + "c_cpp.debuggers.processFilter.description": "레이블, 설명 또는 세부 정보로 원격 연결 후보를 일치시키는 데 사용하는 선택적 정규식입니다. 정확히 하나의 프로세스가 일치하면 디버거가 자동으로 연결됩니다. 여러 프로세스가 일치하면 일치하는 항목만 표시된 프로세스 선택기가 나타납니다. 일치하는 프로세스가 없으면 전체 프로세스 선택기가 표시됩니다. 잘못된 정규식이면 오류가 보고됩니다.", "c_cpp.debuggers.program.attach.markdownDescription": "프로그램 실행 파일의 전체 경로입니다. 디버거는 이 실행 파일 경로와 일치하는 실행 중인 프로세스를 찾아 연결합니다. 여러 프로세스가 일치하는 경우 선택 프롬프트가 나타납니다. 이 필드는 연결된 프로세스의 디버그 기호를 로드하는 데 필요합니다.", "c_cpp.debuggers.symbolSearchPath.description": "기호(pdb 또는 .so) 파일 검색에 사용할 디렉터리의 세미콜론으로 구분된 목록입니다. 예: \"c:\\dir1;c:\\dir2\".", "c_cpp.debuggers.dumpPath.description": "지정된 프로그램에 대한 코어 덤프 파일의 선택적 전체 경로입니다(예: \"c:\\temp\\app.dmp\"). 기본값은 null입니다.", diff --git a/Extension/i18n/kor/src/Debugger/processFilter.i18n.json b/Extension/i18n/kor/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..2047b98ac --- /dev/null +++ b/Extension/i18n/kor/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "잘못된 {0} 정규식: {1}" +} diff --git a/Extension/i18n/kor/src/LanguageServer/extension.i18n.json b/Extension/i18n/kor/src/LanguageServer/extension.i18n.json index 2b9986c9a..506af3783 100644 --- a/Extension/i18n/kor/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/kor/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "vcpkg를 사용하여 이 헤더의 라이브러리를 설치하는 방법 알아보기", "copy.vcpkg.command": "'{0}'을(를) 설치할 vcpkg 명령을 클립보드에 복사", "on.disabled.command": "IntelliSense 관련 명령은 `C_Cpp.intelliSenseEngine`이 `disabled`로 설정된 경우 실행할 수 없습니다.", + "find.translation.units": "변환 단위를 찾는 중...", + "no.translation.units.found": "활성 파일에 대한 변환 단위를 찾을 수 없습니다.", + "current.translation.unit": "현재 변환 단위", + "select.translation.unit": "변환 단위 선택", + "select.translation.unit.placeholder": "변환 단위로 사용할 원본 파일 선택", "switch.header.source": "헤더/원본을 전환하는 중...", "client.not.found": "클라이언트를 찾을 수 없음", "ok": "확인", diff --git a/Extension/i18n/kor/src/nativeStrings.i18n.json b/Extension/i18n/kor/src/nativeStrings.i18n.json index ada469c08..8305ff3ba 100644 --- a/Extension/i18n/kor/src/nativeStrings.i18n.json +++ b/Extension/i18n/kor/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "{0}에 대한 분석이 완료되기를 기다리는 동안 시간이 초과되었습니다.", "failed_to_open_browse_db_lock_file": "찾아보기 데이터베이스 잠금 파일을 열지 못했습니다. {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "찾아보기 데이터베이스 잠금 파일을 잠그지 못했습니다. {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "저장소 위치에서 SQLite WAL 공유 메모리를 지원하지 않으므로 찾아보기 데이터베이스를 사용할 수 없습니다. browse.databaseFilename을 로컬 경로로 설정하세요." + "browse_database_disabled_incompatible_storage": "저장소 위치에서 SQLite WAL 공유 메모리를 지원하지 않으므로 찾아보기 데이터베이스를 사용할 수 없습니다. browse.databaseFilename을 로컬 경로로 설정하세요.", + "selected_translation_unit_not_include_file_previous": "선택한 변환 단위 '{0}'에는 '{1}'이(가) 포함되어 있지 않습니다. IntelliSense는 이전 변환 단위를 사용할 수 있으면 복원하며, 그렇지 않으면 '{1}'을(를) 헤더 전용 변환 단위로 사용합니다.", + "selected_translation_unit_not_include_file_header_only": "선택한 변환 단위 '{0}'에 '{1}'이(가) 포함되어 있지 않습니다. 이전 변환 단위를 사용할 수 없으므로 IntelliSense는 '{1}'을(를) 헤더 전용 변환 단위로 사용합니다." } diff --git a/Extension/i18n/kor/ui/settings.html.i18n.json b/Extension/i18n/kor/ui/settings.html.i18n.json index 5928f080a..67113cd8f 100644 --- a/Extension/i18n/kor/ui/settings.html.i18n.json +++ b/Extension/i18n/kor/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "{0}(또는 선택)인 경우 태그 파서는 {1} 의 원본 파일에 직접 또는 간접적으로 포함된 코드 파일만 구문 분석합니다. {2} 인 경우(또는 선택하지 않은 경우) 태그 파서는 {3} 목록에 지정된 경로에 있는 모든 코드 파일을 구문 분석합니다.", "database.filename": "찾아보기: 데이터베이스 파일 이름", "database.filename.description": "생성된 기호 데이터베이스의 경로입니다. 이 경로는 태그 파서의 기호 데이터베이스를 작업 영역의 기본 스토리지 위치가 아닌 다른 곳에 저장하도록 확장에 지시합니다. 상대 경로가 지정된 경우 작업 영역 폴더 자체가 아니라 작업 영역의 기본 스토리지 위치에 대해 상대적으로 만들어집니다. {0} 변수를 사용하여 작업 영역 폴더에 상대적인 경로를 지정할 수 있습니다(예: {1}).", - "recursiveIncludes.reduce": "재귀 포함: 축소", - "recursiveIncludes.reduce.description": "IntelliSense에 제공된 재귀 포함 경로의 수를 현재 #include 문에서 참조하는 경로로만 줄이려면 {0}(으)로 설정합니다. 이를 위해서는 포함된 파일을 확인하기 위해 먼저 파일을 구문 분석해야 합니다. IntelliSense에 대한 모든 재귀 포함 경로를 제공하려면 {1}(으)로 설정합니다. 재귀 포함 경로의 수를 줄이면 매우 많은 수의 재귀 포함 경로가 관련된 경우 IntelliSense 성능이 향상될 수 있습니다. 재귀 포함 경로의 수를 줄이지 않으면 제공할 포함 경로를 확인하기 위해 파일을 구문 분석할 필요가 없으므로 IntelliSense 성능을 향상시킬 수 있습니다.", "recursiveIncludes.priority": "재귀 포함: 우선 순위", "recursiveIncludes.priority.description": "재귀 포함 경로의 우선 순위입니다. {0}(으)로 설정하면 재귀 포함 경로가 시스템 포함 경로 전에 검색됩니다. {1}(으)로 설정하면 시스템 포함 경로 후에 재귀 포함 경로가 검색됩니다.", "recursiveIncludes.order": "재귀 포함: 주문", diff --git a/Extension/i18n/plk/package.i18n.json b/Extension/i18n/plk/package.i18n.json index 2af190b82..76ad48970 100644 --- a/Extension/i18n/plk/package.i18n.json +++ b/Extension/i18n/plk/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Zainstaluj kompilator języka C++", "c_cpp.command.rescanCompilers.title": "Ponownie zeskanuj w poszukiwaniu kompilatorów", "c_cpp.command.switchHeaderSource.title": "Przełączanie nagłówka/źródła", + "c_cpp.command.selectTranslationUnit.title": "Wybierz jednostkę translacji...", "c_cpp.command.enableErrorSquiggles.title": "Włączanie zygzaków sygnalizujących błędy", "c_cpp.command.disableErrorSquiggles.title": "Wyłączanie zygzaków sygnalizujących błędy", "c_cpp.command.toggleDimInactiveRegions.title": "Przełączanie kolorowania regionów nieaktywnych", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Określa, czy rozszerzenie będzie raportować błędy wykryte w pliku `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Wartość do użycia w konfiguracji, jeśli element `customConfigurationVariables` nie został ustawiony, lub wartości do wstawienia, jeśli element `${default}` istnieje jako klucz w elemencie `customConfigurationVariables`.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Wartość do użycia w konfiguracji, jeśli parametr `dotConfig` nie został określony lub jest ustawiony na wartość `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Wartość do użycia w konfiguracji, jeśli parametr `recursiveIncludes.reduce` nie jest określony lub jest ustawiony na wartość `${default}`.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Wartość do użycia w konfiguracji, jeśli parametr `recursiveIncludes.priority` nie jest określony lub jest ustawiony na wartość `${default}`.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Wartość do użycia w konfiguracji, jeśli parametr `recursiveIncludes.order` nie został określony lub jest ustawiony na wartość `${default}`.", "c_cpp.configuration.experimentalFeatures.description": "Określa, czy można używać funkcji „eksperymentalnych”.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Jeśli wartość to true, wyłącza przekierowywanie konsoli debugowanego obiektu, które jest wymagane do obsługi zintegrowanego terminalu.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Opcjonalne mapowania plików źródłowych przekazane do silnika debugowania. Przykład: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "Opcjonalny identyfikator procesu, do którego ma zostać dołączony debuger. Użyj polecenia `${command:pickProcess}`, aby uzyskać listę uruchomionych lokalnie procesów, do których można dołączyć. Pamiętaj, że niektóre platformy wymagają uprawnień administratora, aby dołączyć je do procesu.", + "c_cpp.debuggers.processFilter.description": "Opcjonalne wyrażenie regularne służące do dopasowywania kandydatów do zdalnego dołączania według etykiety, opisu lub szczegółów. Jeśli pasuje dokładnie jeden proces, debuger dołącza automatycznie. Jeśli pasuje kilka procesów, wyświetlany jest selektor procesów z tylko pasującymi wpisami. Jeśli żaden proces nie pasuje, wyświetlany jest selektor wszystkich procesów. Nieprawidłowe wyrażenie regularne zgłasza błąd.", "c_cpp.debuggers.program.attach.markdownDescription": "Pełna ścieżka do pliku wykonywalnego programu. Debuger wyszuka uruchomiony proces zgodny z tą ścieżką wykonywalną i dołączy do niego. Jeśli wiele procesów jest zgodnych, zostanie wyświetlony monit o zaznaczenie. To pole jest wymagane do załadowania symboli debugowania dla dołączonego procesu.", "c_cpp.debuggers.symbolSearchPath.description": "Rozdzielana średnikami lista katalogów do wyszukiwania plików symboli (tj. pdb lub .so). Przykład: „c:\\dir1;c:\\dir2”.", "c_cpp.debuggers.dumpPath.description": "Opcjonalna pełna ścieżka do pliku zrzutu dla określonego programu. Przykład: „c:\\temp\\app.dmp”. Wartość domyślna to null.", diff --git a/Extension/i18n/plk/src/Debugger/processFilter.i18n.json b/Extension/i18n/plk/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..411a5b307 --- /dev/null +++ b/Extension/i18n/plk/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Nieprawidłowe wyrażenie regularne {0}: {1}" +} diff --git a/Extension/i18n/plk/src/LanguageServer/extension.i18n.json b/Extension/i18n/plk/src/LanguageServer/extension.i18n.json index 6da719cf2..6690f8eea 100644 --- a/Extension/i18n/plk/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/plk/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Dowiedz się, jak zainstalować bibliotekę dla tego nagłówka przy użyciu menedżera vcpkg", "copy.vcpkg.command": "Skopiuj polecenie vcpkg, aby zainstalować element „{0}” w schowku", "on.disabled.command": "Nie można wykonywać poleceń związanych z funkcją IntelliSense, gdy właściwość `C_Cpp.intelliSenseEngine` ma wartość `disabled`.", + "find.translation.units": "Trwa znajdowanie jednostek translacji...", + "no.translation.units.found": "Nie znaleziono jednostek translacji dla aktywnego pliku.", + "current.translation.unit": "Bieżąca jednostka translacji", + "select.translation.unit": "Wybierz jednostkę translacji", + "select.translation.unit.placeholder": "Wybierz plik źródłowy, który ma być używany jako jednostka translacji", "switch.header.source": "Trwa przełączanie nagłówka/źródła...", "client.not.found": "nie znaleziono klienta", "ok": "OK", diff --git a/Extension/i18n/plk/src/nativeStrings.i18n.json b/Extension/i18n/plk/src/nativeStrings.i18n.json index a34703384..ebb51cab2 100644 --- a/Extension/i18n/plk/src/nativeStrings.i18n.json +++ b/Extension/i18n/plk/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "przekroczono limit czasu oczekiwania na zakończenie analizy {0}", "failed_to_open_browse_db_lock_file": "Nie można otworzyć pliku blokady bazy danych przeglądania: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Nie można zablokować pliku blokady bazy danych przeglądania: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "Baza danych przeglądania została wyłączona, ponieważ jej lokalizacja przechowywania nie obsługuje współużytkowanej pamięci SQLite WAL. Ustaw parametr browse.databaseFilename na ścieżkę lokalną." + "browse_database_disabled_incompatible_storage": "Baza danych przeglądania została wyłączona, ponieważ jej lokalizacja przechowywania nie obsługuje współużytkowanej pamięci SQLite WAL. Ustaw parametr browse.databaseFilename na ścieżkę lokalną.", + "selected_translation_unit_not_include_file_previous": "Wybrana jednostka translacji „{0}” nie zawiera elementu „{1}”. Funkcja IntelliSense przywróci poprzednią jednostkę translacji, jeśli jest nadal dostępna; w przeciwnym razie użyje elementu „{1}” jako jednostki translacji zawierającej tylko nagłówek.", + "selected_translation_unit_not_include_file_header_only": "Wybrana jednostka translacji „{0}” nie zawiera elementu „{1}”. Żadna poprzednia jednostka translacji nie jest dostępna, więc funkcja IntelliSense będzie używać elementu „{1}” jako jednostki translacji zawierającej tylko nagłówek." } diff --git a/Extension/i18n/plk/ui/settings.html.i18n.json b/Extension/i18n/plk/ui/settings.html.i18n.json index ed4446987..58e9c4bae 100644 --- a/Extension/i18n/plk/ui/settings.html.i18n.json +++ b/Extension/i18n/plk/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Jeśli wartość jest równa {0} (lub jest zaznaczona), analizator tagów analizuje tylko pliki kodu, które zostały bezpośrednio lub pośrednio dołączone przez plik źródłowy w {1}. Jeśli wartość jest równa {2} (lub nie jest zaznaczona), analizator tagów będzie analizować wszystkie pliki kodu znalezione w ścieżkach określonych na {3} liście.", "database.filename": "Przeglądaj: nazwa pliku bazy danych", "database.filename.description": "Ścieżka do generowanej bazy danych symboli. Określa ona, że rozszerzenie ma zapisać bazę danych symboli analizatora tagów w innym miejscu niż domyślna lokalizacja magazynowania obszaru roboczego. Jeśli zostanie określona ścieżka względna, będzie to ścieżka względem domyślnej lokalizacji magazynowania obszaru roboczego, a nie folderu obszaru roboczego. Można użyć zmiennej {0} do określenia ścieżki względem folderu obszaru roboczego (np. {1}).", - "recursiveIncludes.reduce": "Rekursywne obejmuje: redukcję", - "recursiveIncludes.reduce.description": "Ustaw na wartość {0}, aby zmniejszyć liczbę ścieżek rekursywnego dołączania dostarczanych do funkcji IntelliSense tylko do tych ścieżek, do których obecnie odwołują się instrukcje #include. Wymaga to najpierw przeanalizowania plików w celu określenia, które pliki są dołączane. Ustaw na wartość{1}, aby dostarczać wszystkie ścieżki rekursywnego dołączania do funkcji IntelliSense. Zmniejszenie liczby ścieżek rekursywnego dołączania może zwiększyć wydajność funkcji IntelliSense w przypadku dużej liczby ścieżek rekursywnego dołączania. Brak zmniejszenia liczby ścieżek rekursywnego dołączania może zwiększyć wydajność funkcji IntelliSense, unikając konieczności analizowania plików w celu określenia, które ścieżki dołączane należy podać.", "recursiveIncludes.priority": "Rekursywne dołączania: priorytet", "recursiveIncludes.priority.description": "Priorytet ścieżek rekursywnego dołączania. Jeśli ustawiono na wartość {0}, ścieżki rekursywnego dołączania będą przeszukiwane przed ścieżkami systemowego dołączania. Jeśli ustawiono na wartość {1}, ścieżki rekursywnego dołączania będą przeszukiwane po ścieżkach systemowego dołączania.", "recursiveIncludes.order": "Rekursywne obejmuje: kolejność", diff --git a/Extension/i18n/ptb/package.i18n.json b/Extension/i18n/ptb/package.i18n.json index 491e58a69..a7b1d4739 100644 --- a/Extension/i18n/ptb/package.i18n.json +++ b/Extension/i18n/ptb/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Instalar um compilador C++", "c_cpp.command.rescanCompilers.title": "Examinar novamente os Compiladores", "c_cpp.command.switchHeaderSource.title": "Alternar Cabeçalho/Origem", + "c_cpp.command.selectTranslationUnit.title": "Selecionar uma Unidade de Tradução...", "c_cpp.command.enableErrorSquiggles.title": "Habilitar Rabiscos de Erro", "c_cpp.command.disableErrorSquiggles.title": "Desabilitar Rabiscos de Erro", "c_cpp.command.toggleDimInactiveRegions.title": "Ativar/Desativar a Colorização de Região Inativa", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Controla se a extensão reportará erros detectados em `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "O valor a ser usado em uma configuração se `customConfigurationVariables` não estiver definido, ou os valores a serem inseridos se `${default}` estiver presente como uma chave em `customConfigurationVariables`.", "c_cpp.configuration.default.dotConfig.markdownDescription": "O valor a ser usado em uma configuração se `dotConfig` não for especificado ou definido como `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "O valor a ser usado em uma configuração se `recursiveIncludes.reduce` não for especificado ou definido como `${default}`.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "O valor a ser usado em uma configuração se `recursiveIncludes.priority` não for especificado ou definido como `${default}`.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "O valor a ser usado em uma configuração se `recursiveIncludes.order` não for especificado ou definido como `${default}`.", "c_cpp.configuration.experimentalFeatures.description": "Controla se os recursos \"experimentais\" podem ser usados.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Se for true, desabilitará o redirecionamento do console do depurador requerido para o suporte do Terminal Integrado.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Mapeamentos opcionais de arquivo de origem passados para o mecanismo de depuração. Exemplo: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "ID do processo opcional ao qual anexar o depurador. Use `${command:pickProcess}` para obter uma lista de processos locais em execução aos quais anexar. Observe que algumas plataformas exigem privilégios de administrador para anexação a um processo.", + "c_cpp.debuggers.processFilter.description": "Expressão regular opcional usada para corresponder aos candidatos à anexação remota por rótulo, descrição ou detalhe. Se exatamente um processo corresponder, o depurador será anexado automaticamente. Se vários processos corresponderem, o seletor de processos será mostrado apenas com entradas correspondentes. Se nenhum processo corresponder, o seletor de processo completo será mostrado. Uma expressão regular inválida relata um erro.", "c_cpp.debuggers.program.attach.markdownDescription": "Caminho completo para o executável do programa. O depurador pesquisará um processo em execução que corresponda a esse caminho executável e anexará a ele. Se vários processos corresponderem, um prompt de seleção será mostrado. Esse campo é necessário para carregar símbolos de depuração para o processo anexado.", "c_cpp.debuggers.symbolSearchPath.description": "Lista separada por ponto e vírgula de diretórios a serem usadas para pesquisar arquivos de símbolos (ou seja, pdb ou .so). Exemplo: \"c:\\dir1;c:\\dir2\".", "c_cpp.debuggers.dumpPath.description": "Caminho completo opcional para um arquivo de despejo para o programa especificado. Exemplo: \"c:\\temp\\app.dmp\". Usa nulo como padrão.", diff --git a/Extension/i18n/ptb/src/Debugger/processFilter.i18n.json b/Extension/i18n/ptb/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..8fe505489 --- /dev/null +++ b/Extension/i18n/ptb/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Expressão regular {0} inválida: {1}" +} diff --git a/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json b/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json index ca1c51a8b..d08148352 100644 --- a/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Saiba como instalar uma biblioteca para este cabeçalho com vcpkg", "copy.vcpkg.command": "Copiar o comando vcpkg para instalar '{0}' para a área de transferência", "on.disabled.command": "Comandos relacionados ao IntelliSense não podem ser executados quando `C_Cpp.intelliSenseEngine` está definido como `disabled`.", + "find.translation.units": "Localizando Unidades de Tradução...", + "no.translation.units.found": "Nenhuma unidade de tradução foi encontrada para o arquivo ativo.", + "current.translation.unit": "Unidade de tradução atual", + "select.translation.unit": "Selecionar uma Unidade de Tradução", + "select.translation.unit.placeholder": "Selecione um arquivo de origem para usar como unidade de tradução", "switch.header.source": "Alternando cabeçalho/origem...", "client.not.found": "o cliente não foi encontrado", "ok": "OK", diff --git a/Extension/i18n/ptb/src/nativeStrings.i18n.json b/Extension/i18n/ptb/src/nativeStrings.i18n.json index 836965894..47bac98e3 100644 --- a/Extension/i18n/ptb/src/nativeStrings.i18n.json +++ b/Extension/i18n/ptb/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "tempo limite esgotado enquanto aguardava a conclusão da análise de {0}", "failed_to_open_browse_db_lock_file": "Não foi possível abrir o arquivo de bloqueio do banco de dados de navegação: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Não foi possível bloquear o arquivo de bloqueio do banco de dados de navegação: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "O banco de dados de navegação foi desabilitado porque seu local de armazenamento não dá suporte à memória compartilhada do SQLite WAL. Defina browse.databaseFilename como um caminho local." + "browse_database_disabled_incompatible_storage": "O banco de dados de navegação foi desabilitado porque seu local de armazenamento não dá suporte à memória compartilhada do SQLite WAL. Defina browse.databaseFilename como um caminho local.", + "selected_translation_unit_not_include_file_previous": "A unidade de tradução selecionada '{0}' não inclui '{1}'. O IntelliSense restaurará a unidade de tradução anterior se ela ainda estiver disponível; caso contrário, ele usará '{1}' como uma unidade de tradução somente de cabeçalho.", + "selected_translation_unit_not_include_file_header_only": "A unidade de tradução selecionada '{0}' não inclui '{1}'. Nenhuma unidade de tradução anterior está disponível, portanto, o IntelliSense usará '{1}' como uma unidade de tradução somente de cabeçalho." } diff --git a/Extension/i18n/ptb/ui/settings.html.i18n.json b/Extension/i18n/ptb/ui/settings.html.i18n.json index 50a65efed..724804c82 100644 --- a/Extension/i18n/ptb/ui/settings.html.i18n.json +++ b/Extension/i18n/ptb/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "Quando {0} (ou marcado), o Analisador de Marca analisará somente os arquivos de código que foram diretamente ou indiretamente incluídos em um arquivo de origem no {1}. Quando {2} (ou não marcado), o Analisador de Marca analisará todos os arquivos de código encontrados nos caminhos especificados na lista de {3}.", "database.filename": "Procurar: nome do arquivo do banco de dados", "database.filename.description": "O caminho para o banco de dados de símbolo gerado. Isso instrui a extensão a salvar o banco de dados de símbolos do Analisador de Marca em algum lugar diferente do local de armazenamento padrão do workspace. Se um caminho relativo for especificado, ele será feito em relação ao local de armazenamento padrão do workspace, não à própria pasta do workspace. A {0} variável pode ser usada para especificar um caminho relativo à pasta do workspace (por exemplo, {1}).", - "recursiveIncludes.reduce": "Inclusões recursivas: reduzir", - "recursiveIncludes.reduce.description": "Defina como {0} para reduzir o número de caminhos de inclusão recursivos fornecidos ao IntelliSense apenas para os caminhos atualmente referenciados por instruções #include. Isso requer primeiro a análise de arquivos para determinar quais arquivos estão incluídos. Defina como {1} para fornecer todos os caminhos de inclusão recursivos para o IntelliSense. Reduzir o número de caminhos de inclusão recursivos pode melhorar o desempenho do IntelliSense quando um número muito grande de caminhos de inclusão recursivos está envolvido. Não reduzir o número de caminhos de inclusão recursivos pode melhorar o desempenho do IntelliSense, evitando a necessidade de analisar arquivos para determinar quais caminhos de inclusão fornecer.", "recursiveIncludes.priority": "Inclui recursiva: prioridade", "recursiveIncludes.priority.description": "A prioridade dos caminhos de inclusão recursivo. Se definido como {0}, os caminhos de inclusão recursivos serão pesquisados antes que o sistema inclua caminhos. Se definido como {1}, os caminhos de inclusão recursivos serão pesquisados depois que o sistema incluir caminhos.", "recursiveIncludes.order": "Inclusões recursivas: pedido", diff --git a/Extension/i18n/rus/package.i18n.json b/Extension/i18n/rus/package.i18n.json index 28d1df96c..de81b34ec 100644 --- a/Extension/i18n/rus/package.i18n.json +++ b/Extension/i18n/rus/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "Установка компилятора C++", "c_cpp.command.rescanCompilers.title": "Повторный поиск компиляторов", "c_cpp.command.switchHeaderSource.title": "Переключить заголовок/источник", + "c_cpp.command.selectTranslationUnit.title": "Выбор единицы трансляции...", "c_cpp.command.enableErrorSquiggles.title": "Включить волнистые линии для ошибок", "c_cpp.command.disableErrorSquiggles.title": "Отключить волнистые линии для ошибок", "c_cpp.command.toggleDimInactiveRegions.title": "Переключить раскраску неактивных областей", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Определяет, будет ли расширение сообщать об ошибках, обнаруженных в `c_cpp_properties.json`.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "Значение, используемое в конфигурации, если параметр `customConfigurationVariables` не установлен, или вставляемые значения, если в `customConfigurationVariables` присутствует значение `${default}` в качестве ключа.", "c_cpp.configuration.default.dotConfig.markdownDescription": "Значение, используемое в конфигурации, если параметр `dotConfig` не указан или имеет значение `${default}`.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "Значение, используемое в конфигурации, если параметр `recursiveIncludes.reduce` не указан или имеет значение `${default}`.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "Значение, используемое в конфигурации, если параметр `recursiveIncludes.priority` не указан или имеет значение `${default}`.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "Значение, используемое в конфигурации, если параметр `recursiveIncludes.order` не указан или имеет значение `${default}`.", "c_cpp.configuration.experimentalFeatures.description": "Определяет, можно ли использовать \"экспериментальные\" функции.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Если задано значение true, отключается перенаправление консоли отлаживаемого объекта, необходимое для поддержки встроенного терминала.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Необязательные сопоставления исходных файлов, передаваемые подсистеме отладки. Пример: `{ \"<первоначальный путь к источнику>\": \"<текущий путь к источнику>\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "Необязательный идентификатор процесса, к которому требуется подключить отладчик. Используйте `${command:pickProcess}`, чтобы получить список локальных запущенных процессов для подключения. Обратите внимание, что для подключения к процессам на некоторых платформах требуются права администратора.", + "c_cpp.debuggers.processFilter.description": "Необязательное регулярное выражение, используемое для сопоставления кандидатов удаленного подключения по метке, описанию или деталям. Если найден ровно один подходящий процесс, отладчик подключается автоматически. Если найдено несколько подходящих процессов, отображается средство выбора процессов только с подходящими записями. Если ни один процесс не подходит, отображается полное средство выбора процессов. Недопустимое регулярное выражение приводит к ошибке.", "c_cpp.debuggers.program.attach.markdownDescription": "Полный путь к исполняемому файлу program. Отладчик будет искать запущенный процесс, совпадающий с путем этого исполняемого файла, и подключаться к нему. Если процессов несколько, появится запрос выбора. Это поле обязательно с целью загрузки символов отладки для подключенного процесса.", "c_cpp.debuggers.symbolSearchPath.description": "Список каталогов, разделенных точкой с запятой, который следует использовать для поиска файлов символов (таких как PDB или SO). Пример: \"c:\\каталог_1;c:\\каталог_2\".", "c_cpp.debuggers.dumpPath.description": "Необязательный полный путь к основному файлу дампа для указанной программы. Пример: \"c:\\temp\\app.dmp\". Значение по умолчанию: null.", diff --git a/Extension/i18n/rus/src/Debugger/processFilter.i18n.json b/Extension/i18n/rus/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..99f842142 --- /dev/null +++ b/Extension/i18n/rus/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Недопустимое регулярное выражение {0}: {1}" +} diff --git a/Extension/i18n/rus/src/LanguageServer/extension.i18n.json b/Extension/i18n/rus/src/LanguageServer/extension.i18n.json index 8ca4dd931..aa50ef1c6 100644 --- a/Extension/i18n/rus/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/rus/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "Сведения об установке библиотеки для этого заголовка с помощью vcpkg", "copy.vcpkg.command": "Копировать команду vcpkg для установки \"{0}\" в буфер обмена", "on.disabled.command": "Команды, связанные с IntelliSense, не могут быть выполнены, если для `C_Cpp.intelliSenseEngine` установлено значение `disabled`.", + "find.translation.units": "Поиск единиц трансляции...", + "no.translation.units.found": "Не найдены единицы трансляции для активного файла.", + "current.translation.unit": "Текущая единица трансляции", + "select.translation.unit": "Выберите единицу трансляции", + "select.translation.unit.placeholder": "Выберите исходный файл, который будет использоваться в качестве единицы трансляции", "switch.header.source": "Переключение заголовка/источника...", "client.not.found": "Клиент не найден.", "ok": "ОК", diff --git a/Extension/i18n/rus/src/nativeStrings.i18n.json b/Extension/i18n/rus/src/nativeStrings.i18n.json index 90ac86999..fcabfc992 100644 --- a/Extension/i18n/rus/src/nativeStrings.i18n.json +++ b/Extension/i18n/rus/src/nativeStrings.i18n.json @@ -434,5 +434,7 @@ "check_timed_out": "истекло время ожидания завершения анализа {0}", "failed_to_open_browse_db_lock_file": "Не удалось открыть файл блокировки базы данных просмотра: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Не удалось заблокировать файл блокировки базы данных просмотра: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "База данных просмотра была отключена, так как ее место хранения не поддерживает общую память SQLite WAL. Настройте для browse.databaseFilename локальный путь." + "browse_database_disabled_incompatible_storage": "База данных просмотра была отключена, так как ее место хранения не поддерживает общую память SQLite WAL. Настройте для browse.databaseFilename локальный путь.", + "selected_translation_unit_not_include_file_previous": "Выбранная единица трансляции '{0}' не содержит '{1}'. IntelliSense восстановит предыдущую единицу трансляции, если она еще доступна; в противном случае он будет использовать '{1}' в качестве единицы трансляции только для заголовков.", + "selected_translation_unit_not_include_file_header_only": "Выбранная единица трансляции '{0}' не содержит '{1}'. Предыдущая единица трансляции недоступна, поэтому IntelliSense будет использовать '{1}' как единицу трансляции только для заголовков." } diff --git a/Extension/i18n/rus/ui/settings.html.i18n.json b/Extension/i18n/rus/ui/settings.html.i18n.json index e0f62dd54..21c9fb276 100644 --- a/Extension/i18n/rus/ui/settings.html.i18n.json +++ b/Extension/i18n/rus/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "При значении {0} (или если установлен флажок) анализатор тегов будет анализировать только файлы кода, прямо или косвенно включаемые исходным файлом в {1}. При значении {2} (или если флажок не установлен) анализатор тегов будет анализировать все файлы кода, найденные по путям, указанным в списке {3}.", "database.filename": "Обзор: имя файла базы данных", "database.filename.description": "Путь к создаваемой базе данных символов. Этот параметр указывает расширению расположение для сохранение базы данных символов анализатора тегов, отличное от используемого в этой рабочей области места хранения по умолчанию.Если указать относительный путь, он будет определяться относительно места хранения по умолчанию, а не от папки самой рабочей области. Чтобы указать путь относительно папки рабочей области, можно использовать переменную {0} (например, {1}).", - "recursiveIncludes.reduce": "Рекурсивные включения: уменьшение", - "recursiveIncludes.reduce.description": "Задайте значение {0}, чтобы всегда уменьшать количество путей рекурсивного включения, предоставляемых для IntelliSense, только до тех путей, на которые в настоящее время ссылаются инструкции #include. Для этого необходимо сначала проанализировать файлы, чтобы определить, какие файлы включены. Задайте значение {1}, чтобы предоставить все пути рекурсивного включения для IntelliSense. Уменьшение количества путей рекурсивного включения может повысить производительность IntelliSense, если задействовано очень большое количество путей рекурсивного включения. Отсутствие уменьшения количества путей рекурсивного включения может улучшить производительность IntelliSense благодаря отказу от необходимости анализа файлов для определения того, какие пути включения следует предоставить.", "recursiveIncludes.priority": "Рекурсивные включения: приоритет", "recursiveIncludes.priority.description": "Приоритет путей рекурсивного включения. Если задано значение {0}, поиск путей рекурсивного включения будет выполняться до путей системного включения. Если задано значение {1}, поиск путей рекурсивного включения будет выполняться после путей системного включения.", "recursiveIncludes.order": "Рекурсивные включения: порядок", diff --git a/Extension/i18n/trk/package.i18n.json b/Extension/i18n/trk/package.i18n.json index 9bbf9af87..9c7a8d560 100644 --- a/Extension/i18n/trk/package.i18n.json +++ b/Extension/i18n/trk/package.i18n.json @@ -20,6 +20,7 @@ "c_cpp.command.installCompiler.title": "C++ Derleyicisi Yükle", "c_cpp.command.rescanCompilers.title": "Derleyicileri Yeniden Tara", "c_cpp.command.switchHeaderSource.title": "Üst Bilgiyi/Kaynağı Değiştir", + "c_cpp.command.selectTranslationUnit.title": "Çeviri Birimi Seçin...", "c_cpp.command.enableErrorSquiggles.title": "Hata İlişkilendirmelerini Etkinleştir", "c_cpp.command.disableErrorSquiggles.title": "Hata İlişkilendirmelerini Devre Dışı Bırak", "c_cpp.command.toggleDimInactiveRegions.title": "Etkin Olmayan Bölge Renklendirmeyi Aç/Kapat", @@ -242,7 +243,6 @@ "c_cpp.configuration.default.enableConfigurationSquiggles.markdownDescription": "Uzantının `c_cpp_properties.json` dosyasında algılanan hataları bildirip bildirmeyeceğini denetler.", "c_cpp.configuration.default.customConfigurationVariables.markdownDescription": "`customConfigurationVariables` ayarlanmamışsa bir yapılandırmada kullanılacak değer veya `customConfigurationVariables` içinde anahtar olarak `${default}` varsa eklenecek değerler.", "c_cpp.configuration.default.dotConfig.markdownDescription": "`dotConfig` belirtilmemişse veya `${default}` olarak ayarlanmışsa bir yapılandırmada kullanılacak değer.", - "c_cpp.configuration.default.recursiveIncludes.reduce.markdownDescription": "`recursiveIncludes.reduce` belirtilmemişse veya `${default}` olarak ayarlanmamışsa bir yapılandırmada kullanılacak değer.", "c_cpp.configuration.default.recursiveIncludes.priority.markdownDescription": "`recursiveIncludes.priority` belirtilmemişse veya `${default}` olarak ayarlanmamışsa bir yapılandırmada kullanılacak değer.", "c_cpp.configuration.default.recursiveIncludes.order.markdownDescription": "`recursiveIncludes.order` belirtilmemişse veya `${default}` olarak ayarlanmamışsa bir yapılandırmada kullanılacak değer.", "c_cpp.configuration.experimentalFeatures.description": "\"Deneysel\" özelliklerin kullanılabilir olup olmadığını denetler.", @@ -332,6 +332,7 @@ "c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Değer true ise, Tümleşik Terminal desteği için gerekli olan hata ayıklanan işlem konsol yeniden yönlendirmesini devre dışı bırakır.", "c_cpp.debuggers.sourceFileMap.markdownDescription": "Hata ayıklama altyapısına geçirilen isteğe bağlı kaynak dosya eşlemeleri. Örnek: `{ \"\": \"\" }`.", "c_cpp.debuggers.processId.anyOf.markdownDescription": "Hata ayıklayıcının ekleneceği isteğe bağlı işlem kimliği. Eklenilecek yerel çalışan işlemlerin bir listesini almak için `${command:pickProcess}` kullanın. Bazı platformların bir işleme ekleme yapmak için yönetici ayrıcalıkları gerektirdiğini unutmayın.", + "c_cpp.debuggers.processFilter.description": "Etiket, açıklama veya ayrıntıya göre uzak bağlantı adaylarını eşleştirmek için kullanılan isteğe bağlı normal ifade. Tam olarak bir işlem eşleşirse hata ayıklayıcı otomatik olarak bağlanır. Birden fazla işlem eşleşirse, yalnızca eşleşen girdilerin gösterildiği işlem seçici görüntülenir. Hiçbir işlem eşleşmezse işlem seçicinin tamamı gösterilir. Geçersiz bir normal ifade hata olarak bildirilir.", "c_cpp.debuggers.program.attach.markdownDescription": "Programın yürütülebilir dosyasının tam yolu. Hata ayıklayıcı, bu yürütülebilir dosya yoluyla eşleşen çalışan bir işlemi arayacak ve ona eklenecek. Birden çok çalışan işlem eşleşiyorsa bir seçim istemi gösterilecek. Ekli işlem için hata ayıklama sembollerini yüklerken bu alan gereklidir.", "c_cpp.debuggers.symbolSearchPath.description": "Sembol (yani pdb veya .so) dosyalarını aramak için kullanılacak, noktalı virgülle ayrılmış dizinlerin listesi. Örnek: \"c:\\dizin1;c:\\dizin2\".", "c_cpp.debuggers.dumpPath.description": "Belirtilen program için döküm dosyasının isteğe bağlı tam yolu. Örnek: \"c:\\temp\\app.dmp\". Varsayılan olarak null değerini alır.", diff --git a/Extension/i18n/trk/src/Debugger/processFilter.i18n.json b/Extension/i18n/trk/src/Debugger/processFilter.i18n.json new file mode 100644 index 000000000..c790a3773 --- /dev/null +++ b/Extension/i18n/trk/src/Debugger/processFilter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.processFilter.regex": "Geçersiz {0} normal ifadesi: {1}" +} diff --git a/Extension/i18n/trk/src/LanguageServer/extension.i18n.json b/Extension/i18n/trk/src/LanguageServer/extension.i18n.json index cc06ebee8..a3741baea 100644 --- a/Extension/i18n/trk/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/trk/src/LanguageServer/extension.i18n.json @@ -7,6 +7,11 @@ "learn.how.to.install.a.library": "vcpkg ile bu üst bilgi için bir kitaplık yüklemeyi öğrenin", "copy.vcpkg.command": "'{0}' yükleme vcpkg komutunu panoya kopyalayın", "on.disabled.command": "`C_Cpp.intelliSenseEngine` `disabled` olarak ayarlandığında IntelliSense ile ilgili komutlar yürütülemez.", + "find.translation.units": "Çeviri Birimleri Bulunuyor...", + "no.translation.units.found": "Etkin dosyada hiçbir çeviri birimi bulunamadı.", + "current.translation.unit": "Geçerli çeviri birimi", + "select.translation.unit": "Çeviri Birimi Seçin", + "select.translation.unit.placeholder": "Çeviri birimi olarak kullanılacak bir kaynak dosya seçin", "switch.header.source": "Başlık/Kaynak Değiştiriliyor...", "client.not.found": "istemci bulunamadı", "ok": "Tamam", diff --git a/Extension/i18n/trk/src/nativeStrings.i18n.json b/Extension/i18n/trk/src/nativeStrings.i18n.json index 9e67d9bd7..0bd8c9e65 100644 --- a/Extension/i18n/trk/src/nativeStrings.i18n.json +++ b/Extension/i18n/trk/src/nativeStrings.i18n.json @@ -421,7 +421,7 @@ "important_label": "Önemli:", "help_check": "Bir kaynak dosyayı compile_commands.json ile tam ayrıştırıp analiz ederek doğrular ve tüm tanılamaları raporlar. Hatalar bulunursa sıfır olmayan bir değerle çıkar.", "help_check_compile_commands": "--check ile kullanılacak belirli bir compile_commands.json (veya dizini) için yol. Varsayılan olarak otomatik bulmaya çalışır.", - "check_not_authorized": "yetki yok; --check seçeneğini kullanmak için giriş yapmak gerekiyor", + "check_not_authorized": "--check'i çalıştırmak için yetki yok; giriş yapmak gerekiyor", "check_requires_source": "--check bir kaynak dosya gerektirir: --check=", "check_source_not_found": "kaynak dosya bulunamadı: {0}", "check_compile_commands_not_found": "compile_commands.json bulunamadı: {0}", @@ -434,5 +434,7 @@ "check_timed_out": "{0} analizinin tamamlanması beklenirken zaman aşımına uğradı", "failed_to_open_browse_db_lock_file": "Gözatma veritabanı kilit dosyası açılamadı: {0} (errno={1})", "failed_to_lock_browse_db_lock_file": "Gözatma veritabanı kilit dosyası kilitlenemedi: {0} (errno={1})", - "browse_database_disabled_incompatible_storage": "Gözatma veritabanının depolama konumu SQLite WAL paylaşılan belleğini desteklemediğinden, bu veritabanı devre dışı bırakıldı. browse.databaseFilename öğesini yerel bir yola ayarlayın." + "browse_database_disabled_incompatible_storage": "Gözatma veritabanının depolama konumu SQLite WAL paylaşılan belleğini desteklemediğinden, bu veritabanı devre dışı bırakıldı. browse.databaseFilename öğesini yerel bir yola ayarlayın.", + "selected_translation_unit_not_include_file_previous": "Seçilen çeviri birimi '{0}' '{1}' dosyasını içermiyor. IntelliSense, hala kullanılabilir durumdaysa önceki çeviri birimini geri yükler; aksi takdirde, '{1}' dosyasını yalnızca başlık çeviri birimi olarak kullanacaktır.", + "selected_translation_unit_not_include_file_header_only": "Seçilen çeviri birimi '{0}' '{1}' dosyasını içermiyor. Kullanılabilir önceki çeviri birimi olmadığından IntelliSense, '{1}' dosyasını yalnızca başlık çeviri birimi olarak kullanacak." } diff --git a/Extension/i18n/trk/ui/settings.html.i18n.json b/Extension/i18n/trk/ui/settings.html.i18n.json index 4c8404313..e10d5ed4f 100644 --- a/Extension/i18n/trk/ui/settings.html.i18n.json +++ b/Extension/i18n/trk/ui/settings.html.i18n.json @@ -67,8 +67,6 @@ "limit.symbols.checkbox": "{0} (veya işaretli) olduğunda, Etiket Ayrıştırıcı yalnızca {1} içindeki bir kaynak dosya tarafından doğrudan veya dolaylı olarak dahil edilen kod dosyalarını ayrıştırır. {2} olduğunda (veya işaretlenmediğinde), Etiket Ayrıştırıcı {3} listesinde belirtilen yollarda bulunan tüm kod dosyalarını ayrıştırır.", "database.filename": "Gözat: veritabanı dosya adı", "database.filename.description": "Oluşturulan sembol veritabanının yolu. Bu, uzantının Etiket Ayrıştırıcısının sembol veritabanının çalışma alanı varsayılan depolama konumundan başka bir yerde kaydedilmesini sağlar. Göreli yol belirtilirse, çalışma alanı klasörünün kendisi değil, çalışma alanının varsayılan depolama konumuyla göreli olarak yapılır. {0} değişkeni, çalışma alanı klasörüne göreli bir yol belirtmek için kullanılabilir (örneğin, {1}).", - "recursiveIncludes.reduce": "Özyinelemeli eklemeler: azalt", - "recursiveIncludes.reduce.description": "IntelliSense'e sağlanan özyinelemeli ekleme yollarının sayısını her zaman yalnızca o anda #include deyimleri tarafından başvurulan yollara indirgemek için {0} olarak ayarlayın. Bu, hangi dosyaların eklendiğini belirlemek için önce dosyaların ayrıştırılmasını gerektirir. IntelliSense'e tüm özyinelemeli ekleme yollarını sağlamak için {1} olarak ayarlayın. Özyinelemeli ekleme yollarının sayısının azaltılması, çok sayıda özyinelemeli ekleme yolu söz konusu olduğunda IntelliSense performansını artırabilir. Özyinelemeli ekleme yollarının sayısını azaltmamak, hangi ekleme yollarının sağlanacağını belirlemek için dosyaları ayrıştırma ihtiyacını ortadan kaldırarak IntelliSense performansını artırabilir.", "recursiveIncludes.priority": "Özyinelemeli içerikler: öncelik", "recursiveIncludes.priority.description": "Özyinelemeli ekleme yollarının önceliği. {0} olarak ayarlanırsa özyinelemeli ekleme yolları, sistem ekleme yollarından önce aranır. {1} olarak ayarlanırsa özyinelemeli ekleme yolları, sistem ekleme yollarından sonra aranır.", "recursiveIncludes.order": "Özyinelemeli eklemeler: düzenle", From 544c8612d6d0f6f5938e25f672fac86abb3f487e Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Sep 2026 17:40:51 -0700 Subject: [PATCH 12/29] Update changelog for 1.35.2 (#14792) --- Extension/CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ Extension/package.json | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 6f425af52..308197abe 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,37 @@ # C/C++ for Visual Studio Code Changelog +## Version 1.35.2: September 22, 2026 +### New Feature +* Dim unused local variables and parameters when `editor.showUnused` is enabled. [#10490](https://github.com/microsoft/vscode-cpptools/issues/10490) + +### Enhancements +* Add support for formatting multiple selections with `clang-format` and `vcFormat`. [#12082](https://github.com/microsoft/vscode-cpptools/issues/12082) +* Reduce language server memory usage in workspaces with many interconnected symbolic links. +* Improve responsiveness when deleting source files associated with many open headers. +* Improve `#include` completion performance in workspaces with many open files. + +### Bug Fixes +* Fix IntelliSense handling of MSVC and clang-cl external include paths and environment variables. [#14186](https://github.com/microsoft/vscode-cpptools/issues/14186), [#14205](https://github.com/microsoft/vscode-cpptools/issues/14205) +* Fix missing IntelliSense definitions for additional MSVC predefined macros. [#14312](https://github.com/microsoft/vscode-cpptools/issues/14312) +* Fix lost indentation in displayed documentation comments. [#14567](https://github.com/microsoft/vscode-cpptools/issues/14567) +* Fix compiler queries failing to find dependencies installed alongside the compiler on Linux and macOS. [#14575](https://github.com/microsoft/vscode-cpptools/issues/14575) +* Fix an incorrect `class has more than one default constructor` IntelliSense error. [#14746](https://github.com/microsoft/vscode-cpptools/issues/14746) +* Fix the extension failing to start on Linux ARM64 because `libc.so` is not executable. [#14779](https://github.com/microsoft/vscode-cpptools/issues/14779) +* Fix incorrect or missing `#include` completion suggestions for nonrecursive paths, frameworks, symbolic links, and extensionless files. +* Fix `compile_commands.json` handling for symlinked sources, missing working-directory fields, and invalid database roots. +* Fix stale 'Create Declaration/Definition' diagnostics after cancellation and reduce redundant diagnostic updates. +* Fix missing IntelliSense errors for duplicate local variables, including redeclarations of function parameters. +* Fix a language server crash when requesting `#include` completion with certain Unicode prefixes. +* Fix incorrect undefined-identifier IntelliSense errors for macros using `__COUNTER__` in C++20. +* Fix recursive header lookup with duplicate include roots or `..` paths through symbolic links. +* Fix incorrect EUC-JP and GBK source decoding when multibyte characters span read buffers. +* Fix IntelliSense using strict language modes instead of Clang's default GNU dialect. +* Fix header lookup for long Windows paths when Windows long-path support is enabled. +* Fix a Windows tag parser crash when a worker thread cannot be created. +* Fix intermittent incorrect compiler architecture detection on Linux. +* Various localization updates. +* Update dependencies. + ## Version 1.35.1: September 14, 2026 ### New Feature * Add the 'Select a Translation Unit...' command to choose which source file provides IntelliSense context for the active header file. [PR #14688](https://github.com/microsoft/vscode-cpptools/pull/14688) diff --git a/Extension/package.json b/Extension/package.json index 600398439..92d7ed6ef 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2,7 +2,7 @@ "name": "cpptools", "displayName": "C/C++", "description": "C/C++ IntelliSense, debugging, and code browsing.", - "version": "1.35.1-main", + "version": "1.35.2-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", From e8c18686026d194d4f9aa0ace28a56925d1631d9 Mon Sep 17 00:00:00 2001 From: Glen Chung <105310954+kuchungmsft@users.noreply.github.com> Date: Fri, 25 Sep 2026 14:36:51 -0700 Subject: [PATCH 13/29] Add mscppls repeated-crash diagnostic (#14798) Define the localized native string used when mscppls --check can no longer restart the C++ analysis process after repeated crashes. --- Extension/src/nativeStrings.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Extension/src/nativeStrings.json b/Extension/src/nativeStrings.json index ffe091980..8b1a93276 100644 --- a/Extension/src/nativeStrings.json +++ b/Extension/src/nativeStrings.json @@ -785,5 +785,9 @@ "selected_translation_unit_not_include_file_header_only": { "text": "The selected translation unit '{0}' does not include '{1}'. No previous translation unit is available, so IntelliSense will use '{1}' as a header-only translation unit.", "hint": "{0} is the selected translation unit path. {1} is the active file path. {Locked=\"IntelliSense\"} {Locked=\"{0}\"} {Locked=\"{1}\"}" + }, + "check_analysis_process_unavailable": { + "text": "The C++ analysis process was unavailable while checking \"{0}\".", + "hint": "{0} is the source file path. {Locked=\"C++\"} {Locked=\"{0}\"}" } } From ccef2ab11765ecde6d5aeb1c6651ad46a4e19bde Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 25 Sep 2026 17:33:58 -0700 Subject: [PATCH 14/29] Update localized IntelliSense diagnostics (#14799) --- Extension/bin/messages/cs/messages.json | 3 ++- Extension/bin/messages/de/messages.json | 3 ++- Extension/bin/messages/es/messages.json | 3 ++- Extension/bin/messages/fr/messages.json | 3 ++- Extension/bin/messages/it/messages.json | 3 ++- Extension/bin/messages/ja/messages.json | 3 ++- Extension/bin/messages/ko/messages.json | 3 ++- Extension/bin/messages/pl/messages.json | 3 ++- Extension/bin/messages/pt-br/messages.json | 3 ++- Extension/bin/messages/ru/messages.json | 3 ++- Extension/bin/messages/tr/messages.json | 3 ++- Extension/bin/messages/zh-cn/messages.json | 3 ++- Extension/bin/messages/zh-tw/messages.json | 5 +++-- 13 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Extension/bin/messages/cs/messages.json b/Extension/bin/messages/cs/messages.json index f2ec27691..b7334c92e 100644 --- a/Extension/bin/messages/cs/messages.json +++ b/Extension/bin/messages/cs/messages.json @@ -3782,5 +3782,6 @@ "Typ není podobný jazyku C kvůli této deklaraci členu", "Typ není podobný jazyku C kvůli tomuto lambda výrazu", "Kvalifikátor názvu výčtového typu je funkce jazyka C++11", - "Neomezené sjednocení je funkce jazyka C++11" + "Neomezené sjednocení je funkce jazyka C++11", + "%sq už je v aktuálním rozsahu deklarovaný" ] diff --git a/Extension/bin/messages/de/messages.json b/Extension/bin/messages/de/messages.json index 26c553580..588885286 100644 --- a/Extension/bin/messages/de/messages.json +++ b/Extension/bin/messages/de/messages.json @@ -3782,5 +3782,6 @@ "Der Typ ist aufgrund dieser Memberdeklaration nicht C-ähnlich.", "Der Typ ist aufgrund dieses Lambdaausdrucks nicht C-ähnlich.", "Ein Namensqualifizierer für einen Enumerationstyp ist ein C++11-Feature.", - "Unbeschränkte Unions sind ein C++11-Feature." + "Unbeschränkte Unions sind ein C++11-Feature.", + "%sq wurde bereits im aktuellen Bereich deklariert." ] diff --git a/Extension/bin/messages/es/messages.json b/Extension/bin/messages/es/messages.json index 1780f12c7..25532bdca 100644 --- a/Extension/bin/messages/es/messages.json +++ b/Extension/bin/messages/es/messages.json @@ -3782,5 +3782,6 @@ "el tipo no es similar a C debido a esta declaración de miembro", "el tipo no es similar a C debido a esta expresión lambda", "un calificador de nombre de tipo de enumeración es una característica de C++11", - "las uniones sin restricciones son una característica de C++11" + "las uniones sin restricciones son una característica de C++11", + "%sq ya se ha declarado en el ámbito actual" ] diff --git a/Extension/bin/messages/fr/messages.json b/Extension/bin/messages/fr/messages.json index 126273175..15217cf88 100644 --- a/Extension/bin/messages/fr/messages.json +++ b/Extension/bin/messages/fr/messages.json @@ -3782,5 +3782,6 @@ "le type n’est pas similaire à C en raison de cette déclaration de membre", "le type n’est pas similaire à C en raison de cette expression lambda", "un qualificateur de nom de type énumération est une fonctionnalité C++11", - "les unions sans restriction sont une fonctionnalité C++11" + "les unions sans restriction sont une fonctionnalité C++11", + "%sq a déjà été déclaré dans la portée actuelle" ] diff --git a/Extension/bin/messages/it/messages.json b/Extension/bin/messages/it/messages.json index 82f75976e..84047e643 100644 --- a/Extension/bin/messages/it/messages.json +++ b/Extension/bin/messages/it/messages.json @@ -3782,5 +3782,6 @@ "il tipo non è simile a C a causa di questa dichiarazione di membro", "il tipo non è simile a C a causa di questa espressione lambda", "un qualificatore del nome di tipo enumerazione è una funzionalità di C++11", - "le unioni senza restrizioni sono una funzionalità di C++11" + "le unioni senza restrizioni sono una funzionalità di C++11", + "%sq già dichiarato nell'ambito corrente" ] diff --git a/Extension/bin/messages/ja/messages.json b/Extension/bin/messages/ja/messages.json index fa9d10284..352ed9c04 100644 --- a/Extension/bin/messages/ja/messages.json +++ b/Extension/bin/messages/ja/messages.json @@ -3782,5 +3782,6 @@ "このメンバー宣言のため、型は C-like ではありません", "このラムダ式のため、型は C-like ではありません", "列挙型名修飾子は C++11 の機能です", - "無制限の共用体は C++11 機能です" + "無制限の共用体は C++11 機能です", + "%sq は現在のスコープで既に宣言されています" ] diff --git a/Extension/bin/messages/ko/messages.json b/Extension/bin/messages/ko/messages.json index 828b00b6b..7263448f6 100644 --- a/Extension/bin/messages/ko/messages.json +++ b/Extension/bin/messages/ko/messages.json @@ -3782,5 +3782,6 @@ "이 멤버 선언 때문에 형식이 C와 유사하지 않음", "이 람다 식 때문에 형식이 C와 유사하지 않음", "열거형 형식 이름 한정자는 C++11 기능임", - "제한 없는 공용 구조체는 C++11 기능임" + "제한 없는 공용 구조체는 C++11 기능임", + "현재 범위에 이미 %sq이(가) 선언되어 있습니다." ] diff --git a/Extension/bin/messages/pl/messages.json b/Extension/bin/messages/pl/messages.json index bf5161221..1c5db291b 100644 --- a/Extension/bin/messages/pl/messages.json +++ b/Extension/bin/messages/pl/messages.json @@ -3782,5 +3782,6 @@ "typ nie jest C-podobny z powodu tej deklaracji składowej", "typ nie jest C-podobny z powodu tego wyrażenia lambda", "kwalifikator nazwy typu wyliczeniowego jest funkcją języka C++11", - "nieograniczone unie są funkcją języka C++11" + "nieograniczone unie są funkcją języka C++11", + "element %sq został już zadeklarowany w bieżącym zakresie" ] diff --git a/Extension/bin/messages/pt-br/messages.json b/Extension/bin/messages/pt-br/messages.json index 0b732be7f..f607f807f 100644 --- a/Extension/bin/messages/pt-br/messages.json +++ b/Extension/bin/messages/pt-br/messages.json @@ -3782,5 +3782,6 @@ "o tipo não é semelhante a C devido a esta declaração de membro", "o tipo não é semelhante a C devido a esta expressão lambda", "um qualificador de nome de tipo de enumeração é um recurso do C++11", - "uniões irrestritas são um recurso do C++11" + "uniões irrestritas são um recurso do C++11", + "%sq já foi declarado no escopo atual" ] diff --git a/Extension/bin/messages/ru/messages.json b/Extension/bin/messages/ru/messages.json index 7e3072f00..a3db081fe 100644 --- a/Extension/bin/messages/ru/messages.json +++ b/Extension/bin/messages/ru/messages.json @@ -3782,5 +3782,6 @@ "тип не является C-подобным из-за этого объявления элемента", "тип не является C-подобным из-за этого лямбда-выражения", "квалификатор имени типа перечисления — это функция C++11", - "неограниченные объединения — это функция C++11" + "неограниченные объединения — это функция C++11", + "%sq уже объявлено в текущей области" ] diff --git a/Extension/bin/messages/tr/messages.json b/Extension/bin/messages/tr/messages.json index d04768feb..1b3c8999e 100644 --- a/Extension/bin/messages/tr/messages.json +++ b/Extension/bin/messages/tr/messages.json @@ -3782,5 +3782,6 @@ "bu üye bildirimi nedeniyle tür C benzeri değil", "bu lambda ifadesi nedeniyle tür C benzeri değil", "sabit listesi türü ad niteleyicisi bir C++11 özelliğidir", - "kısıtlanmamış birleşimler bir C++11 özelliğidir" + "kısıtlanmamış birleşimler bir C++11 özelliğidir", + "geçerli kapsamda, %sq önceden de tanımlanmış" ] diff --git a/Extension/bin/messages/zh-cn/messages.json b/Extension/bin/messages/zh-cn/messages.json index 2818c6b89..bccbe9be2 100644 --- a/Extension/bin/messages/zh-cn/messages.json +++ b/Extension/bin/messages/zh-cn/messages.json @@ -3782,5 +3782,6 @@ "由于此成员声明,类型不是 C 风格", "由于此 lambda 表达式,该类型不是 C 风格", "枚举类型名称限定符是 C++11 功能", - "无限制联合是 C++11 功能" + "无限制联合是 C++11 功能", + "已在当前范围内声明 %sq" ] diff --git a/Extension/bin/messages/zh-tw/messages.json b/Extension/bin/messages/zh-tw/messages.json index 1af9e0f9f..cc2a900d1 100644 --- a/Extension/bin/messages/zh-tw/messages.json +++ b/Extension/bin/messages/zh-tw/messages.json @@ -1697,7 +1697,7 @@ "向量運算不適用於非整數類資料類型的向量", "無法開啟 %s 檔案 %sq2", "無法開啟 %s 檔案 %sq2: %s3", - "先行編譯標頭檔", + "預編譯標頭", "預先定義巨集", "已產生 C", "已產生 C++", @@ -3782,5 +3782,6 @@ "因為這個成員宣告,類型不是 C 樣式", "因為這個 Lambda 運算式,類型不是 C 樣式", "列舉型別名稱限定詞是 C++11 功能", - "不受限的等位是 C++11 功能" + "不受限的聯合是 C++11 功能", + "已經在目前的範圍宣告 %sq" ] From 2f9e2a52283462eb152096b690425b513652a1bf Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 28 Sep 2026 17:24:04 -0700 Subject: [PATCH 15/29] Update fast-uri. (#14804) --- Extension/package.json | 2 +- Extension/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 92d7ed6ef..b6eb1bfac 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -7269,7 +7269,7 @@ "resolutions": { "gulp-typescript/**/glob-parent": "^5.1.2", "serialize-javascript": "^7.0.5", - "fast-uri": "^3.1.6", + "fast-uri": "^3.1.8", "@humanfs/node": "^0.16.8" } } diff --git a/Extension/yarn.lock b/Extension/yarn.lock index 66c71267d..6baca69d1 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -2530,10 +2530,10 @@ fast-levenshtein@^3.0.0: dependencies: fastest-levenshtein "^1.0.7" -fast-uri@^3.0.1, fast-uri@^3.1.6: - version "3.1.6" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fast-uri/-/fast-uri-3.1.6.tgz#bfdd308ef763f835fed059f3c6c925f708e33e3a" - integrity sha1-v90wjvdj+DX+0Fnzxskl9wjjPjo= +fast-uri@^3.0.1, fast-uri@^3.1.8: + version "3.1.8" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/fast-uri/-/fast-uri-3.1.8.tgz#f7db8d942e20eead3cfe93b0beeb4eb0169e938b" + integrity sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg== fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.7: version "1.0.16" From 26f1df0a67636903064fd345d7ab03956897056f Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Mon, 28 Sep 2026 18:19:33 -0700 Subject: [PATCH 16/29] Add localized C++ hover size and alignment text (#14797) --- Extension/src/nativeStrings.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Extension/src/nativeStrings.json b/Extension/src/nativeStrings.json index 8b1a93276..5ad20f459 100644 --- a/Extension/src/nativeStrings.json +++ b/Extension/src/nativeStrings.json @@ -789,5 +789,13 @@ "check_analysis_process_unavailable": { "text": "The C++ analysis process was unavailable while checking \"{0}\".", "hint": "{0} is the source file path. {Locked=\"C++\"} {Locked=\"{0}\"}" + }, + "quick_info_size": { + "text": "**Size:** %s B", + "hint": "Size of a C or C++ type in bytes. %s is the numeric size. Translate B to a count-invariant byte unit symbol or abbreviation. {Locked=\"**\"} {Locked=\"%s\"}" + }, + "quick_info_alignment": { + "text": "**Alignment:** %s B", + "hint": "Alignment of a C or C++ type in bytes. %s is the numeric alignment. Translate B to a count-invariant byte unit symbol or abbreviation. {Locked=\"**\"} {Locked=\"%s\"}" } } From 0e056e52ec885a7bd82b31681cbe8ac9b4d38d59 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:18:18 -0700 Subject: [PATCH 17/29] Automatically fold inactive regions (#14796) --- Extension/package.json | 24 ++ Extension/package.nls.json | 3 + Extension/src/LanguageServer/client.ts | 189 ++++++++-- Extension/src/LanguageServer/extension.ts | 12 + .../src/LanguageServer/inactiveRegions.ts | 57 +++ .../src/LanguageServer/languageClient.ts | 9 +- Extension/src/LanguageServer/settings.ts | 10 + Extension/test/minBinaryVersion.json | 2 +- .../tests/inactiveFolding.test.ts | 139 +++++++ .../tests/inactiveFolding.test.ts | 338 ++++++++++++++++++ Extension/test/unit/inactiveRegions.test.ts | 75 ++++ 11 files changed, 822 insertions(+), 36 deletions(-) create mode 100644 Extension/src/LanguageServer/inactiveRegions.ts create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts create mode 100644 Extension/test/scenarios/SingleRootProject/tests/inactiveFolding.test.ts create mode 100644 Extension/test/unit/inactiveRegions.test.ts diff --git a/Extension/package.json b/Extension/package.json index b6eb1bfac..dcce0856c 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -1072,6 +1072,12 @@ "description": "%c_cpp.configuration.dimInactiveRegions.description%", "scope": "resource" }, + "C_Cpp.autoFoldInactiveRegions": { + "type": "boolean", + "default": false, + "markdownDescription": "%c_cpp.configuration.autoFoldInactiveRegions.description%", + "scope": "resource" + }, "C_Cpp.inactiveRegionOpacity": { "type": "number", "default": 0.55, @@ -3999,6 +4005,16 @@ "title": "%c_cpp.command.toggleDimInactiveRegions.title%", "category": "C/C++" }, + { + "command": "C_Cpp.FoldAllInactiveRegions", + "title": "%c_cpp.command.foldAllInactiveRegions.title%", + "category": "C/C++" + }, + { + "command": "C_Cpp.UnfoldAllInactiveRegions", + "title": "%c_cpp.command.unfoldAllInactiveRegions.title%", + "category": "C/C++" + }, { "command": "C_Cpp.ResetDatabase", "title": "%c_cpp.command.resetDatabase.title%", @@ -6552,6 +6568,14 @@ "command": "C_Cpp.ToggleDimInactiveRegions", "when": "config.C_Cpp.intelliSenseEngine =~ /^[dD]efault$/" }, + { + "command": "C_Cpp.FoldAllInactiveRegions", + "when": "editorLangId =~ /^(c|(cuda-)?cpp)$/ && config.C_Cpp.intelliSenseEngine =~ /^[dD]efault$/ && config.C_Cpp.codeFolding =~ /^[eE]nabled$/" + }, + { + "command": "C_Cpp.UnfoldAllInactiveRegions", + "when": "editorLangId =~ /^(c|(cuda-)?cpp)$/ && config.C_Cpp.intelliSenseEngine =~ /^[dD]efault$/ && config.C_Cpp.codeFolding =~ /^[eE]nabled$/" + }, { "command": "C_Cpp.ResetDatabase", "when": "!(config.C_Cpp.intelliSenseEngine =~ /^[dD]isabled$/)" diff --git a/Extension/package.nls.json b/Extension/package.nls.json index d10af1bcd..57f924d7e 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -19,6 +19,8 @@ "c_cpp.command.enableErrorSquiggles.title": "Enable Error Squiggles", "c_cpp.command.disableErrorSquiggles.title": "Disable Error Squiggles", "c_cpp.command.toggleDimInactiveRegions.title": "Toggle Inactive Region Colorization", + "c_cpp.command.foldAllInactiveRegions.title": "Fold All Inactive Regions", + "c_cpp.command.unfoldAllInactiveRegions.title": "Unfold All Inactive Regions", "c_cpp.command.resetDatabase.title": "Reset IntelliSense Database", "c_cpp.command.takeSurvey.title": "Take Survey", "c_cpp.command.restartIntelliSenseForFile.title": "Restart IntelliSense for Active File", @@ -486,6 +488,7 @@ "c_cpp.configuration.autocomplete.disabled.description": "Uses the word-based completion provided by Visual Studio Code.", "c_cpp.configuration.errorSquiggles.description": "Controls whether suspected compile errors detected by the IntelliSense engine will be reported back to the editor. It also controls whether code analysis warnings are reported if includes can't be found. This setting is ignored by the Tag Parser engine.", "c_cpp.configuration.dimInactiveRegions.description": "Controls whether inactive preprocessor blocks are colored differently than active code. This setting has no effect if IntelliSense is disabled or if using the Default High Contrast theme.", + "c_cpp.configuration.autoFoldInactiveRegions.description": "Controls whether inactive preprocessor blocks are automatically folded when a file is opened. This setting only applies when `#C_Cpp.intelliSenseEngine#` is `default` and `#C_Cpp.codeFolding#` is `enabled`.", "c_cpp.configuration.inactiveRegionOpacity.markdownDescription": { "message": "Controls the opacity of inactive preprocessor blocks. Scales between `0.1` and `1.0`. This setting only applies when inactive region dimming is enabled.", "comment": [ diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 77ac15102..22ccc7d96 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -55,6 +55,7 @@ import { CustomConfigurationProvider1, getCustomConfigProviders, isSameProviderE import { DataBinding } from './dataBinding'; import { cachedEditorConfigSettings, getEditorConfigSettings } from './editorConfig'; import { CppSourceStr, clients, configPrefix, initializeIntervalTimer, isWritingCrashCallStack, updateLanguageConfigurations, usesCrashHandler, watchForCrashes } from './extension'; +import { InactiveRegion, InactiveRegionStore, getInactiveRegionStartLines } from './inactiveRegions'; import { LanguageClient } from './languageClient'; import { LocalizeStringParams, getLocaleId, getLocalizedString } from './localization'; import { PersistentFolderState, PersistentState, PersistentWorkspaceState } from './persistentState'; @@ -227,18 +228,13 @@ interface FileChangedParams extends WorkspaceFolderParams { uri: string; } -interface InputRegion { - startLine: number; - startColumn: number; - endLine: number; - endColumn: number; -} - interface DecorationRangesPair { decoration: vscode.TextEditorDecorationType; ranges: vscode.Range[]; } +type InactiveRegionFoldingOperation = 'fold' | 'unfold'; + interface InternalSourceFileConfiguration extends SourceFileConfiguration { compilerArgsLegacy?: string[]; } @@ -362,7 +358,7 @@ export interface IntelliSenseResult { uri: string; fileVersion: number; diagnostics: IntelliSenseDiagnostic[]; - inactiveRegions: InputRegion[]; + inactiveRegions: InactiveRegion[]; semanticTokens: SemanticToken[]; inlayHints: CppInlayHint[]; clearExistingDiagnostics: boolean; @@ -806,6 +802,8 @@ export interface Client { selectTranslationUnit(uri: vscode.Uri, translationUnit: string): Promise; updateActiveDocumentTextOptions(): void; didChangeActiveEditor(editor?: vscode.TextEditor, selection?: Range): Promise; + foldAllInactiveRegions(): Promise; + unfoldAllInactiveRegions(): Promise; restartIntelliSenseForFile(document: vscode.TextDocument): Promise; activate(): void; selectionChanged(selection: Range): Promise; @@ -872,6 +870,7 @@ export function createNullClient(): Client { } export class DefaultClient implements Client { + private static readonly autoFoldedEditors = new WeakSet(); private disposables: vscode.Disposable[] = []; private documentFormattingProviderDisposable: vscode.Disposable | undefined; private formattingRangeProviderDisposable: vscode.Disposable | undefined; @@ -886,6 +885,9 @@ export class DefaultClient implements Client { private workspaceStoragePath: string; private trackedDocuments = new Map(); private inactiveRegionsDecorations = new Map(); + private inactiveRegions = new InactiveRegionStore(); + private pendingInactiveRegionFoldingOperations = new WeakMap(); + private inactiveRegionReportingEnabled: boolean; private settingsTracker: SettingsTracker; private loggingLevel: number = 1; private configurationProvider?: string; @@ -1327,6 +1329,7 @@ export class DefaultClient implements Client { } const rootUri: vscode.Uri | undefined = this.RootUri; + this.inactiveRegionReportingEnabled = new CppSettings(rootUri).inactiveRegionReportingEnabled; this.settingsTracker = new SettingsTracker(rootUri); try { @@ -1477,6 +1480,7 @@ export class DefaultClient implements Client { intelliSenseCacheSize: settings.intelliSenseCacheSize, intelliSenseMemoryLimit: settings.intelliSenseMemoryLimit, dimInactiveRegions: settings.dimInactiveRegions, + codeFolding: settings.codeFolding, suggestSnippets: settings.suggestSnippets, legacyCompilerArgsBehavior: settings.legacyCompilerArgsBehavior, defaultSystemIncludePath: settings.defaultSystemIncludePath, @@ -1849,6 +1853,11 @@ export class DefaultClient implements Client { await this.ready; if (Object.keys(changedSettings).length > 0) { + const inactiveRegionReportingEnabled: boolean = new CppSettings(this.RootUri).inactiveRegionReportingEnabled; + if (inactiveRegionReportingEnabled !== this.inactiveRegionReportingEnabled) { + this.inactiveRegionReportingEnabled = inactiveRegionReportingEnabled; + this.inactiveRegions.clear(); + } if (this === defaultClient) { if (changedSettings.commentContinuationPatterns2 !== undefined) { updateLanguageConfigurations(); @@ -1903,6 +1912,20 @@ export class DefaultClient implements Client { void ui.ShowConfigureIntelliSenseButton(false, this, ConfigurationType.CompilerPath, showButtonSender); } } + if ((changedSettings.autoFoldInactiveRegions !== undefined || changedSettings.codeFolding !== undefined) + && vscode.window.activeTextEditor + && clients.getClientFor(vscode.window.activeTextEditor.document.uri) === this) { + if (changedSettings.codeFolding !== undefined) { + await this.languageClient.refreshFoldingRanges(vscode.window.activeTextEditor.document); + } + await this.tryApplyInactiveRegionFolding(vscode.window.activeTextEditor); + } + if (["dimInactiveRegions", + "inactiveRegionOpacity", + "inactiveRegionForegroundColor", + "inactiveRegionBackgroundColor"].some(setting => setting in changedSettings)) { + this.refreshInactiveRegionDecorations(); + } if (changedSettings.legacyCompilerArgsBehavior !== undefined) { this.configuration.handleConfigurationChange(); } @@ -1997,7 +2020,9 @@ export class DefaultClient implements Client { const oldVersion: number | undefined = openFileVersions.get(textDocumentChangeEvent.document.uri.toString()); const newVersion: number = textDocumentChangeEvent.document.version; if (oldVersion === undefined || newVersion > oldVersion) { - openFileVersions.set(textDocumentChangeEvent.document.uri.toString(), newVersion); + const uri: string = textDocumentChangeEvent.document.uri.toString(); + openFileVersions.set(uri, newVersion); + this.inactiveRegions.delete(uri); } } } @@ -2006,6 +2031,7 @@ export class DefaultClient implements Client { if (document.uri.scheme === "file") { const uri: string = document.uri.toString(); openFileVersions.set(uri, document.version); + this.inactiveRegions.delete(uri); } } @@ -2017,6 +2043,8 @@ export class DefaultClient implements Client { if (this.inlayHintsProvider) { this.inlayHintsProvider.removeFile(uri); } + this.inactiveRegions.delete(uri); + this.inactiveRegionsDecorations.get(uri)?.decoration.dispose(); this.inactiveRegionsDecorations.delete(uri); if (diagnosticsCollectionIntelliSense) { diagnosticsCollectionIntelliSense.delete(document.uri); @@ -2615,7 +2643,8 @@ export class DefaultClient implements Client { this.inlayHintsProvider.deliverInlayHints(intelliSenseResult.uri, intelliSenseResult.inlayHints, intelliSenseResult.clearExistingInlayHint); } - this.updateInactiveRegions(intelliSenseResult.uri, intelliSenseResult.inactiveRegions, intelliSenseResult.clearExistingInactiveRegions); + this.updateInactiveRegions(intelliSenseResult.uri, intelliSenseResult.inactiveRegions, + intelliSenseResult.clearExistingInactiveRegions, intelliSenseResult.isCompletePass); if (intelliSenseResult.clearExistingDiagnostics || intelliSenseResult.diagnostics.length > 0) { this.updateSquiggles(intelliSenseResult.uri, intelliSenseResult.diagnostics, intelliSenseResult.clearExistingDiagnostics); } @@ -2927,12 +2956,24 @@ export class DefaultClient implements Client { this.model.isParsingWorkspacePaused.Value = tagParseStatus.isPaused; } - private updateInactiveRegions(uriString: string, inactiveRegions: InputRegion[], startNewSet: boolean): void { + private updateInactiveRegions(uriString: string, inactiveRegions: InactiveRegion[], startNewSet: boolean, isCompletePass: boolean): void { const client: Client = clients.getClientFor(vscode.Uri.parse(uriString)); - if (!(client instanceof DefaultClient) || (!startNewSet && inactiveRegions.length === 0)) { + if (!(client instanceof DefaultClient) || (!startNewSet && inactiveRegions.length === 0 && !isCompletePass)) { return; } + client.inactiveRegions.update(uriString, inactiveRegions, startNewSet, isCompletePass); + const settings: CppSettings = new CppSettings(client.RootUri); + client.updateInactiveRegionDecorations(uriString, inactiveRegions, startNewSet, settings); + + const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; + if (isCompletePass && activeEditor?.document.uri.toString() === uriString) { + void client.tryApplyInactiveRegionFolding(activeEditor).catch(logAndReturn.undefined); + } + } + + private updateInactiveRegionDecorations(uriString: string, inactiveRegions: readonly InactiveRegion[], + startNewSet: boolean, settings: CppSettings): void { const dimInactiveRegions: boolean = settings.dimInactiveRegions; let currentSet: DecorationRangesPair | undefined = this.inactiveRegionsDecorations.get(uriString); if (startNewSet || !dimInactiveRegions) { @@ -2940,32 +2981,109 @@ export class DefaultClient implements Client { currentSet.decoration.dispose(); this.inactiveRegionsDecorations.delete(uriString); } - if (!dimInactiveRegions) { - return; - } currentSet = undefined; } - if (currentSet === undefined) { - const opacity: number | undefined = settings.inactiveRegionOpacity; - currentSet = { - decoration: vscode.window.createTextEditorDecorationType({ - opacity: (opacity === undefined) ? "0.55" : opacity.toString(), - backgroundColor: settings.inactiveRegionBackgroundColor, - color: settings.inactiveRegionForegroundColor, - rangeBehavior: vscode.DecorationRangeBehavior.OpenOpen - }), - ranges: [] - }; - this.inactiveRegionsDecorations.set(uriString, currentSet); + if (dimInactiveRegions) { + if (currentSet === undefined) { + const opacity: number | undefined = settings.inactiveRegionOpacity; + currentSet = { + decoration: vscode.window.createTextEditorDecorationType({ + opacity: (opacity === undefined) ? "0.55" : opacity.toString(), + backgroundColor: settings.inactiveRegionBackgroundColor, + color: settings.inactiveRegionForegroundColor, + rangeBehavior: vscode.DecorationRangeBehavior.OpenOpen + }), + ranges: [] + }; + this.inactiveRegionsDecorations.set(uriString, currentSet); + } + + Array.prototype.push.apply(currentSet.ranges, inactiveRegions.map(element => + new vscode.Range(element.startLine, element.startColumn, element.endLine, element.endColumn))); + + // Apply the decorations to all *visible* text editors + const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors.filter(e => e.document.uri.toString() === uriString); + for (const e of editors) { + e.setDecorations(currentSet.decoration, currentSet.ranges); + } + } + } + + private refreshInactiveRegionDecorations(): void { + const settings: CppSettings = new CppSettings(this.RootUri); + if (!settings.dimInactiveRegions) { + this.inactiveRegionsDecorations.forEach(currentSet => currentSet.decoration.dispose()); + this.inactiveRegionsDecorations.clear(); + return; + } + + this.inactiveRegions.forEach((inactiveRegions, uriString) => + this.updateInactiveRegionDecorations(uriString, inactiveRegions, true, settings)); + } + + public foldAllInactiveRegions(): Promise { + return this.applyInactiveRegionFolding('fold'); + } + + public unfoldAllInactiveRegions(): Promise { + return this.applyInactiveRegionFolding('unfold'); + } + + private async applyInactiveRegionFolding(operation: InactiveRegionFoldingOperation): Promise { + const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; + if (!editor || !util.isCpp(editor.document)) { + return; + } + + this.pendingInactiveRegionFoldingOperations.set(editor, operation); + await this.tryApplyInactiveRegionFolding(editor); + } + + private async tryApplyInactiveRegionFolding(editor: vscode.TextEditor): Promise { + if (vscode.window.activeTextEditor !== editor || !util.isCpp(editor.document)) { + return; + } + + const uri: string = editor.document.uri.toString(); + const inactiveRegions: readonly InactiveRegion[] | undefined = this.inactiveRegions.getComplete(uri); + if (inactiveRegions === undefined) { + return; + } + + const settings: CppSettings = new CppSettings(editor.document.uri); + const autoFold: boolean = settings.autoFoldInactiveRegions && !DefaultClient.autoFoldedEditors.has(editor); + const pendingOperation: InactiveRegionFoldingOperation | undefined = + this.pendingInactiveRegionFoldingOperations.get(editor); + const operation: InactiveRegionFoldingOperation | undefined = pendingOperation ?? (autoFold ? 'fold' : undefined); + if (operation === undefined) { + return; + } + + this.pendingInactiveRegionFoldingOperations.delete(editor); + + if (autoFold) { + DefaultClient.autoFoldedEditors.add(editor); } - Array.prototype.push.apply(currentSet.ranges, inactiveRegions.map(element => - new vscode.Range(element.startLine, element.startColumn, element.endLine, element.endColumn))); + const selectionLines: number[] = getInactiveRegionStartLines(inactiveRegions); + if (selectionLines.length === 0) { + return; + } - // Apply the decorations to all *visible* text editors - const editors: vscode.TextEditor[] = vscode.window.visibleTextEditors.filter(e => e.document.uri.toString() === uriString); - for (const e of editors) { - e.setDecorations(currentSet.decoration, currentSet.ranges); + try { + await this.languageClient.refreshFoldingRanges(editor.document); + await vscode.commands.executeCommand(`editor.${operation}`, { + selectionLines, + direction: 'down' + }); + } catch (error) { + if (autoFold) { + DefaultClient.autoFoldedEditors.delete(editor); + } + if (pendingOperation) { + this.pendingInactiveRegionFoldingOperations.set(editor, pendingOperation); + } + throw error; } } @@ -3136,6 +3254,7 @@ export class DefaultClient implements Client { return; } + void this.tryApplyInactiveRegionFolding(editor).catch(logAndReturn.undefined); this.updateActiveDocumentTextOptions(); const params: DidChangeActiveEditorParams = { @@ -4232,6 +4351,8 @@ export class DefaultClient implements Client { } public dispose(): void { + this.inactiveRegionsDecorations.forEach(currentSet => currentSet.decoration.dispose()); + this.inactiveRegionsDecorations.clear(); this.pendingTagParsingCalls.forEach(pendingCall => { if (pendingCall.timer) { clearTimeout(pendingCall.timer); @@ -4447,6 +4568,8 @@ class NullClient implements Client { selectTranslationUnit(uri: vscode.Uri, translationUnit: string): Promise { return Promise.resolve(); } updateActiveDocumentTextOptions(): void { } didChangeActiveEditor(editor?: vscode.TextEditor): Promise { return Promise.resolve(); } + foldAllInactiveRegions(): Promise { return Promise.resolve(); } + unfoldAllInactiveRegions(): Promise { return Promise.resolve(); } restartIntelliSenseForFile(document: vscode.TextDocument): Promise { return Promise.resolve(); } activate(): void { } selectionChanged(selection: Range): Promise { return Promise.resolve(); } diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 8ae2125f4..653f620e5 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -396,6 +396,8 @@ export async function registerCommands(enabled: boolean): Promise { commandDisposables.push(vscode.commands.registerCommand('C_Cpp.EnableErrorSquiggles', enabled ? onEnableSquiggles : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.DisableErrorSquiggles', enabled ? onDisableSquiggles : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ToggleDimInactiveRegions', enabled ? onToggleDimInactiveRegions : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.FoldAllInactiveRegions', enabled ? onFoldAllInactiveRegions : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.UnfoldAllInactiveRegions', enabled ? onUnfoldAllInactiveRegions : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.PauseParsing', enabled ? onPauseParsing : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ResumeParsing', enabled ? onResumeParsing : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.PauseCodeAnalysis', enabled ? onPauseCodeAnalysis : onDisabledCommand)); @@ -925,6 +927,16 @@ function onToggleDimInactiveRegions(): void { settings.update("dimInactiveRegions", !settings.dimInactiveRegions); } +function onFoldAllInactiveRegions(): Promise { + const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; + return editor ? clients.getClientFor(editor.document.uri).foldAllInactiveRegions() : Promise.resolve(); +} + +function onUnfoldAllInactiveRegions(): Promise { + const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; + return editor ? clients.getClientFor(editor.document.uri).unfoldAllInactiveRegions() : Promise.resolve(); +} + function onPauseParsing(): void { void clients.ActiveClient.pauseParsing().catch(logAndReturn.undefined); } diff --git a/Extension/src/LanguageServer/inactiveRegions.ts b/Extension/src/LanguageServer/inactiveRegions.ts new file mode 100644 index 000000000..b05d23397 --- /dev/null +++ b/Extension/src/LanguageServer/inactiveRegions.ts @@ -0,0 +1,57 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +export interface InactiveRegion { + startLine: number; + startColumn: number; + endLine: number; + endColumn: number; +} + +interface InactiveRegionSet { + regions: InactiveRegion[]; + isComplete: boolean; +} + +export class InactiveRegionStore { + private readonly regionSets = new Map(); + + public update(uri: string, regions: InactiveRegion[], startNewSet: boolean, isComplete: boolean): void { + let regionSet: InactiveRegionSet | undefined = this.regionSets.get(uri); + if (startNewSet || regionSet === undefined) { + regionSet = { + regions: [], + isComplete: false + }; + this.regionSets.set(uri, regionSet); + } + + for (const region of regions) { + regionSet.regions.push(region); + } + regionSet.isComplete = isComplete; + } + + public getComplete(uri: string): readonly InactiveRegion[] | undefined { + const regionSet: InactiveRegionSet | undefined = this.regionSets.get(uri); + return regionSet?.isComplete ? regionSet.regions : undefined; + } + + public forEach(callback: (regions: readonly InactiveRegion[], uri: string) => void): void { + this.regionSets.forEach((regionSet, uri) => callback(regionSet.regions, uri)); + } + + public clear(): void { + this.regionSets.clear(); + } + + public delete(uri: string): void { + this.regionSets.delete(uri); + } +} + +export function getInactiveRegionStartLines(regions: readonly InactiveRegion[]): number[] { + return [...new Set(regions.map(region => region.startLine))].sort((a, b) => a - b); +} diff --git a/Extension/src/LanguageServer/languageClient.ts b/Extension/src/LanguageServer/languageClient.ts index 255490fdd..63dd88b9c 100644 --- a/Extension/src/LanguageServer/languageClient.ts +++ b/Extension/src/LanguageServer/languageClient.ts @@ -4,8 +4,8 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import { Disposable } from 'vscode'; -import { CancellationToken, NotificationHandler, NotificationType, RequestType } from 'vscode-languageclient'; +import { Disposable, TextDocument } from 'vscode'; +import { CancellationToken, FoldingRangeRequest, NotificationHandler, NotificationType, RequestType } from 'vscode-languageclient'; import * as rpc from 'vscode-languageclient/node'; import { ManualSignal } from '../Utility/Async/manualSignal'; @@ -71,6 +71,11 @@ export class LanguageClient { return this.rpcClient.code2ProtocolConverter; } + public async refreshFoldingRanges(document: TextDocument): Promise { + await this.ready; + this.rpcClient.getFeature(FoldingRangeRequest.method).getProvider(document)?.onDidChangeFoldingRange.fire(); + } + public async sendRequest(type: RequestType, params: P, token?: CancellationToken): Promise { await this.ready; return this.rpcClient.sendRequest(type, params, token); diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index a18b2cd61..2a394cd62 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -49,6 +49,7 @@ export interface WorkspaceFolderSettingsParams { intelliSenseCacheSize: number; intelliSenseMemoryLimit: number; dimInactiveRegions: boolean; + codeFolding: boolean; suggestSnippets: boolean; legacyCompilerArgsBehavior: boolean; defaultSystemIncludePath: string[] | undefined; @@ -377,6 +378,15 @@ export class CppSettings extends Settings { public get inactiveRegionOpacity(): number { return this.getAsNumber("inactiveRegionOpacity"); } public get inactiveRegionForegroundColor(): string | undefined { return changeBlankStringToUndefined(this.getAsStringOrUndefined("inactiveRegionForegroundColor")); } public get inactiveRegionBackgroundColor(): string | undefined { return changeBlankStringToUndefined(this.getAsStringOrUndefined("inactiveRegionBackgroundColor")); } + public get autoFoldInactiveRegions(): boolean { + return this.getAsBoolean("autoFoldInactiveRegions") + && this.codeFolding + && this.intelliSenseEngine.toLowerCase() === "default"; + } + public get inactiveRegionReportingEnabled(): boolean { + return this.dimInactiveRegions + || (this.codeFolding && this.intelliSenseEngine.toLowerCase() === "default"); + } public get autocomplete(): string { return this.getAsString("autocomplete"); } public get autocompleteAddParentheses(): boolean { return this.getAsBoolean("autocompleteAddParentheses"); } public get loggingLevel(): string { return this.getAsString("loggingLevel"); } diff --git a/Extension/test/minBinaryVersion.json b/Extension/test/minBinaryVersion.json index 1a1f20762..26f354be5 100644 --- a/Extension/test/minBinaryVersion.json +++ b/Extension/test/minBinaryVersion.json @@ -1,3 +1,3 @@ { - "minBinaryVersion": "1.33.0" + "minBinaryVersion": "1.35.3" } diff --git a/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts new file mode 100644 index 000000000..f97597c64 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts @@ -0,0 +1,139 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/triple-slash-reference */ +/// + +import * as assert from 'assert'; +import { suite } from 'mocha'; +import * as path from 'path'; +import * as sinon from 'sinon'; +import * as vscode from 'vscode'; +import * as api from 'vscode-cpptools'; +import * as apit from 'vscode-cpptools/out/testApi'; +import * as extension from '../../../../src/LanguageServer/extension'; +import * as testHelpers from '../../../common/testHelpers'; + +suite("Inactive region folding in a multi-root workspace", function (): void { + let testHook: apit.CppToolsTestHook; + let firstWorkspaceFolder: vscode.WorkspaceFolder; + let workspaceFolder: vscode.WorkspaceFolder; + + suiteSetup(async function (): Promise { + await testHelpers.activateCppExtension(); + const cpptools: apit.CppToolsTestApi = await apit.getCppToolsTestApi(api.Version.latest) + ?? assert.fail("Could not get CppToolsTestApi"); + testHook = cpptools.getTestHook(); + firstWorkspaceFolder = vscode.workspace.workspaceFolders?.[0] + ?? assert.fail("First workspace folder is unavailable"); + workspaceFolder = vscode.workspace.workspaceFolders?.[1] + ?? assert.fail("Second workspace folder is unavailable"); + }); + + suiteTeardown(function (): void { + testHook.dispose(); + }); + + test("routes manual folding operations by URI during a workspace client switch", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; + await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + let releaseEditorChange: (() => void) | undefined; + let editorChangeStub: sinon.SinonStub | undefined; + let editorChangePromise: Promise | undefined; + let editor: vscode.TextEditor | undefined; + let firstEditor: vscode.TextEditor | undefined; + try { + editor = await openFileAndWaitForIntelliSense(); + await vscode.commands.executeCommand("editor.unfoldAll"); + + const firstDocument: vscode.TextDocument = await vscode.workspace.openTextDocument( + path.join(firstWorkspaceFolder.uri.fsPath, "test.cpp")); + firstEditor = await vscode.window.showTextDocument(firstDocument); + await extension.clients.didChangeActiveEditor(firstEditor); + const firstClient = extension.clients.ActiveClient; + const owner = extension.clients.getClientFor(editor.document.uri); + assert.notStrictEqual(firstClient, owner); + + const pendingEditorChange: Promise = new Promise(resolve => releaseEditorChange = resolve); + editorChangeStub = sinon.stub(owner, "didChangeActiveEditor").returns(pendingEditorChange); + const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + editorChangePromise = extension.clients.didChangeActiveEditor(activeEditor); + assert.strictEqual(extension.clients.ActiveClient, firstClient); + + await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); + await assertInactiveBranchIsFolded(editor); + + await vscode.commands.executeCommand("C_Cpp.UnfoldAllInactiveRegions"); + await assertInactiveBranchIsUnfolded(editor); + } finally { + releaseEditorChange?.(); + await editorChangePromise; + editorChangeStub?.restore(); + if (editor) { + await closeEditor(editor); + } + if (firstEditor) { + await closeEditor(firstEditor); + } + await testHelpers.delay(150); + await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); + } + }); + + async function closeEditor(editor: vscode.TextEditor): Promise { + await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + } + + async function assertInactiveBranchIsFolded(editor: vscode.TextEditor): Promise { + let line: number = 24; + for (let i: number = 0; i < 20; ++i) { + const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + activeEditor.selection = new vscode.Selection(24, 0, 24, 0); + await vscode.commands.executeCommand("cursorMove", { to: "down", by: "wrappedLine", value: 1 }); + line = activeEditor.selection.active.line; + if (line === 28) { + return; + } + await testHelpers.delay(50); + } + + assert.strictEqual(line, 28); + } + + async function assertInactiveBranchIsUnfolded(editor: vscode.TextEditor): Promise { + const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + activeEditor.selection = new vscode.Selection(24, 0, 24, 0); + await vscode.commands.executeCommand("cursorMove", { to: "down", by: "wrappedLine", value: 1 }); + assert.strictEqual(activeEditor.selection.active.line, 25); + } + + function waitForIntelliSenseReady(fileName: string): Promise { + return new Promise((resolve, reject) => { + const timeout: NodeJS.Timeout = setTimeout(() => { + listener.dispose(); + reject(new Error(`Timed out waiting for IntelliSense for ${fileName}`)); + }, testHelpers.defaultTimeout); + const listener: vscode.Disposable = testHook.IntelliSenseStatusChanged(result => { + if (result.filename === fileName && result.status === apit.Status.IntelliSenseReady) { + clearTimeout(timeout); + listener.dispose(); + resolve(); + } + }); + }); + } + + async function openFileAndWaitForIntelliSense(): Promise { + const fileName: string = "code_folding.cpp"; + const filePath: string = path.join(workspaceFolder.uri.fsPath, fileName); + const ready: Promise = waitForIntelliSenseReady(fileName); + const document: vscode.TextDocument = await vscode.workspace.openTextDocument(filePath); + const editor: vscode.TextEditor = await vscode.window.showTextDocument(document); + await ready; + return editor; + } +}); diff --git a/Extension/test/scenarios/SingleRootProject/tests/inactiveFolding.test.ts b/Extension/test/scenarios/SingleRootProject/tests/inactiveFolding.test.ts new file mode 100644 index 000000000..f623ef848 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/tests/inactiveFolding.test.ts @@ -0,0 +1,338 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/triple-slash-reference */ +/// + +import * as assert from 'assert'; +import { suite } from 'mocha'; +import * as path from 'path'; +import * as vscode from 'vscode'; +import * as api from 'vscode-cpptools'; +import * as apit from 'vscode-cpptools/out/testApi'; +import * as extension from '../../../../src/LanguageServer/extension'; +import * as testHelpers from '../../../common/testHelpers'; + +suite("Inactive region folding", function (): void { + let testHook: apit.CppToolsTestHook; + let workspaceFolder: vscode.WorkspaceFolder; + + suiteSetup(async function (): Promise { + await testHelpers.activateCppExtension(); + const cpptools: apit.CppToolsTestApi = await apit.getCppToolsTestApi(api.Version.latest) + ?? assert.fail("Could not get CppToolsTestApi"); + testHook = cpptools.getTestHook(); + workspaceFolder = vscode.workspace.workspaceFolders?.[0] + ?? assert.fail("No workspace folder available"); + }); + + suiteTeardown(function (): void { + testHook.dispose(); + }); + + test("folds an inactive preprocessor branch instead of its nested function", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousValue: boolean | undefined = configuration.inspect("dimInactiveRegions")?.globalValue; + await configuration.update("dimInactiveRegions", false, vscode.ConfigurationTarget.Global); + try { + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + await vscode.commands.executeCommand("editor.unfoldAll"); + await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); + + await assertInactiveBranchIsFolded(editor); + } finally { + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await configuration.update("dimInactiveRegions", previousValue, vscode.ConfigurationTarget.Global); + } + }); + + test("automatically folds inactive regions when enabled", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousValue: boolean | undefined = configuration.inspect("autoFoldInactiveRegions")?.globalValue; + await configuration.update("autoFoldInactiveRegions", true, vscode.ConfigurationTarget.Global); + try { + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + await testHelpers.delay(100); + + await assertInactiveBranchIsFolded(editor); + } finally { + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await configuration.update("autoFoldInactiveRegions", previousValue, vscode.ConfigurationTarget.Global); + } + }); + + test("manual folding does not suppress later automatic folding", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousAutoFoldValue: boolean | undefined = configuration.inspect("autoFoldInactiveRegions")?.globalValue; + const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; + await configuration.update("autoFoldInactiveRegions", false, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + try { + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + await vscode.commands.executeCommand("editor.unfoldAll"); + await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); + await assertInactiveBranchIsFolded(editor); + + await vscode.commands.executeCommand("editor.unfoldAll"); + await assertInactiveBranchIsUnfolded(editor); + await configuration.update("autoFoldInactiveRegions", true, vscode.ConfigurationTarget.Global); + + await assertInactiveBranchIsFolded(editor); + } finally { + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await configuration.update("autoFoldInactiveRegions", previousAutoFoldValue, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); + } + }); + + test("unfolds all inactive regions", async () => { + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + try { + await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); + await assertInactiveBranchIsFolded(editor); + + await vscode.commands.executeCommand("C_Cpp.UnfoldAllInactiveRegions"); + await assertInactiveBranchIsUnfolded(editor); + } finally { + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + } + }); + + test("applies a fold command queued before IntelliSense is ready", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp"); + const previousUpdateDelay: number | undefined = configuration.inspect("intelliSenseUpdateDelay")?.globalValue; + await configuration.update("intelliSenseUpdateDelay", 3000, vscode.ConfigurationTarget.Global); + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + try { + await vscode.commands.executeCommand("editor.unfoldAll"); + let intelliSenseReady: boolean = false; + const ready: Promise = waitForIntelliSenseReady(path.basename(editor.document.fileName)) + .then(() => { + intelliSenseReady = true; + }); + const editApplied: boolean = await editor.edit(editBuilder => + editBuilder.insert(new vscode.Position(0, 0), " ")); + assert.strictEqual(editApplied, true); + assert.strictEqual(intelliSenseReady, false); + + await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); + await ready; + await assertInactiveBranchIsFolded(editor); + } finally { + if (editor.document.isDirty) { + await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + await vscode.commands.executeCommand("undo"); + } + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await configuration.update("intelliSenseUpdateDelay", previousUpdateDelay, vscode.ConfigurationTarget.Global); + } + }); + + test("applies a queued fold only to the editor that requested it", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp"); + const previousAutoFoldValue: boolean | undefined = configuration.inspect("autoFoldInactiveRegions")?.globalValue; + const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; + const previousUpdateDelay: number | undefined = configuration.inspect("intelliSenseUpdateDelay")?.globalValue; + await configuration.update("autoFoldInactiveRegions", false, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + await configuration.update("intelliSenseUpdateDelay", 3000, vscode.ConfigurationTarget.Global); + const firstEditor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + const secondEditor: vscode.TextEditor = await vscode.window.showTextDocument(firstEditor.document, { + viewColumn: vscode.ViewColumn.Beside, + preserveFocus: false, + preview: false + }); + try { + await vscode.window.showTextDocument(firstEditor.document, firstEditor.viewColumn, false); + await vscode.commands.executeCommand("editor.unfoldAll"); + firstEditor.revealRange(new vscode.Range(24, 0, 25, 0), vscode.TextEditorRevealType.InCenter); + await vscode.window.showTextDocument(secondEditor.document, secondEditor.viewColumn, false); + await vscode.commands.executeCommand("editor.unfoldAll"); + secondEditor.revealRange(new vscode.Range(24, 0, 25, 0), vscode.TextEditorRevealType.InCenter); + await assertLineVisibility(firstEditor, 25, true); + await assertLineVisibility(secondEditor, 25, true); + await vscode.window.showTextDocument(firstEditor.document, firstEditor.viewColumn, false); + + const ready: Promise = waitForIntelliSenseReady(path.basename(firstEditor.document.fileName)); + const editApplied: boolean = await firstEditor.edit(editBuilder => + editBuilder.insert(new vscode.Position(0, 0), " ")); + assert.strictEqual(editApplied, true); + await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); + await vscode.window.showTextDocument(secondEditor.document, secondEditor.viewColumn, false); + + await ready; + await assertLineVisibility(secondEditor, 25, true); + await vscode.window.showTextDocument(firstEditor.document, firstEditor.viewColumn, false); + await assertLineVisibility(firstEditor, 25, false); + await assertLineVisibility(secondEditor, 25, true); + } finally { + if (firstEditor.document.isDirty) { + await vscode.window.showTextDocument(firstEditor.document, firstEditor.viewColumn, false); + await vscode.commands.executeCommand("undo"); + } + await closeEditor(firstEditor); + await closeEditor(secondEditor); + await testHelpers.delay(150); + await configuration.update("autoFoldInactiveRegions", previousAutoFoldValue, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); + await configuration.update("intelliSenseUpdateDelay", previousUpdateDelay, vscode.ConfigurationTarget.Global); + } + }); + + test("does not automatically refold an editor after client recovery", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousAutoFoldValue: boolean | undefined = configuration.inspect("autoFoldInactiveRegions")?.globalValue; + const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; + await configuration.update("autoFoldInactiveRegions", true, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + try { + await assertInactiveBranchIsFolded(editor); + await vscode.commands.executeCommand("editor.unfoldAll"); + await assertInactiveBranchIsUnfolded(editor); + + const ready: Promise = waitForIntelliSenseReady(path.basename(editor.document.fileName)); + await extension.clients.recreateClients(); + await ready; + + await assertInactiveBranchIsUnfolded(editor); + } finally { + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await configuration.update("autoFoldInactiveRegions", previousAutoFoldValue, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); + } + }); + + test("does not automatically fold regions introduced after an empty initial result", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousAutoFoldValue: boolean | undefined = configuration.inspect("autoFoldInactiveRegions")?.globalValue; + const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; + await configuration.update("autoFoldInactiveRegions", true, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense("main.cpp"); + try { + const ready: Promise = waitForIntelliSenseReady(path.basename(editor.document.fileName)); + const editApplied: boolean = await editor.edit(editBuilder => editBuilder.insert( + new vscode.Position(0, 0), + "#if 0\nint inactive()\n{\n return 0;\n}\n#endif\n\n")); + assert.strictEqual(editApplied, true); + await ready; + await testHelpers.delay(100); + + const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + activeEditor.selection = new vscode.Selection(0, 0, 0, 0); + await vscode.commands.executeCommand("cursorMove", { to: "down", by: "wrappedLine", value: 1 }); + assert.strictEqual(activeEditor.selection.active.line, 1); + } finally { + if (editor.document.isDirty) { + await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + await vscode.commands.executeCommand("undo"); + } + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await configuration.update("autoFoldInactiveRegions", previousAutoFoldValue, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); + } + }); + + test("automatically folds when code folding is enabled later", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); + const previousAutoFoldValue: boolean | undefined = configuration.inspect("autoFoldInactiveRegions")?.globalValue; + const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; + await configuration.update("autoFoldInactiveRegions", true, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", "disabled", vscode.ConfigurationTarget.Global); + try { + const editor: vscode.TextEditor = await openFileAndWaitForIntelliSense(); + await vscode.commands.executeCommand("editor.unfoldAll"); + await testHelpers.delay(100); + + await assertInactiveBranchIsUnfolded(editor); + await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + await assertInactiveBranchIsFolded(editor); + } finally { + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + await testHelpers.delay(150); + await configuration.update("autoFoldInactiveRegions", previousAutoFoldValue, vscode.ConfigurationTarget.Global); + await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); + } + }); + + async function assertInactiveBranchIsFolded(editor: vscode.TextEditor): Promise { + let line: number = 24; + for (let i: number = 0; i < 20; ++i) { + line = await moveCursorDown(editor); + if (line === 28) { + return; + } + await testHelpers.delay(50); + } + + assert.strictEqual(line, 28); + } + + async function assertInactiveBranchIsUnfolded(editor: vscode.TextEditor): Promise { + let line: number = 24; + for (let i: number = 0; i < 20; ++i) { + line = await moveCursorDown(editor); + if (line === 25) { + return; + } + await testHelpers.delay(50); + } + + assert.strictEqual(line, 25); + } + + async function moveCursorDown(editor: vscode.TextEditor): Promise { + const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + await vscode.commands.executeCommand("workbench.action.focusActiveEditorGroup"); + activeEditor.selection = new vscode.Selection(24, 0, 24, 0); + await vscode.commands.executeCommand("cursorMove", { to: "down", by: "wrappedLine", value: 1 }); + return activeEditor.selection.active.line; + } + + async function assertLineVisibility(editor: vscode.TextEditor, line: number, expected: boolean): Promise { + const position: vscode.Position = new vscode.Position(line, 0); + let visible: boolean = false; + for (let i: number = 0; i < 20; ++i) { + visible = editor.visibleRanges.some(range => range.contains(position)); + if (visible === expected) { + return; + } + await testHelpers.delay(50); + } + + assert.strictEqual(visible, expected); + } + + async function closeEditor(editor: vscode.TextEditor): Promise { + await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); + await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); + } + + function waitForIntelliSenseReady(fileName: string): Promise { + return new Promise((resolve, reject) => { + const timeout: NodeJS.Timeout = setTimeout(() => { + listener.dispose(); + reject(new Error(`Timed out waiting for IntelliSense for ${fileName}`)); + }, testHelpers.defaultTimeout); + const listener: vscode.Disposable = testHook.IntelliSenseStatusChanged(result => { + if (result.filename === fileName && result.status === apit.Status.IntelliSenseReady) { + clearTimeout(timeout); + listener.dispose(); + resolve(); + } + }); + }); + } + + async function openFileAndWaitForIntelliSense(fileName: string = "code_folding.cpp"): Promise { + const filePath: string = path.join(workspaceFolder.uri.fsPath, fileName); + const ready: Promise = waitForIntelliSenseReady(fileName); + const document: vscode.TextDocument = await vscode.workspace.openTextDocument(filePath); + const editor: vscode.TextEditor = await vscode.window.showTextDocument(document); + await ready; + return editor; + } +}); diff --git a/Extension/test/unit/inactiveRegions.test.ts b/Extension/test/unit/inactiveRegions.test.ts new file mode 100644 index 000000000..bd4e81c9f --- /dev/null +++ b/Extension/test/unit/inactiveRegions.test.ts @@ -0,0 +1,75 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as assert from 'assert'; +import { suite, test } from 'mocha'; +import { getInactiveRegionStartLines, InactiveRegion, InactiveRegionStore } from '../../src/LanguageServer/inactiveRegions'; + +suite("InactiveRegionStore", () => { + const uri: string = "file:///source.cpp"; + const firstRegion: InactiveRegion = { + startLine: 2, + startColumn: 0, + endLine: 4, + endColumn: 0 + }; + const secondRegion: InactiveRegion = { + startLine: 8, + startColumn: 0, + endLine: 10, + endColumn: 0 + }; + + test("returns regions only after a complete pass", () => { + const store: InactiveRegionStore = new InactiveRegionStore(); + + store.update(uri, [firstRegion], true, false); + assert.strictEqual(store.getComplete(uri), undefined); + + store.update(uri, [secondRegion], false, true); + assert.deepStrictEqual(store.getComplete(uri), [firstRegion, secondRegion]); + }); + + test("replaces regions when a new pass starts", () => { + const store: InactiveRegionStore = new InactiveRegionStore(); + store.update(uri, [firstRegion], true, true); + + store.update(uri, [secondRegion], true, true); + + assert.deepStrictEqual(store.getComplete(uri), [secondRegion]); + }); + + test("deletes cached regions", () => { + const store: InactiveRegionStore = new InactiveRegionStore(); + store.update(uri, [firstRegion], true, true); + + store.delete(uri); + + assert.strictEqual(store.getComplete(uri), undefined); + }); + + test("iterates cached regions", () => { + const store: InactiveRegionStore = new InactiveRegionStore(); + store.update(uri, [firstRegion, secondRegion], true, true); + const entries: [string, readonly InactiveRegion[]][] = []; + + store.forEach((regions, entryUri) => entries.push([entryUri, regions])); + + assert.deepStrictEqual(entries, [[uri, [firstRegion, secondRegion]]]); + }); + + test("clears all cached regions", () => { + const store: InactiveRegionStore = new InactiveRegionStore(); + store.update(uri, [firstRegion], true, true); + + store.clear(); + + assert.strictEqual(store.getComplete(uri), undefined); + }); + + test("returns sorted unique start lines", () => { + assert.deepStrictEqual(getInactiveRegionStartLines([secondRegion, firstRegion, secondRegion]), [2, 8]); + }); +}); From 333cfadab82727e550ec42efc81727875db047dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:54:41 -0700 Subject: [PATCH 18/29] Bump brace-expansion from 5.0.9 to 5.0.12 in /ExtensionPack (#14809) Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.9 to 5.0.12. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.9...v5.0.12) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 5.0.12 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ExtensionPack/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ExtensionPack/package-lock.json b/ExtensionPack/package-lock.json index 330bfe832..deb508073 100644 --- a/ExtensionPack/package-lock.json +++ b/ExtensionPack/package-lock.json @@ -777,9 +777,9 @@ "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", + "version": "5.0.12", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { From 32893ee9fb10f01629fa3007dfa7aea4e5d83a04 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Thu, 1 Oct 2026 16:26:51 -0700 Subject: [PATCH 19/29] Update changelog and version for 1.35.3 (#14813) --- Extension/CHANGELOG.md | 29 +++++++++++++++++++++++++++++ Extension/package.json | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 308197abe..b8c8b62db 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,34 @@ # C/C++ for Visual Studio Code Changelog +## Version 1.35.3: October 2, 2026 +### New Features +* Add 'Fold All Inactive Regions' and 'Unfold All Inactive Regions' commands and the opt-in `C_Cpp.autoFoldInactiveRegions` setting. [#8992](https://github.com/microsoft/vscode-cpptools/issues/8992) +* Dim unreachable code when `editor.showUnused` is enabled. [#12902](https://github.com/microsoft/vscode-cpptools/issues/12902) +* Show C++ type size and alignment in hovers. [#13034](https://github.com/microsoft/vscode-cpptools/issues/13034) + +### Enhancements +* Increase the per-file IntelliSense diagnostic limit from 250 to 1,000, prioritize errors over unused-code hints, and reduce processing of over-limit diagnostics. +* Improve IntelliSense performance in large include graphs and classes with many inherited constructors. +* Reduce custom-configuration processing overhead and memory retained from `compile_commands.json`. +* Improve code folding performance in files with many inactive preprocessor regions. +* Improve loading performance for Windows-1255 and Windows-1258 source files. +* Reduce CPU usage when resolving headers in large Windows workspaces. + +### Bug Fixes +* Fix 'Go to Declaration' and 'Go to Definition' returning the current location instead of an available counterpart. [#14509](https://github.com/microsoft/vscode-cpptools/issues/14509) +* Update MIEngine to fix debugger failures with synthetic GDB stack frames. [#14741](https://github.com/microsoft/vscode-cpptools/issues/14741) + * Thanks for the contribution. [@tzcnt](https://github.com/tzcnt) [PR MIEngine#1605](https://github.com/microsoft/MIEngine/pull/1605) +* Fix incorrect IntelliSense errors for alias-template deduction guides using C++26 pack indexing. [#14794](https://github.com/microsoft/vscode-cpptools/issues/14794) +* Fix incorrect unused-parameter warnings and dimming for assignments through reference parameters. [#14801](https://github.com/microsoft/vscode-cpptools/issues/14801) +* Fix missing IntelliSense headers with Clang `-cxx-isystem` and `-stdlib++-isystem` options and split clang-cl `-imsvc` and `/imsvc` arguments. +* Fix IntelliSense crashes involving deduction guides, user-defined conversions, and lambdas in macros. +* Fix IntelliSense handling of GCC `--embed-directory=` and `--embed-directory ` arguments. +* Fix a tag parser stack-overflow crash when loading cyclic or excessively deep cached symbol data. +* Fix unwanted completion popups when typing incomplete floating-point exponents. +* Fix configuration-provider requests delaying language server shutdown. +* Various localization updates. +* Update dependencies. + ## Version 1.35.2: September 22, 2026 ### New Feature * Dim unused local variables and parameters when `editor.showUnused` is enabled. [#10490](https://github.com/microsoft/vscode-cpptools/issues/10490) diff --git a/Extension/package.json b/Extension/package.json index dcce0856c..60f53f7f0 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2,7 +2,7 @@ "name": "cpptools", "displayName": "C/C++", "description": "C/C++ IntelliSense, debugging, and code browsing.", - "version": "1.35.2-main", + "version": "1.35.3-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", From 5fcf27752fce13df2b535a7faf505f18b1ca4c27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 23:28:43 +0000 Subject: [PATCH 20/29] Bump the github-actions group with 2 updates (#14814) Bumps the github-actions group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action). Updates `github/codeql-action/init` from 4.38.0 to 4.38.2 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2) Updates `github/codeql-action/analyze` from 4.38.0 to 4.38.2 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2) --- updated-dependencies: - dependency-name: github/codeql-action/init dependency-version: 4.38.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action/analyze dependency-version: 4.38.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sean McManus --- .github/workflows/codeql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0dbfc4b8a..f89771818 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -63,7 +63,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 + uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -91,7 +91,7 @@ jobs: exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 + uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: category: "/language:${{matrix.language}}" From 2b1c56294e5ee7877743d7ae6b877e16ebae8b59 Mon Sep 17 00:00:00 2001 From: Glen Chung <105310954+kuchungmsft@users.noreply.github.com> Date: Mon, 5 Oct 2026 10:39:20 -0700 Subject: [PATCH 21/29] Add localizable help for workspace config arguments (#14812) Add localizable mscppls help strings for the workspace-neutral configuration option and its deprecated LSP-named aliases. --- Extension/src/nativeStrings.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Extension/src/nativeStrings.json b/Extension/src/nativeStrings.json index 5ad20f459..df651a089 100644 --- a/Extension/src/nativeStrings.json +++ b/Extension/src/nativeStrings.json @@ -797,5 +797,25 @@ "quick_info_alignment": { "text": "**Alignment:** %s B", "hint": "Alignment of a C or C++ type in bytes. %s is the numeric alignment. Translate B to a count-invariant byte unit symbol or abbreviation. {Locked=\"**\"} {Locked=\"%s\"}" + }, + "help_allow_missing_workspace_config": { + "text": "Allow the server to start even when the specified workspace config file does not exist.", + "hint": "Describes the --allow-missing-workspace-config command-line option." + }, + "help_deprecated_lsp_config": { + "text": "Deprecated alias for --workspace-config.", + "hint": "{Locked=\"--workspace-config\"}" + }, + "help_deprecated_allow_missing_lsp_config": { + "text": "Deprecated alias for --allow-missing-workspace-config.", + "hint": "{Locked=\"--allow-missing-workspace-config\"}" + }, + "error_conflicting_config_args": { + "text": "--workspace-config cannot be combined with --lsp-config.", + "hint": "Error shown when both configuration arguments are supplied. {Locked=\"--workspace-config\"} {Locked=\"--lsp-config\"}" + }, + "error_config_arg_requires_path": { + "text": "{0} requires a path.", + "hint": "Error shown when a configuration argument is not followed by a path. {0} is the command-line option name. {Locked=\"{0}\"}" } } From 8377b1ca7a3c55f4cfd1d139a0a3bd96c7654802 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 5 Oct 2026 16:04:49 -0700 Subject: [PATCH 22/29] Update dependencies to address security advisories (#14818) --- .github/actions/package-lock.json | 124 ++++++++++-------------------- Extension/yarn.lock | 18 ++--- Themes/package-lock.json | 6 +- 3 files changed, 51 insertions(+), 97 deletions(-) diff --git a/.github/actions/package-lock.json b/.github/actions/package-lock.json index 7d8f2ac9c..edac10ae8 100644 --- a/.github/actions/package-lock.json +++ b/.github/actions/package-lock.json @@ -1130,29 +1130,6 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-array/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@eslint/config-array/node_modules/minimatch": { "version": "10.2.6", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-10.2.6.tgz", @@ -2740,29 +2717,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.6", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/minimatch/-/minimatch-10.2.6.tgz", @@ -2993,13 +2947,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/axios/-/axios-1.18.1.tgz", - "integrity": "sha1-1j+YY7zYk4gVyG+eKr04AYnZbf4=", + "version": "1.20.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/axios/-/axios-1.20.0.tgz", + "integrity": "sha1-UVUTRFqmDnHQS2UhymIQgpzLR4Y=", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -3100,6 +3054,29 @@ "license": "MIT", "optional": true }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/braces/-/braces-3.0.3.tgz", @@ -3584,29 +3561,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "9.1.2", "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/eslint-scope/-/eslint-scope-9.1.2.tgz", @@ -4070,9 +4024,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha1-WJ2rEcABjQNmvmTNi/Esjb7MgyY=", + "version": "2.1.7", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -4287,9 +4241,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.3.1", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ip-address/-/ip-address-10.3.1.tgz", - "integrity": "sha1-kp+WKdFyT34bdIXOiXUvNnUzahA=", + "version": "10.7.2", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ip-address/-/ip-address-10.7.2.tgz", + "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==", "dev": true, "license": "MIT", "engines": { @@ -4596,9 +4550,9 @@ } }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha1-WJ2rEcABjQNmvmTNi/Esjb7MgyY=", + "version": "2.1.7", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5380,9 +5334,9 @@ } }, "node_modules/undici": { - "version": "6.28.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/undici/-/undici-6.28.0.tgz", - "integrity": "sha1-nw44V0T+9QIdZZbFvM14P2EZPBw=", + "version": "6.29.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/undici/-/undici-6.29.0.tgz", + "integrity": "sha512-R+RODBqp6i2pPflGdq+xIOUkl+RNfGgHwoinecKu/JCuf2uO06cOKoDbI2P7Dn6KcswdKwrczbU6IYJ6K8X+wg==", "license": "MIT", "engines": { "node": ">=18.17" diff --git a/Extension/yarn.lock b/Extension/yarn.lock index 6baca69d1..a946189da 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -1709,24 +1709,24 @@ boundary@^2.0.0: integrity "sha1-FpyLHw1Ezywlk4lnoyjzfgpOXvw= sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==" brace-expansion@^1.1.7: - version "1.1.18" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.18.tgz#3ce74d89885136be1535341f8c3d4425c29a5cab" - integrity "sha1-POdNiYhRNr4VNTQfjD1EJcKaXKs= sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==" + version "1.1.21" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.21.tgz#edf4fab5c64d051aea5a8def49aba1c7522279f3" + integrity sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.1.4" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-2.1.4.tgz#589dab11c0018d0366be64cd8bf12c8dbecc8326" - integrity "sha1-WJ2rEcABjQNmvmTNi/Esjb7MgyY= sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==" + version "2.1.7" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-2.1.7.tgz#14ea3836731823bb24740225ea43b941b436f9d1" + integrity sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g== dependencies: balanced-match "^1.0.0" brace-expansion@^5.0.2, brace-expansion@^5.0.8: - version "5.0.9" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf" - integrity "sha1-fHJDiAm1+lur9UGZofHCgaaYT88= sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==" + version "5.0.12" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.12.tgz#995fbb4750a77c4d16a7dc942ff2ca6ef8e675ec" + integrity sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ== dependencies: balanced-match "^4.0.2" diff --git a/Themes/package-lock.json b/Themes/package-lock.json index 93e9b3ec9..603165d97 100644 --- a/Themes/package-lock.json +++ b/Themes/package-lock.json @@ -767,9 +767,9 @@ "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha1-fHJDiAm1+lur9UGZofHCgaaYT88=", + "version": "5.0.12", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { From 2498b3958dd3602c7be039fcbe07bc00ef9196b0 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Tue, 6 Oct 2026 17:33:56 -0700 Subject: [PATCH 23/29] Show integral values in hexadecimal on hover (#14803) --- Extension/package.json | 6 +++ Extension/package.nls.json | 6 +++ Extension/src/LanguageServer/client.ts | 1 + Extension/src/LanguageServer/settings.ts | 2 + .../tests/quickInfo.test.ts | 51 +++++++++++++++++++ 5 files changed, 66 insertions(+) diff --git a/Extension/package.json b/Extension/package.json index 60f53f7f0..c122428c3 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -1055,6 +1055,12 @@ "description": "%c_cpp.configuration.hover.description%", "scope": "resource" }, + "C_Cpp.hoverShowIntegralValuesInHexadecimal": { + "type": "boolean", + "default": false, + "markdownDescription": "%c_cpp.configuration.hoverShowIntegralValuesInHexadecimal.markdownDescription%", + "scope": "resource" + }, "C_Cpp.errorSquiggles": { "type": "string", "enum": [ diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 57f924d7e..eaec6d5d2 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -773,6 +773,12 @@ "c_cpp.configuration.markdownInComments.enabled.description": "Enable all markdown features in the hover tooltip.", "c_cpp.configuration.markdownInComments.disabled.description": "Disable all markdown features in the hover tooltip.", "c_cpp.configuration.hover.description": "If disabled, hover details are no longer provided by the language server.", + "c_cpp.configuration.hoverShowIntegralValuesInHexadecimal.markdownDescription": { + "message": "Displays integral constant values in hexadecimal in IntelliSense hovers. This setting only applies if `#C_Cpp.intelliSenseEngine#` is set to `default`.", + "comment": [ + "Markdown text between `` should not be translated or localized (it represents literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." + ] + }, "c_cpp.configuration.vcpkg.enabled.markdownDescription": { "message": "Enable integration services for the [vcpkg dependency manager](https://aka.ms/vcpkg/).", "comment": [ diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 22ccc7d96..7900c67a5 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -1502,6 +1502,7 @@ export class DefaultClient implements Client { clangTidyChecksDisabled: settings.clangTidyChecksDisabled, markdownInComments: settings.markdownInComments, hover: settings.hover, + hoverShowIntegralValuesInHexadecimal: settings.hoverShowIntegralValuesInHexadecimal, vcFormatIndentBraces: settings.vcFormatIndentBraces, vcFormatIndentMultiLineRelativeTo: settings.vcFormatIndentMultiLineRelativeTo, vcFormatIndentWithinParentheses: settings.vcFormatIndentWithinParentheses, diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 2a394cd62..726ec82cf 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -70,6 +70,7 @@ export interface WorkspaceFolderSettingsParams { clangTidyChecksEnabled: string[] | undefined; clangTidyChecksDisabled: string[] | undefined; hover: string; + hoverShowIntegralValuesInHexadecimal: boolean; markdownInComments: string; vcFormatIndentBraces: boolean; vcFormatIndentMultiLineRelativeTo: string; @@ -478,6 +479,7 @@ export class CppSettings extends Settings { public get isCaseSensitiveFileSupportEnabled(): boolean { return !isWindows || this.getAsString("caseSensitiveFileSupport").toLowerCase() === "enabled"; } public get doxygenSectionTags(): string[] { return this.getAsArrayOfStrings("doxygen.sectionTags"); } public get hover(): string { return this.getAsString("hover"); } + public get hoverShowIntegralValuesInHexadecimal(): boolean { return this.getAsBoolean("hoverShowIntegralValuesInHexadecimal"); } public get markdownInComments(): string { return this.getAsString("markdownInComments"); } public get legacyCompilerArgsBehavior(): boolean { return this.getAsBoolean("legacyCompilerArgsBehavior"); } public get inlayHintsAutoDeclarationTypes(): boolean { return this.getAsBoolean("inlayHints.autoDeclarationTypes.enabled"); } diff --git a/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts index d9c819386..11a455cba 100644 --- a/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts @@ -7,6 +7,7 @@ import * as os from 'os'; import * as vscode from 'vscode'; import * as api from 'vscode-cpptools'; import * as apit from 'vscode-cpptools/out/testApi'; +import { CppSettings } from '../../../../src/LanguageServer/settings'; import { timeout } from '../../../../src/Utility/Async/timeout'; import * as testHelpers from '../../../common/testHelpers'; @@ -104,4 +105,54 @@ suite("[Quick info test]", function(): void { const actual: string = (result[0].contents[0]).value; assert.strictEqual(actual, expected); }); + + test("[Hover settings coexist in the same scope]", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", fileUri); + const originalHover: string | undefined = configuration.inspect("hover")?.workspaceFolderValue; + const originalShowIntegralValuesInHexadecimal: boolean | undefined = + configuration.inspect("hoverShowIntegralValuesInHexadecimal")?.workspaceFolderValue; + + try { + await configuration.update("hover", "disabled", vscode.ConfigurationTarget.WorkspaceFolder); + await configuration.update("hoverShowIntegralValuesInHexadecimal", true, vscode.ConfigurationTarget.WorkspaceFolder); + + const settings: CppSettings = new CppSettings(fileUri); + assert.strictEqual(settings.hover, "disabled"); + assert.strictEqual(settings.hoverShowIntegralValuesInHexadecimal, true); + } finally { + await configuration.update( + "hoverShowIntegralValuesInHexadecimal", + originalShowIntegralValuesInHexadecimal, + vscode.ConfigurationTarget.WorkspaceFolder); + await configuration.update("hover", originalHover, vscode.ConfigurationTarget.WorkspaceFolder); + } + }); + + test("[Folder hexadecimal setting preserves global disabled hover]", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", fileUri); + const originalGlobalHover: string | undefined = configuration.inspect("hover")?.globalValue; + const originalWorkspaceHover: string | undefined = configuration.inspect("hover")?.workspaceValue; + const originalWorkspaceFolderHover: string | undefined = configuration.inspect("hover")?.workspaceFolderValue; + const originalShowIntegralValuesInHexadecimal: boolean | undefined = + configuration.inspect("hoverShowIntegralValuesInHexadecimal")?.workspaceFolderValue; + + try { + await configuration.update("hover", "disabled", vscode.ConfigurationTarget.Global); + await configuration.update("hover", undefined, vscode.ConfigurationTarget.Workspace); + await configuration.update("hover", undefined, vscode.ConfigurationTarget.WorkspaceFolder); + await configuration.update("hoverShowIntegralValuesInHexadecimal", true, vscode.ConfigurationTarget.WorkspaceFolder); + + const settings: CppSettings = new CppSettings(fileUri); + assert.strictEqual(settings.hover, "disabled"); + assert.strictEqual(settings.hoverShowIntegralValuesInHexadecimal, true); + } finally { + await configuration.update( + "hoverShowIntegralValuesInHexadecimal", + originalShowIntegralValuesInHexadecimal, + vscode.ConfigurationTarget.WorkspaceFolder); + await configuration.update("hover", originalWorkspaceFolderHover, vscode.ConfigurationTarget.WorkspaceFolder); + await configuration.update("hover", originalWorkspaceHover, vscode.ConfigurationTarget.Workspace); + await configuration.update("hover", originalGlobalHover, vscode.ConfigurationTarget.Global); + } + }); }); From fbdb130688afbfab1dc902ee44823a1e6c8476ee Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Tue, 6 Oct 2026 18:58:53 -0700 Subject: [PATCH 24/29] Send include cleanup editorconfig preferences (#14808) --- Extension/src/LanguageServer/client.ts | 26 ++++++---- .../includeCleanupEditorConfig.ts | 33 ++++++++++++ .../unit/includeCleanupEditorConfig.test.ts | 51 +++++++++++++++++++ 3 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 Extension/src/LanguageServer/includeCleanupEditorConfig.ts create mode 100644 Extension/test/unit/includeCleanupEditorConfig.test.ts diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 7900c67a5..25343f4f7 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -55,6 +55,7 @@ import { CustomConfigurationProvider1, getCustomConfigProviders, isSameProviderE import { DataBinding } from './dataBinding'; import { cachedEditorConfigSettings, getEditorConfigSettings } from './editorConfig'; import { CppSourceStr, clients, configPrefix, initializeIntervalTimer, isWritingCrashCallStack, updateLanguageConfigurations, usesCrashHandler, watchForCrashes } from './extension'; +import { IncludeCleanupPreferences, getIncludeCleanupPreferences } from './includeCleanupEditorConfig'; import { InactiveRegion, InactiveRegionStore, getInactiveRegionStartLines } from './inactiveRegions'; import { LanguageClient } from './languageClient'; import { LocalizeStringParams, getLocaleId, getLocalizedString } from './localization'; @@ -507,6 +508,7 @@ interface TagParseStatus { interface VisibleEditorInfo { visibleRanges: Range[]; originalEncoding: string; + includeCleanupPreferences: IncludeCleanupPreferences; } interface DidChangeVisibleTextEditorsParams { @@ -1953,9 +1955,11 @@ export class DefaultClient implements Client { // First, we just concat all ranges for the same file. const uri: string = editor.document.uri.toString(); if (!visibileEditorInfo[uri]) { + const editorConfigSettings: any = getEditorConfigSettings(editor.document.uri.fsPath); visibileEditorInfo[uri] = { visibleRanges: [], - originalEncoding: editor.document.encoding + originalEncoding: editor.document.encoding, + includeCleanupPreferences: getIncludeCleanupPreferences(editorConfigSettings) }; } visibileEditorInfo[uri].visibleRanges = visibileEditorInfo[uri].visibleRanges.concat(editor.visibleRanges.map(makeLspRange)); @@ -2714,6 +2718,15 @@ export class DefaultClient implements Client { private associations_for_did_change?: Set; + private refreshEditorConfigSettings(): void { + cachedEditorConfigSettings.clear(); + cachedEditorConfigLookups.clear(); + this.updateActiveDocumentTextOptions(); + + const cppEditors: vscode.TextEditor[] = vscode.window.visibleTextEditors.filter(editor => util.isCpp(editor.document)); + void this.onDidChangeVisibleTextEditors(cppEditors).catch(logAndReturn.undefined); + } + /** * listen for file created/deleted events under the ${workspaceFolder} folder */ @@ -2734,9 +2747,7 @@ export class DefaultClient implements Client { } const fileName: string = path.basename(uri.fsPath).toLowerCase(); if (fileName === ".editorconfig") { - cachedEditorConfigSettings.clear(); - cachedEditorConfigLookups.clear(); - this.updateActiveDocumentTextOptions(); + this.refreshEditorConfigSettings(); } if (fileName === ".clang-format" || fileName === "_clang-format") { cachedEditorConfigLookups.clear(); @@ -2762,9 +2773,7 @@ export class DefaultClient implements Client { const dotIndex: number = uri.fsPath.lastIndexOf('.'); const fileName: string = path.basename(uri.fsPath).toLowerCase(); if (fileName === ".editorconfig") { - cachedEditorConfigSettings.clear(); - cachedEditorConfigLookups.clear(); - this.updateActiveDocumentTextOptions(); + this.refreshEditorConfigSettings(); } const ext: string | undefined = dotIndex !== -1 ? uri.fsPath.substring(dotIndex + 1) : undefined; const isTrackedFile: boolean = hasNativeFileTypeMappings() @@ -2789,8 +2798,7 @@ export class DefaultClient implements Client { } const fileName: string = path.basename(uri.fsPath).toLowerCase(); if (fileName === ".editorconfig") { - cachedEditorConfigSettings.clear(); - cachedEditorConfigLookups.clear(); + this.refreshEditorConfigSettings(); } if (fileName === ".clang-format" || fileName === "_clang-format") { cachedEditorConfigLookups.clear(); diff --git a/Extension/src/LanguageServer/includeCleanupEditorConfig.ts b/Extension/src/LanguageServer/includeCleanupEditorConfig.ts new file mode 100644 index 000000000..60c7fb17c --- /dev/null +++ b/Extension/src/LanguageServer/includeCleanupEditorConfig.ts @@ -0,0 +1,33 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +export interface IncludeCleanupPreferences { + alternateFiles: string; + excludedFiles: string; + replacementFiles: string; + requiredFiles: string; +} + +function normalizeSettingKeys(settings: any): Record { + return Object.fromEntries(Object.entries(settings ?? {}).map(([key, value]) => [key.toLowerCase(), value])); +} + +function getStringSetting(settings: Record, key: string): string { + const value: unknown = settings?.[key]; + if (typeof value !== 'string' || value.toLowerCase() === 'unset') { + return ''; + } + return value; +} + +export function getIncludeCleanupPreferences(settings: any): IncludeCleanupPreferences { + const normalizedSettings: Record = normalizeSettingKeys(settings); + return { + alternateFiles: getStringSetting(normalizedSettings, 'cpp_include_cleanup_alternate_files'), + excludedFiles: getStringSetting(normalizedSettings, 'cpp_include_cleanup_excluded_files'), + replacementFiles: getStringSetting(normalizedSettings, 'cpp_include_cleanup_replacement_files'), + requiredFiles: getStringSetting(normalizedSettings, 'cpp_include_cleanup_required_files') + }; +} diff --git a/Extension/test/unit/includeCleanupEditorConfig.test.ts b/Extension/test/unit/includeCleanupEditorConfig.test.ts new file mode 100644 index 000000000..cf9ccdf74 --- /dev/null +++ b/Extension/test/unit/includeCleanupEditorConfig.test.ts @@ -0,0 +1,51 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { deepStrictEqual } from 'assert'; +import { describe, it } from 'mocha'; +import { getIncludeCleanupPreferences } from '../../src/LanguageServer/includeCleanupEditorConfig'; + +describe('Include Cleanup editorconfig settings', () => { + it('maps semantic preference strings', () => { + deepStrictEqual(getIncludeCleanupPreferences({ + cpp_include_cleanup_alternate_files: 'umbrella.h:internal.h', + cpp_include_cleanup_excluded_files: 'generated.h', + cpp_include_cleanup_replacement_files: 'stdio.h:cstdio', + cpp_include_cleanup_required_files: 'atlwin.h:atlbase.h' + }), { + alternateFiles: 'umbrella.h:internal.h', + excludedFiles: 'generated.h', + replacementFiles: 'stdio.h:cstdio', + requiredFiles: 'atlwin.h:atlbase.h' + }); + }); + + it('maps property names case-insensitively', () => { + deepStrictEqual(getIncludeCleanupPreferences({ + CPP_INCLUDE_CLEANUP_ALTERNATE_FILES: 'umbrella.h:internal.h', + Cpp_Include_Cleanup_Excluded_Files: 'generated.h', + cpp_INCLUDE_cleanup_REPLACEMENT_files: 'stdio.h:cstdio', + CPP_include_cleanup_required_FILES: 'atlwin.h:atlbase.h' + }), { + alternateFiles: 'umbrella.h:internal.h', + excludedFiles: 'generated.h', + replacementFiles: 'stdio.h:cstdio', + requiredFiles: 'atlwin.h:atlbase.h' + }); + }); + + it('maps unset and non-string values to empty strings', () => { + deepStrictEqual(getIncludeCleanupPreferences({ + cpp_include_cleanup_alternate_files: 'unset', + cpp_include_cleanup_excluded_files: true, + cpp_include_cleanup_replacement_files: 42 + }), { + alternateFiles: '', + excludedFiles: '', + replacementFiles: '', + requiredFiles: '' + }); + }); +}); From 9a30994a45acd9b9dcc2363ebd430ca2ec73830a Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Thu, 8 Oct 2026 10:50:50 -0700 Subject: [PATCH 25/29] Add configurable clang-tidy Include Cleaner provider mappings (#14788) --- Extension/package.json | 14 ++ Extension/package.nls.json | 6 + Extension/src/LanguageServer/client.ts | 1 + Extension/src/LanguageServer/settings.ts | 10 + .../src/LanguageServer/settingsTracker.ts | 1 + Extension/test/unit/settings.test.ts | 189 ++++++++++++++++++ 6 files changed, 221 insertions(+) create mode 100644 Extension/test/unit/settings.test.ts diff --git a/Extension/package.json b/Extension/package.json index c122428c3..6c4efb682 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2287,6 +2287,20 @@ "markdownDescription": "%c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription%", "scope": "resource" }, + "C_Cpp.codeAnalysis.clangTidy.includeCleanerMappings": { + "type": "object", + "default": {}, + "propertyNames": { + "minLength": 1, + "pattern": "^[^\\u0000-\\u001f\\u007f-\\u009f]+(?![\\s\\S])" + }, + "additionalProperties": { + "type": "string", + "pattern": "^(?:<[^<>\"\\u0000-\\u001f\\u007f-\\u009f]+>|\"[^<>\"\\u0000-\\u001f\\u007f-\\u009f]+\")(?![\\s\\S])" + }, + "markdownDescription": "%c_cpp.configuration.codeAnalysis.clangTidy.includeCleanerMappings.markdownDescription%", + "scope": "resource" + }, "C_Cpp.codeAnalysis.clangTidy.args": { "type": "array", "items": { diff --git a/Extension/package.nls.json b/Extension/package.nls.json index eaec6d5d2..2d0019cf0 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -201,6 +201,12 @@ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, + "c_cpp.configuration.codeAnalysis.clangTidy.includeCleanerMappings.markdownDescription": { + "message": "Opt-in mappings from exact `misc-include-cleaner` symbol names to public headers. Keys must be nonempty. Values use `` or `\"path\"` with a nonempty path and no embedded delimiters. Keys and values cannot contain control characters. Diagnostics are kept unless a direct include of the mapped header is proven; public-header insertion is offered when available.", + "comment": [ + "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." + ] + }, "c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": { "message": "Additional command line arguments to pass to `clang-tidy`. These take precedence over the equivalent `C_Cpp.codeAnalysis.clangTidy.*` settings.", "comment": [ diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 25343f4f7..176b3a40b 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -1498,6 +1498,7 @@ export class DefaultClient implements Client { clangTidyConfig: settings.clangTidyConfig, clangTidyFallbackConfig: settings.clangTidyFallbackConfig, clangTidyHeaderFilter: settings.clangTidyHeaderFilter !== null ? util.resolveVariables(settings.clangTidyHeaderFilter, this.AdditionalEnvironment) : null, + clangTidyIncludeCleanerMappings: settings.clangTidyIncludeCleanerMappings, clangTidyArgs: util.resolveVariablesArray(settings.clangTidyArgs, this.AdditionalEnvironment), clangTidyUseBuildPath: settings.clangTidyUseBuildPath, clangTidyChecksEnabled: settings.clangTidyChecksEnabled, diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 726ec82cf..0214c5e4a 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -65,6 +65,7 @@ export interface WorkspaceFolderSettingsParams { clangTidyConfig: string | undefined; clangTidyFallbackConfig: string | undefined; clangTidyHeaderFilter: string | null; + clangTidyIncludeCleanerMappings: Associations; clangTidyArgs: string[]; clangTidyUseBuildPath: boolean; clangTidyChecksEnabled: string[] | undefined; @@ -349,6 +350,15 @@ export class CppSettings extends Settings { public get clangTidyConfig(): string | undefined { return changeBlankStringToUndefined(this.getAsStringOrUndefined("codeAnalysis.clangTidy.config")); } public get clangTidyFallbackConfig(): string | undefined { return changeBlankStringToUndefined(this.getAsStringOrUndefined("codeAnalysis.clangTidy.fallbackConfig")); } public get clangTidyHeaderFilter(): string | null { return this.getAsString("codeAnalysis.clangTidy.headerFilter", true); } + public get clangTidyIncludeCleanerMappings(): Associations { + const mappings: Associations = this.getAsAssociations("codeAnalysis.clangTidy.includeCleanerMappings"); + return Object.fromEntries(Object.entries(mappings).filter(([symbol, header]) => + symbol.length > 0 + && !/[\u0000-\u001f\u007f-\u009f]/.test(symbol) + && header.length > 2 + && ((header.startsWith("<") && header.endsWith(">")) || (header.startsWith('"') && header.endsWith('"'))) + && !/[<>"\u0000-\u001f\u007f-\u009f]/.test(header.slice(1, -1)))); + } public get clangTidyArgs(): string[] | undefined { return this.getAsArrayOfStringsOrUndefined("codeAnalysis.clangTidy.args"); } public get clangTidyUseBuildPath(): boolean { return this.getAsBoolean("codeAnalysis.clangTidy.useBuildPath"); } public get clangTidyChecksEnabled(): string[] | undefined { return this.getAsArrayOfStringsOrUndefined("codeAnalysis.clangTidy.checks.enabled", true); } diff --git a/Extension/src/LanguageServer/settingsTracker.ts b/Extension/src/LanguageServer/settingsTracker.ts index 6cc37f45b..0ebbe5bc7 100644 --- a/Extension/src/LanguageServer/settingsTracker.ts +++ b/Extension/src/LanguageServer/settingsTracker.ts @@ -198,6 +198,7 @@ export class SettingsTracker { || key === "codeAnalysis.clangTidy.path" || key === "codeAnalysis.clangTidy.headerFilter" || key === "codeAnalysis.clangTidy.args" || key === "codeAnalysis.clangTidy.config" || key === "codeAnalysis.clangTidy.fallbackConfig" + || key === "codeAnalysis.clangTidy.includeCleanerMappings" // Note: An existing bug prevents these settings of type "object" from getting processed here, // so these checks are here just in case that bug gets fixed later on. diff --git a/Extension/test/unit/settings.test.ts b/Extension/test/unit/settings.test.ts new file mode 100644 index 000000000..edb96479a --- /dev/null +++ b/Extension/test/unit/settings.test.ts @@ -0,0 +1,189 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { beforeEach, describe, it } from 'mocha'; +import { deepStrictEqual, strictEqual } from 'node:assert'; +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import type { Uri } from 'vscode'; +import proxyquire = require('proxyquire'); + +const settingName = 'codeAnalysis.clangTidy.includeCleanerMappings'; +const packageJson = JSON.parse(readFileSync(resolve(__dirname, '../../../package.json'), 'utf8')); +let mappings: unknown; +let requestedResource: unknown; + +function getSetting(key: string, value: unknown): unknown { + const settings = { codeAnalysis: { clangTidy: { includeCleanerMappings: value } } }; + return key.split('.').reduce((section, name) => + section && typeof section === 'object' ? (section as Record)[name] : undefined, settings); +} + +const configuration = { + codeAnalysis: {}, + get: (key: string) => getSetting(key, mappings), + inspect: (key: string) => ({ defaultValue: getSetting(key, {}) }) +}; +const vscode = { + extensions: { getExtension: () => ({ packageJSON: packageJson }) }, + workspace: { + getConfiguration: (_section: string, resource: unknown) => { + requestedResource = resource; + return configuration; + } + } +}; +const load = proxyquire.noCallThru(); +const common: typeof import('../../src/common') = load('../../src/common', { + vscode, + 'vscode-languageclient': {}, + 'vscode-tas-client': {}, + './logger': {}, + './platform': {}, + './telemetry': {} +}); +const { CppSettings }: typeof import('../../src/LanguageServer/settings') = load('../../src/LanguageServer/settings', { + vscode, + '../common': common, + '../telemetry': {}, + './client': {}, + './editorConfig': {}, + './extension': {}, + './persistentState': {} +}); +const { SettingsTracker }: typeof import('../../src/LanguageServer/settingsTracker') = load('../../src/LanguageServer/settingsTracker', { + vscode, + '../common': common +}); +const schema = common.getRawSetting(`C_Cpp.${settingName}`, true); + +const controlCharacters = [ + ...Array.from({ length: 0x20 }, (_, code) => String.fromCharCode(code)), + ...Array.from({ length: 0x21 }, (_, code) => String.fromCharCode(0x7f + code)) +]; +const validHeaders = [ + '', + '"widget.h"', + '', + '"folder with spaces/widget.h"', + '', + '"folder\\widget.h"', + '<${name}.h>', + '', + '"cafe\u0301/élément.h"' +]; +const invalidHeaders = [ + '', '<>', '""', 'widget.h', '#include ', + '', ' trailing', ' ', + '\n', '\r', '\n', '', '"widget\r.h"', + '', '"widget\0.h"', '', '"widgeth"', + '', 'h>', '"widget"h"', '\n#include "other.h"', + '""', '<"widget.h">', + ...controlCharacters.flatMap(control => [ + ``, `"widget${control}.h"`, + `${control}`, `${control}"widget.h"`, + `${control}`, `"widget.h"${control}` + ]) +]; + +describe('Include Cleaner mapping settings', () => { + beforeEach(() => { + mappings = undefined; + requestedResource = undefined; + }); + + it('declares a localized resource-scoped object with an empty default', () => { + strictEqual(schema.type, 'object'); + strictEqual(schema.scope, 'resource'); + deepStrictEqual(schema.default, {}); + strictEqual(schema.propertyNames.minLength, 1); + strictEqual(schema.additionalProperties.type, 'string'); + const messages = JSON.parse(readFileSync(resolve(__dirname, '../../../package.nls.json'), 'utf8')); + strictEqual(typeof messages[schema.markdownDescription.slice(1, -1)].message, 'string'); + deepStrictEqual(new CppSettings().clangTidyIncludeCleanerMappings, {}); + }); + + it('preserves exact symbol names and literal include spellings for the resource', () => { + const resource = { scheme: 'file', fsPath: '/workspace' } as Uri; + const expected = Object.freeze(Object.fromEntries([ + ['example::widget', ''], + ['example::Widget', '"widget.h"'], + ['example::operator*', ''], + ['example::operator<', ''], + ['example::operator>', '"operators.h"'], + ['example::operator""_tag', ''], + ['example::.*', ''], + ['café::élément', ''], + ['cafe\u0301::élément', '"cafe\u0301/élément.h"'], + ['__proto__', ''] + ])); + mappings = expected; + const actual = new CppSettings(resource).clangTidyIncludeCleanerMappings; + deepStrictEqual(actual, expected); + strictEqual(Object.getPrototypeOf(actual), Object.prototype); + strictEqual(Object.getOwnPropertyDescriptor(actual, '__proto__')?.value, ''); + strictEqual(requestedResource, resource); + const pattern = new RegExp(schema.propertyNames.pattern); + for (const symbol of Object.keys(expected)) { + strictEqual(pattern.test(symbol), true, JSON.stringify(symbol)); + } + }); + + it('drops empty or control-containing symbol names without dropping valid entries', () => { + const invalidSymbols = ['', ...controlCharacters.flatMap(control => [ + control, `${control}example::widget`, `example::${control}widget`, `example::widget${control}` + ])]; + for (const symbol of invalidSymbols) { + mappings = Object.freeze({ [symbol]: '', 'example::other': '' }); + deepStrictEqual(new CppSettings().clangTidyIncludeCleanerMappings, { 'example::other': '' }, JSON.stringify(symbol)); + strictEqual(new RegExp(schema.propertyNames.pattern).test(symbol), false, JSON.stringify(symbol)); + } + }); + + it('agrees with the schema on valid literal headers', () => { + const pattern = new RegExp(schema.additionalProperties.pattern); + for (const header of validHeaders) { + mappings = { 'example::widget': header }; + deepStrictEqual(new CppSettings().clangTidyIncludeCleanerMappings, mappings, JSON.stringify(header)); + strictEqual(pattern.test(header), true, JSON.stringify(header)); + } + }); + + it('drops malformed headers without dropping valid string entries', () => { + const pattern = new RegExp(schema.additionalProperties.pattern); + for (const header of invalidHeaders) { + mappings = Object.freeze({ 'example::widget': header, 'example::other': '' }); + deepStrictEqual(new CppSettings().clangTidyIncludeCleanerMappings, { 'example::other': '' }, JSON.stringify(header)); + strictEqual(pattern.test(header), false, JSON.stringify(header)); + } + }); + + it('uses the empty default for values that are not string-to-string objects', () => { + for (const value of [null, false, 42, '', [], [''], { 'example::widget': null }, + { 'example::widget': [''] }, { 'example::widget': 42, 'example::other': '' }]) { + mappings = value; + deepStrictEqual(new CppSettings().clangTidyIncludeCleanerMappings, {}, JSON.stringify(value)); + } + }); + + it('redacts mapping keys and values from initial and changed-settings telemetry', () => { + mappings = { 'private::widget': '', toString: '"private-string.h"' }; + const tracker = new SettingsTracker(undefined); + deepStrictEqual(tracker.getUserModifiedSettings(), { [settingName]: '...' }); + deepStrictEqual(tracker.getChangedSettings(), {}); + mappings = { 'private::other': '"private-other.h"' }; + deepStrictEqual(tracker.getChangedSettings(), { [settingName]: '...' }); + mappings = {}; + deepStrictEqual(tracker.getChangedSettings(), { [settingName]: '' }); + }); + + it('redacts malformed mapping entries without recursing into their keys', () => { + for (const value of [{ 'private::widget': { 'private-key': 'private-value' } }, ['private-value']]) { + mappings = value; + const tracker = new SettingsTracker(undefined); + deepStrictEqual(tracker.getUserModifiedSettings(), { [settingName]: '...' }); + } + }); +}); From dcb7034453689b8ad3e7b90738cc7cfe942f0562 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 9 Oct 2026 04:40:41 -0700 Subject: [PATCH 26/29] Make multi-root inactive folding routing test deterministic (#14823) --- .../tests/inactiveFolding.test.ts | 95 ++++--------------- 1 file changed, 20 insertions(+), 75 deletions(-) diff --git a/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts index f97597c64..4f544ca10 100644 --- a/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/inactiveFolding.test.ts @@ -11,75 +11,69 @@ import { suite } from 'mocha'; import * as path from 'path'; import * as sinon from 'sinon'; import * as vscode from 'vscode'; -import * as api from 'vscode-cpptools'; -import * as apit from 'vscode-cpptools/out/testApi'; import * as extension from '../../../../src/LanguageServer/extension'; import * as testHelpers from '../../../common/testHelpers'; suite("Inactive region folding in a multi-root workspace", function (): void { - let testHook: apit.CppToolsTestHook; let firstWorkspaceFolder: vscode.WorkspaceFolder; let workspaceFolder: vscode.WorkspaceFolder; suiteSetup(async function (): Promise { await testHelpers.activateCppExtension(); - const cpptools: apit.CppToolsTestApi = await apit.getCppToolsTestApi(api.Version.latest) - ?? assert.fail("Could not get CppToolsTestApi"); - testHook = cpptools.getTestHook(); firstWorkspaceFolder = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("First workspace folder is unavailable"); workspaceFolder = vscode.workspace.workspaceFolders?.[1] ?? assert.fail("Second workspace folder is unavailable"); }); - suiteTeardown(function (): void { - testHook.dispose(); - }); - test("routes manual folding operations by URI during a workspace client switch", async () => { - const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", workspaceFolder.uri); - const previousCodeFoldingValue: string | undefined = configuration.inspect("codeFolding")?.globalValue; - await configuration.update("codeFolding", "enabled", vscode.ConfigurationTarget.Global); + const sandbox: sinon.SinonSandbox = sinon.createSandbox(); let releaseEditorChange: (() => void) | undefined; - let editorChangeStub: sinon.SinonStub | undefined; let editorChangePromise: Promise | undefined; let editor: vscode.TextEditor | undefined; let firstEditor: vscode.TextEditor | undefined; try { - editor = await openFileAndWaitForIntelliSense(); - await vscode.commands.executeCommand("editor.unfoldAll"); - const firstDocument: vscode.TextDocument = await vscode.workspace.openTextDocument( path.join(firstWorkspaceFolder.uri.fsPath, "test.cpp")); firstEditor = await vscode.window.showTextDocument(firstDocument); await extension.clients.didChangeActiveEditor(firstEditor); const firstClient = extension.clients.ActiveClient; - const owner = extension.clients.getClientFor(editor.document.uri); + const document: vscode.TextDocument = await vscode.workspace.openTextDocument( + path.join(workspaceFolder.uri.fsPath, "code_folding.cpp")); + const owner = extension.clients.getClientFor(document.uri); assert.notStrictEqual(firstClient, owner); + const ownerFoldStub: sinon.SinonStub = sandbox.stub(owner, "foldAllInactiveRegions").resolves(); + const ownerUnfoldStub: sinon.SinonStub = sandbox.stub(owner, "unfoldAllInactiveRegions").resolves(); + const firstFoldStub: sinon.SinonStub = sandbox.stub(firstClient, "foldAllInactiveRegions").resolves(); + const firstUnfoldStub: sinon.SinonStub = sandbox.stub(firstClient, "unfoldAllInactiveRegions").resolves(); + const pendingEditorChange: Promise = new Promise(resolve => releaseEditorChange = resolve); - editorChangeStub = sinon.stub(owner, "didChangeActiveEditor").returns(pendingEditorChange); - const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); - editorChangePromise = extension.clients.didChangeActiveEditor(activeEditor); + // Hold the client switch open; only command dispatch is under test. + sandbox.stub(owner, "didChangeActiveEditor").returns(pendingEditorChange); + editor = await vscode.window.showTextDocument(document); + editorChangePromise = extension.clients.didChangeActiveEditor(editor); assert.strictEqual(extension.clients.ActiveClient, firstClient); await vscode.commands.executeCommand("C_Cpp.FoldAllInactiveRegions"); - await assertInactiveBranchIsFolded(editor); + sinon.assert.calledOnce(ownerFoldStub); + sinon.assert.notCalled(firstFoldStub); + assert.strictEqual(extension.clients.ActiveClient, firstClient); await vscode.commands.executeCommand("C_Cpp.UnfoldAllInactiveRegions"); - await assertInactiveBranchIsUnfolded(editor); + sinon.assert.calledOnce(ownerUnfoldStub); + sinon.assert.notCalled(firstUnfoldStub); + assert.strictEqual(extension.clients.ActiveClient, firstClient); } finally { releaseEditorChange?.(); await editorChangePromise; - editorChangeStub?.restore(); + sandbox.restore(); if (editor) { await closeEditor(editor); } if (firstEditor) { await closeEditor(firstEditor); } - await testHelpers.delay(150); - await configuration.update("codeFolding", previousCodeFoldingValue, vscode.ConfigurationTarget.Global); } }); @@ -87,53 +81,4 @@ suite("Inactive region folding in a multi-root workspace", function (): void { await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); await vscode.commands.executeCommand("workbench.action.closeActiveEditor"); } - - async function assertInactiveBranchIsFolded(editor: vscode.TextEditor): Promise { - let line: number = 24; - for (let i: number = 0; i < 20; ++i) { - const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); - activeEditor.selection = new vscode.Selection(24, 0, 24, 0); - await vscode.commands.executeCommand("cursorMove", { to: "down", by: "wrappedLine", value: 1 }); - line = activeEditor.selection.active.line; - if (line === 28) { - return; - } - await testHelpers.delay(50); - } - - assert.strictEqual(line, 28); - } - - async function assertInactiveBranchIsUnfolded(editor: vscode.TextEditor): Promise { - const activeEditor: vscode.TextEditor = await vscode.window.showTextDocument(editor.document, editor.viewColumn, false); - activeEditor.selection = new vscode.Selection(24, 0, 24, 0); - await vscode.commands.executeCommand("cursorMove", { to: "down", by: "wrappedLine", value: 1 }); - assert.strictEqual(activeEditor.selection.active.line, 25); - } - - function waitForIntelliSenseReady(fileName: string): Promise { - return new Promise((resolve, reject) => { - const timeout: NodeJS.Timeout = setTimeout(() => { - listener.dispose(); - reject(new Error(`Timed out waiting for IntelliSense for ${fileName}`)); - }, testHelpers.defaultTimeout); - const listener: vscode.Disposable = testHook.IntelliSenseStatusChanged(result => { - if (result.filename === fileName && result.status === apit.Status.IntelliSenseReady) { - clearTimeout(timeout); - listener.dispose(); - resolve(); - } - }); - }); - } - - async function openFileAndWaitForIntelliSense(): Promise { - const fileName: string = "code_folding.cpp"; - const filePath: string = path.join(workspaceFolder.uri.fsPath, fileName); - const ready: Promise = waitForIntelliSenseReady(fileName); - const document: vscode.TextDocument = await vscode.workspace.openTextDocument(filePath); - const editor: vscode.TextEditor = await vscode.window.showTextDocument(document); - await ready; - return editor; - } }); From d4f62233ad9e47e7a31f5a5a62705b160be4bee4 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 9 Oct 2026 11:57:00 -0700 Subject: [PATCH 27/29] Refresh localized diagnostic messages with safe English fallbacks (#14826) --- Extension/bin/messages/cs/messages.json | 41 +++++++++++++++------- Extension/bin/messages/de/messages.json | 41 +++++++++++++++------- Extension/bin/messages/es/messages.json | 41 +++++++++++++++------- Extension/bin/messages/fr/messages.json | 41 +++++++++++++++------- Extension/bin/messages/it/messages.json | 41 +++++++++++++++------- Extension/bin/messages/ja/messages.json | 41 +++++++++++++++------- Extension/bin/messages/ko/messages.json | 41 +++++++++++++++------- Extension/bin/messages/pl/messages.json | 41 +++++++++++++++------- Extension/bin/messages/pt-br/messages.json | 41 +++++++++++++++------- Extension/bin/messages/ru/messages.json | 41 +++++++++++++++------- Extension/bin/messages/tr/messages.json | 41 +++++++++++++++------- Extension/bin/messages/zh-cn/messages.json | 41 +++++++++++++++------- Extension/bin/messages/zh-tw/messages.json | 41 +++++++++++++++------- 13 files changed, 364 insertions(+), 169 deletions(-) diff --git a/Extension/bin/messages/cs/messages.json b/Extension/bin/messages/cs/messages.json index b7334c92e..e207091f9 100644 --- a/Extension/bin/messages/cs/messages.json +++ b/Extension/bin/messages/cs/messages.json @@ -2713,11 +2713,11 @@ "Nepovedlo se inicializovat metadata.", "Neplatné přetypování mezi základní a odvozenou třídou (skutečný typ odvozené třídy je %t)", "Neplatný přístup k %n v objektu s úplným typem %t.", - "__auto_type tady není povolený.", - "__auto_type nepovoluje víc deklarátorů.", - "Inicializace pomocí {...} není povolená pro __auto_type.", - "__auto_type musí být zástupný symbol pro úplný typ proměnné (ne pro komponentu tohoto typu).", - "Proměnná deklarovaná pomocí __auto_type musí mít inicializátor.", + "%sq not allowed here", + "%sq does not permit multiple declarators", + "initialization with \"{...}\" is not allowed for %sq", + "%sq musí být zástupný symbol pro úplný typ proměnné (ne pro komponentu tohoto typu).", + "a variable declared with %sq requires an initializer", "Konstanta typu integer musí být větší nebo rovná nule.", "Typ musí být integrální typ.", "Výraz se nedá interpretovat.", @@ -3000,7 +3000,7 @@ "Došlo k neznámé chybě. Soubor PCH IntelliSense se nevygeneroval.", "Nejméně jednu ze vzdálených cest nejde namapovat na stávající místní cesty. Funkce IntelliSense možná nebude fungovat zcela podle očekávání.", "Příliš mnoho vnořených uživatelsky definovaných převodů (možný cyklus převodních rutin)", - null, + "%sq už je v aktuálním rozsahu deklarovaný", null, null, null, @@ -3412,7 +3412,7 @@ "Členská funkce deklarovaná jako static nemůže mít explicitní parametr this.", "Explicitní parametr this musí být první deklarovaný parametr.", "Proměnná this se tady nepodporuje.", - "Porovnávací funkce s explicitním this nemůže být nastavena jako výchozí.", + "a comparison function with explicit \"this\" cannot be defaulted", "Funkce s explicitním this vyžaduje druhý operand.", "Příkazy if consteval a if not consteval nejsou v tomto režimu standardní.", "Vynechání () v deklarátoru výrazu lambda je v tomto režimu nestandardní.", @@ -3564,12 +3564,12 @@ "std::string_view, který se tady používá, není konzistentní s použitím v jiných vnitřních funkcích", "definice std::string_view neodpovídá předpokladům reflexe (žádné základní třídy a datoví členové pro ukazatele a délku)", "reflexe není reflexe konstantní hodnoty", - "pole s nulovou délkou se nedá vytvořit", - "délka (%d1) předaná make_constexpr_array je větší než počet dostupných elementů (%d2)", - "definice std::meta::infovec neodpovídá předpokladům reflexe (žádné základní třídy a datoví členové pro ukazatele, délku a kapacitu)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "chybná reflexe (%r) pro spojení výrazů", "%n již byl definován (předchozí definice %p)", - "objekt infovec není inicializovaný", + "infovec object not initialized", "extrakce typu %t1 není kompatibilní s danou odezvou (entita s typem %t2)", "reflektování sady přetížení není v tuto chvíli povolené", "tato vnitřní funkce vyžaduje reflexi pro instanci šablony", @@ -3750,7 +3750,7 @@ "Zkrácená syntaxe šablony funkce není standardní pro vodítka dedukce", "explicitní parametry „this“ jsou funkcí C++23", "specifikátory pole se v kontextech dedukce šablony nepodporují", - "druhý argument musí být vektor celočíselného typu se stejným počtem prvků jako první", + "the second argument must be an integer type with the same shape (a scalar or vector type) as the first argument", "argument musí být vektorem logických typů", "argument musí být ukazatel na skalární typ", "nesprávný typ argumentu (měl by být %t)", @@ -3783,5 +3783,20 @@ "Typ není podobný jazyku C kvůli tomuto lambda výrazu", "Kvalifikátor názvu výčtového typu je funkce jazyka C++11", "Neomezené sjednocení je funkce jazyka C++11", - "%sq už je v aktuálním rozsahu deklarovaný" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "the range passed to the metafunction cannot be iterated", + "interpreter:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "invalid tag in constexpr diagnostic control option: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq does not spell an identifier", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "Tato deklarace %n nedeklaruje stejný typ jako deklarace %p" ] diff --git a/Extension/bin/messages/de/messages.json b/Extension/bin/messages/de/messages.json index 588885286..ebfb0abb9 100644 --- a/Extension/bin/messages/de/messages.json +++ b/Extension/bin/messages/de/messages.json @@ -2713,11 +2713,11 @@ "Fehler bei der Metadateninitialisierung.", "Ungültige Umwandlung vom Basistyp zum abgeleiteten Typ (tatsächlicher abgeleiteter Klassentyp ist %t)", "Ungültiger Zugriff auf %n im Objekt des vollständigen Typs %t.", - "\"__auto_type\" ist hier unzulässig.", - "\"__auto_type\" erlaubt nicht mehrere Deklaratoren.", - "Die Initialisierung mit \"{...}\" ist für \"__auto_type\" unzulässig.", - "\"__auto_type\" muss ein Platzhalter für den vollständigen Typ der Variablen sein (nicht für eine Komponente dieses Typs).", - "Eine mit \"__auto_type\" deklarierte Variable erfordert einen Initialisierer.", + "%sq ist hier nicht zulässig.", + "%sq erlaubt nicht mehrere Deklaratoren.", + "initialization with \"{...}\" is not allowed for %sq", + "%sq muss ein Platzhalter für den vollständigen Typ der Variablen sein (nicht für eine Komponente dieses Typs).", + "Für eine mit %sq deklarierte Variable ist ein Initialisierer erforderlich.", "Die Integerkonstante muss größer oder gleich NULL sein.", "Der Typ muss ein integraler Typ sein.", "Der Ausdruck kann nicht interpretiert werden.", @@ -3000,7 +3000,7 @@ "Unbekannter Fehler. Es wurde keine IntelliSense PCH-Datei generiert.", "Mindestens ein Remotepfad kann vorhandenen lokalen Pfaden nicht zugeordnet werden. Die IntelliSense-Funktionen werden ggf. beeinträchtigt.", "zu viele geschachtelte benutzerdefinierte Konvertierungen (möglicher Zyklus von Konvertierungsroutinen)", - null, + "%sq wurde bereits im aktuellen Bereich deklariert.", null, null, null, @@ -3412,7 +3412,7 @@ "eine mit „statisch“ deklarierte Memberfunktion darf keinen expliziten „dies“-Parameter aufweisen", "ein expliziter „dies“-Parameter muss der erste deklarierte Parameter sein", "„dies“ ist hier nicht zulässig", - "eine Vergleichsfunktion mit explizitem „dies“ kann nicht als Standard verwendet werden", + "a comparison function with explicit \"this\" cannot be defaulted", "eine explizite „dies-2-Funktion erfordert einen Selektoroperanden", "„wenn consteval“ und „wenn nicht consteval“ sind in diesem Modus nicht Standard", "das Weglassen von „()“ in einem Lambda-Deklarator ist in diesem Modus nicht der Standard", @@ -3564,12 +3564,12 @@ "Die hier verwendete std::string_view ist inkonsistent mit der Verwendung in anderen systeminternen Funktionen.", "Die Definition von std::string_view stimmt nicht mit den Annahmen der Reflexion überein (keine Basisklassen und Datenmember für Zeiger und Länge).", "Die Reflexion ist nicht von einem konstanten Wert.", - "kann kein Array der Länge 0 (null) erstellen", - "Die an make_constexpr_array übergebene Länge (%d1) ist größer als die Anzahl der verfügbaren Elemente (%d2).", - "Die Definition von std::meta::infovec stimmt nicht mit den Annahmen der Reflexion überein (keine Basisklassen und Datenmember für Zeiger, Länge und Kapazität).", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "Ungültige Reflexion (%r) für Ausdrucks-Splice", "%n wurde bereits definiert (vorherige Definition %p)", - "Infovec-Objekt nicht initialisiert", + "infovec object not initialized", "Extrakt von Typ „%t1“ ist nicht mit der angegebenen Reflexion kompatibel (Entität vom Typ „%t2“)", "Das Reflektieren eines Überladungssatzes ist derzeit nicht zulässig.", "Diese systeminterne Funktion erfordert eine Reflexion für eine Vorlageninstanz.", @@ -3750,7 +3750,7 @@ "Die abgekürzte Funktionsvorlagensyntax entspricht nicht dem Standard für Deduktionsleitfäden.", "Explizite this-Parameter sind ein C++23-Feature.", "Arraykennzeichner werden in Kontexten zur Vorlagendeduktion nicht unterstützt.", - "Das zweite Argument muss ein ganzzahliger Vektor mit derselben Anzahl von Elementen wie das erste sein.", + "the second argument must be an integer type with the same shape (a scalar or vector type) as the first argument", "Das Argument muss ein Vektor boolescher Typen sein.", "Das Argument muss ein Zeiger auf einen skalaren Typ sein.", "Falscher Argumenttyp (sollte „%t“ sein)", @@ -3783,5 +3783,20 @@ "Der Typ ist aufgrund dieses Lambdaausdrucks nicht C-ähnlich.", "Ein Namensqualifizierer für einen Enumerationstyp ist ein C++11-Feature.", "Unbeschränkte Unions sind ein C++11-Feature.", - "%sq wurde bereits im aktuellen Bereich deklariert." + "Eine Paketerweiterung kann nicht als Argument für Nicht-Paket %n1 von %n2 verwendet werden.", + "Der an die Metafunktion übergebene Bereich kann nicht durchlaufen werden.", + "Interpreter:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "Ungültiges Tag in der „constexpr“-Diagnosesteuerungsoption: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq ist kein Bezeichner", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "Diese Deklaration von %n deklariert nicht denselben Typ wie die Deklaration %p." ] diff --git a/Extension/bin/messages/es/messages.json b/Extension/bin/messages/es/messages.json index 25532bdca..7aedebde0 100644 --- a/Extension/bin/messages/es/messages.json +++ b/Extension/bin/messages/es/messages.json @@ -2713,11 +2713,11 @@ "error en la inicialización de los metadatos", "conversión de base a derivada no válida (el tipo de clase derivada real es %t)", "acceso a %n no válido en un objeto del tipo %t completo", - "no se permite aquí \"__auto_type\"", - "\"__auto_type\" no admite varios declaradores", - "no se admite la inicialización con \"{...}\" para \"__auto_type\"", - "'__auto_type' debe ser un marcador de posición para el tipo completo de la variable (no para un componente de ese tipo)", - "una variable declarada con \"__auto_type\" requiere un inicializador", + "%sq no se permite aquí", + "%sq no permite varios declaradores", + "initialization with \"{...}\" is not allowed for %sq", + "%sq debe ser un marcador de posición para el tipo completo de la variable (no para un componente de ese tipo)", + "una variable declarada con %sq requiere un inicializador", "la constante de tipo entero debe ser mayor o igual que cero", "el tipo debe ser un tipo entero", "la expresión no se puede interpretar", @@ -3000,7 +3000,7 @@ "error desconocido. No se generó un archivo IntelliSense PCH.", "No se pueden asignar una o varias rutas remotas a las rutas locales actuales. La experiencia con IntelliSense puede degradarse.", "demasiadas conversiones anidadas definidas por el usuario (posible ciclo de rutinas de conversión)", - null, + "%sq ya se ha declarado en el ámbito actual", null, null, null, @@ -3412,7 +3412,7 @@ "una función miembro declarada con 'static' no puede tener un parámetro 'this' explícito", "un parámetro 'this' explícito debe ser el primer parámetro declarado", "“this” no se permite aquí", - "no se puede establecer de forma predeterminada una función de comparación con 'this' explícita", + "a comparison function with explicit \"this\" cannot be defaulted", "una función explícita 'this' requiere un operando selector", "'if consteval' y 'if not consteval' no son estándar en este modo", "omitir '()' en un declarador lambda no es estándar en este modo", @@ -3564,12 +3564,12 @@ "el valor de std::string_view que se usa aquí no es coherente con el uso en otros elementos intrínsecos", "la definición de std::string_view no coincide con las suposiciones de reflexión (no hay clases base ni miembros de datos para puntero y longitud)", "la reflexión no es la de un valor constante", - "no se puede crear una matriz de longitud cero", - "la longitud (%d1) pasada a make_constexpr_array es mayor que el número de elementos disponibles (%d2)", - "la definición de std::meta::infovec no coincide con las suposiciones de reflexión (no hay clases base ni miembros de datos para puntero, longitud y capacidad)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "reflexión incorrecta (%r) para la expresión splice", "%n ya se ha definido (definición anterior %p)", - "objeto infovec no inicializado", + "infovec object not initialized", "la extracción de tipo %t1 no es compatible con la reflexión especificada (entidad con el tipo %t2)", "no se permite actualmente reflejar un conjunto de sobrecargas", "este elemento intrínseco requiere una reflexión para una instancia de plantilla", @@ -3750,7 +3750,7 @@ "La sintaxis abreviada de las plantillas de funciones no es estándar para las guías de deducción", "los parámetros explícitos \"this\" son una característica de C++23", "no se admiten designadores de matriz en contextos de deducción de plantilla", - "el segundo argumento debe ser un vector de tipo entero con el mismo número de elementos que el primero", + "el segundo argumento debe ser un tipo entero con la misma forma (un tipo escalar o vectorial) que el primer argumento", "el argumento debe ser un vector de tipos booleanos", "el argumento debe ser un puntero a un tipo escalar", "tipo de argumento incorrecto (debe ser %t)", @@ -3783,5 +3783,20 @@ "el tipo no es similar a C debido a esta expresión lambda", "un calificador de nombre de tipo de enumeración es una característica de C++11", "las uniones sin restricciones son una característica de C++11", - "%sq ya se ha declarado en el ámbito actual" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "el intervalo pasado a la metafunción no se puede iterar", + "intérprete:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "invalid tag in constexpr diagnostic control option: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq no escribe un identificador", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "esta declaración de %n no declara el mismo tipo que la declaración %p" ] diff --git a/Extension/bin/messages/fr/messages.json b/Extension/bin/messages/fr/messages.json index 15217cf88..8fc9d961c 100644 --- a/Extension/bin/messages/fr/messages.json +++ b/Extension/bin/messages/fr/messages.json @@ -2713,11 +2713,11 @@ "échec de l'initialisation des métadonnées", "conversion de base vers dérivée non valide (le type réel de la classe dérivée est %t)", "accès non valide à %n dans l'objet de type complet %t", - "'__auto_type' non autorisé ici", - "'__auto_type' n'autorise pas plusieurs déclarateurs", - "initialisation avec '{...}' non autorisée pour '__auto_type'", - "'__auto_type' doit être un espace réservé pour le type complet de la variable (et non pour un composant de ce type)", - "une variable déclarée avec '__auto_type' nécessite un initialiseur", + "%sq not allowed here", + "%sq does not permit multiple declarators", + "initialization with \"{...}\" is not allowed for %sq", + "%sq doit être un espace réservé pour le type complet de la variable (et non pour un composant de ce type)", + "a variable declared with %sq requires an initializer", "une constante entière doit être supérieure ou égale à zéro", "le type doit être un type intégral", "impossible d'interpréter l'expression", @@ -3000,7 +3000,7 @@ "une erreur inconnue s'est produite. Aucun fichier PCH IntelliSense n'a été généré.", "Impossible de mapper un ou plusieurs chemins distants à des chemins locaux existants. L'expérience IntelliSense risque d'être dégradée.", "trop de conversions imbriquées définies par l’utilisateur(-trice) (cycle possible des routines de conversion)", - null, + "%sq a déjà été déclaré dans la portée actuelle", null, null, null, @@ -3412,7 +3412,7 @@ "une fonction membre déclarée avec « static » ne peut pas avoir de paramètre « this » explicite", "un paramètre « this » explicite doit être le premier paramètre déclaré", "« this » n’est pas autorisé ici", - "une fonction de comparaison avec « this » explicite ne peut pas être par défaut", + "a comparison function with explicit \"this\" cannot be defaulted", "une fonction « this » explicite nécessite un opérande de sélecteur", "« if consteval » et « if not consteval » ne sont pas standard dans ce mode", "l’omission de « () » dans un déclarateur lambda n’est pas standard dans ce mode", @@ -3564,12 +3564,12 @@ "std::string_view utilisé ici est incompatible avec son utilisation dans d'autres éléments intrinsèques", "la définition de std::string_view ne correspond pas aux hypothèses de réflexion (pas de classes de base ni de données membres pour le pointeur et la longueur)", "la réflexion n'est pas celle d'une valeur constante", - "impossible de créer un tableau de longueur nulle", - "la longueur (%d1) transmise à make_constexpr_array est supérieure au nombre d'éléments disponibles (%d2)", - "la définition de std::meta::infovec ne correspond pas aux hypothèses de réflexion (pas de classes de base ni de données membres pour le pointeur, la longueur et la capacité)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "réflexion incorrecte (%r) pour la splice d’expression", "%n a déjà été défini (définition précédente %p)", - "objet infovec non initialisé", + "infovec object not initialized", "l’extrait du type %t1 n’est pas compatible avec la réflexion indiquée (entité de type %t2)", "refléter un ensemble de surcharge n'est actuellement pas autorisé", "cette intrinsèque nécessite une réflexion pour une instance de modèle", @@ -3750,7 +3750,7 @@ "la syntaxe abrégée du modèle de fonction n’est pas standard pour les guides de déduction", "les paramètres explicites « this » sont une fonctionnalité de C++23", "les désignateurs de tableau ne sont pas pris en charge dans les contextes de déduction de modèle", - "Le deuxième argument doit être un vecteur de type entier avec le même nombre d’éléments que le premier", + "the second argument must be an integer type with the same shape (a scalar or vector type) as the first argument", "l’argument doit être un vecteur de types booléens", "l’argument doit être un pointeur vers un type scalaire", "type d’argument incorrect (il doit s’agir de %t)", @@ -3783,5 +3783,20 @@ "le type n’est pas similaire à C en raison de cette expression lambda", "un qualificateur de nom de type énumération est une fonctionnalité C++11", "les unions sans restriction sont une fonctionnalité C++11", - "%sq a déjà été déclaré dans la portée actuelle" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "the range passed to the metafunction cannot be iterated", + "interpreter:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "invalid tag in constexpr diagnostic control option: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq does not spell an identifier", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "this declaration of %n does not declare the same type as the declaration %p" ] diff --git a/Extension/bin/messages/it/messages.json b/Extension/bin/messages/it/messages.json index 84047e643..bcffbda92 100644 --- a/Extension/bin/messages/it/messages.json +++ b/Extension/bin/messages/it/messages.json @@ -2713,11 +2713,11 @@ "inizializzazione dei metadati non riuscita", "cast da base a derivato non valido (il tipo della classe derivata effettivo è %t)", "accesso non valido a %n nell'oggetto del tipo completo %t", - "'__auto_type' non è consentito in questo punto", - "'__auto_type' non consente l'uso di più dichiaratori", - "l'inizializzazione con '{...}' non è consentita per '__auto_type'", - "'__auto_type' deve essere un segnaposto per il tipo completo della variabile e non per un componente di tale tipo", - "in una variabile dichiarata con '__auto_type' è richiesto un inizializzatore", + "%sq non è consentito in questo punto", + "%sq non consente l'uso di più dichiaratori", + "initialization with \"{...}\" is not allowed for %sq", + "%sq deve essere un segnaposto per il tipo completo della variabile e non per un componente di tale tipo", + "in una variabile dichiarata con %sq è richiesto un inizializzatore", "la costante Integer deve essere maggiore o uguale a zero", "il tipo deve essere un tipo integrale", "non è possibile interpretare l'espressione", @@ -3000,7 +3000,7 @@ "si è verificato un errore sconosciuto. Non è stato generato alcun file PCH IntelliSense.", "Non è possibile eseguire il mapping di uno o più percorsi remoti a percorsi locali esistenti. L'operazione potrebbe influire negativamente sull'esperienza IntelliSense.", "troppe conversioni annidate definite dall'utente (possibile ciclo di routine di conversione)", - null, + "%sq già dichiarato nell'ambito corrente", null, null, null, @@ -3412,7 +3412,7 @@ "una funzione membro dichiarata con 'static' non può avere un parametro 'this' esplicito", "un parametro 'this' esplicito deve essere il primo parametro dichiarato", "'this' non è consentito qui", - "una funzione di confronto con 'this' esplicito non può essere predefinita", + "a comparison function with explicit \"this\" cannot be defaulted", "una funzione 'this' esplicita richiede un operando selettore", "'if consteval' e 'if not consteval' non sono standard in questa modalità", "l'omissione di '()' in un dichiaratore lambda non è standard in questa modalità", @@ -3564,12 +3564,12 @@ "std::string_view usato qui non è coerente con l'uso in altri intrinseci", "la definizione di std::string_view non corrisponde ai presupposti della reflection (nessuna classe di base e membri dati per puntatore e lunghezza)", "la reflection non è quella di un valore costante", - "non può creare una matrice di lunghezza zero", - "la lunghezza (%d1) passata a make_constexpr_array è maggiore del numero di elementi disponibili (%d2)", - "la definizione di std::meta::infovec non corrisponde ai presupposti della reflection (nessuna classe di base e membri dati per puntatore, lunghezza e capacità)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "reflection non valida (%r) per la splice dell'espressione", "%n è già stato definito (definizione precedente %p)", - "Oggetto infovec non inizializzato", + "infovec object not initialized", "il tipo di estrazione %t1 non è compatibile con la reflection specificata (entità con tipo %t2)", "la reflection di un set di overload non è attualmente consentita", "questo intrinseco richiede una reflection per un'istanza del modello", @@ -3750,7 +3750,7 @@ "la sintassi abbreviata del modello di funzione non è standard per le guide alla deduzione", "i parametri 'this' espliciti sono una funzionalità di C++23", "gli indicatori di matrice non sono supportati nei contesti di deduzione del modello", - "Il secondo argomento deve essere un vettore di tipo intero con lo stesso numero di elementi del primo", + "il secondo argomento deve essere di tipo intero e avere la stessa forma (scalare o vettoriale) del primo argomento", "l'argomento deve essere un vettore di tipi booleani", "l'argomento deve essere un puntatore a un tipo scalare", "tipo di argomento non corretto (deve essere %t)", @@ -3783,5 +3783,20 @@ "il tipo non è simile a C a causa di questa espressione lambda", "un qualificatore del nome di tipo enumerazione è una funzionalità di C++11", "le unioni senza restrizioni sono una funzionalità di C++11", - "%sq già dichiarato nell'ambito corrente" + "non è possibile usare un'espansione del pacchetto come argomento per non pack %n1 di %n2", + "non è possibile iterare l'intervallo passato alla metafunzione", + "interprete:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "tag non valido nell'opzione di controllo della diagnostica constexpr: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq non forma un identificatore", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "questa dichiarazione di %n non dichiara lo stesso tipo della dichiarazione %p" ] diff --git a/Extension/bin/messages/ja/messages.json b/Extension/bin/messages/ja/messages.json index 352ed9c04..33c35787f 100644 --- a/Extension/bin/messages/ja/messages.json +++ b/Extension/bin/messages/ja/messages.json @@ -2713,11 +2713,11 @@ "メタデータの初期化に失敗しました", "base から derived へのキャストが無効です (実際の derived クラス型は %t です)", "完全な型 %t のオブジェクトの %n へのアクセス権が無効です", - "'__auto_type' はここでは使用できません", - "'__auto_type' には複数の宣言子は使用できません", - "'__auto_type' に対する '{...}' での初期化は許可されていません", - "'__auto_type' は変数の完全な型 (その型のコンポーネントではなく) のプレースホルダーである必要があります", - "'__auto_type' で宣言された変数には初期化子が必要です", + "%sq はここでは使用できません", + "%sq には複数の宣言子は使用できません", + "initialization with \"{...}\" is not allowed for %sq", + "%sq は、変数の完全な型のプレースホルダーである必要があります (その型のコンポーネント用ではありません)", + "%sq で宣言された変数には初期化子が必要です", "整数型の定数はゼロ以上である必要があります", "型は整数型である必要があります", "式を解釈できません", @@ -3000,7 +3000,7 @@ "不明なエラーが発生しました。IntelliSense PCH ファイルは生成されませんでした。", "1 つ以上のリモート パスを既存のローカル パスにマップできません。IntelliSense の機能が低下する可能性があります。", "入れ子になったユーザー定義変換が多すぎます (変換ルーチンの可能なサイクル)", - null, + "%sq は現在のスコープで既に宣言されています", null, null, null, @@ -3412,7 +3412,7 @@ "'static' と宣言されたメンバー関数に明示的な 'this' パラメーターを指定することはできません", "明示的な 'this' パラメーターは最初に宣言されたパラメーターでなければなりません", "'this' はここでは許可されていません", - "明示的な 'this' を持つ比較関数は既定値にできません", + "a comparison function with explicit \"this\" cannot be defaulted", "明示的な 'this' 関数にはセレクター オペランドが必要です", "このモードでは、'if consteval' と 'if not consteval' は標準ではありません", "ラムダ宣言子での '()' の省略は、このモードでは非標準です", @@ -3564,12 +3564,12 @@ "ここで使用される std::string_view は、他の組み込み関数での使用と矛盾しています", "std::string_view の定義がリフレクションの想定と一致しません (ポインターと長さの基底クラスとデータ メンバーがありません)", "リフレクションは定数値のものではありません", - "長さ 0 の配列を作成できません", - "make_constexpr_array に渡された長さ (%d1) が使用可能な要素の数 (%d2) を超えています", - "std::meta::infovec の定義がリフレクションの想定と一致しません (ポインター、長さ、および容量の基底クラスとデータ メンバーがありません)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "式の継ぎ目のリフレクション (%r) が正しくありません", "%n は既に定義されています (前の定義 %p)", - "infovec オブジェクトが初期化されていません", + "infovec object not initialized", "型 %t1 の抽出は、指定されたリフレクション (型 %t2 のエンティティ) と互換性がありません", "オーバーロード セットのリフレクションは現在許可されていません", "この組み込み関数には、テンプレート インスタンスのリフレクションが必要です", @@ -3750,7 +3750,7 @@ "省略形の関数テンプレート構文は、推論ガイドでは非標準です", "明示的な 'this' パラメーターは C++23 の機能です", "テンプレート引数推論コンテキストでは配列指定子はサポートされていません", - "2 番目の引数は、1 番目の引数と同じ数の要素を持つ整数型のベクターである必要があります", + "2 番目の引数は、最初の引数と同じ図形 (スカラー型またはベクトル型) の整数型である必要があります", "引数はブール型のベクターである必要があります", "引数はスカラー型へのポインターである必要があります", "引数の型が正しくありません (必要な型: %t)", @@ -3783,5 +3783,20 @@ "このラムダ式のため、型は C-like ではありません", "列挙型名修飾子は C++11 の機能です", "無制限の共用体は C++11 機能です", - "%sq は現在のスコープで既に宣言されています" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "メタ関数に渡された範囲は反復できません", + "インタープリター:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "constexpr 診断制御オプションのタグが無効です: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq は識別子をスペルしません", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "%n のこの宣言は、宣言 %p と同じ型を宣言しません" ] diff --git a/Extension/bin/messages/ko/messages.json b/Extension/bin/messages/ko/messages.json index 7263448f6..ab7c28004 100644 --- a/Extension/bin/messages/ko/messages.json +++ b/Extension/bin/messages/ko/messages.json @@ -2713,11 +2713,11 @@ "메타데이터 초기화 실패", "기본에서 파생으로의 캐스트가 잘못되었습니다(실제 파생 클래스 형식은 %t임).", "완전한 형식 %t의 개체에서 %n에 대한 액세스가 잘못되었습니다.", - "'__auto_type'은 여기에 사용할 수 없습니다.", - "'__auto_type'에는 선언자를 여러 개 사용할 수 없습니다.", - "'__auto_type'에는 '{...}'를 사용한 초기화를 사용할 수 없습니다.", - "'__auto_type'은 완전한 변수 형식에 대한 구성 요소가 아니라 자리 표시자여야 합니다.", - "'__auto_type'으로 선언된 변수에는 이니셜라이저가 필요합니다.", + "%sq은(는) 여기에서 사용할 수 없습니다.", + "%sq에는 선언자를 여러 개 사용할 수 없습니다.", + "initialization with \"{...}\" is not allowed for %sq", + "%sq은(는) 변수의 전체 형식을 나타내는 자리 표시자여야 하며, 해당 형식의 구성 요소를 나타내는 자리 표시자여서는 안 됩니다.", + "%sq (으)로 선언된 변수에는 이니셜라이저가 필요합니다.", "정수 상수는 0보다 크거나 같아야 합니다.", "형식은 정수 형식이어야 합니다.", "식을 해석할 수 없습니다.", @@ -3000,7 +3000,7 @@ "알 수 없는 오류가 발생했습니다. IntelliSense PCH 파일이 생성되지 않았습니다.", "하나 이상의 원격 경로를 기존 로컬 경로에 매핑할 수 없습니다. IntelliSense 성능이 저하될 수 있습니다.", "중첩된 사용자 정의 변환이 너무 많음(변환 루틴의 순환이 발생할 수 있음).", - null, + "현재 범위에 이미 %sq이(가) 선언되어 있습니다.", null, null, null, @@ -3412,7 +3412,7 @@ "'static'으로 선언된 멤버 함수에는 명시적 'this' 매개 변수를 사용할 수 없습니다.", "명시적 'this' 매개 변수는 첫 번째 선언된 매개 변수여야 합니다.", "여기서는 'this'를 사용할 수 없습니다.", - "명시적 'this'를 사용하는 비교 함수는 기본값으로 사용할 수 없습니다.", + "a comparison function with explicit \"this\" cannot be defaulted", "명시적 'this' 함수에는 선택기 피연산자가 필요합니다.", "'if consteval' 및 'if not consteval'은 이 모드에서 표준이 아닙니다.", "람다 선언자에서 '()'를 생략하는 것은 이 모드에서 표준이 아닙니다.", @@ -3564,12 +3564,12 @@ "여기에 사용된 std::string_view는 다른 내장 함수에서의 사용과 일치하지 않습니다.", "std::string_view의 정의가 리플렉션의 가정과 일치하지 않습니다(포인터 및 길이에 대한 기본 클래스 및 데이터 멤버 없음).", "리플렉션이 상수 값의 리플렉션이 아닙니다.", - "길이가 0인 배열을 만들 수 없음", - "make_constexpr_array에 전달된 길이(%d1)가 사용 가능한 요소 수보다 큽니다(%d2).", - "std::meta::infovec의 정의가 리플렉션의 가정과 일치하지 않습니다(포인터, 길이 및 용량에 대한 기본 클래스 및 데이터 멤버가 없음).", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "식 스플라이스에 대한 잘못된 리플렉션(%r)", "%n이(가) 이미 정의되었습니다(이전 정의 %p).", - "infovec 개체가 초기화되지 않음", + "infovec object not initialized", "%t1 형식의 추출은 지정된 리플렉션(%t2 형식의 엔터티)과 호환되지 않습니다.", "오버로드 집합을 반영하는 것은 현재 허용되지 않습니다.", "이 내장 함수에는 템플릿 인스턴스에 대한 리플렉션이 필요합니다.", @@ -3750,7 +3750,7 @@ "약식 함수 템플릿 구문은 추론 가이드에 대한 표준이 아닙니다.", "명시적 'this' 매개 변수는 C++23 기능입니다.", "배열 지정자는 템플릿 추론 컨텍스트에서 지원되지 않습니다.", - "두 번째 인수는 첫 번째 인수와 같은 수의 요소를 가진 정수 형식의 벡터여야 합니다.", + "두 번째 인수는 첫 번째 인수와 동일한 형태(스칼라 또는 벡터 형식)의 정수 형식이어야 합니다.", "인수는 부울 형식의 벡터여야 합니다.", "인수는 스칼라 형식을 가리키는 포인터여야 합니다.", "인수 형식이 잘못되었습니다. %t여(이어)야 합니다.", @@ -3783,5 +3783,20 @@ "이 람다 식 때문에 형식이 C와 유사하지 않음", "열거형 형식 이름 한정자는 C++11 기능임", "제한 없는 공용 구조체는 C++11 기능임", - "현재 범위에 이미 %sq이(가) 선언되어 있습니다." + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "메타 함수에 전달된 범위는 반복할 수 없습니다.", + "인터프리터:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "constexpr 진단 제어 옵션의 잘못된 태그: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq does not spell an identifier", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "이 선언 %n은(는) 선언 %p과(와) 동일한 형식을 선언하지 않습니다." ] diff --git a/Extension/bin/messages/pl/messages.json b/Extension/bin/messages/pl/messages.json index 1c5db291b..128c0aa6e 100644 --- a/Extension/bin/messages/pl/messages.json +++ b/Extension/bin/messages/pl/messages.json @@ -2713,11 +2713,11 @@ "nie można zainicjować metadanych", "nieprawidłowe rzutowanie typu bazowego na pochodny (rzeczywisty typ klasy pochodnej to %t)", "nieprawidłowy dostęp do elementu %n w obiekcie, którego pełny typ to %t", - "element „__auto_type” jest niedozwolony w tym miejscu", - "element „__auto_type” nie zezwala na wiele deklaratorów", - "inicjowanie za pomocą deklaracji „{...}” jest niedozwolone dla elementu „__auto_type”", - "element „__auto_type” musi być symbolem zastępczym dla pełnego typu zmiennej (a nie składnika tego typu)", - "zmienna zadeklarowana za pomocą elementu „__auto_type” wymaga inicjatora", + "element %sq nie jest dozwolony w tym miejscu", + "element %sq nie zezwala na wiele deklaratorów", + "initialization with \"{...}\" is not allowed for %sq", + "%sq musi być symbolem zastępczym dla pełnego typu zmiennej (nie dla składnika tego typu)", + "zmienna zadeklarowana za pomocą elementu %sq wymaga inicjatora", "stała całkowita musi być równa zero lub większa", "typ musi być typem całkowitym", "nie można zinterpretować wyrażenia", @@ -3000,7 +3000,7 @@ "wystąpił nieznany błąd. Nie wygenerowano pliku PCH funkcji IntelliSense.", "Nie można zamapować co najmniej jednej ścieżki zdalnej na istniejące ścieżki lokalne. Może to mieć negatywny wpływ na działanie funkcji IntelliSense.", "zbyt wiele zagnieżdżonych konwersji zdefiniowanych przez użytkownika (możliwy cykl procedur konwersji)", - null, + "element %sq został już zadeklarowany w bieżącym zakresie", null, null, null, @@ -3412,7 +3412,7 @@ "funkcja składowa zadeklarowana za pomocą elementu „static” nie może mieć jawnego parametru „this”", "jawny parametr „this” musi być pierwszym zadeklarowanym parametrem", "Element „this” jest niedozwolony w tym miejscu", - "nie można domyślnie określić funkcji porównania z jawnym elementem „this”", + "a comparison function with explicit \"this\" cannot be defaulted", "jawna funkcja „this” wymaga operandu selektora", "Instrukcje „if consteval” i „if not consteval” nie są standardowe w tym trybie", "pominięcie elementu „()” w deklaratorze lambda jest niestandardowe w tym trybie", @@ -3564,12 +3564,12 @@ "std::string_view użyte w tym miejscu jest niespójne z użyciem w innych elementach wewnętrznych", "definicja elementu std::string_view nie jest zgodna z założeniami odbicia (brak klas bazowych i składowych danych dla wskaźnika i długości)", "odbicie nie jest wartością stałą", - "nie można utworzyć tablicy o zerowej długości", - "długość (%d1) przekazana do make_constexpr_array jest większa niż liczba dostępnych elementów (%d2)", - "definicja elementu std::meta::infovec nie jest zgodna z założeniami odbicia (brak klas bazowych i składowych danych dla wskaźnika, długości i pojemności)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "złe odbicie (%r) dla splice wyrażenia", "Element %n został już zdefiniowany (poprzednia definicja :%p)", - "obiekt infovec nie został zainicjowany", + "infovec object not initialized", "wyodrębnienie typu %t1 jest niezgodne z danym odbiciem (jednostka o typie %t2)", "odzwierciedlanie zestawu przeciążeń jest obecnie niedozwolone", "ta wewnętrzna funkcja wymaga odbicia dla wystąpienia szablonu", @@ -3750,7 +3750,7 @@ "skrócona składnia szablonu funkcji jest niestandardowa dla przewodników dedukcji", "jawne parametry „this” są funkcją języka C++23", "desygnatory tablic nie są obsługiwane w kontekstach dedukcji szablonów", - "drugi argument musi być wektorem typu całkowitego o takiej samej liczbie elementów jak pierwszy", + "drugi argument musi być typem liczby całkowitej o tym samym kształcie (typ skalarny lub wektorowy) co pierwszy argument", "argument musi być wektorem typów logicznych", "argument musi być wskaźnikiem do typu skalarnego", "niepoprawny typ argumentu (powinien być %t)", @@ -3783,5 +3783,20 @@ "typ nie jest C-podobny z powodu tego wyrażenia lambda", "kwalifikator nazwy typu wyliczeniowego jest funkcją języka C++11", "nieograniczone unie są funkcją języka C++11", - "element %sq został już zadeklarowany w bieżącym zakresie" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "zakresu przekazanego do metafunkcji nie można iterować", + "interpreter:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "nieprawidłowy tag w opcji kontroli diagnostycznej constexpr: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq nie określa pisowni identyfikatora", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "deklaracja %n nie deklaruje tego samego typu co deklaracja %p" ] diff --git a/Extension/bin/messages/pt-br/messages.json b/Extension/bin/messages/pt-br/messages.json index f607f807f..73cf91a4f 100644 --- a/Extension/bin/messages/pt-br/messages.json +++ b/Extension/bin/messages/pt-br/messages.json @@ -2713,11 +2713,11 @@ "falha na inicialização de metadados", "Conversão inválida de base para derivada (o tipo real da classe derivada é %t)", "acesso inválido a %n no objeto do tipo %t completo", - "'__auto_type' não é permitido aqui", - "'__auto_type' não permite vários declaradores", - "a inicialização com '{...}' não é permitida para '__auto_type'", - "\"__auto_type\" deve ser um espaço reservado para o tipo de variável completo (não para um componente desse tipo)", - "uma variável declarada com '__auto_type' exige um inicializador", + "%sq not allowed here", + "%sq does not permit multiple declarators", + "initialization with \"{...}\" is not allowed for %sq", + "%sq deve ser um espaço reservado para o tipo completo da variável (não para um componente desse tipo)", + "a variable declared with %sq requires an initializer", "o constante inteiro deve ser maior ou igual a zero", "o tipo deve ser um tipo integral", "não é possível interpretar a expressão", @@ -3000,7 +3000,7 @@ "erro desconhecido. Não foi gerado um arquivo PCH do IntelliSense.", "Um ou mais caminhos remotos não podem ser mapeados para os caminhos locais existentes. A experiência do IntelliSense pode ser degradada.", "muitas conversões aninhadas definidas pelo usuário (possível ciclo de rotinas de conversão)", - null, + "%sq já foi declarado no escopo atual", null, null, null, @@ -3412,7 +3412,7 @@ "uma função membro declarada com 'static' não pode ter um parâmetro 'this' explícito", "um parâmetro 'this' explícito deve ser o primeiro parâmetro declarado", "'this' não é permitido aqui", - "uma função de comparação com 'this' explícito não pode ser padrão", + "a comparison function with explicit \"this\" cannot be defaulted", "uma função 'this' explícita requer um operando de seletor", "'if consteval' e 'if not consteval' não são padrão neste modo", "omitir '()' em um declarador lambda não é padrão neste modo", @@ -3564,12 +3564,12 @@ "std::string_view usado aqui é inconsistente com o uso em outros elementos intrínsecos", "a definição de std::string_view não corresponde a suposições de reflexão (nenhuma classe base nem membros de dados para ponteiro e comprimento)", "a reflexão não é a de um valor constante", - "não é possível criar uma matriz de comprimento zero", - "o comprimento (%d1) passado para make_constexpr_array é maior que o número de elementos disponíveis (%d2)", - "a definição de std::meta::infovec não corresponde a suposições de reflexão (nenhuma classe base nem membros de dados para ponteiro, comprimento e capacidade)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "reflexão incorreta (%r) para a expressão splice", "%n já foi definido (definição anterior %p)", - "objeto infovec não inicializado", + "infovec object not initialized", "o extrato do tipo %t1 não é compatível com a reflexão fornecida (entidade com tipo %t2)", "refletir um conjunto de sobrecargas não é permitido no momento", "este elemento intrínseco requer uma reflexão para uma instância de modelo", @@ -3750,7 +3750,7 @@ "a sintaxe abreviada de template de função é não padrão para guias de dedução", "parâmetros explícitos de 'this' são um recurso do C++23", "designadores de matriz não têm suporte em contextos de dedução de modelo", - "o segundo argumento deve ser um vetor de tipo inteiro com o mesmo número de elementos que o primeiro", + "the second argument must be an integer type with the same shape (a scalar or vector type) as the first argument", "o argumento deve ser um vetor de tipos boolianos", "o argumento deve ser um ponteiro para um tipo escalar", "tipo de argumento incorreto (deveria ser %t)", @@ -3783,5 +3783,20 @@ "o tipo não é semelhante a C devido a esta expressão lambda", "um qualificador de nome de tipo de enumeração é um recurso do C++11", "uniões irrestritas são um recurso do C++11", - "%sq já foi declarado no escopo atual" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "the range passed to the metafunction cannot be iterated", + "interpreter:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "invalid tag in constexpr diagnostic control option: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq does not spell an identifier", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "Esta declaração de %n não declara o mesmo tipo que a declaração %p" ] diff --git a/Extension/bin/messages/ru/messages.json b/Extension/bin/messages/ru/messages.json index a3db081fe..27383c50f 100644 --- a/Extension/bin/messages/ru/messages.json +++ b/Extension/bin/messages/ru/messages.json @@ -2713,11 +2713,11 @@ "сбой инициализации метаданных", "недопустимое приведение базового класса к производному (фактический тип производного класса — %t)", "недопустимый доступ к %n в объекте полного типа %t", - "Значение \"__auto_type\" здесь запрещено", - "\"__auto_type\" не допускает множество операторов объявления.", - "инициализация с помощью \"{...}\" запрещена для \"__auto_type\"", - "Значение \"__auto_type\" должно быть заполнителем для полного типа переменной (а не для компонента этого типа)", - "для переменной, объявленной с \"__auto_type\", требуется инициализатор", + "%sq здесь не разрешен", + "%sq does not permit multiple declarators", + "initialization with \"{...}\" is not allowed for %sq", + "%sq должен быть заполнителем для полного типа переменной (а не для компонента этого типа)", + "для переменной, объявленной с помощью %sq, требуется инициализатор", "целочисленная константа должна быть больше нуля или равна нулю", "тип должен быть целочисленным", "невозможно интерпретировать выражение", @@ -3000,7 +3000,7 @@ "произошла неизвестная ошибка. PCH-файл IntelliSense не был создан.", "Один или несколько удаленных путей не могут быть сопоставлены с существующими локальными путями. Использование IntelliSense может быть ограничено.", "слишком много вложенных пользовательских преобразований (возможен цикл процедур преобразования)", - null, + "%sq уже объявлено в текущей области", null, null, null, @@ -3412,7 +3412,7 @@ "функция-член, объявленная со значением \"static\", не может иметь явный параметр \"this\"", "явный параметр \"this\" должен быть первым объявленным параметром", "\"this\" здесь не разрешено", - "функция сравнения с явным параметром \"this\" не может быть задана по умолчанию", + "a comparison function with explicit \"this\" cannot be defaulted", "для явной функции \"this\" требуется операнд селектора", "\"if consteval\" и \"if not consteval\" не являются стандартными в этом режиме", "опущение \"()\" в лямбда-операторе объявления является нестандартным в этом режиме", @@ -3564,12 +3564,12 @@ "используемый здесь std::string_view несовместим с использованием в других встроенных функциях.", "определение std::string_view не соответствует предположениям об отражении (нет базовых классов и элементов данных для указателя и длины)", "отражение не является отражением постоянной величины", - "не удается сделать массив нулевой длины", - "длина (%d1), переданная в make_constexpr_array, больше числа доступных элементов (%d2)", - "определение std::meta::infovec не соответствует предположениям об отражении (нет базовых классов и элементов данных для указателя, длины и емкости)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "плохое отражение (%r) для выражения splice", "%n уже определено (предыдущее определение %p)", - "объект infovec не инициализирован", + "infovec object not initialized", "извлечение типа %t1 несовместимо с заданным отражением (сущность типа %t2)", "отражение набора перегрузки сейчас не разрешено", "эта внутренняя функция требует отражения для экземпляра шаблона", @@ -3750,7 +3750,7 @@ "сокращенный синтаксис шаблона функции не является стандартным для правил дедукции", "явные параметры this — это функция C++23", "обозначения элементов массива не поддерживаются в контекстах дедукции шаблонов", - "второй аргумент должен быть вектором целочисленного типа с тем же количеством элементов, что и первый", + "второй аргумент должен иметь целочисленный тип и ту же форму, что и первый аргумент (скалярный или векторный тип)", "аргумент должен быть вектором логических типов", "аргумент должен быть указателем на скалярный тип", "неправильный тип аргумента (должен быть %t)", @@ -3783,5 +3783,20 @@ "тип не является C-подобным из-за этого лямбда-выражения", "квалификатор имени типа перечисления — это функция C++11", "неограниченные объединения — это функция C++11", - "%sq уже объявлено в текущей области" + "расширение пакета нельзя использовать в качестве аргумента для элемента, не являющегося пакетом %n1 из %n2", + "диапазон, переданный в метафункцию, не поддается итерации", + "интерпретатор:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "недопустимый тег в параметре диагностического контроля constexpr: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq не образует идентификатор", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "это объявление %n не объявляет тот же тип, что и объявление %p" ] diff --git a/Extension/bin/messages/tr/messages.json b/Extension/bin/messages/tr/messages.json index 1b3c8999e..13cbb91b5 100644 --- a/Extension/bin/messages/tr/messages.json +++ b/Extension/bin/messages/tr/messages.json @@ -2713,11 +2713,11 @@ "meta veriler başlatılamadı", "temelden türetilmişe dönüştürme işlemi geçersiz (gerçek türetilmiş sınıf türü %t)", "tam %t türünün nesnesindeki %n öğesine geçersiz erişim", - "'__auto_type' öğesine burada izin verilmez", - "'__auto_type' birden fazla bildirimciye izin vermez", - "'__auto_type' için '{...}' ile başlatmaya izin verilmez", - "'__auto_type' öğesi, değişken türünün tamamı için (türün bileşeni için değil) yer tutucu olmalıdır", - "'__auto_type' ile bildirilen değişken için başlatıcı gerekir", + "%sq not allowed here", + "%sq does not permit multiple declarators", + "initialization with \"{...}\" is not allowed for %sq", + "%sq must be a placeholder for the complete type of the variable (not for a component of that type)", + "a variable declared with %sq requires an initializer", "sabit tam sayı değeri sıfırdan büyük veya sıfıra eşit olmalıdır", "tür, tam sayı türünde olmalıdır", "ifade yorumlanamıyor", @@ -3000,7 +3000,7 @@ "bilinmeyen bir hata oluştu. IntelliSense PCH dosyası oluşturulmadı.", "Bir veya daha fazla uzak yol, mevcut yerel yollarla eşlenemiyor. IntelliSense deneyimi bozulabilir.", "Çok fazla iç içe kullanıcı tanımlı dönüştürme var (dönüştürme yordamlarının olası döngüsü)", - null, + "%sq has already been declared in the current scope", null, null, null, @@ -3412,7 +3412,7 @@ "'static' ile bildirilen üye işlevi açık bir 'this' parametresine sahip olamaz", "açık 'this' parametresi, bildirilen ilk parametre olmalıdır", "burada 'this' kullanımına izin verilmiyor", - "açık 'this' içeren karşılaştırma işlevi varsayılan olarak ayarlanamaz", + "a comparison function with explicit \"this\" cannot be defaulted", "açık 'this' işlevi bir seçici işleneni gerektirir", "'if consteval' ve 'if not consteval' bu modda standart değil", "lambda bildirimcisinde '()' atlanması bu modda standart değil", @@ -3564,12 +3564,12 @@ "burada kullanılan std::string_view diğer iç öğelerde kullanım ile tutarsızlık gösteriyor", "std::string_view tanımı yansıtma varsayımları ile eşleşmiyor (işaretçi ve uzunluk için temel sınıf ve veri üyesi yok)", "yansıma sabit bir değer değil", - "sıfır uzunluklu bir dizi oluşturulamıyor", - "make_constexpr_array uzunluğu (%d1) kullanılabilir öğe sayısından (%d2) daha büyük", - "std::meta::infovec tanımı yansıtma varsayımları ile eşleşmiyor (işaretçi, uzunluk ve kapasite için temel sınıf ve veri üyesi yok)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "ifade eşleme için hatalı yansıma (%r)", "%n zaten tanımlandı (önceki tanım %p)", - "infovec nesnesi başlatılamadı", + "infovec object not initialized", "%t1 türündeki ayıklama verilen yansımayla (%t2 türüne sahip varlık) uyumlu değil", "aşırı yükleme kümesini yansıtmaya şu anda izin verilmiyor", "bu iç öğe, bir şablon örneği için yansıma gerektiriyor", @@ -3750,7 +3750,7 @@ "kısaltılmış işlev şablonu sözdizimi çıkarsama kılavuzları için standart değil", "açık 'this' parametreleri bir C++23 özelliğidir", "dizi belirleyicileri şablon çıkarsama bağlamlarında desteklenmez", - "ikinci bağımsız değişken, birinciyle aynı sayıda öğeye sahip tamsayı türünde bir vektör olmalıdır", + "the second argument must be an integer type with the same shape (a scalar or vector type) as the first argument", "bağımsız değişken, boole türlerinden bir vektör olmalıdır", "bağımsız değişken, skaler bir türe yönelik işaretçi olmalıdır", "yanlış bağımsız değişken türü (%t olmalıdır)", @@ -3783,5 +3783,20 @@ "bu lambda ifadesi nedeniyle tür C benzeri değil", "sabit listesi türü ad niteleyicisi bir C++11 özelliğidir", "kısıtlanmamış birleşimler bir C++11 özelliğidir", - "geçerli kapsamda, %sq önceden de tanımlanmış" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "the range passed to the metafunction cannot be iterated", + "interpreter:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "invalid tag in constexpr diagnostic control option: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq does not spell an identifier", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "this declaration of %n does not declare the same type as the declaration %p" ] diff --git a/Extension/bin/messages/zh-cn/messages.json b/Extension/bin/messages/zh-cn/messages.json index bccbe9be2..bffb120e8 100644 --- a/Extension/bin/messages/zh-cn/messages.json +++ b/Extension/bin/messages/zh-cn/messages.json @@ -2713,11 +2713,11 @@ "元数据初始化失败", "从基类到派生类的转换无效(实际派生类类型是 %t)", "对完整类型 %t 的对象中的 %n 的访问无效", - "此处禁止使用 \"__auto_type\"", - "\"__auto_type\" 不允许多个声明符", - "\"__auto_type\" 不允许使用 \"{...}\" 进行初始化", - "\"__auto_type\" 必须是完整类型变量的占位符(而不是该类型组件的占位符)", - "使用 \"__auto_type\" 声明的变量需要初始化表达式", + "此处不允许使用 %sq", + "%sq 不允许使用多个声明符", + "initialization with \"{...}\" is not allowed for %sq", + "%sq 必须是用于完整变量类型的占位符(不适用于此类型的组件)", + "a variable declared with %sq requires an initializer", "整型常数必须大于等于零", "类型必须是整型类型", "表达式无法解释", @@ -3000,7 +3000,7 @@ "出现了未知错误。未生成 IntelliSense PCH 文件。", "一个或多个远程路径无法映射到现有本地路径。IntelliSense 体验可能会降级。", "嵌套的用户定义转换过多(可能存在转换例程循环)", - null, + "已在当前范围内声明 %sq", null, null, null, @@ -3412,7 +3412,7 @@ "使用 'static' 声明的成员函数不能具有显式 'this' 参数", "显式 'this' 参数必须是第一个声明的参数", "此处不允许使用 'this'", - "不能默认使用具有显式 'this' 的比较函数", + "a comparison function with explicit \"this\" cannot be defaulted", "显式 'this' 函数需要选择器操作数", "在此模式下,'if consteval' 和 'if not consteval' 不标准", "在此模式下,在 lambda 声明符中省略 '()' 为不标准操作", @@ -3564,12 +3564,12 @@ "此处使用的 std::string_view 与其他内部函数中的使用不一致", "std::string_view 的定义与反射的假设不匹配(指针和长度没有基类和数据成员)", "反射不是常量值的反射", - "无法创建零长度的数组", - "传递到 std::meta::substitute 的长度(%d1)比可用元素数量(%d2)要长", - "std::meta::infovec 的定义与反射的假设不匹配(指针、长度和容量没有基类和数据成员)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "表达式拼接的错误反射(%r)", "已定义 %n (之前的定义 %p)", - "infovec 对象未初始化", + "infovec object not initialized", "类型 %t1 的提取与给定的反射(类型为 %t2 的实体)不兼容", "当前不允许反射重载集", "此内部函数需要模板实例的反射", @@ -3750,7 +3750,7 @@ "缩写函数模板语法对于推导指南是不标准的", "显式 \"this\" 参数是 C++23 功能", "模板推导上下文中不支持数组指示符", - "第二个参数必须是整数类型的向量,且元素数量与第一个参数相同", + "第二个参数必须是与第一个参数具有相同形状(标量或矢量类型)的整数类型", "参数必须是布尔类型的向量", "参数必须是指向标量类型的指针", "参数类型不正确(应为 %t)", @@ -3783,5 +3783,20 @@ "由于此 lambda 表达式,该类型不是 C 风格", "枚举类型名称限定符是 C++11 功能", "无限制联合是 C++11 功能", - "已在当前范围内声明 %sq" + "包扩展不能用作 %n2 的非包 %n1 的参数", + "传递给元函数的范围无法迭代", + "解释器:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "constexpr 诊断控制选项中的标记无效: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq 未拼写为标识符", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "%n 的此声明与声明 %p 所声明的类型不同" ] diff --git a/Extension/bin/messages/zh-tw/messages.json b/Extension/bin/messages/zh-tw/messages.json index cc2a900d1..f0bf48136 100644 --- a/Extension/bin/messages/zh-tw/messages.json +++ b/Extension/bin/messages/zh-tw/messages.json @@ -2713,11 +2713,11 @@ "中繼資料初始化失敗", "從基底到衍生的轉換無效 (實際衍生類別類型是 %t)", "對完整類型 %t 物件中 %n 的存取無效", - "此處不允許 '__auto_type'", - "'__auto_type' 不允許多個宣告子", - "'__auto_type' 不允許使用了 '{...}' 的初始化", - "'__auto_type' 必須是完整變數類型 (而非該類型的元件) 的預留位置", - "使用 '__auto_type' 所宣告的變數需要初始設定式", + "這裡不允許 %sq", + "%sq 不允許多個宣告子", + "initialization with \"{...}\" is not allowed for %sq", + "%sq 必須是變數完整類型 (而不是該類型的元件) 的預留位置", + "使用 %sq 所宣告的變數需要初始設定式", "整數常數必須大於或等於零", "類型必須是整數類型", "無法解譯運算式", @@ -3000,7 +3000,7 @@ "發生未知的錯誤。未產生 IntelliSense PCH 檔案。", "有一或多個遠端路徑無法對應到現有的本機路徑。IntelliSense 的效能可能會變差。", "巢狀的使用者定義轉換太多 (轉換常式可能形成循環)", - null, + "已經在目前的範圍宣告 %sq", null, null, null, @@ -3412,7 +3412,7 @@ "以 'static' 宣告的成員函式不能有明確的 'this' 參數", "明確 'this' 參數必須是第一個宣告的參數", "這裡不允許 'this'", - "無法預設具有明確 'this' 的比較函數", + "a comparison function with explicit \"this\" cannot be defaulted", "明確 'this' 函數需要選取器運算元", "在此模式中,'if consteval' 和 'if not consteval' 不是標準", "在此模式中,在 Lambda 宣告子中省略 '()' 並非標準", @@ -3564,12 +3564,12 @@ "在這裡使用的 std::string_view 與其他內部函式的使用不一致", "std::string_view 的定義不符合反映假設 (指標和長度沒有基底類別和資料成員)", "反映不是常數值的反映", - "不能使陣列長度為零", - "傳遞至 make_constexpr_array 的長度 (%d1) 大於可用的元素數目 (%d2)", - "std::meta::infovec 的定義不符合反映假設 (指標、長度和容量沒有基底類別和資料成員)", + "cannot make a zero-length array", + "length (%d1) passed to make_constexpr_array is larger than number of elements available (%d2)", + "definition of std::meta::infovec does not match assumptions of reflection (no base classes and data members for pointer, length, and capacity)", "運算式 splice 的不良反映 (%r)", "%n 已定義 (先前的定義 %p)", - "infovec 物件未初始化", + "infovec object not initialized", "類型 %t1 的擷取與給定的反映 (類型為 %t2 的實體) 不相容", "目前不允許反射多載集", "此內部函式需要範本執行個體的反映", @@ -3750,7 +3750,7 @@ "簡化函式範本語法在推導指南中並非標準用法", "明確 'this' 參數是 C++23 功能", "範本推導內容中不支援陣列指定元", - "第二個引數必須是整數類型的向量,其元素數目必須與第一個相同", + "第二個引數必須是與第一個引數具有相同形狀 (純量或向量類型) 的整數類型", "引數必須是布林型別的向量", "引數必須是純量類型的指標", "不正確的引數類型 (應該是 %t)", @@ -3783,5 +3783,20 @@ "因為這個 Lambda 運算式,類型不是 C 樣式", "列舉型別名稱限定詞是 C++11 功能", "不受限的聯合是 C++11 功能", - "已經在目前的範圍宣告 %sq" + "a pack expansion cannot be used as an argument for non-pack %n1 of %n2", + "傳遞給元函式的範圍無法逐一巡覽", + "解譯器:", + "%s1 %s2", + "%s1 %s2", + "%s1 %s2", + "a call to \"__builtin_constexpr_diag\" requires three arguments", + "the first argument in a call to \"__builtin_constexpr_diag\" must be 0 (remark), 1 (warning), 2 (error), 16 (remark at caller), 17 (warning at caller), or 18 (error at caller)", + "a string literal or an object with the representation of std::string_view is required for the tag and the message in a call to \"__builtin_constexpr_diag\"", + "the tag in a call to \"__builtin_constexpr_diag\" may contain only letters, digits, and underscores", + "invalid tag in constexpr diagnostic control option: %s", + "a token sequence must be introduced by \"^^\"", + "expected an interpolator (\"\\[\", \"\\[:\", \"\\{\", \"\\val\", or \"\\str\")", + "%sq 無法拼出識別碼", + "the operand of a \"\\{...}\" interpolator is not a token sequence", + "此宣告 %n 的型別與宣告 %p 的型別不同" ] From e38cfef2b93322bee30f7b8a3912bb54ad107890 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Fri, 9 Oct 2026 13:11:28 -0700 Subject: [PATCH 28/29] Enable hide/show of type size/alignment (#14822) --- Extension/package.json | 15 +++++ Extension/package.nls.json | 7 +++ Extension/src/LanguageServer/client.ts | 5 +- .../src/LanguageServer/configurations.ts | 4 +- Extension/src/LanguageServer/extension.ts | 23 ++++++- Extension/src/LanguageServer/settings.ts | 6 +- Extension/test/minBinaryVersion.json | 2 +- .../assets/SingleRootProject/quickInfo.cpp | 7 ++- .../tests/quickInfo.test.ts | 62 +++++++++++++++++++ 9 files changed, 118 insertions(+), 13 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 6c4efb682..29a55638d 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -1061,6 +1061,12 @@ "markdownDescription": "%c_cpp.configuration.hoverShowIntegralValuesInHexadecimal.markdownDescription%", "scope": "resource" }, + "C_Cpp.hoverShowTypeSizeAndAlignment": { + "type": "boolean", + "default": true, + "markdownDescription": "%c_cpp.configuration.hoverShowTypeSizeAndAlignment.markdownDescription%", + "scope": "resource" + }, "C_Cpp.errorSquiggles": { "type": "string", "enum": [ @@ -4025,6 +4031,11 @@ "title": "%c_cpp.command.toggleDimInactiveRegions.title%", "category": "C/C++" }, + { + "command": "C_Cpp.ToggleTypeSizeAndAlignment", + "title": "%c_cpp.command.toggleTypeSizeAndAlignment.title%", + "category": "C/C++" + }, { "command": "C_Cpp.FoldAllInactiveRegions", "title": "%c_cpp.command.foldAllInactiveRegions.title%", @@ -6588,6 +6599,10 @@ "command": "C_Cpp.ToggleDimInactiveRegions", "when": "config.C_Cpp.intelliSenseEngine =~ /^[dD]efault$/" }, + { + "command": "C_Cpp.ToggleTypeSizeAndAlignment", + "when": "config.C_Cpp.intelliSenseEngine =~ /^[dD]efault$/" + }, { "command": "C_Cpp.FoldAllInactiveRegions", "when": "editorLangId =~ /^(c|(cuda-)?cpp)$/ && config.C_Cpp.intelliSenseEngine =~ /^[dD]efault$/ && config.C_Cpp.codeFolding =~ /^[eE]nabled$/" diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 2d0019cf0..fa9fa84e8 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -19,6 +19,7 @@ "c_cpp.command.enableErrorSquiggles.title": "Enable Error Squiggles", "c_cpp.command.disableErrorSquiggles.title": "Disable Error Squiggles", "c_cpp.command.toggleDimInactiveRegions.title": "Toggle Inactive Region Colorization", + "c_cpp.command.toggleTypeSizeAndAlignment.title": "Toggle Type Size and Alignment in Hovers", "c_cpp.command.foldAllInactiveRegions.title": "Fold All Inactive Regions", "c_cpp.command.unfoldAllInactiveRegions.title": "Unfold All Inactive Regions", "c_cpp.command.resetDatabase.title": "Reset IntelliSense Database", @@ -785,6 +786,12 @@ "Markdown text between `` should not be translated or localized (it represents literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, + "c_cpp.configuration.hoverShowTypeSizeAndAlignment.markdownDescription": { + "message": "Displays the size and alignment of types in IntelliSense hovers. This setting only applies if `#C_Cpp.intelliSenseEngine#` is set to `default`.", + "comment": [ + "Markdown text between `` should not be translated or localized (it represents literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." + ] + }, "c_cpp.configuration.vcpkg.enabled.markdownDescription": { "message": "Enable integration services for the [vcpkg dependency manager](https://aka.ms/vcpkg/).", "comment": [ diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 176b3a40b..5481bdd8b 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -1506,6 +1506,7 @@ export class DefaultClient implements Client { markdownInComments: settings.markdownInComments, hover: settings.hover, hoverShowIntegralValuesInHexadecimal: settings.hoverShowIntegralValuesInHexadecimal, + hoverShowTypeSizeAndAlignment: settings.hoverShowTypeSizeAndAlignment, vcFormatIndentBraces: settings.vcFormatIndentBraces, vcFormatIndentMultiLineRelativeTo: settings.vcFormatIndentMultiLineRelativeTo, vcFormatIndentWithinParentheses: settings.vcFormatIndentWithinParentheses, @@ -1848,10 +1849,6 @@ export class DefaultClient implements Client { public async onDidChangeSettings(_event: vscode.ConfigurationChangeEvent): Promise> { const defaultClient: Client = clients.getDefaultClient(); - if (this === defaultClient) { - // Only send the updated settings information once, as it includes values for all folders. - void this.sendDidChangeSettings().catch(logAndReturn.undefined); - } const changedSettings: Record = this.settingsTracker.getChangedSettings(); await this.ready; diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index 6d01647ec..2dd791d48 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -687,9 +687,9 @@ export class CppProperties implements vscode.Disposable { if (!this.propertiesFile) { const settings: CppSettings = new CppSettings(this.rootUri); if (providerId) { - settings.update("default.configurationProvider", providerId); + void settings.update("default.configurationProvider", providerId); } else { - settings.update("default.configurationProvider", undefined); // delete the setting + void settings.update("default.configurationProvider", undefined); // delete the setting } const config: Configuration | undefined = this.CurrentConfiguration; if (config) { diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 653f620e5..266b9266c 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -291,13 +291,23 @@ export function updateLanguageConfigurations(): void { * workspace events */ async function onDidChangeSettings(event: vscode.ConfigurationChangeEvent): Promise { + let settingsChanged: boolean = false; clients.forEach(client => { if (client instanceof DefaultClient) { if (trackedSections.some(section => event.affectsConfiguration(section, client.RootUri))) { + settingsChanged = true; void client.onDidChangeSettings(event).catch(logAndReturn.undefined); } } }); + if (settingsChanged) { + // Send the updated settings once through the default client because the payload includes all workspace folders. + const defaultClient: Client = clients.getDefaultClient(); + void defaultClient.sendDidChangeSettings().catch(logAndReturn.undefined); + if (event.affectsConfiguration("C_Cpp.hoverShowTypeSizeAndAlignment")) { + defaultClient.getCopilotHoverProvider()?.reset(); + } + } } function onDidChangeTextDocument(event: vscode.TextDocumentChangeEvent): void { @@ -396,6 +406,7 @@ export async function registerCommands(enabled: boolean): Promise { commandDisposables.push(vscode.commands.registerCommand('C_Cpp.EnableErrorSquiggles', enabled ? onEnableSquiggles : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.DisableErrorSquiggles', enabled ? onDisableSquiggles : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ToggleDimInactiveRegions', enabled ? onToggleDimInactiveRegions : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ToggleTypeSizeAndAlignment', enabled ? onToggleTypeSizeAndAlignment : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.FoldAllInactiveRegions', enabled ? onFoldAllInactiveRegions : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.UnfoldAllInactiveRegions', enabled ? onUnfoldAllInactiveRegions : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.PauseParsing', enabled ? onPauseParsing : onDisabledCommand)); @@ -912,19 +923,25 @@ async function onAddToIncludePath(path: string): Promise { function onEnableSquiggles(): void { // This only applies to the active client. const settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri); - settings.update("errorSquiggles", "enabled"); + void settings.update("errorSquiggles", "enabled"); } function onDisableSquiggles(): void { // This only applies to the active client. const settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri); - settings.update("errorSquiggles", "disabled"); + void settings.update("errorSquiggles", "disabled"); } function onToggleDimInactiveRegions(): void { // This only applies to the active client. const settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri); - settings.update("dimInactiveRegions", !settings.dimInactiveRegions); + void settings.update("dimInactiveRegions", !settings.dimInactiveRegions); +} + +function onToggleTypeSizeAndAlignment(): Thenable { + // This only applies to the active client. + const settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri); + return settings.update("hoverShowTypeSizeAndAlignment", !settings.hoverShowTypeSizeAndAlignment); } function onFoldAllInactiveRegions(): Promise { diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 0214c5e4a..499431d09 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -72,6 +72,7 @@ export interface WorkspaceFolderSettingsParams { clangTidyChecksDisabled: string[] | undefined; hover: string; hoverShowIntegralValuesInHexadecimal: boolean; + hoverShowTypeSizeAndAlignment: boolean; markdownInComments: string; vcFormatIndentBraces: boolean; vcFormatIndentMultiLineRelativeTo: string; @@ -490,6 +491,7 @@ export class CppSettings extends Settings { public get doxygenSectionTags(): string[] { return this.getAsArrayOfStrings("doxygen.sectionTags"); } public get hover(): string { return this.getAsString("hover"); } public get hoverShowIntegralValuesInHexadecimal(): boolean { return this.getAsBoolean("hoverShowIntegralValuesInHexadecimal"); } + public get hoverShowTypeSizeAndAlignment(): boolean { return this.getAsBoolean("hoverShowTypeSizeAndAlignment"); } public get markdownInComments(): string { return this.getAsString("markdownInComments"); } public get legacyCompilerArgsBehavior(): boolean { return this.getAsBoolean("legacyCompilerArgsBehavior"); } public get inlayHintsAutoDeclarationTypes(): boolean { return this.getAsBoolean("inlayHints.autoDeclarationTypes.enabled"); } @@ -777,8 +779,8 @@ export class CppSettings extends Settings { void super.Section.update(name, value?.toLowerCase() === value1.toLowerCase() ? value2 : value1, getTarget()); } - public update(name: string, value: T): void { - void super.Section.update(name, value); + public update(name: string, value: T): Thenable { + return super.Section.update(name, value); } public populateEditorConfig(document: vscode.TextDocument): void { diff --git a/Extension/test/minBinaryVersion.json b/Extension/test/minBinaryVersion.json index 26f354be5..9c4112f6c 100644 --- a/Extension/test/minBinaryVersion.json +++ b/Extension/test/minBinaryVersion.json @@ -1,3 +1,3 @@ { - "minBinaryVersion": "1.35.3" + "minBinaryVersion": "1.35.4" } diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp index db844e8e5..e03f5792a 100644 --- a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp @@ -35,4 +35,9 @@ int main() myfunction(false); bool result = isEven(1); testDoxygen(2, 3); -} \ No newline at end of file +} + +struct HoverType +{ + int value; +}; \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts index 11a455cba..041956d44 100644 --- a/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts @@ -58,6 +58,34 @@ suite("[Quick info test]", function(): void { disposables.forEach(d => d.dispose()); }); + async function getTypeHoverText(): Promise { + const result: vscode.Hover[] = (await vscode.commands.executeCommand( + 'vscode.executeHoverProvider', + fileUri, + new vscode.Position(39, 8))); + assert.ok(result.length > 0, "Expected a hover for HoverType."); + return result.flatMap(hover => hover.contents) + .map(content => typeof content === "string" ? content : content.value) + .join("\n"); + } + + async function waitForTypeHover(showSizeAndAlignment: boolean): Promise { + const deadline: number = Date.now() + 5000; + let hoverText: string = ""; + while (Date.now() < deadline) { + hoverText = await getTypeHoverText(); + const showsSize: boolean = hoverText.includes("**Size:**"); + const showsAlignment: boolean = hoverText.includes("**Alignment:**"); + if (hoverText.includes("struct HoverType") + && showsSize === showSizeAndAlignment + && showsAlignment === showSizeAndAlignment) { + return hoverText; + } + await testHelpers.delay(50); + } + assert.fail(`Timed out waiting for type size and alignment to be ${showSizeAndAlignment ? "shown" : "hidden"}. Last hover:\n${hoverText}`); + } + test("[Hover over function call - normal comment]", async () => { const result: vscode.Hover[] = (await vscode.commands.executeCommand('vscode.executeHoverProvider', fileUri, new vscode.Position(35, 23))); const expected_full_comment: string = `\`\`\`cpp\nbool isEven(int value)\n\`\`\` \nVerifies if input is even number or not`; @@ -111,15 +139,23 @@ suite("[Quick info test]", function(): void { const originalHover: string | undefined = configuration.inspect("hover")?.workspaceFolderValue; const originalShowIntegralValuesInHexadecimal: boolean | undefined = configuration.inspect("hoverShowIntegralValuesInHexadecimal")?.workspaceFolderValue; + const originalShowTypeSizeAndAlignment: boolean | undefined = + configuration.inspect("hoverShowTypeSizeAndAlignment")?.workspaceFolderValue; try { await configuration.update("hover", "disabled", vscode.ConfigurationTarget.WorkspaceFolder); await configuration.update("hoverShowIntegralValuesInHexadecimal", true, vscode.ConfigurationTarget.WorkspaceFolder); + await configuration.update("hoverShowTypeSizeAndAlignment", false, vscode.ConfigurationTarget.WorkspaceFolder); const settings: CppSettings = new CppSettings(fileUri); assert.strictEqual(settings.hover, "disabled"); assert.strictEqual(settings.hoverShowIntegralValuesInHexadecimal, true); + assert.strictEqual(settings.hoverShowTypeSizeAndAlignment, false); } finally { + await configuration.update( + "hoverShowTypeSizeAndAlignment", + originalShowTypeSizeAndAlignment, + vscode.ConfigurationTarget.WorkspaceFolder); await configuration.update( "hoverShowIntegralValuesInHexadecimal", originalShowIntegralValuesInHexadecimal, @@ -128,6 +164,32 @@ suite("[Quick info test]", function(): void { } }); + test("[Toggle type size and alignment command updates hover]", async () => { + const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", fileUri); + const originalShowTypeSizeAndAlignment: boolean | undefined = + configuration.inspect("hoverShowTypeSizeAndAlignment")?.workspaceFolderValue; + + try { + await configuration.update("hoverShowTypeSizeAndAlignment", true, vscode.ConfigurationTarget.WorkspaceFolder); + await waitForTypeHover(true); + + await vscode.commands.executeCommand("C_Cpp.ToggleTypeSizeAndAlignment"); + assert.strictEqual(configuration.inspect("hoverShowTypeSizeAndAlignment")?.workspaceFolderValue, false); + const hiddenHover: string = await waitForTypeHover(false); + assert.ok(hiddenHover.includes("struct HoverType")); + + await vscode.commands.executeCommand("C_Cpp.ToggleTypeSizeAndAlignment"); + assert.strictEqual(configuration.inspect("hoverShowTypeSizeAndAlignment")?.workspaceFolderValue, true); + const shownHover: string = await waitForTypeHover(true); + assert.ok(shownHover.includes("struct HoverType")); + } finally { + await configuration.update( + "hoverShowTypeSizeAndAlignment", + originalShowTypeSizeAndAlignment, + vscode.ConfigurationTarget.WorkspaceFolder); + } + }); + test("[Folder hexadecimal setting preserves global disabled hover]", async () => { const configuration: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", fileUri); const originalGlobalHover: string | undefined = configuration.inspect("hover")?.globalValue; From 78d5c33430250d1179f43aa375432a4447330b32 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 12 Oct 2026 16:27:30 -0700 Subject: [PATCH 29/29] Format quick info test callbacks --- .../scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts index 041956d44..79b33c873 100644 --- a/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts @@ -11,14 +11,14 @@ import { CppSettings } from '../../../../src/LanguageServer/settings'; import { timeout } from '../../../../src/Utility/Async/timeout'; import * as testHelpers from '../../../common/testHelpers'; -suite("[Quick info test]", function(): void { +suite("[Quick info test]", function (): void { let cpptools: apit.CppToolsTestApi; const disposables: vscode.Disposable[] = []; const filePath: string = `${vscode.workspace.workspaceFolders?.[1]?.uri.fsPath}/quickInfo.cpp`; const fileUri: vscode.Uri = vscode.Uri.file(filePath); let platform: string = ""; - suiteSetup(async function(): Promise { + suiteSetup(async function (): Promise { await testHelpers.activateCppExtension(); cpptools = await apit.getCppToolsTestApi(api.Version.latest) ?? assert.fail('Could not get CppToolsTestApi'); @@ -54,7 +54,7 @@ suite("[Quick info test]", function(): void { }); - suiteTeardown(function(): void { + suiteTeardown(function (): void { disposables.forEach(d => d.dispose()); });