diff --git a/.github/actions/.npmrc b/.github/actions/.npmrc index d8324806f..0446fca08 100644 --- a/.github/actions/.npmrc +++ b/.github/actions/.npmrc @@ -1,2 +1,4 @@ registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ -always-auth=true \ No newline at end of file +always-auth=true +# Disable postinstall scripts for supply chain security. Allowlist exceptions with npm trust: https://docs.npmjs.com/cli/v11/commands/npm-trust +ignore-scripts=true diff --git a/.github/actions/package-lock.json b/.github/actions/package-lock.json index af2dead5b..260ea3810 100644 --- a/.github/actions/package-lock.json +++ b/.github/actions/package-lock.json @@ -13,8 +13,8 @@ "@octokit/rest": "^21.1.1", "@slack/web-api": "^6.9.1", "applicationinsights": "^2.5.1", - "axios": "^1.13.5", - "uuid": "^8.3.2" + "axios": "^1.15.0", + "uuid": "^14.0.0" }, "devDependencies": { "@azure/storage-blob": "^12.13.0", @@ -3084,14 +3084,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.6", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/axios/-/axios-1.13.6.tgz", - "integrity": "sha1-w/ktqRfcIJoV3SmTbSDVCJtrbJg=", + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/axios/-/axios-1.15.0.tgz", + "integrity": "sha1-D87pHvA9OGUUR0kEsnhjssaDv08=", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/axios/node_modules/form-data": { @@ -4125,9 +4125,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha1-d31z1yqS+OxNLkEOtHNSpWuOg0A=", + "version": "1.16.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha1-KEdKFZ07nRHvYgUKFO1g5N9tYbw=", "funding": [ { "type": "individual", @@ -5339,10 +5339,13 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha1-4QLxbKNVQkhldV0sno6k8k1Yw+I=", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha1-p0h1aK2tV3z6qn6IxJyrOrMIGro=", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/punycode": { "version": "2.3.1", @@ -5933,12 +5936,16 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "version": "14.0.0", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha1-CviDIgFj0mT/4MCE9riom5Zmlm0=", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { diff --git a/.github/actions/package.json b/.github/actions/package.json index f824ebd03..622bbcd89 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -15,8 +15,8 @@ "@octokit/rest": "^21.1.1", "@slack/web-api": "^6.9.1", "applicationinsights": "^2.5.1", - "axios": "^1.13.5", - "uuid": "^8.3.2" + "axios": "^1.15.0", + "uuid": "^14.0.0" }, "devDependencies": { "@azure/storage-blob": "^12.13.0", diff --git a/.github/workflows/job-compile-and-test.yml b/.github/workflows/job-compile-and-test.yml index a9a1b8621..884c61c91 100644 --- a/.github/workflows/job-compile-and-test.yml +++ b/.github/workflows/job-compile-and-test.yml @@ -66,6 +66,11 @@ jobs: # run: yarn test --scenario=MultirootDeadlockTest # working-directory: Extension + # - name: Run E2E IntelliSense features tests + # if: ${{ inputs.platform == 'windows' }} + # run: yarn test --scenario=RunWithoutDebugging + # working-directory: Extension + # NOTE: For mac/linux run the tests with xvfb-action for UI support. # Another way to start xvfb https://github.com/microsoft/vscode-test/blob/master/sample/azure-pipelines.yml @@ -83,3 +88,10 @@ jobs: # run: yarn test --scenario=MultirootDeadlockTest # working-directory: Extension + # - name: Run E2E IntelliSense features tests (xvfb) + # if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }} + # uses: coactions/setup-xvfb@v1 + # with: + # run: yarn test --scenario=RunWithoutDebugging + # working-directory: Extension + diff --git a/Build/cg/cg.yml b/Build/cg/cg.yml index 7f1b47176..415874be5 100644 --- a/Build/cg/cg.yml +++ b/Build/cg/cg.yml @@ -107,8 +107,14 @@ extends: fi retryCountOnTaskFailure: 3 - - script: | - cd $(Build.SourcesDirectory)\Extension - npx @vscode/vsce@3.7.1 package --yarn -o $(Build.ArtifactStagingDirectory)\Extension\cpptools.vsix - name: ProcessRunner_12 + - script: yarn install --frozen-lockfile + displayName: Install dependencies with yarn + workingDirectory: $(Build.SourcesDirectory)\Extension + + - 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.SourcesDirectory)\Extension + + - script: npx vsce package --yarn -o $(Build.ArtifactStagingDirectory)\Extension\cpptools.vsix displayName: Run VSCE to package vsix + workingDirectory: $(Build.SourcesDirectory)\Extension diff --git a/Build/package/jobs_package_vsix.yml b/Build/package/jobs_package_vsix.yml index 95d65b430..b5a73b174 100644 --- a/Build/package/jobs_package_vsix.yml +++ b/Build/package/jobs_package_vsix.yml @@ -59,13 +59,24 @@ jobs: - script: mkdir $(Build.ArtifactStagingDirectory)\vsix displayName: Create Staging Directory - - script: | - cd $(Build.SourcesDirectory)\${{ parameters.srcDir }} - npx @vscode/vsce@3.7.1 package -o $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.vsix + - script: npm install --no-save --ignore-scripts=false --include=optional --force @vscode/vsce@3.7.1 + displayName: Install vsce + workingDirectory: $(Build.SourcesDirectory)\${{ parameters.srcDir }} + + - script: npm rebuild @vscode/vsce-sign --ignore-scripts=false + displayName: Rebuild vsce-sign binary + workingDirectory: $(Build.SourcesDirectory)\${{ parameters.srcDir }} + + - 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.SourcesDirectory)\${{ parameters.srcDir }} + + - script: npx vsce package -o $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.vsix displayName: Run VSCE to package vsix + workingDirectory: $(Build.SourcesDirectory)\${{ parameters.srcDir }} # sign the vsix - - script: npx @vscode/vsce@3.7.1 generate-manifest -i $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.vsix -o $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.manifest + - script: npx vsce generate-manifest -i $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.vsix -o $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.manifest displayName: generate manifest workingDirectory: $(Build.SourcesDirectory)\${{ parameters.srcDir }} - script: copy $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.manifest $(Build.ArtifactStagingDirectory)\vsix\${{ parameters.vsixName }}.signature.p7s diff --git a/Build/publish/jobs_publish_vsix.yml b/Build/publish/jobs_publish_vsix.yml index 9cab81201..9decb93f8 100644 --- a/Build/publish/jobs_publish_vsix.yml +++ b/Build/publish/jobs_publish_vsix.yml @@ -31,8 +31,16 @@ 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: | - npx @vscode/vsce@3.7.1 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 + - script: npm install --no-save --ignore-scripts=false --include=optional --force @vscode/vsce@3.7.1 + displayName: Install vsce + + - script: npm rebuild @vscode/vsce-sign --ignore-scripts=false + displayName: Rebuild vsce-sign binary + + - 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 + + - 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 env: VSCE_PAT: $(AAD_TOKEN) diff --git a/Extension/.npmrc b/Extension/.npmrc index d8324806f..0446fca08 100644 --- a/Extension/.npmrc +++ b/Extension/.npmrc @@ -1,2 +1,4 @@ registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ -always-auth=true \ No newline at end of file +always-auth=true +# Disable postinstall scripts for supply chain security. Allowlist exceptions with npm trust: https://docs.npmjs.com/cli/v11/commands/npm-trust +ignore-scripts=true diff --git a/Extension/.scripts/copyExtensionBinaries.ts b/Extension/.scripts/copyExtensionBinaries.ts new file mode 100644 index 000000000..0ebf078be --- /dev/null +++ b/Extension/.scripts/copyExtensionBinaries.ts @@ -0,0 +1,113 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { cp, readdir, rm, stat } from 'node:fs/promises'; +import { homedir } from 'node:os'; +import { join } from 'node:path'; +import { $args, $root, green, heading, note } from './common'; + +const extensionPrefix = 'ms-vscode.cpptools-'; +const foldersToCopy = ['bin', 'debugAdapters', 'LLVM'] as const; + +type InstalledExtension = { + path: string; + version: number[]; + modified: number; +}; + +function compareVersions(left: number[], right: number[]): number { + const maxLength: number = Math.max(left.length, right.length); + for (let i = 0; i < maxLength; i++) { + const diff: number = (left[i] ?? 0) - (right[i] ?? 0); + if (diff !== 0) { + return diff; + } + } + return 0; +} + +function tryParseVersion(folderName: string): number[] | undefined { + if (!folderName.startsWith(extensionPrefix)) { + return undefined; + } + + const versionText: string | undefined = folderName.substring(extensionPrefix.length).match(/^\d+\.\d+\.\d+/)?.[0]; + return versionText?.split('.').map(each => Number(each)); +} + +async function getInstalledExtensions(root: string): Promise { + try { + const entries = await readdir(root, { withFileTypes: true }); + const candidates: Promise[] = entries.map(async (entry) => { + if (!entry.isDirectory()) { + return undefined; + } + + const version: number[] | undefined = tryParseVersion(entry.name); + if (!version) { + return undefined; + } + + const extensionPath: string = join(root, entry.name); + for (const folder of foldersToCopy) { + const info = await stat(join(extensionPath, folder)).catch(() => undefined); + if (!info?.isDirectory()) { + return undefined; + } + } + + const info = await stat(extensionPath); + return { + path: extensionPath, + version, + modified: info.mtimeMs + }; + }); + + const found = await Promise.all(candidates); + return found.filter((entry): entry is InstalledExtension => entry !== undefined); + } catch { + return []; + } +} + +async function findLatestInstalledExtension(providedPath?: string): Promise { + if (providedPath) { + return providedPath; + } + + const searchRoots: string[] = [ + join(homedir(), '.vscode', 'extensions'), + join(homedir(), '.vscode-insiders', 'extensions'), + join(homedir(), '.vscode-server', 'extensions'), + join(homedir(), '.vscode-server-insiders', 'extensions') + ]; + + const installed: InstalledExtension[] = (await Promise.all(searchRoots.map(each => getInstalledExtensions(each)))).flat(); + if (!installed.length) { + throw new Error(`Unable to find an installed C/C++ extension under ${searchRoots.join(' or ')}.`); + } + + installed.sort((left, right) => compareVersions(right.version, left.version) || right.modified - left.modified); + return installed[0].path; +} + +export async function main(sourcePath = $args[0]) { + console.log(heading('Copy installed extension binaries')); + + const installedExtensionPath: string = await findLatestInstalledExtension(sourcePath); + note(`Using installed extension at ${installedExtensionPath}`); + + for (const folder of foldersToCopy) { + const source: string = join(installedExtensionPath, folder); + const destination: string = join($root, folder); + + console.log(`Copying ${green(folder)} from ${source}`); + await rm(destination, { recursive: true, force: true }); + await cp(source, destination, { recursive: true, force: true }); + } + + note(`Copied installed binaries into ${$root}`); +} diff --git a/Extension/.vscode/launch.json b/Extension/.vscode/launch.json index 4323f133d..a110f3407 100644 --- a/Extension/.vscode/launch.json +++ b/Extension/.vscode/launch.json @@ -97,6 +97,10 @@ "label": "MultirootDeadlockTest ", "value": "${workspaceFolder}/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace" }, + { + "label": "RunWithoutDebugging ", + "value": "${workspaceFolder}/test/scenarios/RunWithoutDebugging/assets/" + }, { "label": "SimpleCppProject ", "value": "${workspaceFolder}/test/scenarios/SimpleCppProject/assets/simpleCppProject.code-workspace" diff --git a/Extension/.vscodeignore b/Extension/.vscodeignore index ca69612fc..59e8dac79 100644 --- a/Extension/.vscodeignore +++ b/Extension/.vscodeignore @@ -35,7 +35,6 @@ eslint.config.js gulpfile.js localized_string_ids.h readme.developer.md -Reinstalling the Extension.md test.tsconfig.json translations_auto_pr.js tsconfig.json diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 09ef7ed93..de00517c6 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,31 @@ # C/C++ for Visual Studio Code Changelog +## Version 1.32.1: April 20, 2026 +### Bug Fixes +* Fix an IntelliSense crash when three special-case comments are used in a template. [#14360](https://github.com/microsoft/vscode-cpptools/issues/14360) +* Fix `Reinstalling the Extension.md` not being found. [#14389](https://github.com/microsoft/vscode-cpptools/issues/14389) +* Fix the `C/C++ DevTools` extension language service tools not working after the `C/C++` extension updates via `Restart Extensions`. [#14392](https://github.com/microsoft/vscode-cpptools/issues/14392) +* Fix the clang-tidy error `Error: no checks enabled.` when checks are not otherwise set. [#14391](https://github.com/microsoft/vscode-cpptools/issues/14391) +* Update localized strings. + +## Version 1.32.0: April 14, 2026 +### New Feature +* Add support for run without debugging. [#1201](https://github.com/microsoft/vscode-cpptools/issues/1201) + +### Enhancements +* Add a `C_Cpp.doxygen.generateOnCodeAction` setting to allow disabling of Doxygen generation code actions. [#14341](https://github.com/microsoft/vscode-cpptools/issues/14341) +* Improve wildcard matching with the debugger natvis. [MIEngine#1162](https://github.com/microsoft/MIEngine/issues/1162) +* Add support for `HideRawView` with the debugger natvis. [MIEngine#1458](https://github.com/microsoft/MIEngine/issues/1458) + +### Bug Fixes +* Fix high CPU usage caused by repeated calls to `selectChatModels`. [#14168](https://github.com/microsoft/vscode-cpptools/issues/14168), [#14211](https://github.com/microsoft/vscode-cpptools/issues/14211), [#14241](https://github.com/microsoft/vscode-cpptools/issues/14241) +* Fix the MSVC developer environment not working if `UCRTVersion` isn't found, and update the walkthrough instructions for installing MSVC. [#14352](https://github.com/microsoft/vscode-cpptools/issues/14352) +* Fix Copilot hover taking too many premium requests. [#14372](https://github.com/microsoft/vscode-cpptools/issues/14372) +* Fix null pointers being expandable for variables in the debugger. [MIEngine#698](https://github.com/microsoft/MIEngine/issues/698) +* Fix recursive `{this}` evaluation with the debugger natvis. [MIEngine#1391](https://github.com/microsoft/MIEngine/issues/1391) +* Update clang-tidy and clang-format from 22.1.1 to 22.1.3 (bug fixes). +* Fix a bug with semantic colorization of operators. + ## Version 1.31.4: March 31, 2026 ### Bug Fix * Debugging cpptools and cpptools-srv processes on macOS (to get call stacks) is now blocked when SIP is enabled (due to a potential security issue). diff --git a/Extension/ThirdPartyNotices.txt b/Extension/ThirdPartyNotices.txt index b2b6d038b..1d3df8562 100644 --- a/Extension/ThirdPartyNotices.txt +++ b/Extension/ThirdPartyNotices.txt @@ -1250,7 +1250,7 @@ SOFTWARE. --------------------------------------------------------- -@xmldom/xmldom 0.8.11 - MIT +@xmldom/xmldom 0.8.12 - MIT https://github.com/xmldom/xmldom Copyright 2019 - present Christopher J. Brody and other contributors @@ -1510,7 +1510,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI --------------------------------------------------------- -brace-expansion 1.1.12 - MIT +brace-expansion 1.1.13 - MIT https://github.com/juliangruber/brace-expansion Copyright (c) 2013 Julian Gruber @@ -1542,7 +1542,7 @@ SOFTWARE. --------------------------------------------------------- -brace-expansion 2.0.2 - MIT +brace-expansion 2.0.3 - MIT https://github.com/juliangruber/brace-expansion Copyright (c) 2013 Julian Gruber @@ -1642,7 +1642,7 @@ SOFTWARE. chokidar 3.6.0 - MIT https://github.com/paulmillr/chokidar -(c) Paul Miller +(c) Paul Miller Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker The MIT License (MIT) @@ -3018,7 +3018,7 @@ THE SOFTWARE. --------------------------------------------------------- -picomatch 2.3.1 - MIT +picomatch 2.3.2 - MIT https://github.com/micromatch/picomatch Copyright (c) 2017-present, Jon Schlinkert @@ -3183,7 +3183,7 @@ readdirp 3.6.0 - MIT https://github.com/paulmillr/readdirp Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com) -Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller ( https://paulmillr.com ) MIT License diff --git a/Extension/i18n/chs/package.i18n.json b/Extension/i18n/chs/package.i18n.json index 5cdf362d7..e7c59f08b 100644 --- a/Extension/i18n/chs/package.i18n.json +++ b/Extension/i18n/chs/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "用作生成的用户路径的路径分隔符的字符。", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "如果为 `true`,则悬停和自动完成的工具提示将仅显示结构化注释的某些标签。否则,将显示所有注释。", "c_cpp.configuration.doxygen.generateOnType.description": "控制在键入所选注释样式后是否自动插入 Doxygen 注释。", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "控制是否启用生成 Doxygen 注释的代码操作。", "c_cpp.configuration.doxygen.generatedStyle.description": "用作 Doxygen 注释起始行的字符串。", "c_cpp.configuration.doxygen.sectionTags.description": "启用“简化结构化注释”设置后,选择希望在工具提示区域中悬停时显示的 Doxygen 节标记。 ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "开始多行或单行注释块的模式。多行注释块的延续模式默认为 ` * `,或单行注释块默认为此字符串。", diff --git a/Extension/i18n/chs/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/chs/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 95a451cb9..f72734b58 100644 --- a/Extension/i18n/chs/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/chs/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "调试程序类型“{0}”不适用于非 Windows 计算机。" + "debugger.not.available": "调试程序类型“{0}”不适用于非 Windows 计算机。", + "debugger.noDebug.requestType.not.supported": "仅启动配置支持“运行但不调试”。", + "debugger.noDebug.pipeTransport.not.supported": "已设置 \"pipeTransport\" 的配置不支持“运行但不调试”。", + "debugger.noDebug.debugServerPath.not.supported": "已设置 \"debugServerPath\" 的配置不支持“运行但不调试”。", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "已设置 \"miDebuggerServerAddress\" 的配置不支持“运行但不调试”。", + "debugger.noDebug.coreDumpPath.not.supported": "已设置 \"coreDumpPath\" 的配置不支持“运行但不调试”。" } \ No newline at end of file diff --git a/Extension/i18n/chs/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/chs/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..22ae523af --- /dev/null +++ b/Extension/i18n/chs/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "找不到终端仿真器。请将 $TERMINAL 环境变量设置为你选择的终端仿真器,或安装以下程序之一: x-terminal-emulator、gnome-terminal、konsole、xterm。" +} \ No newline at end of file diff --git a/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index f00efc3e5..e8c8170eb 100644 --- a/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "在 Windows 上安装 C++ 编译器", "walkthrough.windows.text1": "如果要对 Windows 进行 C++ 开发,建议安装 Microsoft Visual C++ (MSVC)编译器。", - "walkthrough.windows.text2": "若要安装 MSVC,请打开 VS Code 终端(CTRL + `)并在以下命令中粘贴:\n", + "walkthrough.windows.text2": "若要安装 MSVC,请打开 VS Code 终端(CTRL + `)并在以下命令中粘贴:", "walkthrough.windows.note1": "注意", "walkthrough.windows.note1.text": "可以使用 Visual Studio 生成工具中的 C++ 工具集以及 Visual Studio Code 以编译、生成并验证任何 C++ 代码库,前提是同时具有有效的 Visual Studio 许可证(社区版、专业版或企业版),且正积极将其用于开发该 C++ 代码库。", "walkthrough.windows.verify.compiler": "验证编译器安装", diff --git a/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index f00efc3e5..e8c8170eb 100644 --- a/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/chs/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "在 Windows 上安装 C++ 编译器", "walkthrough.windows.text1": "如果要对 Windows 进行 C++ 开发,建议安装 Microsoft Visual C++ (MSVC)编译器。", - "walkthrough.windows.text2": "若要安装 MSVC,请打开 VS Code 终端(CTRL + `)并在以下命令中粘贴:\n", + "walkthrough.windows.text2": "若要安装 MSVC,请打开 VS Code 终端(CTRL + `)并在以下命令中粘贴:", "walkthrough.windows.note1": "注意", "walkthrough.windows.note1.text": "可以使用 Visual Studio 生成工具中的 C++ 工具集以及 Visual Studio Code 以编译、生成并验证任何 C++ 代码库,前提是同时具有有效的 Visual Studio 许可证(社区版、专业版或企业版),且正积极将其用于开发该 C++ 代码库。", "walkthrough.windows.verify.compiler": "验证编译器安装", diff --git a/Extension/i18n/cht/package.i18n.json b/Extension/i18n/cht/package.i18n.json index 185a9a890..cf1996b20 100644 --- a/Extension/i18n/cht/package.i18n.json +++ b/Extension/i18n/cht/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "作為所產生使用者路徑之路徑分隔符的字元。", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "若為 `true`,暫留與自動完成的工具提示只會顯示特定結構化註解標籤,否則將會顯示所有註解。", "c_cpp.configuration.doxygen.generateOnType.description": "控制是否在輸入選擇的註解樣式後自動插入 Doxygen 註解。", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "控制是否啟用產生 Doxygen 註解的程式碼動作。", "c_cpp.configuration.doxygen.generatedStyle.description": "作為 Doxygen 註解起始行的字元字串。", "c_cpp.configuration.doxygen.sectionTags.description": "選取啟用 [簡化結構化註解] 設定時,要在於工具提示區域暫留時顯示的 [Doxygen] 區段標籤。 ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "開始多行或單行註解區塊的模式。對於多行註解區塊,接續模式預設為 ` * `,或此字串表示單行註解區塊。", diff --git a/Extension/i18n/cht/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/cht/src/Debugger/debugAdapterDescriptorFactory.i18n.json index b3dbcd156..0a4a105c5 100644 --- a/Extension/i18n/cht/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/cht/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "非 Windows 電腦無法使用偵錯工具類型 '{0}'。" + "debugger.not.available": "非 Windows 電腦無法使用偵錯工具類型 '{0}'。", + "debugger.noDebug.requestType.not.supported": "僅啟動設定才支援「執行但不進行偵錯」。", + "debugger.noDebug.pipeTransport.not.supported": "設定 'pipeTransport' 的設定不支援「執行但不進行偵錯」。", + "debugger.noDebug.debugServerPath.not.supported": "設定 'debugServerPath' 的設定不支援「執行但不進行偵錯」。", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "設定 'miDebuggerServerAddress' 的設定不支援「執行但不進行偵錯」。", + "debugger.noDebug.coreDumpPath.not.supported": "設定 'coreDumpPath' 的設定不支援「執行但不進行偵錯」。" } \ No newline at end of file diff --git a/Extension/i18n/cht/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/cht/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..41b36024c --- /dev/null +++ b/Extension/i18n/cht/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "找不到終端機模擬器。請將 $TERMINAL 環境變數設定為您所選擇的終端機模擬器,或安裝下列其中一項: x-terminal-emulator、gnome-terminal、konsole、xterm。" +} \ No newline at end of file diff --git a/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index ce905e1e1..282d9add8 100644 --- a/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "在 Windows 上安裝 C++ 編譯器", "walkthrough.windows.text1": "如果您正在進行 Windows 的 C++ 開發,建議您安裝 Microsoft Visual C++ (MSVC) 編譯器。", - "walkthrough.windows.text2": "若要安裝 MSVC,請開啟 VS Code 終端機 (CTRL + `),然後在下列命令中貼上:\n", + "walkthrough.windows.text2": "若要安裝 MSVC,請開啟 VS Code 終端機 (CTRL + `),然後在下列命令中貼上:", "walkthrough.windows.note1": "備註", "walkthrough.windows.note1.text": "您可以使用 Visual Studio Build Tools 中的 C++ 工具組以及 Visual Studio Code 來編譯、組建及驗證任何 C++ 程式碼基底,只要您也擁有有效的 Visual Studio 授權 (社群版、專業版或企業版),且您正積極開發該 C++ 程式碼基底。", "walkthrough.windows.verify.compiler": "驗證編譯器安裝", diff --git a/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index ce905e1e1..282d9add8 100644 --- a/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/cht/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "在 Windows 上安裝 C++ 編譯器", "walkthrough.windows.text1": "如果您正在進行 Windows 的 C++ 開發,建議您安裝 Microsoft Visual C++ (MSVC) 編譯器。", - "walkthrough.windows.text2": "若要安裝 MSVC,請開啟 VS Code 終端機 (CTRL + `),然後在下列命令中貼上:\n", + "walkthrough.windows.text2": "若要安裝 MSVC,請開啟 VS Code 終端機 (CTRL + `),然後在下列命令中貼上:", "walkthrough.windows.note1": "備註", "walkthrough.windows.note1.text": "您可以使用 Visual Studio Build Tools 中的 C++ 工具組以及 Visual Studio Code 來編譯、組建及驗證任何 C++ 程式碼基底,只要您也擁有有效的 Visual Studio 授權 (社群版、專業版或企業版),且您正積極開發該 C++ 程式碼基底。", "walkthrough.windows.verify.compiler": "驗證編譯器安裝", diff --git a/Extension/i18n/csy/package.i18n.json b/Extension/i18n/csy/package.i18n.json index cb31ce14d..7bcc760bf 100644 --- a/Extension/i18n/csy/package.i18n.json +++ b/Extension/i18n/csy/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Znak použitý jako oddělovač cesty pro generované uživatelské cesty", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Když se tato možnost nastaví na `true`, popisky ovládacích prvků po najetí myší a automatické dokončování budou zobrazovat jen určité popisky strukturovaných komentářů. Jinak se budou zobrazovat všechny komentáře.", "c_cpp.configuration.doxygen.generateOnType.description": "Určuje, jestli se má po zadání zvoleného stylu komentáře automaticky vložit komentář Doxygen.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Určuje, zda je povolena akce kódu pro generování komentáře Doxygen.", "c_cpp.configuration.doxygen.generatedStyle.description": "Řetězec znaků použitý jako počáteční řádek komentáře Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Vyberte značky oddílu Doxygen, které chcete zobrazit při najetí myší v oblasti popisu, pokud je povolené nastavení Zjednodušit strukturované komentáře. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Vzor, který zahájí víceřádkový nebo jednořádkový blok komentáře. Výchozí vzor pro pokračování je pro víceřádkové bloky komentářů ` * `, nebo tento řetězec pro jednořádkové bloky.", diff --git a/Extension/i18n/csy/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/csy/src/Debugger/debugAdapterDescriptorFactory.i18n.json index bf6c8c6fb..bf28c08df 100644 --- a/Extension/i18n/csy/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/csy/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Typ ladicího programu {0} není pro počítače, které nepoužívají Windows, k dispozici." + "debugger.not.available": "Typ ladicího programu {0} není pro počítače, které nepoužívají Windows, k dispozici.", + "debugger.noDebug.requestType.not.supported": "Spuštění bez ladění je podporováno pouze pro konfigurace spuštění.", + "debugger.noDebug.pipeTransport.not.supported": "Spuštění bez ladění není podporováno pro konfigurace s nastavenou hodnotou pipeTransport.", + "debugger.noDebug.debugServerPath.not.supported": "Spuštění bez ladění není podporováno pro konfigurace s nastavenou hodnotou debugServerPath.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "Spuštění bez ladění není podporováno pro konfigurace s nastavenou hodnotou miDebuggerServerAddress.", + "debugger.noDebug.coreDumpPath.not.supported": "Spuštění bez ladění není podporováno pro konfigurace s nastavenou hodnotou coreDumpPath." } \ No newline at end of file diff --git a/Extension/i18n/csy/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/csy/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..e31b6a8d9 --- /dev/null +++ b/Extension/i18n/csy/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Nenašel se žádný emulátor terminálu. Nastavte proměnnou prostředí $TERMINAL na vámi preferovaný emulátor terminálu nebo nainstalujte některý z následujících: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 2cd36a1fa..e2a72d870 100644 --- a/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Instalace kompilátoru jazyka C++ v systému Windows", "walkthrough.windows.text1": "Pokud provádíte vývoj C++ pro Windows, doporučujeme nainstalovat kompilátor Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Pokud chcete nainstalovat MSVC, otevřete terminál VS Code (CTRL + `) a vložte následující příkaz:\n", + "walkthrough.windows.text2": "Pokud chcete nainstalovat MSVC, otevřete terminál VS Code (CTRL + `) a vložte následující příkaz:", "walkthrough.windows.note1": "Poznámka", "walkthrough.windows.note1.text": "Můžete použít sadu nástrojů C++ z Visual Studio Build Tools spolu s Visual Studio Code ke kompilaci, sestavení a ověření jakékoli kódové báze C++, pokud máte také platnou licenci Visual Studio (buď Community, Pro nebo Enterprise), kterou aktivně používáte k vývoji kódové báze C++.", "walkthrough.windows.verify.compiler": "Ověřování instalace kompilátoru", diff --git a/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 2cd36a1fa..e2a72d870 100644 --- a/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/csy/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Instalace kompilátoru jazyka C++ v systému Windows", "walkthrough.windows.text1": "Pokud provádíte vývoj C++ pro Windows, doporučujeme nainstalovat kompilátor Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Pokud chcete nainstalovat MSVC, otevřete terminál VS Code (CTRL + `) a vložte následující příkaz:\n", + "walkthrough.windows.text2": "Pokud chcete nainstalovat MSVC, otevřete terminál VS Code (CTRL + `) a vložte následující příkaz:", "walkthrough.windows.note1": "Poznámka", "walkthrough.windows.note1.text": "Můžete použít sadu nástrojů C++ z Visual Studio Build Tools spolu s Visual Studio Code ke kompilaci, sestavení a ověření jakékoli kódové báze C++, pokud máte také platnou licenci Visual Studio (buď Community, Pro nebo Enterprise), kterou aktivně používáte k vývoji kódové báze C++.", "walkthrough.windows.verify.compiler": "Ověřování instalace kompilátoru", diff --git a/Extension/i18n/deu/package.i18n.json b/Extension/i18n/deu/package.i18n.json index e761f068a..0be4b8503 100644 --- a/Extension/i18n/deu/package.i18n.json +++ b/Extension/i18n/deu/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Das Zeichen, das als Pfadtrennzeichen für generierte Benutzerpfade verwendet wird.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Wenn `true` festgelegt ist, zeigen die QuickInfos für Draufzeigen und AutoVervollständigen nur bestimmte Bezeichnungen strukturierter Kommentare an. Andernfalls werden alle Kommentare angezeigt.", "c_cpp.configuration.doxygen.generateOnType.description": "Steuert, ob der Doxygenkommentar nach Eingabe des ausgewählten Kommentarstils automatisch eingefügt wird.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Steuert, ob die Codeaktion zum Generieren eines Doxygen-Kommentars aktiviert ist.", "c_cpp.configuration.doxygen.generatedStyle.description": "Die Zeichenfolge von Zeichen, die als Startzeile des Doxygen-Kommentars verwendet wird.", "c_cpp.configuration.doxygen.sectionTags.description": "Wählen Sie die Doxygen-Abschnittstags aus, die beim Daraufzeigen im QuickInfo-Bereich angezeigt werden sollen, wenn die Einstellung \"Strukturierte Kommentare vereinfachen\" aktiviert ist. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Muster, mit dem ein mehrzeiliger oder einzeiliger Kommentarblock beginnt. Das Fortsetzungsmuster wird standardmäßig auf ` * ` für mehrzeilige Kommentarblöcke oder auf diese Zeichenfolge für einzeilige Kommentarblöcke festgelegt.", diff --git a/Extension/i18n/deu/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/deu/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 55b61ef95..72016e1b3 100644 --- a/Extension/i18n/deu/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/deu/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Der Debuggertyp \"{0}\" ist für Nicht-Windows-Computer nicht verfügbar." + "debugger.not.available": "Der Debuggertyp \"{0}\" ist für Nicht-Windows-Computer nicht verfügbar.", + "debugger.noDebug.requestType.not.supported": "„Ausführen ohne Debuggen“ wird nur für Startkonfigurationen unterstützt.", + "debugger.noDebug.pipeTransport.not.supported": "„Ausführen ohne Debuggen“ wird für Konfigurationen mit festgelegtem „pipeTransport“ nicht unterstützt.", + "debugger.noDebug.debugServerPath.not.supported": "„Ausführen ohne Debuggen“ wird für Konfigurationen, für die „debugServerPath“ festgelegt ist, nicht unterstützt.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "Das Ausführen ohne Debuggen wird für Konfigurationen mit festgelegter „miDebuggerServerAddress“ nicht unterstützt.", + "debugger.noDebug.coreDumpPath.not.supported": "„Ausführen ohne Debuggen“ wird für Konfigurationen, für die „coreDumpPath“ festgelegt ist, nicht unterstützt." } \ No newline at end of file diff --git a/Extension/i18n/deu/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/deu/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..4475cb987 --- /dev/null +++ b/Extension/i18n/deu/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Kein Terminalemulator gefunden. Legen Sie die Umgebungsvariable $TERMINAL auf den Terminalemulator Ihrer Wahl fest, oder installieren Sie eine der folgenden Komponenten: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 4adc886c9..438c4cc6b 100644 --- a/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "C++-Compiler unter Windows installieren", "walkthrough.windows.text1": "Wenn Sie mithilfe von C++ unter Windows entwickeln, empfehlen wir die Installation des Microsoft Visual C++-Compiler (MSVC).", - "walkthrough.windows.text2": "Öffnen Sie zum Installieren von MSVC das VS Code-Terminal (STRG + `), und fügen Sie den folgenden Befehl ein:\n", + "walkthrough.windows.text2": "Öffnen Sie zum Installieren von MSVC das VS Code-Terminal (STRG + `), und fügen Sie den folgenden Befehl ein:", "walkthrough.windows.note1": "Hinweis", "walkthrough.windows.note1.text": "Sie können das C++-Toolset aus Visual Studio Build Tools zusammen mit Visual Studio Code zum Kompilieren, Erstellen und Überprüfen von C++-Codebasis verwenden, sofern Sie auch über eine gültige Visual Studio-Lizenz (Community, Pro oder Enterprise) verfügen, die Sie aktiv zum Entwickeln dieser C++-Codebasis verwenden.", "walkthrough.windows.verify.compiler": "Überprüfen der Compilerinstallation", diff --git a/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 4adc886c9..438c4cc6b 100644 --- a/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/deu/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "C++-Compiler unter Windows installieren", "walkthrough.windows.text1": "Wenn Sie mithilfe von C++ unter Windows entwickeln, empfehlen wir die Installation des Microsoft Visual C++-Compiler (MSVC).", - "walkthrough.windows.text2": "Öffnen Sie zum Installieren von MSVC das VS Code-Terminal (STRG + `), und fügen Sie den folgenden Befehl ein:\n", + "walkthrough.windows.text2": "Öffnen Sie zum Installieren von MSVC das VS Code-Terminal (STRG + `), und fügen Sie den folgenden Befehl ein:", "walkthrough.windows.note1": "Hinweis", "walkthrough.windows.note1.text": "Sie können das C++-Toolset aus Visual Studio Build Tools zusammen mit Visual Studio Code zum Kompilieren, Erstellen und Überprüfen von C++-Codebasis verwenden, sofern Sie auch über eine gültige Visual Studio-Lizenz (Community, Pro oder Enterprise) verfügen, die Sie aktiv zum Entwickeln dieser C++-Codebasis verwenden.", "walkthrough.windows.verify.compiler": "Überprüfen der Compilerinstallation", diff --git a/Extension/i18n/esn/package.i18n.json b/Extension/i18n/esn/package.i18n.json index 19ca36c2b..616bb0dab 100644 --- a/Extension/i18n/esn/package.i18n.json +++ b/Extension/i18n/esn/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Carácter utilizado como separador de ruta de acceso para las rutas de acceso de usuario generadas.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Si es `true`, la información sobre herramientas al mantener el puntero y autocompletar solo mostrará ciertas etiquetas de comentarios estructurados. De lo contrario, se muestran todos los comentarios.", "c_cpp.configuration.doxygen.generateOnType.description": "Controla si se va a insertar automáticamente el comentario de Doxygen después de escribir el estilo de comentario elegido.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Controla si está habilitada la acción de código para generar un comentario Doxygen.", "c_cpp.configuration.doxygen.generatedStyle.description": "La cadena de caracteres utilizada como línea de inicio del comentario de Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Seleccione las etiquetas de sección de Doxygen que quiere que aparezcan al mantener el puntero en el área de información sobre herramientas cuando esté habilitada la opción 'simplificar comentarios estructurados'. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Patrón que comienza un bloque de comentario de una o varias líneas. El valor predeterminado del patrón de continuación es ` * ` para los bloques de comentario multilínea o esta cadena para los bloques de comentario de una línea.", diff --git a/Extension/i18n/esn/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/esn/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 1350794d6..0d10aae8c 100644 --- a/Extension/i18n/esn/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/esn/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "El tipo de depurador '{0}' no está disponible para equipos que no son de Windows." + "debugger.not.available": "El tipo de depurador '{0}' no está disponible para equipos que no son de Windows.", + "debugger.noDebug.requestType.not.supported": "Ejecutar sin depuración solo se admite para las configuraciones de inicio.", + "debugger.noDebug.pipeTransport.not.supported": "No se admite ejecutar sin depuración para configuraciones con \"pipeTransport\" establecido.", + "debugger.noDebug.debugServerPath.not.supported": "No se admite ejecutar sin depuración para configuraciones con el valor \"debugServerPath\" establecido.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "No se admite ejecutar sin depuración para configuraciones con el conjunto \"miDebuggerServerAddress\".", + "debugger.noDebug.coreDumpPath.not.supported": "No se admite ejecutar sin depuración para configuraciones con \"coreDumpPath\" establecido." } \ No newline at end of file diff --git a/Extension/i18n/esn/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/esn/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..74690fbb2 --- /dev/null +++ b/Extension/i18n/esn/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "No se encontró ningún emulador de terminal. Establezca la variable de entorno $TERMINAL en el emulador de terminal que prefiera o instale una de las siguientes opciones: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index af10336f5..43d907f5d 100644 --- a/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Instalación de un compilador de C++ en Windows", "walkthrough.windows.text1": "Si está desarrollando C++ para Windows, le recomendamos que instale el compilador Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Para instalar MSVC, abra el terminal de VS Code (CTRL + `) y pegue el siguiente comando:\n", + "walkthrough.windows.text2": "Para instalar MSVC, abra el terminal de VS Code (CTRL + `) y pegue el siguiente comando:", "walkthrough.windows.note1": "Nota", "walkthrough.windows.note1.text": "Puede usar el conjunto de herramientas de C++ de Visual Studio Build Tools junto con Visual Studio Code para compilar y comprobar cualquier código base de C++, siempre que también tenga una licencia de Visual Studio válida (Community, Pro o Enterprise) que esté usando de manera activa para desarrollar ese código base de C++.", "walkthrough.windows.verify.compiler": "Comprobación de la instalación del compilador", diff --git a/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index af10336f5..43d907f5d 100644 --- a/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/esn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Instalación de un compilador de C++ en Windows", "walkthrough.windows.text1": "Si está desarrollando C++ para Windows, le recomendamos que instale el compilador Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Para instalar MSVC, abra el terminal de VS Code (CTRL + `) y pegue el siguiente comando:\n", + "walkthrough.windows.text2": "Para instalar MSVC, abra el terminal de VS Code (CTRL + `) y pegue el siguiente comando:", "walkthrough.windows.note1": "Nota", "walkthrough.windows.note1.text": "Puede usar el conjunto de herramientas de C++ de Visual Studio Build Tools junto con Visual Studio Code para compilar y comprobar cualquier código base de C++, siempre que también tenga una licencia de Visual Studio válida (Community, Pro o Enterprise) que esté usando de manera activa para desarrollar ese código base de C++.", "walkthrough.windows.verify.compiler": "Comprobación de la instalación del compilador", diff --git a/Extension/i18n/fra/package.i18n.json b/Extension/i18n/fra/package.i18n.json index 9d2b1d888..2f99e7eb9 100644 --- a/Extension/i18n/fra/package.i18n.json +++ b/Extension/i18n/fra/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Caractère utilisé comme séparateur de chemins d’accès pour les chemins d’utilisateur générés.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Si la valeur est `true`, les info-bulles de pointage et d'autocomplétion affichent uniquement certaines étiquettes de commentaires structurés. Sinon, tous les commentaires sont affichés.", "c_cpp.configuration.doxygen.generateOnType.description": "Contrôle s’il faut insérer automatiquement le commentaire Doxygen après avoir tapé le style de commentaire choisi.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Contrôle si l’action de code permettant de générer un commentaire Doxygen est activée.", "c_cpp.configuration.doxygen.generatedStyle.description": "Chaîne de caractères utilisée comme ligne de départ du commentaire Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Sélectionnez les balises de section Doxygen que vous souhaitez afficher sur le pointage dans la zone d’info-bulle lorsque le paramètre « Simplifier les commentaires structurés » est activé. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Modèle qui commence un bloc de commentaires multiligne ou monoligne. Le modèle consécutif a la valeur par défaut ` * ` pour les blocs de commentaires multilignes ou cette chaîne pour les blocs de commentaires monolignes.", diff --git a/Extension/i18n/fra/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/fra/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 04de7143e..2e42f9a27 100644 --- a/Extension/i18n/fra/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/fra/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Le type de débogueur '{0}' n’est pas disponible pour les machines non Windows." + "debugger.not.available": "Le type de débogueur '{0}' n’est pas disponible pour les machines non Windows.", + "debugger.noDebug.requestType.not.supported": "L’exécution sans débogage n’est prise en charge que pour les configurations de lancement.", + "debugger.noDebug.pipeTransport.not.supported": "L’exécution sans débogage n’est pas prise en charge pour les configurations où « pipeTransport » est défini.", + "debugger.noDebug.debugServerPath.not.supported": "L’exécution sans débogage n’est pas prise en charge pour les configurations où « debugServerPath » est défini.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "L’exécution sans débogage n’est pas prise en charge pour les configurations où « miDebuggerServerAddress » est défini.", + "debugger.noDebug.coreDumpPath.not.supported": "L’exécution sans débogage n’est pas prise en charge pour les configurations où « coreDumpPath » est défini." } \ No newline at end of file diff --git a/Extension/i18n/fra/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/fra/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..52f9e9c95 --- /dev/null +++ b/Extension/i18n/fra/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Émulateur de terminal introuvable. Veuillez définir la variable d’environnement $TERMINAL sur l’émulateur de terminal de votre choix, ou installez l’un des éléments suivants : x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index d4802a35e..54eca74e3 100644 --- a/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Installer un compilateur C++ sur Windows", "walkthrough.windows.text1": "Si vous effectuez un développement C++ pour Windows, nous vous recommandons d’installer le compilateur Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Pour installer MSVC, ouvrez le terminal VS Code (CTRL + `) et collez-le dans la commande suivante :\n", + "walkthrough.windows.text2": "Pour installer MSVC, ouvrez le terminal VS Code (CTRL + `) et collez-le dans la commande suivante :", "walkthrough.windows.note1": "Remarque", "walkthrough.windows.note1.text": "Vous pouvez utiliser l’ensemble d’outils C++ à partir de Visual Studio Build Tools avec Visual Studio Code pour compiler, générer et vérifier n’importe quelle base de code C++, tant que vous disposez également d’une licence Visual Studio valide (Community, Pro ou Enterprise) que vous utilisez activement pour développer cette base de code C++.", "walkthrough.windows.verify.compiler": "Vérification de l’installation du compilateur", diff --git a/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index d4802a35e..54eca74e3 100644 --- a/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/fra/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Installer un compilateur C++ sur Windows", "walkthrough.windows.text1": "Si vous effectuez un développement C++ pour Windows, nous vous recommandons d’installer le compilateur Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Pour installer MSVC, ouvrez le terminal VS Code (CTRL + `) et collez-le dans la commande suivante :\n", + "walkthrough.windows.text2": "Pour installer MSVC, ouvrez le terminal VS Code (CTRL + `) et collez-le dans la commande suivante :", "walkthrough.windows.note1": "Remarque", "walkthrough.windows.note1.text": "Vous pouvez utiliser l’ensemble d’outils C++ à partir de Visual Studio Build Tools avec Visual Studio Code pour compiler, générer et vérifier n’importe quelle base de code C++, tant que vous disposez également d’une licence Visual Studio valide (Community, Pro ou Enterprise) que vous utilisez activement pour développer cette base de code C++.", "walkthrough.windows.verify.compiler": "Vérification de l’installation du compilateur", diff --git a/Extension/i18n/ita/package.i18n.json b/Extension/i18n/ita/package.i18n.json index d2b315bf9..39e300895 100644 --- a/Extension/i18n/ita/package.i18n.json +++ b/Extension/i18n/ita/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Carattere utilizzato come separatore di percorso per i percorsi utente generati.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Se è `true`, le descrizioni comando al passaggio del mouse e del completamento automatico visualizzeranno solo alcune etichette di commenti strutturati. In caso contrario, vengono visualizzati tutti i commenti.", "c_cpp.configuration.doxygen.generateOnType.description": "Controlla se inserire automaticamente il commento Doxygen dopo aver digitato lo stile di commento scelto.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Controllare se l'azione codice per generare un commento Doxygen è abilitata.", "c_cpp.configuration.doxygen.generatedStyle.description": "Stringa di caratteri utilizzata come riga iniziale del commento Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Seleziona i tag di sezione Doxygen da visualizzare al passaggio del mouse nell'area della descrizione comando quando è abilitata l'impostazione 'Semplifica commenti strutturati'. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Criterio con cui inizia un blocco di commento su più righe o su una sola riga. Il criterio di continuazione è impostato su `* ` per i blocchi di commento su più righe o su questa stringa per i blocchi di commento su una sola riga.", diff --git a/Extension/i18n/ita/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/ita/src/Debugger/debugAdapterDescriptorFactory.i18n.json index ab3d0476b..3af87b013 100644 --- a/Extension/i18n/ita/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/ita/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Il tipo di debugger '{0}' non è disponibile per computer non Windows." + "debugger.not.available": "Il tipo di debugger '{0}' non è disponibile per computer non Windows.", + "debugger.noDebug.requestType.not.supported": "L'opzione Esegui senza debug è supportata solo per le configurazioni di avvio.", + "debugger.noDebug.pipeTransport.not.supported": "L'opzione Esegui senza debug non è supportata per le configurazioni con \"pipeTransport\" impostato.", + "debugger.noDebug.debugServerPath.not.supported": "L'opzione Esegui senza debug non è supportata per le configurazioni con \"debugServerPath\" impostato.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "L'opzione Esegui senza debug non è supportata per le configurazioni con \"miDebuggerServerAddress\" impostato.", + "debugger.noDebug.coreDumpPath.not.supported": "L'opzione Esegui senza debug non è supportata per le configurazioni con \"coreDumpPath\" impostato." } \ No newline at end of file diff --git a/Extension/i18n/ita/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/ita/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..3732030ac --- /dev/null +++ b/Extension/i18n/ita/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Nessun emulatore di terminale trovato. Impostare la variabile d'ambiente $TERMINAL sull'emulatore del terminale preferito, oppure installarne uno dei seguenti: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 79390e5ab..92bb2f49f 100644 --- a/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Installa un compilatore C++ in Windows", "walkthrough.windows.text1": "Se si sviluppa in C++ per Windows, è consigliabile installare il compilatore Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Per installare MSVC, aprire il terminale VS Code (CTRL+ `) e incollare il comando seguente:\n", + "walkthrough.windows.text2": "Per installare MSVC, aprire il terminale VS Code (CTRL+ `) e incollare il comando seguente:", "walkthrough.windows.note1": "Nota", "walkthrough.windows.note1.text": "È possibile usare il set di strumenti C++ di Visual Studio Build Tools insieme a Visual Studio Code per compilare, creare e verificare qualsiasi codebase C++, purché sia disponibile una licenza di Visual Studio valida (Community, Pro o Enterprise) usata attivamente per sviluppare la codebase C++.", "walkthrough.windows.verify.compiler": "Verifica dell'installazione del compilatore", diff --git a/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 79390e5ab..92bb2f49f 100644 --- a/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/ita/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Installa un compilatore C++ in Windows", "walkthrough.windows.text1": "Se si sviluppa in C++ per Windows, è consigliabile installare il compilatore Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Per installare MSVC, aprire il terminale VS Code (CTRL+ `) e incollare il comando seguente:\n", + "walkthrough.windows.text2": "Per installare MSVC, aprire il terminale VS Code (CTRL+ `) e incollare il comando seguente:", "walkthrough.windows.note1": "Nota", "walkthrough.windows.note1.text": "È possibile usare il set di strumenti C++ di Visual Studio Build Tools insieme a Visual Studio Code per compilare, creare e verificare qualsiasi codebase C++, purché sia disponibile una licenza di Visual Studio valida (Community, Pro o Enterprise) usata attivamente per sviluppare la codebase C++.", "walkthrough.windows.verify.compiler": "Verifica dell'installazione del compilatore", diff --git a/Extension/i18n/jpn/package.i18n.json b/Extension/i18n/jpn/package.i18n.json index b9a20221c..32305130a 100644 --- a/Extension/i18n/jpn/package.i18n.json +++ b/Extension/i18n/jpn/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "生成されたユーザー パスのパス区切り記号として使用される文字です。", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "`true` の場合、ホバーおよびオートコンプリートのヒントに、構造化されたコメントの特定のラベルのみが表示されます。それ以外の場合は、すべてのコメントが表示されます。", "c_cpp.configuration.doxygen.generateOnType.description": "選択したコメント スタイルを入力した後に、Doxygen コメントを自動的に挿入するかどうかを制御します。", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Doxygen コメントを生成するコード アクションを有効にするかどうかを制御します。", "c_cpp.configuration.doxygen.generatedStyle.description": "Doxygen コメントの開始行として使用される文字列です。", "c_cpp.configuration.doxygen.sectionTags.description": "[構造化コメントの簡略化] 設定が有効になっているときにヒント領域をポイントしたときに表示する Doxygen セクション タグを選択します。 ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "複数行または単一行のコメント ブロックの先頭に置くパターン。継続のパターンの既定値は、複数行コメント ブロックの場合は ` * `、単一行コメント ブロックの場合はこの文字列です。", diff --git a/Extension/i18n/jpn/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/jpn/src/Debugger/debugAdapterDescriptorFactory.i18n.json index c36ada614..20002ae62 100644 --- a/Extension/i18n/jpn/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/jpn/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "デバッガーのタイプ '{0}' は、Windows 以外のコンピューターでは使用できません。" + "debugger.not.available": "デバッガーのタイプ '{0}' は、Windows 以外のコンピューターでは使用できません。", + "debugger.noDebug.requestType.not.supported": "デバッグなしで実行は、起動構成でのみサポートされています。", + "debugger.noDebug.pipeTransport.not.supported": "'pipeTransport' が設定された構成では、デバッグなしで実行はサポートされていません。", + "debugger.noDebug.debugServerPath.not.supported": "'debugServerPath' が設定された構成では、デバッグなしで実行はサポートされていません。", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "'miDebuggerServerAddress' が設定された構成では、デバッグなしで実行はサポートされていません。", + "debugger.noDebug.coreDumpPath.not.supported": "'coreDumpPath' が設定された構成では、デバッグなしで実行はサポートされていません。" } \ No newline at end of file diff --git a/Extension/i18n/jpn/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/jpn/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..854b71812 --- /dev/null +++ b/Extension/i18n/jpn/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "ターミナル エミュレーターが見つかりません。$TERMINAL 環境変数を使用するターミナル エミュレーターに設定するか、次のいずれかをインストールしてください: x-terminal-emulator、gnome-terminal、konsole、xterm。" +} \ No newline at end of file diff --git a/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 34611a95f..f4f317490 100644 --- a/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Windows で C++ コンパイラをインストールする", "walkthrough.windows.text1": "Windows 向けの C++ 開発を行っている場合は、Microsoft Visual C++ (MSVC) コンパイラをインストールすることをお勧めします。", - "walkthrough.windows.text2": "MSVC をインストールするには、VS Code ターミナル (CTRL + `) を開き、次のコマンドで貼り付けます:\n", + "walkthrough.windows.text2": "MSVC をインストールするには、VS Code ターミナルを開き (CTRL + `)、次のコマンドを貼り付けます:", "walkthrough.windows.note1": "メモ", "walkthrough.windows.note1.text": "有効な Visual Studio ライセンス (Community、Pro、Enterprise のいずれか) があり、その C++ コードベースの開発に積極的に使用している場合は、Visual Studio Build Tools の C++ ツールセットを Visual Studio Code と合わせて使用して、C++ コードベースのコンパイル、ビルド、および検証を行うことができます。", "walkthrough.windows.verify.compiler": "コンパイラのインストールの確認中", diff --git a/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 34611a95f..f4f317490 100644 --- a/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/jpn/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Windows で C++ コンパイラをインストールする", "walkthrough.windows.text1": "Windows 向けの C++ 開発を行っている場合は、Microsoft Visual C++ (MSVC) コンパイラをインストールすることをお勧めします。", - "walkthrough.windows.text2": "MSVC をインストールするには、VS Code ターミナル (CTRL + `) を開き、次のコマンドで貼り付けます:\n", + "walkthrough.windows.text2": "MSVC をインストールするには、VS Code ターミナルを開き (CTRL + `)、次のコマンドを貼り付けます:", "walkthrough.windows.note1": "メモ", "walkthrough.windows.note1.text": "有効な Visual Studio ライセンス (Community、Pro、Enterprise のいずれか) があり、その C++ コードベースの開発に積極的に使用している場合は、Visual Studio Build Tools の C++ ツールセットを Visual Studio Code と合わせて使用して、C++ コードベースのコンパイル、ビルド、および検証を行うことができます。", "walkthrough.windows.verify.compiler": "コンパイラのインストールの確認中", diff --git a/Extension/i18n/kor/package.i18n.json b/Extension/i18n/kor/package.i18n.json index 6741ff620..193f107bf 100644 --- a/Extension/i18n/kor/package.i18n.json +++ b/Extension/i18n/kor/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "생성된 사용자 경로의 경로 구분 기호로 사용되는 문자입니다.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "`true`인 경우 가리키기 및 자동 완성 도구 설명에 구조적 주석의 특정 레이블만 표시됩니다. 그렇지 않으면 모든 주석이 표시됩니다.", "c_cpp.configuration.doxygen.generateOnType.description": "선택한 주석 스타일을 입력한 후 Doxygen 주석을 자동으로 삽입할지 여부를 제어합니다.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Doxygen 주석을 생성하는 코드 작업을 사용할지 여부를 제어합니다.", "c_cpp.configuration.doxygen.generatedStyle.description": "Doxygen 주석의 시작 줄로 사용되는 문자 문자열입니다.", "c_cpp.configuration.doxygen.sectionTags.description": "'구조적 설명 단순화' 설정이 활성화된 경우 도구 설명 영역에서 마우스를 가져가면 표시할 Doxygen 섹션 태그를 선택합니다. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "여러 줄 또는 한 줄 주석 블록을 시작하는 패턴입니다. 기본적으로 여러 줄 주석 블록의 계속 패턴은 ` * `로 설정되고, 한 줄 주석 블록의 경우 이 문자열로 설정됩니다.", diff --git a/Extension/i18n/kor/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/kor/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 7401e5779..d73248987 100644 --- a/Extension/i18n/kor/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/kor/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Windows가 아닌 머신에서는 '{0}' 디버거 형식을 사용할 수 없습니다." + "debugger.not.available": "Windows가 아닌 머신에서는 '{0}' 디버거 형식을 사용할 수 없습니다.", + "debugger.noDebug.requestType.not.supported": "디버깅하지 않고 실행은 시작 구성에만 지원됩니다.", + "debugger.noDebug.pipeTransport.not.supported": "'pipeTransport'가 설정된 구성에는 디버깅 없이 실행이 지원되지 않습니다.", + "debugger.noDebug.debugServerPath.not.supported": "'debugServerPath'가 설정된 구성에는 디버깅 없이 실행이 지원되지 않습니다.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "'miDebuggerServerAddress'가 설정된 구성에는 디버깅 없이 실행이 지원되지 않습니다.", + "debugger.noDebug.coreDumpPath.not.supported": "'coreDumpPath'가 설정된 구성에는 디버깅 없이 실행이 지원되지 않습니다." } \ No newline at end of file diff --git a/Extension/i18n/kor/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/kor/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..6391c82ac --- /dev/null +++ b/Extension/i18n/kor/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "터미널 에뮬레이터를 찾을 수 없습니다. $TERMINAL 환경 변수를 원하는 터미널 에뮬레이터로 설정하거나 x-terminal-emulator, gnome-terminal, konsole, xterm 중 하나를 설치하세요." +} \ No newline at end of file diff --git a/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 1afe7d81b..549632b44 100644 --- a/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Windows에 C++ 컴파일러 설치", "walkthrough.windows.text1": "Windows용 C++ 개발 중인 경우 MSVC(Microsoft Visual C++) 컴파일러를 설치하는 것이 좋습니다.", - "walkthrough.windows.text2": "MSVC를 설치하려면 VS Code 터미널(CTRL + `)을 열고 다음 명령을 붙여 넣습니다.\n", + "walkthrough.windows.text2": "MSVC를 설치하려면 VS Code 터미널(CTRL + `)을 열고 다음 명령을 붙여 넣습니다.", "walkthrough.windows.note1": "메모", "walkthrough.windows.note1.text": "현재 C++ 코드베이스를 개발하는 데 적극적으로 사용 중인 유효한 Visual Studio 라이선스(Community, Pro 또는 Enterprise)가 있는 한 Visual Studio Build Tools의 C++ 도구 집합을 Visual Studio Code와 함께 사용하여 모든 C++ 코드베이스를 컴파일, 빌드 및 확인할 수 있습니다.", "walkthrough.windows.verify.compiler": "컴파일러 설치 확인 중", diff --git a/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 1afe7d81b..549632b44 100644 --- a/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/kor/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Windows에 C++ 컴파일러 설치", "walkthrough.windows.text1": "Windows용 C++ 개발 중인 경우 MSVC(Microsoft Visual C++) 컴파일러를 설치하는 것이 좋습니다.", - "walkthrough.windows.text2": "MSVC를 설치하려면 VS Code 터미널(CTRL + `)을 열고 다음 명령을 붙여 넣습니다.\n", + "walkthrough.windows.text2": "MSVC를 설치하려면 VS Code 터미널(CTRL + `)을 열고 다음 명령을 붙여 넣습니다.", "walkthrough.windows.note1": "메모", "walkthrough.windows.note1.text": "현재 C++ 코드베이스를 개발하는 데 적극적으로 사용 중인 유효한 Visual Studio 라이선스(Community, Pro 또는 Enterprise)가 있는 한 Visual Studio Build Tools의 C++ 도구 집합을 Visual Studio Code와 함께 사용하여 모든 C++ 코드베이스를 컴파일, 빌드 및 확인할 수 있습니다.", "walkthrough.windows.verify.compiler": "컴파일러 설치 확인 중", diff --git a/Extension/i18n/plk/package.i18n.json b/Extension/i18n/plk/package.i18n.json index 99400a980..9b723c113 100644 --- a/Extension/i18n/plk/package.i18n.json +++ b/Extension/i18n/plk/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Znak używany jako separator ścieżek dla wygenerowanych ścieżek użytkowników.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "W przypadku wartości `true` etykietki narzędzi najechania kursorem oraz automatycznego uzupełniania będą wyświetlać tylko określone etykiety komentarzy ze strukturą. W przeciwnym razie wyświetlane będą wszystkie komentarze.", "c_cpp.configuration.doxygen.generateOnType.description": "Określa, czy komentarz Doxygen ma być wstawiany automatycznie po wpisaniu wybranego stylu komentarza.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Określa, czy akcja kodu w celu wygenerowania komentarza Doxygen jest włączona.", "c_cpp.configuration.doxygen.generatedStyle.description": "Ciąg znaków używany jako wiersz początkowy komentarza Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Wybierz tagi sekcji Doxygen, które mają być wyświetlane po zatrzymaniu wskaźnika myszy w obszarze etykietki narzędzia po włączeniu ustawienia „Uprość komentarze strukturalne”. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Wzorzec, który rozpoczyna wielowierszowy lub jednowierszowy blok komentarza. Wartość domyślna wzorca kontynuacji to ` * ` w przypadku wielowierszowych bloków komentarzy lub ten ciąg w przypadku jednowierszowych bloków komentarza.", diff --git a/Extension/i18n/plk/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/plk/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 223a672cb..670edd14b 100644 --- a/Extension/i18n/plk/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/plk/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Typ debugera „{0}” nie jest dostępny dla maszyn z systemem innym niż Windows." + "debugger.not.available": "Typ debugera „{0}” nie jest dostępny dla maszyn z systemem innym niż Windows.", + "debugger.noDebug.requestType.not.supported": "Uruchamianie bez debugowania jest obsługiwane tylko dla konfiguracji uruchamiania.", + "debugger.noDebug.pipeTransport.not.supported": "Uruchamianie bez debugowania nie jest obsługiwane dla konfiguracji z ustawionym parametrem „pipeTransport”.", + "debugger.noDebug.debugServerPath.not.supported": "Uruchamianie bez debugowania nie jest obsługiwane dla konfiguracji z ustawionym parametrem „debugServerPath”.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "Uruchamianie bez debugowania nie jest obsługiwane dla konfiguracji z ustawionym parametrem „miDebuggerServerAddress”.", + "debugger.noDebug.coreDumpPath.not.supported": "Uruchamianie bez debugowania nie jest obsługiwane dla konfiguracji z ustawionym parametrem „coreDumpPath”." } \ No newline at end of file diff --git a/Extension/i18n/plk/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/plk/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..69d389654 --- /dev/null +++ b/Extension/i18n/plk/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Nie znaleziono emulatora terminalu. Ustaw zmienną środowiskową $TERMINAL na wybrany emulator terminala lub zainstaluj jeden z następujących: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index e978b0bcc..2c8cfab2d 100644 --- a/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Zainstaluj kompilator języka C++ w systemie Windows", "walkthrough.windows.text1": "W przypadku programowania w języku C++ dla systemu Windows zalecamy zainstalowanie kompilatora Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Aby zainstalować program MSVC, otwórz terminal VS Code (CTRL + `) i wklej następujące polecenie:\n", + "walkthrough.windows.text2": "Aby zainstalować program MSVC, otwórz terminal VS Code (CTRL + `) i wklej następujące polecenie:", "walkthrough.windows.note1": "Notatka", "walkthrough.windows.note1.text": "Zestawu narzędzi języka C++ z narzędzi Visual Studio Build Tools wraz z programem Visual Studio Code można używać do kompilowania, tworzenia i weryfikowania dowolnej bazy kodu języka C++, o ile masz również ważną licencję programu Visual Studio (Community, Pro lub Enterprise), której aktywnie używasz do opracowywania tej bazy kodu języka C++.", "walkthrough.windows.verify.compiler": "Weryfikowanie instalacji kompilatora", diff --git a/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index e978b0bcc..2c8cfab2d 100644 --- a/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/plk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Zainstaluj kompilator języka C++ w systemie Windows", "walkthrough.windows.text1": "W przypadku programowania w języku C++ dla systemu Windows zalecamy zainstalowanie kompilatora Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Aby zainstalować program MSVC, otwórz terminal VS Code (CTRL + `) i wklej następujące polecenie:\n", + "walkthrough.windows.text2": "Aby zainstalować program MSVC, otwórz terminal VS Code (CTRL + `) i wklej następujące polecenie:", "walkthrough.windows.note1": "Notatka", "walkthrough.windows.note1.text": "Zestawu narzędzi języka C++ z narzędzi Visual Studio Build Tools wraz z programem Visual Studio Code można używać do kompilowania, tworzenia i weryfikowania dowolnej bazy kodu języka C++, o ile masz również ważną licencję programu Visual Studio (Community, Pro lub Enterprise), której aktywnie używasz do opracowywania tej bazy kodu języka C++.", "walkthrough.windows.verify.compiler": "Weryfikowanie instalacji kompilatora", diff --git a/Extension/i18n/ptb/package.i18n.json b/Extension/i18n/ptb/package.i18n.json index 2cdb706bc..a2bd3201b 100644 --- a/Extension/i18n/ptb/package.i18n.json +++ b/Extension/i18n/ptb/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "O caractere usado como separador de caminho para caminhos de usuário gerados.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Se for `true`, as dicas de passar o mouse e autocompletar exibirão apenas alguns rótulos de comentários estruturados. Caso contrário, todos os comentários serão exibidos.", "c_cpp.configuration.doxygen.generateOnType.description": "Controle se o comentário Doxygen deve ser inserido automaticamente depois de digitar o estilo de comentário escolhido.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Controla se a ação de código para gerar um comentário do Doxygen está habilitada.", "c_cpp.configuration.doxygen.generatedStyle.description": "A cadeia de caracteres usada como a linha inicial do comentário Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Selecione as tags de seção do Doxygen que você quer exibir ao focalizar na área de dica de ferramenta quando a configuração `Simplificar Comentários Estruturados` estiver habilitada. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "O padrão que inicia um bloco de comentário de várias linhas ou de uma linha. O padrão de continuação é `*` para blocos de comentários de várias linhas ou esta cadeia de caracteres para blocos de comentários de uma única linha.", diff --git a/Extension/i18n/ptb/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/ptb/src/Debugger/debugAdapterDescriptorFactory.i18n.json index c4d51c6d5..dab24487f 100644 --- a/Extension/i18n/ptb/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/ptb/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "O tipo de depurador '{0}' não está disponível para máquinas que não sejam Windows." + "debugger.not.available": "O tipo de depurador '{0}' não está disponível para máquinas que não sejam Windows.", + "debugger.noDebug.requestType.not.supported": "A execução sem depuração só tem suporte para configurações de inicialização.", + "debugger.noDebug.pipeTransport.not.supported": "Não há suporte para Executar Sem Depuração para configurações com \"pipeTransport\" definido.", + "debugger.noDebug.debugServerPath.not.supported": "Não há suporte para Executar sem Depuração em configurações com \"debugServerPath\" definido.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "Não há suporte para Executar sem Depuração para configurações com \"miDebuggerServerAddress\" definido.", + "debugger.noDebug.coreDumpPath.not.supported": "Não há suporte para Executar sem Depuração para configurações com o conjunto \"coreDumpPath\"." } \ No newline at end of file diff --git a/Extension/i18n/ptb/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/ptb/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..30bed1160 --- /dev/null +++ b/Extension/i18n/ptb/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Nenhum emulador de terminal encontrado. Defina a variável de ambiente $TERMINAL para o emulador de terminal de sua escolha ou instale um dos seguintes: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index ca7d95ff5..46897af8a 100644 --- a/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Instalar um compilador C++ no Windows", "walkthrough.windows.text1": "Se você estiver desenvolvendo C++ para Windows, recomendamos instalar o conjunto de ferramentas do compilador Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Para instalar o MSVC, abra o terminal VS Code (CTRL + `) e cole o seguinte comando:\n", + "walkthrough.windows.text2": "Para instalar o MSVC, abra o terminal VS Code (CTRL + `) e cole o seguinte comando:", "walkthrough.windows.note1": "Observação", "walkthrough.windows.note1.text": "Você pode usar o conjunto de ferramentas C++ das Ferramentas de Build do Visual Studio junto com o Visual Studio Code para compilar, construir e verificar qualquer base de código C++, contanto que também tenha uma licença válida do Visual Studio (Community, Pro ou Enterprise) que esteja ativamente usando para desenvolver essa base de código C++.", "walkthrough.windows.verify.compiler": "Verificando a instalação do compilador", diff --git a/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index ca7d95ff5..46897af8a 100644 --- a/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/ptb/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Instalar um compilador C++ no Windows", "walkthrough.windows.text1": "Se você estiver desenvolvendo C++ para Windows, recomendamos instalar o conjunto de ferramentas do compilador Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Para instalar o MSVC, abra o terminal VS Code (CTRL + `) e cole o seguinte comando:\n", + "walkthrough.windows.text2": "Para instalar o MSVC, abra o terminal VS Code (CTRL + `) e cole o seguinte comando:", "walkthrough.windows.note1": "Observação", "walkthrough.windows.note1.text": "Você pode usar o conjunto de ferramentas C++ das Ferramentas de Build do Visual Studio junto com o Visual Studio Code para compilar, construir e verificar qualquer base de código C++, contanto que também tenha uma licença válida do Visual Studio (Community, Pro ou Enterprise) que esteja ativamente usando para desenvolver essa base de código C++.", "walkthrough.windows.verify.compiler": "Verificando a instalação do compilador", diff --git a/Extension/i18n/rus/package.i18n.json b/Extension/i18n/rus/package.i18n.json index 60aee77a8..72c5e2bbc 100644 --- a/Extension/i18n/rus/package.i18n.json +++ b/Extension/i18n/rus/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Символ, используемый в качестве разделителя путей для созданных путей пользователей.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Если выбрано значение `true`, в подсказках при наведении указателя и автозавершении будут отображаться только определенные метки со структурированными комментариями. В противном случае отображаются все комментарии.", "c_cpp.configuration.doxygen.generateOnType.description": "Определяет, следует ли автоматически вставлять комментарий Doxygen после ввода выбранного стиля комментария.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Управляет включением действия кода для создания комментария Doxygen.", "c_cpp.configuration.doxygen.generatedStyle.description": "Строка символов, используемая в качестве начальной строки комментария Doxygen.", "c_cpp.configuration.doxygen.sectionTags.description": "Выберите теги раздела Doxygen, которые должны отображаться при наведении курсора на область подсказок, если включен параметр \"Упростить структурированные комментарии\".", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Шаблон, который начинается с многострочного или однострочного примечания. Шаблон продолжения по умолчанию имеет значение ` * ` для многострочных примечаний или соответствует этой строке для однострочных примечаний.", diff --git a/Extension/i18n/rus/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/rus/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 704da1606..3cd62d94b 100644 --- a/Extension/i18n/rus/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/rus/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "Тип отладчика \"{0}\" недоступен для компьютеров с операционной системой, отличной от Windows." + "debugger.not.available": "Тип отладчика \"{0}\" недоступен для компьютеров с операционной системой, отличной от Windows.", + "debugger.noDebug.requestType.not.supported": "Запуск без отладки поддерживается только для конфигураций запуска.", + "debugger.noDebug.pipeTransport.not.supported": "Запуск без отладки не поддерживается для конфигураций с настроенным параметром \"pipeTransport\".", + "debugger.noDebug.debugServerPath.not.supported": "Запуск без отладки не поддерживается для конфигураций с настроенным параметром \"debugServerPath\".", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "Запуск без отладки не поддерживается для конфигураций с настроенным параметром \"miDebuggerServerAddress\".", + "debugger.noDebug.coreDumpPath.not.supported": "Запуск без отладки не поддерживается для конфигураций с настроенным параметром \"coreDumpPath\"." } \ No newline at end of file diff --git a/Extension/i18n/rus/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/rus/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..212471217 --- /dev/null +++ b/Extension/i18n/rus/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Эмулятор терминала не найден. Настройте переменную среды $TERMINAL, указав предпочитаемый эмулятор терминала, или установите один из следующих вариантов: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 7c4e0ec62..599f74949 100644 --- a/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Установка компилятора C++ в Windows", "walkthrough.windows.text1": "Если вы занимаетесь разработкой на C++ для Windows, рекомендуется установить компилятор Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Чтобы установить MSVC, откройте терминал VS Code (CTRL + `) и вставьте следующую команду:\n", + "walkthrough.windows.text2": "Чтобы установить MSVC, откройте терминал VS Code (CTRL + `) и вставьте следующую команду:", "walkthrough.windows.note1": "Примечание", "walkthrough.windows.note1.text": "Вы можете использовать набор инструментов C++ из пакета Visual Studio Build Tools вместе с Visual Studio Code для компиляции, сборки и проверки любой базы кода C++, если у вас есть действующая лицензия Visual Studio (Community, Pro или Enterprise), которой вы активно пользуетесь для разработки этой базы кода C++.", "walkthrough.windows.verify.compiler": "Проверка установки компилятора", diff --git a/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 7c4e0ec62..599f74949 100644 --- a/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/rus/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Установка компилятора C++ в Windows", "walkthrough.windows.text1": "Если вы занимаетесь разработкой на C++ для Windows, рекомендуется установить компилятор Microsoft Visual C++ (MSVC).", - "walkthrough.windows.text2": "Чтобы установить MSVC, откройте терминал VS Code (CTRL + `) и вставьте следующую команду:\n", + "walkthrough.windows.text2": "Чтобы установить MSVC, откройте терминал VS Code (CTRL + `) и вставьте следующую команду:", "walkthrough.windows.note1": "Примечание", "walkthrough.windows.note1.text": "Вы можете использовать набор инструментов C++ из пакета Visual Studio Build Tools вместе с Visual Studio Code для компиляции, сборки и проверки любой базы кода C++, если у вас есть действующая лицензия Visual Studio (Community, Pro или Enterprise), которой вы активно пользуетесь для разработки этой базы кода C++.", "walkthrough.windows.verify.compiler": "Проверка установки компилятора", diff --git a/Extension/i18n/trk/package.i18n.json b/Extension/i18n/trk/package.i18n.json index c3ab3295f..e79c4d4a5 100644 --- a/Extension/i18n/trk/package.i18n.json +++ b/Extension/i18n/trk/package.i18n.json @@ -210,6 +210,7 @@ "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Oluşturulan kullanıcı yolları için yol ayırıcı olarak kullanılan karakter.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "`true` ise, üzerine gelme ve otomatik tamamlama araç ipuçları, yapılandırılmış açıklamaların yalnızca belirli etiketlerini görüntüler. Aksi halde tüm açıklamalar görüntülenir.", "c_cpp.configuration.doxygen.generateOnType.description": "Seçilen açıklama stilini girdikten sonra Doxygen açıklamasının otomatik olarak eklenip eklenmeyeceğini kontrol eder.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Doxygen açıklaması oluşturma kod eyleminin etkin olup olmadığını denetler.", "c_cpp.configuration.doxygen.generatedStyle.description": "Doxygen açıklamasının başlangıç satırı olarak kullanılan karakter dizesi.", "c_cpp.configuration.doxygen.sectionTags.description": "\"Yapılandırılmış Yorumları Basitleştir\" ayarı etkinleştirildiğinde araç ipucu alanında fareyle üzerine gelindiğinde görünmesini istediğiniz Doxygen bölümü etiketlerini seçin. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Çok satırlı veya tek satırlı açıklama bloğu başlatan desen. Devam deseni, çok satırlı açıklama blokları için varsayılan olarak ` * ` değerini veya tek satırlı açıklama blokları için bu dize değerini alır.", diff --git a/Extension/i18n/trk/src/Debugger/debugAdapterDescriptorFactory.i18n.json b/Extension/i18n/trk/src/Debugger/debugAdapterDescriptorFactory.i18n.json index 5eb31f875..b9c6616f9 100644 --- a/Extension/i18n/trk/src/Debugger/debugAdapterDescriptorFactory.i18n.json +++ b/Extension/i18n/trk/src/Debugger/debugAdapterDescriptorFactory.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "debugger.not.available": "'{0}' hata ayıklayıcısı türü, Windows dışı makinelerde kullanılamaz." + "debugger.not.available": "'{0}' hata ayıklayıcısı türü, Windows dışı makinelerde kullanılamaz.", + "debugger.noDebug.requestType.not.supported": "Hata Ayıklama Olmadan Çalıştırma yalnızca başlatma yapılandırmaları için destekleniyor.", + "debugger.noDebug.pipeTransport.not.supported": "Hata Ayıklama Olmadan Çalıştırma, 'pipeTransport' ayarlı yapılandırmalar için desteklenmiyor.", + "debugger.noDebug.debugServerPath.not.supported": "Hata Ayıklama Olmadan Çalıştırma, 'debugServerPath' ayarlı yapılandırmalar için desteklenmiyor.", + "debugger.noDebug.miDebuggerServerAddress.not.supported": "Hata Ayıklama Olmadan Çalıştırma, 'miDebuggerServerAddress' ayarlı yapılandırmalar için desteklenmiyor.", + "debugger.noDebug.coreDumpPath.not.supported": "Hata Ayıklama Olmadan Çalıştırma, 'coreDumpPath' ayarlı yapılandırmalar için desteklenmiyor." } \ No newline at end of file diff --git a/Extension/i18n/trk/src/Debugger/runWithoutDebuggingAdapter.i18n.json b/Extension/i18n/trk/src/Debugger/runWithoutDebuggingAdapter.i18n.json new file mode 100644 index 000000000..58602464c --- /dev/null +++ b/Extension/i18n/trk/src/Debugger/runWithoutDebuggingAdapter.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. +{ + "no.terminal.emulator": "Terminal emülatörü bulunamadı. Lütfen $TERMINAL ortam değişkenini tercih ettiğiniz terminal emülatörüne ayarlayın veya şunlardan birini yükleyin: x-terminal-emulator, gnome-terminal, konsole, xterm." +} \ No newline at end of file diff --git a/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json b/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json index 936c8b1eb..7968d1e7a 100644 --- a/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json +++ b/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows10.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Windows'a C++ derleyicisi yükleme", "walkthrough.windows.text1": "Windows için C++ geliştirme yapıyorsanız Microsoft Visual C++ (MSVC) derleyicisini yüklemenizi öneririz.", - "walkthrough.windows.text2": "MSVC'yi yüklemek için VS Code terminalini (CTRL + `) açın ve aşağıdaki komutu yapıştırın:\n", + "walkthrough.windows.text2": "MSVC'yi yüklemek için VS Code terminalini (CTRL + `) açın ve aşağıdaki komutu yapıştırın:", "walkthrough.windows.note1": "Not", "walkthrough.windows.note1.text": "Herhangi bir C++ kod temelini derlemek, oluşturmak ve doğrulamak için Visual Studio Code ile birlikte Visual Studio Derleme Araçları’nda bulunan C++ araç takımını kullanabilirsiniz. Bunun yanı sıra, bu C++ kod temelini geliştirmek için etkin olarak kullandığınız geçerli bir Visual Studio lisansına (Community, Pro veya Enterprise) sahip olursunuz.", "walkthrough.windows.verify.compiler": "Derleyici yüklemesi doğrulanıyor", diff --git a/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json b/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json index 936c8b1eb..7968d1e7a 100644 --- a/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json +++ b/Extension/i18n/trk/walkthrough/installcompiler/install-compiler-windows11.md.i18n.json @@ -6,7 +6,7 @@ { "walkthrough.windows.install.compiler": "Windows'a C++ derleyicisi yükleme", "walkthrough.windows.text1": "Windows için C++ geliştirme yapıyorsanız Microsoft Visual C++ (MSVC) derleyicisini yüklemenizi öneririz.", - "walkthrough.windows.text2": "MSVC'yi yüklemek için VS Code terminalini (CTRL + `) açın ve aşağıdaki komutu yapıştırın:\n", + "walkthrough.windows.text2": "MSVC'yi yüklemek için VS Code terminalini (CTRL + `) açın ve aşağıdaki komutu yapıştırın:", "walkthrough.windows.note1": "Not", "walkthrough.windows.note1.text": "Herhangi bir C++ kod temelini derlemek, oluşturmak ve doğrulamak için Visual Studio Code ile birlikte Visual Studio Derleme Araçları’nda bulunan C++ araç takımını kullanabilirsiniz. Bunun yanı sıra, bu C++ kod temelini geliştirmek için etkin olarak kullandığınız geçerli bir Visual Studio lisansına (Community, Pro veya Enterprise) sahip olursunuz.", "walkthrough.windows.verify.compiler": "Derleyici yüklemesi doğrulanıyor", diff --git a/Extension/package.json b/Extension/package.json index 49701bccf..e9eca52aa 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.31.4-main", + "version": "1.32.1-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", @@ -1703,6 +1703,12 @@ "description": "%c_cpp.configuration.doxygen.generateOnType.description%", "scope": "resource" }, + "C_Cpp.doxygen.generateOnCodeAction": { + "type": "boolean", + "default": true, + "description": "%c_cpp.configuration.doxygen.generateOnCodeAction.description%", + "scope": "resource" + }, "C_Cpp.doxygen.generatedStyle": { "type": "string", "enum": [ @@ -6799,6 +6805,7 @@ "generate-native-strings": "ts-node -T ./.scripts/generateNativeStrings.ts", "generate-options-schema": "ts-node -T ./.scripts/generateOptionsSchema.ts", "copy-walkthrough-media": "ts-node -T ./.scripts/copyWalkthruMedia.ts", + "copy-extension-binaries": "ts-node -T ./.scripts/copyExtensionBinaries.ts", "translations-export": "yarn install && yarn prep && yarn generate-native-strings && gulp translations-export", "translations-generate": "gulp translations-generate", "translations-import": "gulp translations-import", diff --git a/Extension/package.nls.json b/Extension/package.nls.json index ca0f42449..9adf8c517 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -580,6 +580,7 @@ ] }, "c_cpp.configuration.doxygen.generateOnType.description": "Controls whether to automatically insert the Doxygen comment after typing the chosen comment style.", + "c_cpp.configuration.doxygen.generateOnCodeAction.description": "Controls whether the code action to generate a Doxygen comment is enabled.", "c_cpp.configuration.doxygen.generatedStyle.description": "The string of characters used as the starting line of the Doxygen comment.", "c_cpp.configuration.doxygen.sectionTags.description": "Select the Doxygen section tags that you would like to appear on hover in the tooltip area when the 'Simplify Structured Comments' setting is enabled. ", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": { diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 8f0ae0c7c..5bc427759 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -147,12 +147,14 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv Telemetry.logDebuggerEvent(DebuggerEvent.debugPanel, { "debugType": DebugType.debug, "configSource": folder ? ConfigSource.workspaceFolder : ConfigSource.singleFile, "configMode": ConfigMode.noLaunchConfig, "cancelled": "true", "succeeded": "true" }); return undefined; // aborts debugging silently } else { + const noDebug = config.noDebug ?? false; // Preserve the noDebug value from the config if it exists. // Currently, we expect only one debug config to be selected. console.assert(configs.length === 1, "More than one debug config is selected."); config = configs[0]; // Keep track of the entry point where the debug config has been selected, for telemetry purposes. config.debuggerEvent = DebuggerEvent.debugPanel; config.configSource = folder ? ConfigSource.workspaceFolder : ConfigSource.singleFile; + config.noDebug = noDebug; } } diff --git a/Extension/src/Debugger/configurations.ts b/Extension/src/Debugger/configurations.ts index 96895c6da..d3c0acaf6 100644 --- a/Extension/src/Debugger/configurations.ts +++ b/Extension/src/Debugger/configurations.ts @@ -97,7 +97,7 @@ function createLaunchString(name: string, type: string, executable: string): str "stopAtEntry": false, "cwd": "$\{fileDirname\}", "environment": [], -${ type === "cppdbg" ? `"externalConsole": false` : `"console": "externalTerminal"` } +${type === "cppdbg" ? `"externalConsole": false` : `"console": "internalConsole"`} `; } @@ -164,7 +164,7 @@ export class MIConfigurations extends Configuration { \t${indentJsonString(createLaunchString(name, this.miDebugger, this.executable))}, \t"MIMode": "${this.MIMode}"{0}{1} }`, [this.miDebugger === "cppdbg" && os.platform() === "win32" ? `,${os.EOL}\t"miDebuggerPath": "/path/to/gdb"` : "", - this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]); + this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]); return { "label": configPrefix + name, @@ -182,7 +182,7 @@ export class MIConfigurations extends Configuration { \t${indentJsonString(createAttachString(name, this.miDebugger, this.executable))} \t"MIMode": "${this.MIMode}"{0}{1} }`, [this.miDebugger === "cppdbg" && os.platform() === "win32" ? `,${os.EOL}\t"miDebuggerPath": "/path/to/gdb"` : "", - this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]); + this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]); return { "label": configPrefix + name, diff --git a/Extension/src/Debugger/debugAdapterDescriptorFactory.ts b/Extension/src/Debugger/debugAdapterDescriptorFactory.ts index d43d71bc3..90657bb90 100644 --- a/Extension/src/Debugger/debugAdapterDescriptorFactory.ts +++ b/Extension/src/Debugger/debugAdapterDescriptorFactory.ts @@ -7,11 +7,13 @@ import * as os from 'os'; import * as path from 'path'; import * as vscode from "vscode"; import * as nls from 'vscode-nls'; +import { getOutputChannel } from '../logger'; +import { RunWithoutDebuggingAdapter } from './runWithoutDebuggingAdapter'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); -// Registers DebugAdapterDescriptorFactory for `cppdbg` and `cppvsdbg`. If it is not ready, it will prompt a wait for the download dialog. +// Registers DebugAdapterDescriptorFactory for `cppdbg` and `cppvsdbg`. // NOTE: This file is not automatically tested. abstract class AbstractDebugAdapterDescriptorFactory implements vscode.DebugAdapterDescriptorFactory { @@ -26,8 +28,15 @@ abstract class AbstractDebugAdapterDescriptorFactory implements vscode.DebugAdap } export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory { + async createDebugAdapterDescriptor(session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): Promise { + if (session.configuration.noDebug) { + if (noDebugSupported(session.configuration)) { + return new vscode.DebugAdapterInlineImplementation(new RunWithoutDebuggingAdapter()); + } + // If the configuration is not supported, gracefully fall back to a regular debug session and log a message to the user. + logReasonForNoDebugNotSupported(session.configuration); + } - async createDebugAdapterDescriptor(_session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): Promise { const adapter: string = "./debugAdapters/bin/OpenDebugAD7" + (os.platform() === 'win32' ? ".exe" : ""); const command: string = path.join(this.context.extensionPath, adapter); @@ -37,8 +46,15 @@ export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDes } export class CppvsdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory { + async createDebugAdapterDescriptor(session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): Promise { + if (session.configuration.noDebug) { + if (noDebugSupported(session.configuration)) { + return new vscode.DebugAdapterInlineImplementation(new RunWithoutDebuggingAdapter()); + } + // If the configuration is not supported, gracefully fall back to a regular debug session and log a message to the user. + logReasonForNoDebugNotSupported(session.configuration); + } - async createDebugAdapterDescriptor(_session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): Promise { if (os.platform() !== 'win32') { void vscode.window.showErrorMessage(localize("debugger.not.available", "Debugger type '{0}' is not available for non-Windows machines.", "cppvsdbg")); return null; @@ -50,3 +66,28 @@ export class CppvsdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterD } } } + +function noDebugSupported(configuration: vscode.DebugConfiguration): boolean { + // Don't attempt to start a noDebug session if the configuration has any of these properties, which require a debug adapter to function. + return configuration.request === 'launch' && !configuration.pipeTransport && !configuration.debugServerPath && !configuration.miDebuggerServerAddress && !configuration.coreDumpPath; +} + +function logReasonForNoDebugNotSupported(configuration: vscode.DebugConfiguration): void { + const outputChannel = getOutputChannel(); + if (configuration.request !== 'launch') { + outputChannel.appendLine(localize("debugger.noDebug.requestType.not.supported", "Run Without Debugging is only supported for launch configurations.")); + } + if (configuration.pipeTransport) { + outputChannel.appendLine(localize("debugger.noDebug.pipeTransport.not.supported", "Run Without Debugging is not supported for configurations with 'pipeTransport' set.")); + } + if (configuration.debugServerPath) { + outputChannel.appendLine(localize("debugger.noDebug.debugServerPath.not.supported", "Run Without Debugging is not supported for configurations with 'debugServerPath' set.")); + } + if (configuration.miDebuggerServerAddress) { + outputChannel.appendLine(localize("debugger.noDebug.miDebuggerServerAddress.not.supported", "Run Without Debugging is not supported for configurations with 'miDebuggerServerAddress' set.")); + } + if (configuration.coreDumpPath) { + outputChannel.appendLine(localize("debugger.noDebug.coreDumpPath.not.supported", "Run Without Debugging is not supported for configurations with 'coreDumpPath' set.")); + } + outputChannel.show(true); +} diff --git a/Extension/src/Debugger/runWithoutDebuggingAdapter.ts b/Extension/src/Debugger/runWithoutDebuggingAdapter.ts new file mode 100644 index 000000000..d03cb859a --- /dev/null +++ b/Extension/src/Debugger/runWithoutDebuggingAdapter.ts @@ -0,0 +1,303 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as cp from 'child_process'; +import * as os from 'os'; +import * as path from 'path'; +import * as vscode from 'vscode'; +import * as nls from 'vscode-nls'; +import { buildShellCommandLine, sessionIsWsl } from '../common'; +import { isWindows } from '../constants'; + +nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); +const localize = nls.loadMessageBundle(); + +/** + * A minimal inline Debug Adapter that runs the target program directly without a debug adapter + * when the user invokes "Run Without Debugging". + */ +export class RunWithoutDebuggingAdapter implements vscode.DebugAdapter { + private readonly sendMessageEmitter = new vscode.EventEmitter(); + public readonly onDidSendMessage: vscode.Event = this.sendMessageEmitter.event; + private readonly terminalListeners: vscode.Disposable[] = []; + + private seq: number = 1; + private childProcess?: cp.ChildProcess; + private terminal?: vscode.Terminal; + private terminalExecution?: vscode.TerminalShellExecution; + private hasTerminated: boolean = false; + + public handleMessage(message: vscode.DebugProtocolMessage): void { + const msg = message as { type: string; command: string; seq: number; arguments?: any; }; + if (msg.type === 'request') { + void this.handleRequest(msg); + } + } + + private async handleRequest(request: { command: string; seq: number; arguments?: any; }): Promise { + switch (request.command) { + case 'initialize': + this.sendResponse(request, {}); + this.sendEvent('initialized'); + break; + case 'launch': + await this.launch(request); + break; + case 'configurationDone': + this.sendResponse(request, {}); + break; + case 'disconnect': + case 'terminate': + this.sendResponse(request, {}); + break; + default: + this.sendResponse(request, {}); + break; + } + } + + private async launch(request: { command: string; seq: number; arguments?: any; }): Promise { + const config = request.arguments as { + program?: string; + args?: string[]; + cwd?: string; + environment?: { name: string; value: string; }[]; + console?: string; + externalConsole?: boolean; + }; + + const program: string = config.program ?? ''; + const args: string[] = config.args ?? []; + const cwd: string | undefined = config.cwd; + const environment: { name: string; value: string; }[] = config.environment ?? []; + const consoleMode: string = config.console ?? (config.externalConsole ? 'externalTerminal' : 'integratedTerminal'); + + // Merge the launch config's environment variables on top of the inherited process environment. + const env: NodeJS.ProcessEnv = { ...process.env }; + for (const e of environment) { + env[e.name] = e.value; + } + + this.sendResponse(request, {}); + + if (consoleMode === 'integratedTerminal' || consoleMode === 'internalConsole') { + await this.launchIntegratedTerminal(program, args, cwd, env); + } else if (consoleMode === 'externalTerminal') { + this.launchExternalTerminal(program, args, cwd, env); + } + } + + /** + * Launch the program in a VS Code integrated terminal. + * The terminal will remain open after the program exits and be reused for the next session, if applicable. + */ + private async launchIntegratedTerminal(program: string, args: string[], cwd: string | undefined, env: NodeJS.ProcessEnv): Promise { + const terminalName = path.normalize(program); + const existingTerminal = vscode.window.terminals.find(t => t.name === terminalName); + this.terminal = existingTerminal ?? vscode.window.createTerminal({ + name: terminalName, + cwd, + env: env as Record + }); + this.terminal.show(true); + + const shellIntegration: vscode.TerminalShellIntegration | undefined = + this.terminal.shellIntegration ?? await this.waitForShellIntegration(this.terminal, 3000); + + // Not all terminals support shell integration. If it's not available, we'll just send the command as text though we won't be able to monitor its execution. + if (shellIntegration) { + this.monitorIntegratedTerminal(this.terminal); + let executable: string = program; + let executableArgs: string[] = args; + if (!program.match(/["']/) && program.match(/\s/)) { + // VS Code does not automatically quote the program path if it has spaces. + const shellPath: string | undefined = 'shellPath' in this.terminal.creationOptions + ? this.terminal.creationOptions.shellPath?.toLowerCase() + : undefined; + const terminalShell: string | undefined = this.terminal.state.shell?.toLowerCase(); + const defaultTerminalProfile: string | undefined = isWindows + ? vscode.workspace.getConfiguration('terminal.integrated').get('defaultProfile.windows')?.toLowerCase() + : undefined; + const isPowerShell: boolean | undefined = + shellPath?.endsWith('pwsh.exe') || shellPath?.endsWith('powershell.exe') || shellPath?.endsWith('pwsh') || + terminalShell?.includes('powershell') || terminalShell?.includes('pwsh') || + defaultTerminalProfile?.includes('powershell') || defaultTerminalProfile?.includes('pwsh'); + + if (isPowerShell || (isWindows && isPowerShell === undefined)) { // PowerShell is the default on Windows if we can't determine the shell. + executable = '&'; + executableArgs = [program, ...args]; + } else { + executable = `"${program}"`; + } + } + this.terminalExecution = shellIntegration.executeCommand(executable, executableArgs); + } else { + const cmdLine: string = buildShellCommandLine('', program, args, true); + this.terminal.sendText(cmdLine); + + // The terminal manages its own lifecycle; notify VS Code the "debug" session is done. + this.sendEvent('terminated'); + } + } + + /** + * Launch the program in an external terminal. We do not keep track of this terminal or the spawned process. + */ + private launchExternalTerminal(program: string, args: string[], cwd: string | undefined, env: NodeJS.ProcessEnv): void { + const cmdLine: string = buildShellCommandLine('', program, args, true); + const platform: string = os.platform(); + if (platform === 'win32') { + cp.spawn('cmd.exe', ['/c', 'start', 'cmd.exe', '/K', `"${cmdLine}"`], { cwd, env, windowsVerbatimArguments: true, detached: true, stdio: 'ignore' }).unref(); + } else if (platform === 'darwin') { + cp.spawn('osascript', ['-e', `tell application "Terminal" to do script "${this.escapeQuotes(cmdLine)}"`], { cwd, env, detached: true, stdio: 'ignore' }).unref(); + } else if (platform === 'linux' && sessionIsWsl()) { + cp.spawn('/mnt/c/Windows/System32/cmd.exe', ['/c', 'start', 'bash', '-c', `${cmdLine};read -p 'Press enter to continue...'`], { env, detached: true, stdio: 'ignore' }).unref(); + } else { // platform === 'linux' + this.launchLinuxExternalTerminal(cmdLine, cwd, env); + } + this.sendEvent('terminated'); + } + + /** + * On Linux, find and launch an available terminal emulator to run the command. + */ + private launchLinuxExternalTerminal(cmdLine: string, cwd: string | undefined, env: NodeJS.ProcessEnv): void { + const bashCmd = `${cmdLine}; echo; read -p 'Press enter to continue...'`; + const bashArgs = ['bash', '-c', bashCmd]; + + // Terminal emulators in order of preference, with the correct flag style for each. + const candidates: { cmd: string; buildArgs(): string[] }[] = [ + { cmd: 'x-terminal-emulator', buildArgs: () => ['-e', ...bashArgs] }, + { cmd: 'gnome-terminal', buildArgs: () => ['-e', ...bashArgs] }, + { cmd: 'konsole', buildArgs: () => ['-e', ...bashArgs] }, + { cmd: 'xterm', buildArgs: () => ['-e', ...bashArgs] } + ]; + + // Honor the $TERMINAL environment variable if set. + const terminalEnv = process.env['TERMINAL']; + if (terminalEnv) { + candidates.unshift({ cmd: terminalEnv, buildArgs: () => ['-e', ...bashArgs] }); + } + + for (const candidate of candidates) { + try { + const result = cp.spawnSync('which', [candidate.cmd], { stdio: 'pipe' }); + if (result.status === 0) { + cp.spawn(candidate.cmd, candidate.buildArgs(), { cwd, env, detached: true, stdio: 'ignore' }).unref(); + return; + } + } catch { + continue; + } + } + + const message = localize({ key: 'no.terminal.emulator', comment: ['{Locked="$TERMINAL"} {Locked="x-terminal-emulator"} {Locked="gnome-terminal"} {Locked="konsole"} {Locked="xterm"}'] }, + 'No terminal emulator found. Please set the $TERMINAL environment variable to your terminal emulator of choice, or install one of the following: x-terminal-emulator, gnome-terminal, konsole, xterm.'); + vscode.window.showErrorMessage(message); + } + + private escapeQuotes(arg: string): string { + return arg.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); + } + + private waitForShellIntegration(terminal: vscode.Terminal, timeoutMs: number): Promise { + return new Promise(resolve => { + let resolved: boolean = false; + const done = (shellIntegration: vscode.TerminalShellIntegration | undefined): void => { + if (resolved) { + return; + } + + resolved = true; + clearTimeout(timeout); + shellIntegrationChanged.dispose(); + terminalClosed.dispose(); + resolve(shellIntegration); + }; + + const timeout = setTimeout(() => done(undefined), timeoutMs); + const shellIntegrationChanged = vscode.window.onDidChangeTerminalShellIntegration(event => { + if (event.terminal === terminal) { + done(event.shellIntegration); + } + }); + const terminalClosed = vscode.window.onDidCloseTerminal(closedTerminal => { + if (closedTerminal === terminal) { + done(undefined); + } + }); + }); + } + + private monitorIntegratedTerminal(terminal: vscode.Terminal): void { + this.disposeTerminalListeners(); + this.terminalListeners.push( + vscode.window.onDidEndTerminalShellExecution(event => { + if (event.terminal !== terminal || event.execution !== this.terminalExecution || this.hasTerminated) { + return; + } + + if (event.exitCode !== undefined) { + this.sendEvent('exited', { exitCode: event.exitCode }); + } + + this.sendEvent('terminated'); + }), + vscode.window.onDidCloseTerminal(closedTerminal => { + if (closedTerminal !== terminal || this.hasTerminated) { + return; + } + + this.sendEvent('terminated'); + }) + ); + } + + private disposeTerminalListeners(): void { + while (this.terminalListeners.length > 0) { + this.terminalListeners.pop()?.dispose(); + } + } + + private sendResponse(request: { command: string; seq: number; }, body: object): void { + this.sendMessageEmitter.fire({ + type: 'response', + seq: this.seq++, + request_seq: request.seq, + success: true, + command: request.command, + body + } as vscode.DebugProtocolMessage); + } + + private sendEvent(event: string, body?: object): void { + if (event === 'terminated') { + if (this.hasTerminated) { + return; + } + + this.hasTerminated = true; + this.disposeTerminalListeners(); + } + + this.sendMessageEmitter.fire({ + type: 'event', + seq: this.seq++, + event, + body + } as vscode.DebugProtocolMessage); + } + + public dispose(): void { + this.terminateProcess(); + this.disposeTerminalListeners(); + this.sendMessageEmitter.dispose(); + } + + private terminateProcess(): void { + this.childProcess?.kill(); + this.childProcess = undefined; + } +} diff --git a/Extension/src/LanguageServer/Providers/CopilotHoverProvider.ts b/Extension/src/LanguageServer/Providers/CopilotHoverProvider.ts index b04e17cd3..7469fd570 100644 --- a/Extension/src/LanguageServer/Providers/CopilotHoverProvider.ts +++ b/Extension/src/LanguageServer/Providers/CopilotHoverProvider.ts @@ -27,6 +27,7 @@ export class CopilotHoverProvider implements vscode.HoverProvider { private cancelledPosition: vscode.Position | undefined; private content: string | undefined; private chatModel: vscode.LanguageModelChat | undefined; + private chatModelId: string | undefined; // Save the selected model ID to avoid trying the same unavailable model repeatedly. // Flag to avoid querying the LanguageModelChat repeatedly if no model is found private checkedChatModel: boolean = false; constructor(client: DefaultClient) { @@ -41,7 +42,30 @@ export class CopilotHoverProvider implements vscode.HoverProvider { const vscodelm = getVSCodeLanguageModel(); if (vscodelm) { try { - const [model] = await vscodelm.selectChatModels(modelSelector); + let model: vscode.LanguageModelChat | undefined; + if (this.chatModelId === undefined) { + // First look for GPT-4o which should be available to all + // users and have a 0x multiplier on paid plans. + // GPT-4o is faster than the x0 GPT-5-mini (which seems too slow for hover, e.g. 10+ seconds). + this.chatModelId = 'gpt-4o'; + [model] = await vscodelm.selectChatModels({ ...modelSelector, id: this.chatModelId }); + if (!model) { + // If GPT-4o is not available, fallback to GPT-5.4-mini (x0.33 and fast). + this.chatModelId = 'gpt-5.4-mini'; + [model] = await vscodelm.selectChatModels({ ...modelSelector, id: this.chatModelId }); + } + if (!model) { + // If GPT-5.4-mini is not available, fallback to the first available model. + this.chatModelId = 'default'; + [model] = await vscodelm.selectChatModels(modelSelector); + } + } else { + if (this.chatModelId === 'default') { + [model] = await vscodelm.selectChatModels(modelSelector); + } else { + [model] = await vscodelm.selectChatModels({ ...modelSelector, id: this.chatModelId }); + } + } if (!model) { telemetry.logLanguageServerEvent('CopilotHoverNoModelSelected', { remoteName: vscode.env.remoteName || 'local' }); } else { diff --git a/Extension/src/LanguageServer/Providers/callHierarchyProvider.ts b/Extension/src/LanguageServer/Providers/callHierarchyProvider.ts index 6c6d39f07..61b7b110b 100644 --- a/Extension/src/LanguageServer/Providers/callHierarchyProvider.ts +++ b/Extension/src/LanguageServer/Providers/callHierarchyProvider.ts @@ -88,6 +88,129 @@ const CallHierarchyCallsToRequest: RequestType = new RequestType('cpptools/callHierarchyCallsFrom'); +function makeVscodeCallHierarchyItem(client: DefaultClient, item: CallHierarchyItem): vscode.CallHierarchyItem { + const containerDetail: string = (item.detail !== "") ? `${item.detail} - ` : ""; + const itemUri: vscode.Uri = vscode.Uri.file(item.file); + + // Get file detail + const isInWorkspace: boolean = client.RootUri !== undefined && + itemUri.fsPath.startsWith(client.RootUri.fsPath); + const dirPath: string = isInWorkspace ? + path.relative(client.RootPath, path.dirname(item.file)) : path.dirname(item.file); + const fileDetail: string = dirPath.length === 0 ? + `${path.basename(item.file)}` : `${path.basename(item.file)} (${dirPath})`; + + return new vscode.CallHierarchyItem( + item.kind, + item.name, + containerDetail + fileDetail, + itemUri, + makeVscodeRange(item.range), + makeVscodeRange(item.selectionRange)); +} + +function createIncomingCalls(client: DefaultClient, calls: CallHierarchyCallsItem[]): vscode.CallHierarchyIncomingCall[] { + const result: vscode.CallHierarchyIncomingCall[] = []; + + for (const call of calls) { + const item: vscode.CallHierarchyItem = makeVscodeCallHierarchyItem(client, call.item); + const ranges: vscode.Range[] = []; + call.fromRanges.forEach(r => { + ranges.push(makeVscodeRange(r)); + }); + + const incomingCall: vscode.CallHierarchyIncomingCall = + new vscode.CallHierarchyIncomingCall(item, ranges); + result.push(incomingCall); + } + + return result; +} + +function createOutgoingCalls(client: DefaultClient, calls: CallHierarchyCallsItem[]): vscode.CallHierarchyOutgoingCall[] { + const result: vscode.CallHierarchyOutgoingCall[] = []; + + for (const call of calls) { + const item: vscode.CallHierarchyItem = makeVscodeCallHierarchyItem(client, call.item); + const ranges: vscode.Range[] = []; + call.fromRanges.forEach(r => { + ranges.push(makeVscodeRange(r)); + }); + + const outgoingCall: vscode.CallHierarchyOutgoingCall = + new vscode.CallHierarchyOutgoingCall(item, ranges); + result.push(outgoingCall); + } + + return result; +} + +export async function sendPrepareCallHierarchyRequest(client: DefaultClient, uri: vscode.Uri, position: vscode.Position, token: vscode.CancellationToken): Promise { + const params: CallHierarchyParams = { + textDocument: { uri: uri.toString() }, + position: Position.create(position.line, position.character) + }; + let response: CallHierarchyItemResult; + try { + response = await client.languageClient.sendRequest(CallHierarchyItemRequest, params, token); + } catch (e: any) { + if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { + return undefined; + } + throw e; + } + + if (token.isCancellationRequested) { + return undefined; + } + + return response.item === undefined ? [] : [makeVscodeCallHierarchyItem(client, response.item)]; +} + +export async function sendCallHierarchyCallsToRequest(client: DefaultClient, item: vscode.CallHierarchyItem, token: vscode.CancellationToken): Promise { + const params: CallHierarchyParams = { + textDocument: { uri: item.uri.toString() }, + position: Position.create(item.selectionRange.start.line, item.selectionRange.start.character) + }; + let response: CallHierarchyCallsItemResult; + try { + response = await client.languageClient.sendRequest(CallHierarchyCallsToRequest, params, token); + } catch (e: any) { + if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { + return undefined; + } + throw e; + } + + if (token.isCancellationRequested) { + return undefined; + } + + return response.calls.length !== 0 ? createIncomingCalls(client, response.calls) : []; +} + +export async function sendCallHierarchyCallsFromRequest(client: DefaultClient, item: vscode.CallHierarchyItem, token: vscode.CancellationToken): Promise { + const params: CallHierarchyParams = { + textDocument: { uri: item.uri.toString() }, + position: Position.create(item.selectionRange.start.line, item.selectionRange.start.character) + }; + let response: CallHierarchyCallsItemResult; + try { + response = await client.languageClient.sendRequest(CallHierarchyCallsFromRequest, params, token); + } catch (e: any) { + if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { + return undefined; + } + throw e; + } + + if (token.isCancellationRequested) { + return undefined; + } + + return response.calls.length !== 0 ? createOutgoingCalls(client, response.calls) : []; +} + export class CallHierarchyProvider implements vscode.CallHierarchyProvider { // Indicates whether a request is from an entry root node (e.g. top function in the call tree). private isEntryRootNodeTelemetry: boolean = false; @@ -118,20 +241,10 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider { cancelSource.cancel(); }); - const params: CallHierarchyParams = { - textDocument: { uri: document.uri.toString() }, - position: Position.create(position.line, position.character) - }; - let response: CallHierarchyItemResult; + let result: vscode.CallHierarchyItem[] | undefined; try { - response = await this.client.languageClient.sendRequest(CallHierarchyItemRequest, params, cancelSource.token); - } catch (e: any) { - if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { - return undefined; - } - throw e; - } - finally { + result = await sendPrepareCallHierarchyRequest(this.client, document.uri, position, cancelSource.token); + } finally { cancellationTokenListener.dispose(); requestCanceledListener.dispose(); } @@ -139,12 +252,12 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider { if (cancelSource.token.isCancellationRequested) { throw new vscode.CancellationError(); } - if (response.item === undefined) { + if (!result || result.length === 0) { return undefined; } this.isEntryRootNodeTelemetry = true; - return this.makeVscodeCallHierarchyItem(response.item); + return result[0]; } public async provideCallHierarchyIncomingCalls(item: vscode.CallHierarchyItem, token: vscode.CancellationToken): Promise { @@ -172,39 +285,28 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider { // Send the request to the language server. let result: vscode.CallHierarchyIncomingCall[] | undefined; - const params: CallHierarchyParams = { - textDocument: { uri: item.uri.toString() }, - position: Position.create(item.selectionRange.start.line, item.selectionRange.start.character) - }; - let response: CallHierarchyCallsItemResult | undefined; - let cancelled: boolean = false; + let progressBarDuration: number | undefined; try { - response = await this.client.languageClient.sendRequest(CallHierarchyCallsToRequest, params, cancelSource.token); - } catch (e: any) { - cancelled = e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled); - if (!cancelled) { - throw e; - } + result = await sendCallHierarchyCallsToRequest(this.client, item, cancelSource.token); + } finally { + // Reset anything that can be cleared before processing the result. + progressBarDuration = workspaceReferences.getCallHierarchyProgressBarDuration(); + workspaceReferences.resetProgressBar(); + workspaceReferences.resetReferences(); + cancellationTokenListener.dispose(); + requestCanceledListener.dispose(); } - // Reset anything that can be cleared before processing the result. - const progressBarDuration: number | undefined = workspaceReferences.getCallHierarchyProgressBarDuration(); - workspaceReferences.resetProgressBar(); - workspaceReferences.resetReferences(); - cancellationTokenListener.dispose(); - requestCanceledListener.dispose(); // Process the result. - if (cancelSource.token.isCancellationRequested || cancelled || requestCanceled !== undefined) { + if (cancelSource.token.isCancellationRequested || result === undefined || requestCanceled !== undefined) { const requestStatus: CallHierarchyRequestStatus = requestCanceled === CancellationSender.User ? CallHierarchyRequestStatus.CanceledByUser : CallHierarchyRequestStatus.Canceled; this.logTelemetry(CallHierarchyCallsToEvent, requestStatus, progressBarDuration); throw new vscode.CancellationError(); - } else if (response && response.calls.length !== 0) { - result = this.createIncomingCalls(response.calls); } this.logTelemetry(CallHierarchyCallsToEvent, CallHierarchyRequestStatus.Succeeded, progressBarDuration); - return result; + return result.length !== 0 ? result : undefined; } public async provideCallHierarchyOutgoingCalls(item: vscode.CallHierarchyItem, token: vscode.CancellationToken): Promise { @@ -216,87 +318,15 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider { await this.client.ready; - let result: vscode.CallHierarchyOutgoingCall[] | undefined; - const params: CallHierarchyParams = { - textDocument: { uri: item.uri.toString() }, - position: Position.create(item.selectionRange.start.line, item.selectionRange.start.character) - }; - let response: CallHierarchyCallsItemResult | undefined; - let cancelled: boolean = false; - try { - response = await this.client.languageClient.sendRequest(CallHierarchyCallsFromRequest, params, token); - } catch (e: any) { - cancelled = e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled); - if (!cancelled) { - throw e; - } - } - if (token.isCancellationRequested || cancelled) { + const result: vscode.CallHierarchyOutgoingCall[] | undefined = + await sendCallHierarchyCallsFromRequest(this.client, item, token); + if (token.isCancellationRequested || result === undefined) { this.logTelemetry(CallHierarchyCallsFromEvent, CallHierarchyRequestStatus.Canceled); throw new vscode.CancellationError(); - } else if (response && response.calls.length !== 0) { - result = this.createOutgoingCalls(response.calls); } this.logTelemetry(CallHierarchyCallsFromEvent, CallHierarchyRequestStatus.Succeeded); - return result; - } - - private makeVscodeCallHierarchyItem(item: CallHierarchyItem): vscode.CallHierarchyItem { - const containerDetail: string = (item.detail !== "") ? `${item.detail} - ` : ""; - const itemUri: vscode.Uri = vscode.Uri.file(item.file); - - // Get file detail - const isInWorkspace: boolean = this.client.RootUri !== undefined && - itemUri.fsPath.startsWith(this.client.RootUri?.fsPath); - const dirPath: string = isInWorkspace ? - path.relative(this.client.RootPath, path.dirname(item.file)) : path.dirname(item.file); - const fileDetail: string = dirPath.length === 0 ? - `${path.basename(item.file)}` : `${path.basename(item.file)} (${dirPath})`; - - return new vscode.CallHierarchyItem( - item.kind, - item.name, - containerDetail + fileDetail, - itemUri, - makeVscodeRange(item.range), - makeVscodeRange(item.selectionRange)); - } - - private createIncomingCalls(calls: CallHierarchyCallsItem[]): vscode.CallHierarchyIncomingCall[] { - const result: vscode.CallHierarchyIncomingCall[] = []; - - for (const call of calls) { - const item: vscode.CallHierarchyItem = this.makeVscodeCallHierarchyItem(call.item); - const ranges: vscode.Range[] = []; - call.fromRanges.forEach(r => { - ranges.push(makeVscodeRange(r)); - }); - - const incomingCall: vscode.CallHierarchyIncomingCall = - new vscode.CallHierarchyIncomingCall(item, ranges); - result.push(incomingCall); - } - - return result; - } - - private createOutgoingCalls(calls: CallHierarchyCallsItem[]): vscode.CallHierarchyOutgoingCall[] { - const result: vscode.CallHierarchyOutgoingCall[] = []; - - for (const call of calls) { - const item: vscode.CallHierarchyItem = this.makeVscodeCallHierarchyItem(call.item); - const ranges: vscode.Range[] = []; - call.fromRanges.forEach(r => { - ranges.push(makeVscodeRange(r)); - }); - - const outgoingCall: vscode.CallHierarchyOutgoingCall = - new vscode.CallHierarchyOutgoingCall(item, ranges); - result.push(outgoingCall); - } - - return result; + return result.length !== 0 ? result : undefined; } private logTelemetry(eventName: string, requestStatus: CallHierarchyRequestStatus, progressBarDuration?: number): void { diff --git a/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts b/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts index ffdb1cf9e..664cf80c6 100644 --- a/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts +++ b/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts @@ -11,6 +11,50 @@ import { CancellationSender, ReferenceInfo, ReferenceType, ReferencesParams, Ref const FindAllReferencesRequest: RequestType = new RequestType('cpptools/findAllReferences'); +export interface FindAllReferencesResult { + referencesResult: ReferencesResult; + locations: vscode.Location[]; +} + +function convertConfirmedReferencesToLocations(referencesResult: ReferencesResult): vscode.Location[] { + const locationsResult: vscode.Location[] = []; + referencesResult.referenceInfos.forEach((referenceInfo: ReferenceInfo) => { + if (referenceInfo.type === ReferenceType.Confirmed) { + const uri: vscode.Uri = vscode.Uri.file(referenceInfo.file); + const range: vscode.Range = new vscode.Range(referenceInfo.position.line, referenceInfo.position.character, + referenceInfo.position.line, referenceInfo.position.character + referencesResult.text.length); + locationsResult.push(new vscode.Location(uri, range)); + } + }); + return locationsResult; +} + +export async function sendFindAllReferencesRequest(client: DefaultClient, uri: vscode.Uri, position: vscode.Position, token: vscode.CancellationToken): Promise { + const params: ReferencesParams = { + newName: "", + position: Position.create(position.line, position.character), + textDocument: { uri: uri.toString() } + }; + let response: ReferencesResult; + try { + response = await client.languageClient.sendRequest(FindAllReferencesRequest, params, token); + } catch (e: any) { + if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { + return undefined; + } + throw e; + } + + if (token.isCancellationRequested || response.isCanceled) { + return undefined; + } + + return { + referencesResult: response, + locations: convertConfirmedReferencesToLocations(response) + }; +} + export class FindAllReferencesProvider implements vscode.ReferenceProvider { private client: DefaultClient; @@ -29,23 +73,10 @@ export class FindAllReferencesProvider implements vscode.ReferenceProvider { const requestCanceledListener: vscode.Disposable = workspaceReferences.onCancellationRequested(_sender => { cancelSource.cancel(); }); // Send the request to the language server. - const locationsResult: vscode.Location[] = []; - const params: ReferencesParams = { - newName: "", - position: Position.create(position.line, position.character), - textDocument: { uri: document.uri.toString() } - }; - let response: ReferencesResult | undefined; - let cancelled: boolean = false; + let result: FindAllReferencesResult | undefined; try { - response = await this.client.languageClient.sendRequest(FindAllReferencesRequest, params, cancelSource.token); - } catch (e: any) { - cancelled = e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled); - if (!cancelled) { - throw e; - } - } - finally { + result = await sendFindAllReferencesRequest(this.client, document.uri, position, cancelSource.token); + } finally { // Reset anything that can be cleared before processing the result. workspaceReferences.resetProgressBar(); cancellationTokenListener.dispose(); @@ -53,30 +84,21 @@ export class FindAllReferencesProvider implements vscode.ReferenceProvider { } // Process the result. - if (cancelSource.token.isCancellationRequested || cancelled || (response && response.isCanceled)) { + if (cancelSource.token.isCancellationRequested || !result) { // Return undefined instead of vscode.CancellationError to avoid the following error message from VS Code: // "Cannot destructure property 'range' of 'e.location' as it is undefined." // TODO: per issue https://github.com/microsoft/vscode/issues/169698 // vscode.CancellationError is expected, so when VS Code fixes the error use vscode.CancellationError again. workspaceReferences.resetReferences(); return undefined; - } else if (response && response.referenceInfos.length > 0) { - response.referenceInfos.forEach((referenceInfo: ReferenceInfo) => { - if (referenceInfo.type === ReferenceType.Confirmed) { - const uri: vscode.Uri = vscode.Uri.file(referenceInfo.file); - const range: vscode.Range = new vscode.Range(referenceInfo.position.line, referenceInfo.position.character, - referenceInfo.position.line, referenceInfo.position.character + response.text.length); - locationsResult.push(new vscode.Location(uri, range)); - } - }); - + } else if (result.referencesResult.referenceInfos.length > 0) { // Display other reference types in panel or channel view. // Note: ReferencesManager.resetReferences is called in ReferencesManager.showResultsInPanelView - workspaceReferences.showResultsInPanelView(response); + workspaceReferences.showResultsInPanelView(result.referencesResult); } else { workspaceReferences.resetReferences(); } - return locationsResult; + return result.locations; } } diff --git a/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts b/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts new file mode 100644 index 000000000..80fb17c34 --- /dev/null +++ b/Extension/src/LanguageServer/Providers/goToDefinitionProvider.ts @@ -0,0 +1,57 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +import * as vscode from 'vscode'; +import { Definition, DefinitionLink, DefinitionRequest, Position, ResponseError, TextDocumentPositionParams } from 'vscode-languageclient'; +import { DefaultClient } from '../client'; +import { RequestCancelled, ServerCancelled } from '../protocolFilter'; + +function convertDefinitionsToLocations(definitionsResult: vscode.Definition | vscode.DefinitionLink[] | undefined): vscode.Location[] { + if (!definitionsResult) { + return []; + } + + if (!Array.isArray(definitionsResult)) { + return [definitionsResult]; + } + + const result: vscode.Location[] = []; + for (const definition of definitionsResult) { + if (definition instanceof vscode.Location) { + result.push(definition); + } else { + result.push(new vscode.Location(definition.targetUri, definition.targetSelectionRange ?? definition.targetRange)); + } + } + + return result; +} + +export async function sendGoToDefinitionRequest(client: DefaultClient, uri: vscode.Uri, position: vscode.Position, token: vscode.CancellationToken): Promise { + const params: TextDocumentPositionParams = { + position: Position.create(position.line, position.character), + textDocument: { uri: uri.toString() } + }; + let response: Definition | DefinitionLink[] | null; + try { + response = await client.languageClient.sendRequest(DefinitionRequest.type, params, token); + } catch (e: any) { + if (e instanceof ResponseError && (e.code === RequestCancelled || e.code === ServerCancelled)) { + return undefined; + } + throw e; + } + + if (token.isCancellationRequested) { + return undefined; + } + + const result: vscode.Definition | vscode.DefinitionLink[] | undefined = + await client.languageClient.protocol2CodeConverter.asDefinitionResult(response, token); + if (token.isCancellationRequested) { + return undefined; + } + + return convertDefinitionsToLocations(result); +} diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 9fd268013..680c14749 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -1537,6 +1537,7 @@ export class DefaultClient implements Client { vcFormatSpaceAroundTernaryOperator: settings.vcFormatSpaceAroundTernaryOperator, vcFormatWrapPreserveBlocks: settings.vcFormatWrapPreserveBlocks, doxygenGenerateOnType: settings.doxygenGenerateOnType, + doxygenGenerateOnCodeAction: settings.doxygenGenerateOnCodeAction, doxygenGeneratedStyle: settings.doxygenGeneratedCommentStyle, doxygenSectionTags: settings.doxygenSectionTags, filesExclude: otherSettings.filesExclude, diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index f4d3417b2..79f89f9d6 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -23,6 +23,9 @@ import { getCrashCallStacksChannel } from '../logger'; import { PlatformInformation } from '../platform'; import * as telemetry from '../telemetry'; import { CopilotHoverProvider } from './Providers/CopilotHoverProvider'; +import { sendCallHierarchyCallsFromRequest, sendCallHierarchyCallsToRequest, sendPrepareCallHierarchyRequest } from './Providers/callHierarchyProvider'; +import { sendFindAllReferencesRequest } from './Providers/findAllReferencesProvider'; +import { sendGoToDefinitionRequest } from './Providers/goToDefinitionProvider'; import { Client, DefaultClient, DoxygenCodeActionCommandArguments, openFileVersions } from './client'; import { ClientCollection } from './clientCollection'; import { CodeActionDiagnosticInfo, CodeAnalysisDiagnosticIdentifiersAndUri, codeAnalysisAllFixes, codeAnalysisCodeToFixes, codeAnalysisFileToCodeActions } from './codeAnalysis'; @@ -272,6 +275,7 @@ export async function activate(): Promise { } await registerRelatedFilesProvider(); + await vscode.commands.executeCommand('setContext', 'cpptools.languageServerActivated', true); } export function updateLanguageConfigurations(): void { @@ -397,6 +401,11 @@ export async function registerCommands(enabled: boolean): Promise { commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowActiveCodeAnalysisCommands', enabled ? onShowActiveCodeAnalysisCommands : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowIdleCodeAnalysisCommands', enabled ? onShowIdleCodeAnalysisCommands : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowReferencesProgress', enabled ? onShowReferencesProgress : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.FindAllReferences', enabled ? onFindAllReferences : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.GoToDefinition', enabled ? onGoToDefinition : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.PrepareCallHierarchy', enabled ? onPrepareCallHierarchy : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CallHierarchyCallsTo', enabled ? onCallHierarchyCallsTo : onDisabledCommand)); + commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CallHierarchyCallsFrom', enabled ? onCallHierarchyCallsFrom : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.TakeSurvey', enabled ? onTakeSurvey : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.LogDiagnostics', enabled ? onLogDiagnostics : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.RescanWorkspace', enabled ? onRescanWorkspace : onDisabledCommand)); @@ -808,6 +817,77 @@ function onShowReferencesProgress(): void { void clients.ActiveClient.handleReferencesIcon().catch(logAndReturn.undefined); } +async function onFindAllReferences(uri: vscode.Uri, position: vscode.Position, token?: vscode.CancellationToken): Promise { + if (!uri || !position) { + throw new Error("C_Cpp.FindAllReferences requires both a uri and position."); + } + + const client: Client = clients.getClientFor(uri); + if (!(client instanceof DefaultClient)) { + return undefined; + } + + await client.ready; + const result = await sendFindAllReferencesRequest(client, uri, position, token ?? CancellationToken.None); + return result?.locations; +} + +async function onGoToDefinition(uri: vscode.Uri, position: vscode.Position, token?: vscode.CancellationToken): Promise { + if (!uri || !position) { + throw new Error("C_Cpp.GoToDefinition requires both a uri and position."); + } + + const client: Client = clients.getClientFor(uri); + if (!(client instanceof DefaultClient)) { + return undefined; + } + + await client.ready; + return sendGoToDefinitionRequest(client, uri, position, token ?? CancellationToken.None); +} + +async function onPrepareCallHierarchy(uri: vscode.Uri, position: vscode.Position, token?: vscode.CancellationToken): Promise { + if (!uri || !position) { + throw new Error("C_Cpp.PrepareCallHierarchy requires both a uri and position."); + } + + const client: Client = clients.getClientFor(uri); + if (!(client instanceof DefaultClient)) { + return undefined; + } + + await client.ready; + return sendPrepareCallHierarchyRequest(client, uri, position, token ?? CancellationToken.None); +} + +async function onCallHierarchyCallsTo(item: vscode.CallHierarchyItem, token?: vscode.CancellationToken): Promise { + if (!item) { + throw new Error("C_Cpp.CallHierarchyCallsTo requires an item."); + } + + const client: Client = clients.getClientFor(item.uri); + if (!(client instanceof DefaultClient)) { + return undefined; + } + + await client.ready; + return sendCallHierarchyCallsToRequest(client, item, token ?? CancellationToken.None); +} + +async function onCallHierarchyCallsFrom(item: vscode.CallHierarchyItem, token?: vscode.CancellationToken): Promise { + if (!item) { + throw new Error("C_Cpp.CallHierarchyCallsFrom requires an item."); + } + + const client: Client = clients.getClientFor(item.uri); + if (!(client instanceof DefaultClient)) { + return undefined; + } + + await client.ready; + return sendCallHierarchyCallsFromRequest(client, item, token ?? CancellationToken.None); +} + function onToggleRefGroupView(): void { // Set context to switch icons const client: Client = getActiveClient(); diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 881423789..a80d54347 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -126,6 +126,7 @@ export interface WorkspaceFolderSettingsParams { vcFormatSpaceAroundTernaryOperator: string; vcFormatWrapPreserveBlocks: string; doxygenGenerateOnType: boolean; + doxygenGenerateOnCodeAction: boolean; doxygenGeneratedStyle: string; doxygenSectionTags: string[]; filesExclude: Excludes; @@ -383,6 +384,7 @@ export class CppSettings extends Settings { public get simplifyStructuredComments(): boolean { return this.getAsBoolean("simplifyStructuredComments"); } public get doxygenGeneratedCommentStyle(): string { return this.getAsString("doxygen.generatedStyle"); } public get doxygenGenerateOnType(): boolean { return this.getAsBoolean("doxygen.generateOnType"); } + public get doxygenGenerateOnCodeAction(): boolean { return this.getAsBoolean("doxygen.generateOnCodeAction"); } public get commentContinuationPatterns(): (string | CommentPattern)[] { const value: any = super.Section.get("commentContinuationPatterns"); if (this.isArrayOfCommentContinuationPatterns(value)) { diff --git a/Extension/src/common.ts b/Extension/src/common.ts index 849f4d6f3..c84f94290 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -1549,7 +1549,6 @@ export function hasMsvcEnvironment(): boolean { 'INCLUDE', 'LIB', 'LIBPATH', - 'UCRTVersion', 'UniversalCRTSdkDir', 'VCIDEInstallDir', 'VCINSTALLDIR', @@ -1568,6 +1567,34 @@ export function hasMsvcEnvironment(): boolean { ); } +export function getMissingMsvcEnvironmentVariables(): string[] { + const msvcEnvVars: string[] = [ + 'DevEnvDir', + 'Framework40Version', + 'FrameworkDir', + 'FrameworkVersion', + 'INCLUDE', + 'LIB', + 'LIBPATH', + 'UCRTVersion', + 'UniversalCRTSdkDir', + 'VCIDEInstallDir', + 'VCINSTALLDIR', + 'VCToolsRedistDir', + 'VisualStudioVersion', + 'VSINSTALLDIR', + 'WindowsLibPath', + 'WindowsSdkBinPath', + 'WindowsSdkDir', + 'WindowsSDKLibVersion', + 'WindowsSDKVersion' + ]; + return msvcEnvVars.filter(envVarName => + (process.env[envVarName] === undefined || process.env[envVarName] === '') && + extensionContext?.environmentVariableCollection?.get(envVarName) === undefined + ); +} + function isIntegral(str: string): boolean { const regex = /^-?\d+$/; return regex.test(str); @@ -1668,7 +1695,7 @@ export interface IQuotedString { export type CommandString = string | IQuotedString; -export function buildShellCommandLine(originalCommand: CommandString, command: CommandString, args: CommandString[]): string { +export function buildShellCommandLine(originalCommand: CommandString, command: CommandString, args: CommandString[], singleCommandOnly: boolean = false): string { let shellQuoteOptions: IShellQuotingOptions; const isWindows: boolean = os.platform() === 'win32'; @@ -1782,7 +1809,7 @@ export function buildShellCommandLine(originalCommand: CommandString, command: C let commandLine = result.join(' '); // There are special rules quoted command line in cmd.exe - if (isWindows) { + if (isWindows && !singleCommandOnly) { commandLine = `chcp 65001>nul && ${commandLine}`; if (commandQuoted && argQuoted) { commandLine = '"' + commandLine + '"'; @@ -1850,3 +1877,14 @@ export function getVSCodeLanguageModel(): any | undefined { } return vscodelm; } + +export function sessionIsWsl(): boolean { + if (process.env.WSL_DISTRO_NAME) { + return true; + } + try { + return fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft'); + } catch { + return false; + } +} diff --git a/Extension/test/scenarios/RunWithoutDebugging/assets/argsTest.cpp b/Extension/test/scenarios/RunWithoutDebugging/assets/argsTest.cpp new file mode 100644 index 000000000..aef910aef --- /dev/null +++ b/Extension/test/scenarios/RunWithoutDebugging/assets/argsTest.cpp @@ -0,0 +1,21 @@ +#include + +int main(int argc, char *argv[]) { + if (argc < 2) { + return 1; + } + + std::ofstream resultFile(argv[1]); + if (!resultFile) { + return 2; + } + + for (int i = 2; i < argc; ++i) { + resultFile << argv[i]; + if (i + 1 < argc) { + resultFile << '\n'; + } + } + + return 0; +} diff --git a/Extension/test/scenarios/RunWithoutDebugging/assets/debugTest.cpp b/Extension/test/scenarios/RunWithoutDebugging/assets/debugTest.cpp new file mode 100644 index 000000000..77020e3e5 --- /dev/null +++ b/Extension/test/scenarios/RunWithoutDebugging/assets/debugTest.cpp @@ -0,0 +1,11 @@ +#include + +int main() { + std::ofstream resultFile("runWithoutDebuggingResult.txt"); + if (!resultFile) { + return 1; + } + + resultFile << 37; + return 0; +} diff --git a/Extension/test/scenarios/RunWithoutDebugging/tests/compileProgram.ts b/Extension/test/scenarios/RunWithoutDebugging/tests/compileProgram.ts new file mode 100644 index 000000000..4c71ad62c --- /dev/null +++ b/Extension/test/scenarios/RunWithoutDebugging/tests/compileProgram.ts @@ -0,0 +1,72 @@ +/* -------------------------------------------------------------------------------------------- + * 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 * as cp from 'child_process'; +import * as vscode from 'vscode'; +import * as util from '../../../../src/common'; +import { isLinux, isMacOS, isWindows } from '../../../../src/constants'; +import { getEffectiveEnvironment } from '../../../../src/LanguageServer/devcmd'; + +interface ProcessResult { + code: number | null; + stdout: string; + stderr: string; +} + +function runProcess(command: string, args: string[], cwd: string, env?: NodeJS.ProcessEnv): Promise { + return new Promise((resolve, reject) => { + const child = cp.spawn(command, args, { cwd, env }); + let stdout = ''; + let stderr = ''; + + child.stdout.on('data', (data: Buffer) => { + stdout += data.toString(); + }); + + child.stderr.on('data', (data: Buffer) => { + stderr += data.toString(); + }); + + child.on('error', reject); + child.on('close', (code) => resolve({ code, stdout, stderr })); + }); +} + +async function setWindowsBuildEnvironment(): Promise { + const promise = vscode.commands.executeCommand('C_Cpp.SetVsDeveloperEnvironment', 'test'); + const timer = setInterval(() => { + void vscode.commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + }, 1000); + await promise; + clearInterval(timer); + const missingVars = util.getMissingMsvcEnvironmentVariables(); + assert.strictEqual(missingVars.length, 0, `MSVC environment missing: ${missingVars.join(', ')}`); +} + +export async function compileProgram(workspacePath: string, sourcePath: string, outputPath: string): Promise { + if (isWindows) { + await setWindowsBuildEnvironment(); + const env = getEffectiveEnvironment(); + const result = await runProcess('cl.exe', ['/nologo', '/EHsc', '/Zi', '/std:c++17', `/Fe:${outputPath}`, sourcePath], workspacePath, env); + assert.strictEqual(result.code, 0, `MSVC compilation failed. stdout: ${result.stdout}\nstderr: ${result.stderr}`); + return; + } + + if (isMacOS) { + const result = await runProcess('clang++', ['-std=c++17', '-g', sourcePath, '-o', outputPath], workspacePath); + assert.strictEqual(result.code, 0, `clang++ compilation failed. stdout: ${result.stdout}\nstderr: ${result.stderr}`); + return; + } + + if (isLinux) { + const result = await runProcess('g++', ['-std=c++17', '-g', sourcePath, '-o', outputPath], workspacePath); + assert.strictEqual(result.code, 0, `g++ compilation failed. stdout: ${result.stdout}\nstderr: ${result.stderr}`); + return; + } + + assert.fail(`Unsupported test platform: ${process.platform}`); +} diff --git a/Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.integration.test.ts b/Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.integration.test.ts new file mode 100644 index 000000000..53542e36e --- /dev/null +++ b/Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.integration.test.ts @@ -0,0 +1,267 @@ +/* -------------------------------------------------------------------------------------------- + * 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 util from '../../../../src/common'; +import { isMacOS, isWindows } from '../../../../src/constants'; +import { compileProgram } from './compileProgram'; + +interface TrackerState { + setBreakpointsRequestReceived: boolean; + stoppedEventReceived: boolean; + exitedEventReceived: boolean; + exitedBeforeStop: boolean; +} + +interface TrackerController { + state: TrackerState; + lastEvent: Promise<'stopped' | 'exited'>; + dispose(): void; +} + +async function createBreakpointAtResultWriteStatement(sourceUri: vscode.Uri): Promise { + const document = await vscode.workspace.openTextDocument(sourceUri); + const resultWriteLine = document.getText().split(/\r?\n/).findIndex((line) => line.includes('resultFile << 37;')); + assert.notStrictEqual(resultWriteLine, -1, 'Unable to find expected result-write statement for breakpoint placement.'); + const breakpoint = new vscode.SourceBreakpoint(new vscode.Location(sourceUri, new vscode.Position(resultWriteLine, 0)), true); + vscode.debug.addBreakpoints([breakpoint]); + return breakpoint; +} + +function createSessionTerminatedPromise(sessionName: string): Promise { + return new Promise((resolve) => { + const terminateSubscription = vscode.debug.onDidTerminateDebugSession((session) => { + if (session.name === sessionName) { + terminateSubscription.dispose(); + resolve(); + } + }); + }); +} + +function createTracker(debugType: string, sessionName: string, timeoutMs: number, timeoutMessage: string): TrackerController { + const state: TrackerState = { + setBreakpointsRequestReceived: false, + stoppedEventReceived: false, + exitedEventReceived: false, + exitedBeforeStop: false + }; + + let trackerRegistration: vscode.Disposable | undefined; + let timeoutHandle: NodeJS.Timeout | undefined; + + const lastEvent = new Promise<'stopped' | 'exited'>((resolve, reject) => { + timeoutHandle = setTimeout(() => { + trackerRegistration?.dispose(); + trackerRegistration = undefined; + reject(new Error(timeoutMessage)); + }, timeoutMs); + + trackerRegistration = vscode.debug.registerDebugAdapterTrackerFactory(debugType, { + createDebugAdapterTracker: (session: vscode.DebugSession): vscode.DebugAdapterTracker | undefined => { + if (session.name !== sessionName) { + return undefined; + } + + return { + onWillReceiveMessage: (message: any): void => { + if (message?.type === 'request' && message?.command === 'setBreakpoints') { + state.setBreakpointsRequestReceived = true; + } + }, + onDidSendMessage: (message: any): void => { + if (message?.type !== 'event') { + return; + } + + if (message.event === 'stopped') { + state.stoppedEventReceived = true; + if (timeoutHandle) { + clearTimeout(timeoutHandle); + timeoutHandle = undefined; + } + resolve('stopped'); + } + + if ((message.event === 'terminated' || message.event === 'exited') && !state.exitedEventReceived) { + state.exitedEventReceived = true; + if (!state.stoppedEventReceived) { + state.exitedBeforeStop = true; + } + if (timeoutHandle) { + clearTimeout(timeoutHandle); + timeoutHandle = undefined; + } + resolve('exited'); + } + } + }; + } + }); + }); + + return { + state, + lastEvent, + dispose(): void { + if (timeoutHandle) { + clearTimeout(timeoutHandle); + timeoutHandle = undefined; + } + trackerRegistration?.dispose(); + trackerRegistration = undefined; + } + }; +} + +async function waitForResultFileValue(filePath: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastContents = ''; + + while (Date.now() < deadline) { + try { + lastContents = await util.readFileText(filePath, 'utf8'); + const trimmedContents = lastContents.trim(); + if (trimmedContents.length > 0) { + const value = Number.parseInt(trimmedContents, 10); + if (!Number.isNaN(value)) { + return value; + } + } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error; + } + } + + await new Promise(resolve => setTimeout(resolve, 100)); + } + + assert.fail(`Timed out waiting for numeric result in ${filePath}. Last contents: ${lastContents}`); +} + +suite('Run Without Debugging Test', function (): void { + const expectedResultValue = 37; + const workspaceFolder = vscode.workspace.workspaceFolders?.[0] ?? assert.fail('No workspace folder available'); + const workspacePath = workspaceFolder.uri.fsPath; + const sourceFile = path.join(workspacePath, 'debugTest.cpp'); + const sourceUri = vscode.Uri.file(sourceFile); + const resultFilePath = path.join(workspacePath, 'runWithoutDebuggingResult.txt'); + const executableName = isWindows ? 'debugTestProgram.exe' : 'debugTestProgram'; + const executablePath = path.join(workspacePath, executableName); + const sessionName = 'Run Without Debugging Result File'; + const debugType = isWindows ? 'cppvsdbg' : 'cppdbg'; + const miMode = isMacOS ? 'lldb' : 'gdb'; + + suiteSetup(async function (): Promise { + const extension: vscode.Extension = vscode.extensions.getExtension('ms-vscode.cpptools') || assert.fail('Extension not found'); + if (!extension.isActive) { + await extension.activate(); + } + await compileProgram(workspacePath, sourceFile, executablePath); + }); + + suiteTeardown(async function (): Promise { + if (isWindows) { + await vscode.commands.executeCommand('C_Cpp.ClearVsDeveloperEnvironment'); + } + }); + + setup(async function (): Promise { + await util.deleteFile(resultFilePath); + }); + + test('Run Without Debugging should not break on breakpoints and write the expected result file', async () => { + const breakpoint = await createBreakpointAtResultWriteStatement(sourceUri); + const tracker = createTracker(debugType, sessionName, 30000, 'Timed out waiting for debugger event.'); + const debugSessionTerminated = createSessionTerminatedPromise(sessionName); + + try { + const started = await vscode.debug.startDebugging( + workspaceFolder, + { + name: sessionName, + type: debugType, + request: 'launch', + program: executablePath, + args: [], + cwd: workspacePath, + externalConsole: debugType === 'cppdbg' ? false : undefined, + console: debugType === 'cppvsdbg' ? 'internalConsole' : undefined + }, + { noDebug: true }); + + assert.strictEqual(started, true, 'The noDebug launch did not start successfully.'); + + const lastEvent = await tracker.lastEvent; + await debugSessionTerminated; + const actualResultValue = await waitForResultFileValue(resultFilePath, 10000); + + assert.strictEqual(lastEvent, 'exited', 'No-debug launch should exit rather than stop on a breakpoint.'); + assert.strictEqual(tracker.state.setBreakpointsRequestReceived, false, 'a "no debug" session should not send setBreakpoints requests.'); + assert.strictEqual(tracker.state.stoppedEventReceived, false, 'a "no debug" session should not emit stopped events.'); + assert.strictEqual(actualResultValue, expectedResultValue, 'Unexpected result value from run without debugging launch.'); + } finally { + tracker.dispose(); + vscode.debug.removeBreakpoints([breakpoint]); + await util.deleteFile(resultFilePath); + } + }); + + test('Debug launch should bind and stop at the breakpoint', async () => { + const breakpoint = await createBreakpointAtResultWriteStatement(sourceUri); + const tracker = createTracker(debugType, sessionName, 30000, 'Timed out waiting for debugger event in normal debug mode.'); + const debugSessionTerminated = createSessionTerminatedPromise(sessionName); + + let launchedSession: vscode.DebugSession | undefined; + const startedSubscription = vscode.debug.onDidStartDebugSession((session) => { + if (session.name === sessionName) { + launchedSession = session; + } + }); + + try { + const started = await vscode.debug.startDebugging( + workspaceFolder, + { + name: sessionName, + type: debugType, + request: 'launch', + program: executablePath, + args: [], + cwd: workspacePath, + MIMode: debugType === 'cppdbg' ? miMode : undefined, + externalConsole: debugType === 'cppdbg' ? false : undefined, + console: debugType === 'cppvsdbg' ? 'internalConsole' : undefined + }, + { noDebug: false }); + + assert.strictEqual(started, true, 'The debug launch did not start successfully.'); + + const lastEvent = await tracker.lastEvent; + + assert.strictEqual(lastEvent, 'stopped', 'Debug launch should stop at the breakpoint before exit.'); + assert.strictEqual(tracker.state.setBreakpointsRequestReceived, true, 'Debug mode should send setBreakpoints requests.'); + assert.strictEqual(tracker.state.stoppedEventReceived, true, 'Debug mode should emit a stopped event at the breakpoint.'); + assert.strictEqual(tracker.state.exitedBeforeStop, false, 'Program exited before stopping at breakpoint in debug mode.'); + assert.strictEqual(vscode.debug.activeDebugSession?.name, sessionName, 'Debug session should still be active at breakpoint.'); + + const stoppedSession = launchedSession ?? vscode.debug.activeDebugSession; + assert.ok(stoppedSession, 'Unable to identify the running debug session for termination.'); + await vscode.debug.stopDebugging(stoppedSession); + await debugSessionTerminated; + } finally { + startedSubscription.dispose(); + tracker.dispose(); + vscode.debug.removeBreakpoints([breakpoint]); + await util.deleteFile(resultFilePath); + } + }); + +}); diff --git a/Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.terminals.test.ts b/Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.terminals.test.ts new file mode 100644 index 000000000..57b27d975 --- /dev/null +++ b/Extension/test/scenarios/RunWithoutDebugging/tests/runWithoutDebugging.terminals.test.ts @@ -0,0 +1,190 @@ +/* -------------------------------------------------------------------------------------------- + * 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 util from '../../../../src/common'; +import { isWindows } from '../../../../src/constants'; +import { compileProgram } from './compileProgram'; + +type ConsoleMode = 'integratedTerminal' | 'externalTerminal'; +type WindowsTerminalProfile = 'Command Prompt' | 'PowerShell'; + +/** + * Waits for the output of a program to be written to a file and returns the lines of output. + * @param filePath The path to the file containing the program output. + * @param timeoutMs The maximum time to wait for the output, in milliseconds. + * @returns A promise that resolves to an array of output lines. + * @throws An error if the output is not available within the specified timeout. + */ +async function waitForOutput(filePath: string, timeoutMs: number): Promise { + const deadline = Date.now() + timeoutMs; + let lastContents = ''; + + while (Date.now() < deadline) { + try { + lastContents = await util.readFileText(filePath, 'utf8'); + const trimmedContents = lastContents.trimEnd(); + if (trimmedContents.length > 0) { + return trimmedContents.split(/\r?\n/); + } + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error; + } + } + + await new Promise(resolve => setTimeout(resolve, 100)); + } + + assert.fail(`Timed out waiting for argument output in ${filePath}. Last contents: ${lastContents}`); +} + +/** + * Disposes of any terminals whose names match the given program paths. These are the terminals that were created to run the specified programs. + * @param programs An array of program paths whose corresponding terminals should be disposed. + */ +function disposeTerminals(programs: string[]): void { + const terminalNames = new Set(programs.map(program => path.normalize(program))); + for (const terminal of vscode.window.terminals) { + if (terminalNames.has(terminal.name)) { + terminal.dispose(); + } + } +} + +/** + * Sets or clears the setting for the default Windows terminal profile. + * @param profile The terminal profile to set as the default, or undefined to clear the setting. + */ +async function setWindowsDefaultTerminalProfile(profile?: WindowsTerminalProfile): Promise { + if (!isWindows) { + return; + } + + const config = vscode.workspace.getConfiguration('terminal.integrated'); + await config.update('defaultProfile.windows', profile, vscode.ConfigurationTarget.Workspace); +} + +async function runNoDebugLaunch(workspaceFolder: vscode.WorkspaceFolder, sessionName: string, program: string, consoleMode: ConsoleMode, resultFilePath: string, args: string[]): Promise { + const debugType = isWindows ? 'cppvsdbg' : 'cppdbg'; + const launchConfig: vscode.DebugConfiguration = { + name: sessionName, + type: debugType, + request: 'launch', + program: program, + args: [resultFilePath, ...args], + cwd: workspaceFolder.uri.fsPath + }; + + if (debugType === 'cppvsdbg') { + launchConfig.console = consoleMode; + } else { + launchConfig.externalConsole = consoleMode === 'externalTerminal'; + } + + const started = await vscode.debug.startDebugging(workspaceFolder, launchConfig, { noDebug: true }); + assert.strictEqual(started, true, `The ${consoleMode} noDebug launch did not start successfully.`); + return waitForOutput(resultFilePath, 15000); +} + +suite('Run Without Debugging Terminal and Arguments Test', function (this: Mocha.Suite): void { + this.timeout(120000); + + const workspaceFolder = vscode.workspace.workspaceFolders?.[0] ?? assert.fail('No workspace folder available'); + const workspacePath = workspaceFolder.uri.fsPath; + const sourceFile = path.join(workspacePath, 'argsTest.cpp'); + const resultFilePath = path.join(workspacePath, 'test_output.txt'); + const executablePath = path.join(workspacePath, isWindows ? 'argsTestProgram.exe' : 'argsTestProgram'); + const spacedExecutablePath = path.join(workspacePath, isWindows ? 'args Test Program.exe' : 'args Test Program'); + const executablePaths = [executablePath, spacedExecutablePath]; + const expectedArgs = [ + 'alpha', + 'two words', + path.join(workspacePath, 'input folder', 'three words.txt') + ]; + + suiteSetup(async function (): Promise { + const extension: vscode.Extension = vscode.extensions.getExtension('ms-vscode.cpptools') || assert.fail('Extension not found'); + if (!extension.isActive) { + await extension.activate(); + } + + await compileProgram(workspacePath, sourceFile, executablePath); + await compileProgram(workspacePath, sourceFile, spacedExecutablePath); + }); + + teardown(async function (): Promise { + await util.deleteFile(resultFilePath); + disposeTerminals(executablePaths); + }); + + setup(async function (): Promise { + if (await util.checkFileExists(resultFilePath)) { + await util.deleteFile(resultFilePath); + } + }); + + suiteTeardown(async function (): Promise { + await util.deleteFile(resultFilePath); + disposeTerminals(executablePaths); + + if (isWindows) { + await vscode.commands.executeCommand('C_Cpp.ClearVsDeveloperEnvironment'); + await util.deleteFile(path.join(workspacePath, '.vscode', 'settings.json')); + } + }); + + const consoleCases: { label: string; consoleMode: ConsoleMode; windowsProfiles?: (WindowsTerminalProfile | undefined)[] }[] = [ + { + label: 'integrated terminal', + consoleMode: 'integratedTerminal', + windowsProfiles: [undefined, 'Command Prompt', 'PowerShell'] + }, + { + label: 'external terminal', + consoleMode: 'externalTerminal' + } + ]; + + const programCases = [ + { + label: 'a program name without spaces', + programPath: executablePath + }, + { + label: 'a program name with spaces', + programPath: spacedExecutablePath + } + ]; + + for (const consoleCase of consoleCases) { + for (const programCase of programCases) { + const profiles: (WindowsTerminalProfile | undefined)[] = isWindows && consoleCase.consoleMode === 'integratedTerminal' ? consoleCase.windowsProfiles ?? [undefined] : [undefined]; + + for (const profile of profiles) { + const profileSuffix = profile ? ` with ${profile} as the default terminal` : consoleCase.consoleMode === 'integratedTerminal' ? ' with default terminal' : ''; + test(`No-debug launch via ${consoleCase.label} handles ${programCase.label}${profileSuffix}`, async () => { + await setWindowsDefaultTerminalProfile(profile); + + disposeTerminals(executablePaths); + const sessionName = `Run Without Debugging Args (${consoleCase.consoleMode}, ${path.basename(programCase.programPath)}${profile ? `, ${profile}` : ''})`; + const actualArgs = await runNoDebugLaunch( + workspaceFolder, + sessionName, + programCase.programPath, + consoleCase.consoleMode, + resultFilePath, + expectedArgs); + + assert.deepStrictEqual(actualArgs, expectedArgs, `Unexpected arguments received for ${consoleCase.label} using ${programCase.label}${profileSuffix}.`); + }); + } + } + } +}); diff --git a/Extension/walkthrough/installcompiler/install-compiler-windows10.md b/Extension/walkthrough/installcompiler/install-compiler-windows10.md index 7e215fd65..305842637 100644 --- a/Extension/walkthrough/installcompiler/install-compiler-windows10.md +++ b/Extension/walkthrough/installcompiler/install-compiler-windows10.md @@ -1,9 +1,8 @@

Install a C++ compiler on Windows

If you're doing C++ development for Windows, we recommend installing the Microsoft Visual C++ (MSVC) compiler.

    -
  1. To install MSVC, open the VS Code terminal (CTRL + `) and paste in the following command: -

    winget install Microsoft.VisualStudio.2022.BuildTools --force --override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows10SDK.20348"
    -
  2. +
  3. To install MSVC, open the VS Code terminal (CTRL + `) and paste in the following command:

    +

    winget install Microsoft.VisualStudio.2022.BuildTools --force --override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows10SDK.19041"

    Note: You can use the C++ toolset from Visual Studio Build Tools along with Visual Studio Code to compile, build, and verify any C++ codebase as long as you also have a valid Visual Studio license (either Community, Pro, or Enterprise) that you are actively using to develop that C++ codebase.

    diff --git a/Extension/walkthrough/installcompiler/install-compiler-windows11.md b/Extension/walkthrough/installcompiler/install-compiler-windows11.md index cf9c39f1b..8d79b7eb7 100644 --- a/Extension/walkthrough/installcompiler/install-compiler-windows11.md +++ b/Extension/walkthrough/installcompiler/install-compiler-windows11.md @@ -1,9 +1,8 @@

    Install a C++ compiler on Windows

    If you're doing C++ development for Windows, we recommend installing the Microsoft Visual C++ (MSVC) compiler.

      -
    1. To install MSVC, open the VS Code terminal (CTRL + `) and paste in the following command: -

      winget install Microsoft.VisualStudio.2022.BuildTools --force --override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows11SDK.26100"
      -
    2. +
    3. To install MSVC, open the VS Code terminal (CTRL + `) and paste in the following command:

      +

      winget install Microsoft.VisualStudio.2022.BuildTools --force --override "--wait --passive --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows11SDK.26100"

      Note: You can use the C++ toolset from Visual Studio Build Tools along with Visual Studio Code to compile, build, and verify any C++ codebase as long as you also have a valid Visual Studio license (either Community, Pro, or Enterprise) that you are actively using to develop that C++ codebase.

      diff --git a/Extension/yarn.lock b/Extension/yarn.lock index 1d665116d..daea732ac 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -1310,9 +1310,9 @@ integrity sha1-Ml20I5XNSf5sFAV/mpAOQn34gQ4= "@xmldom/xmldom@^0.8.8": - version "0.8.12" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@xmldom/xmldom/-/xmldom-0.8.12.tgz#cf488a5435fa06c7374ad1449c69cea0f823624b" - integrity sha1-z0iKVDX6Bsc3StFEnGnOoPgjYks= + version "0.8.13" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@xmldom/xmldom/-/xmldom-0.8.13.tgz#00d1dd940b218dff2e49309d410d8bb212159225" + integrity sha1-ANHdlAshjf8uSTCdQQ2LshIVkiU= "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -4271,9 +4271,9 @@ lodash.truncate@^4.4.2: integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= lodash@^4.17.23: - version "4.17.23" - resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha1-8ROwN4OGEDvk9okziMc9C95/LFo= + version "4.18.1" + resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha1-/ytmwfYybVlRPeJAe/iBQ5gSdxw= log-symbols@^4.1.0: version "4.1.0" diff --git a/ExtensionPack/.npmrc b/ExtensionPack/.npmrc index d8324806f..0446fca08 100644 --- a/ExtensionPack/.npmrc +++ b/ExtensionPack/.npmrc @@ -1,2 +1,4 @@ registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ -always-auth=true \ No newline at end of file +always-auth=true +# Disable postinstall scripts for supply chain security. Allowlist exceptions with npm trust: https://docs.npmjs.com/cli/v11/commands/npm-trust +ignore-scripts=true diff --git a/ExtensionPack/package-lock.json b/ExtensionPack/package-lock.json index ff471e417..fe77d2eba 100644 --- a/ExtensionPack/package-lock.json +++ b/ExtensionPack/package-lock.json @@ -2353,9 +2353,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha1-8ROwN4OGEDvk9okziMc9C95/LFo=", + "version": "4.18.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c", + "integrity": "sha1-/ytmwfYybVlRPeJAe/iBQ5gSdxw=", "dev": true, "license": "MIT" }, diff --git a/Themes/.npmrc b/Themes/.npmrc index d8324806f..0446fca08 100644 --- a/Themes/.npmrc +++ b/Themes/.npmrc @@ -1,2 +1,4 @@ registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/ -always-auth=true \ No newline at end of file +always-auth=true +# Disable postinstall scripts for supply chain security. Allowlist exceptions with npm trust: https://docs.npmjs.com/cli/v11/commands/npm-trust +ignore-scripts=true diff --git a/Themes/package-lock.json b/Themes/package-lock.json index 310e5c69b..7f89e7fb1 100644 --- a/Themes/package-lock.json +++ b/Themes/package-lock.json @@ -2353,9 +2353,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha1-8ROwN4OGEDvk9okziMc9C95/LFo=", + "version": "4.18.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c", + "integrity": "sha1-/ytmwfYybVlRPeJAe/iBQ5gSdxw=", "dev": true, "license": "MIT" },