Compare commits

..
65 Commits
Author SHA1 Message Date
Sean McManus 83f034db46 Merge pull request #14572 from microsoft/seanmcm/vs_july9
Merge to the vs branch (1.33.4)
2026-07-10 02:56:35 -07:00
Sean McManus f3f2521b70 Merge branch 'main' into seanmcm/vs_july9 2026-07-09 12:12:29 -07:00
Sean McManus 6f40e5bc24 Update changelog and version for 1.33.4. (#14568) 2026-07-08 11:45:52 -07:00
Bob Brown 24d299fcff Rewording an error message (#14561)
* Rewording an error message
2026-07-07 15:52:55 -07:00
Sean McManusandcsigs bbf1ad3caf Update loc for 1.33.3 (again) (#14566)
* Localization - Translated Strings
* Apply fixes.

---------

Co-authored-by: csigs <[email protected]>
2026-07-06 12:17:18 -07:00
Sean McManus d686c15de1 Add .vscode/settings.json to .gitignore. (#14563) 2026-07-03 01:54:38 +00:00
Sean McManus 44a962969d Update changelog and version for 1.33.3. (#14562) 2026-07-02 18:20:51 -07:00
tieoandSean McManus 894e101363 Fix C/C++ debug hover on intermediate members of a dereferenced expression (#14540)
* Add EvaluatableExpressionProvider to fix C/C++ debug hover on dereferenced members

VS Code's default debug data-tip keeps a leading `*`/`&` and clips on the right, so hovering
an intermediate member of e.g. `*a.b.c` evaluates `*a.b` (a dereference of the struct `a.b`)
and shows no value.

Register an EvaluatableExpressionProvider that, only for that case, returns the expression
without the leading operator. Every other expression returns undefined so the default
behavior is unchanged.

* Move the debug hover provider to the debugger

Register the EvaluatableExpressionProvider during debugger activation
instead of through the language client, so it also works when IntelliSense
is disabled, and move it next to the other debugger code.

The expression computation lives in a vscode-free module
(evaluatableExpression.ts) so it can be unit tested directly. Registering
a provider replaces VS Code's built-in data-tip expression detection, so
it reproduces that for ordinary tokens and additionally handles access
chains the built-in detection gets wrong for C/C++:

- A leading */& binds to the whole access chain (the postfix ., ->, []
  operators bind tighter), so it is dropped for an interior member of a
  dot chain, where *a.b would dereference the struct a.b, and kept on the
  final member and before ->.

- Array subscripts and :: are kept in the token, so members after a
  subscript (a.b[i].c) and scoped names (ns::var) resolve instead of
  producing a broken fragment.

* Document why the leading-operator drop is .-only

The leading */& is kept before -> / [] and at the end of a chain because
those left operands are provably pointers/arrays, so *ptr->m, *a.b[i] and
&a[i] evaluate without error; it is dropped only before . where the left
operand may be a struct. Documents these keep-leading outcomes as deliberate
per review feedback.

* Decline non-token cursor positions inside a subscript

Inside [...] the token spans whitespace and operators (e.g. a[i + j]), so
returning the nearest identifier evaluated the wrong expression when the
cursor was on an operator or space. Return undefined unless the cursor is on
the index identifier itself, and add tests.

* Rewrite hover token detection with a balanced-bracket scanner

Replace the token regex with a manual scanner so nested subscripts (a[b[i]])
stay in one token, fix hovering past the last identifier truncating a trailing
subscript, and decline non-token positions inside [...] (operators/whitespace).
Keep the leading * only on the final dereferenced segment (including a final
subscript element like *a.b[i]); drop it on interior segments and drop a leading
& always. Removes the previous regex (and its ReDoS surface).

---------

Co-authored-by: Sean McManus <[email protected]>
2026-07-01 18:50:47 -07:00
Bob Brown 4aa35c9681 Allow for platform overrides in cppbuild tasks (#14559) 2026-07-01 18:22:57 -07:00
Bob Brown 300d65a9d5 Enable language server tests for GitHub PR's (#14474) 2026-07-01 18:22:03 -07:00
Sean McManus 3203386c6e Localization for 1.33.3 (#14553)
* Localization - Translated Strings
2026-06-30 16:39:00 -07:00
Sean McManus dd1902a8dc Update .npmrc (#14557) 2026-06-30 16:16:30 -07:00
Sean McManus 03ee07113a Fix format settings. (#14558)
* Fix format settings.
2026-06-30 15:54:00 -07:00
Sean McManus 8e68bbba5d Fix Windows backslash paths being mangled when adding an SSH target (#14554)
* Fix Windows backslash paths being mangled when adding an SSH target
2026-06-30 15:31:44 -07:00
Sean McManus fe18c4af95 Improve crash call stack data. (#14555)
* Improve crash call stack data.
2026-06-30 13:55:08 -07:00
Sean McManus 53dd88fd19 Fix clang-format/clang-tidy version check failing on Windows (and paths with spaces) (#14552)
* Fix clang-format/clang-tidy version check failing on Windows (and paths with spaces)
2026-06-29 16:32:42 -07:00
Sean McManus 4e9ebaa180 Merge pull request #14556 from microsoft/seanmcm/vs_1_33_3
Merge to vs (1.33.3)
2026-06-29 15:54:36 -07:00
Sean McManus 97b6775aeb Merge branch 'main' into seanmcm/vs_1_33_3 2026-06-29 12:21:41 -07:00
Sean McManus df58934ca0 Fix TypeScript compilation errors in common.ts (#14551)
* Fix TypeScript errors.
2026-06-26 16:01:26 -07:00
Sean McManus 4ad4456b40 Merge pull request #14517 from microsoft/seanmcm/vs_june_2026
Merge to vs
2026-06-18 13:27:51 -07:00
Sean McManus 0891980f74 Merge branch 'main' into seanmcm/vs_june_2026 2026-06-16 11:13:14 -07:00
Sean McManus 2f19d5fc59 Merge branch 'main' into seanmcm/vs_june_2026 2026-06-15 17:49:44 -07:00
Sean McManus 2c79d00dd3 Merge pull request #14410 from microsoft/seanmcm/vsApr27
Merge to vs
2026-05-07 09:14:20 -07:00
Sean McManus fce5d98001 Merge branch 'main' into seanmcm/vsApr27 2026-05-01 05:28:33 -07:00
Sean McManus 81b40ca82a Merge branch 'main' into seanmcm/vsApr27 2026-04-27 17:56:02 -07:00
Sean McManus c0bbf33742 Merge branch 'main' into seanmcm/vsApr27 2026-04-27 07:36:02 -07:00
675855f453 Merge to vs (#14336)
* Bump undici from 7.22.0 to 7.24.0 in /Extension (#14272)

Bumps [undici](https://github.com/nodejs/undici) from 7.22.0 to 7.24.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.22.0...v7.24.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.24.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump undici from 7.22.0 to 7.24.0 in /ExtensionPack (#14273)

Bumps [undici](https://github.com/nodejs/undici) from 7.22.0 to 7.24.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.22.0...v7.24.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.24.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sean McManus <[email protected]>

* Bump undici from 7.22.0 to 7.24.0 in /Themes (#14274)

Bumps [undici](https://github.com/nodejs/undici) from 7.22.0 to 7.24.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.22.0...v7.24.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.24.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sean McManus <[email protected]>

* Bump undici from 6.23.0 to 6.24.0 in /.github/actions (#14275)

Bumps [undici](https://github.com/nodejs/undici) from 6.23.0 to 6.24.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.23.0...v6.24.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.24.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update. (#14277)

* Stop using yarn with extension pack (#14278)

* Use npm instead of yarn for the extension package vsix.

* Update changelog for 1.31.2. (#14271)

* Update changelog for 1.31.2.

* Fix a yarn.lock mismatch. (#14282)

* Update flatted. It was already updated in the Extension folder. (#14285)

* Upate @azure/msal-browser for the ExtensionPack. (#14286)

* Update changelog and version for 1.31.3. (#14288)

* Fix a changelog typo missed in the last PR. (#14290)

* Update fast-xml-parser. (#14292)

* Bootstrap yarn to fix/enable CFSClean3. (#14284)

* Switch .github builds to use node 24 and the latest OS images (#14293)

* Switch to node 24.
* Also update the runner-env images.

* Update to 1ESPT-Windows2025. (#14295)

* Remove console.debug calls. (#14296)

* Update changelog and TPN. (#14298)

* Update flatted and fast-xml-parser. (#14303)

* Bump flatted from 3.4.1 to 3.4.2 in /Extension (#14304)

Bumps [flatted](https://github.com/WebReflection/flatted) from 3.4.1 to 3.4.2.
- [Commits](https://github.com/WebReflection/flatted/compare/v3.4.1...v3.4.2)

---
updated-dependencies:
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update changelog with recent fixes. (#14313)

* Bump picomatch from 2.3.1 to 2.3.2 in /ExtensionPack (#14318)

Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump picomatch from 2.3.1 to 2.3.2 in /.github/actions (#14319)

Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sean McManus <[email protected]>

* Bump picomatch from 2.3.1 to 2.3.2 in /Themes (#14323)

Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update picomatch. (#14324)

* Update brace-expansion v5. (#14325)

* Bump serialize-javascript from 7.0.4 to 7.0.5 in /.github/actions (#14332)

Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) from 7.0.4 to 7.0.5.
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v7.0.4...v7.0.5)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-version: 7.0.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update brace-expansion and serialize-javascript. (#14328)

* minimize the calls to lm.selectChatModels (#14327)

* Update brace-expansion for other folders (#14333)

* Update brace-expansion for other folders.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Luca <[email protected]>
2026-04-02 11:33:46 -07:00
Sean McManus c6163a73c5 Merge branch 'main' into seanmcm/mergeToVs_March26 2026-03-30 17:25:11 -07:00
Sean McManus 28a834241c Merge pull request #14279 from microsoft/seanmcm/vs_1_31_2
Merge to vs for 1.31.2
2026-03-16 11:29:50 -07:00
Sean McManus 9859b84e04 Merge branch 'main' into seanmcm/vs_1_31_2 2026-03-13 12:09:30 -07:00
Sean McManus 622b8ee60c Merge pull request #14233 from microsoft/seanmcm/vs1_31_1
Merge to vs (1.31.1)
2026-03-04 08:02:13 -08:00
Sean McManus 74dd1a27f4 Merge branch 'main' into seanmcm/vs1_31_1 2026-03-03 19:02:38 -08:00
Sean McManus 982dd4e31d Merge pull request #14132 from microsoft/seanmcm/updateVsJan9
Update vs to match 1.30.1
2026-01-09 11:40:35 -08:00
Sean McManus 0cd8e4c491 Merge branch 'seanmcm/updateIntelliSenseLocStringsJan9' into seanmcm/updateVsJan9 2026-01-09 04:36:22 -08:00
Sean McManus 7601046429 Update IntelliSense loc strings. 2026-01-09 04:29:18 -08:00
Sean McManus e82289630e Merge pull request #14048 from microsoft/seanmcm/mergeMainToVs
Merge main to vs
2025-11-14 14:32:46 -08:00
Sean McManus 70e2c0d67e Merge branch 'main' into seanmcm/mergeMainToVs 2025-11-14 14:20:06 -08:00
Sean McManus 7caf05e0d5 Merge pull request #14027 from microsoft/seanmcm/mainToVs
main to vs
2025-10-31 14:12:11 -07:00
Sean McManus ac7b33c48a Merge branch 'main' into seanmcm/mainToVs 2025-10-31 14:03:51 -07:00
Sean McManus 4b67a68c8e Merge pull request #13960 from microsoft/seanmcm/mergeVs
Merge to vs
2025-09-23 18:15:13 -07:00
Sean McManus 5ded58bbf2 Merge branch 'main' into seanmcm/mergeVs 2025-09-23 04:23:59 -07:00
Sean McManus 171e0addb7 Merge branch 'main' into seanmcm/mergeVs 2025-09-23 04:23:03 -07:00
d321f0af78 Merge main to vs (#13828)
* Fix the description of debugServerPath (#13778)

This mentions the non-existent miDebugServerAddress, but the
correct name is actually miDebuggerServerAddress.

* Enable string length encoding fix in cpptools (#13769)

* Try to fix the Windows builds. (#13788)

* Update IntelliSense loc strings. (#13793)

* Makes remote attach picker respect the pipeTransport.quoteArgs config… (#13794)

* Makes remote attach picker respect the pipeTransport.quoteArgs configuration
* fixes linter error - don't compare boolean value to a boolean

* Remove "exceptions" from quoteArgs. (#13796)

* Fix loc for the miDebuggerServerAddress change. (#13797)

* Update changelog for 1.27.0 (2nd time). (#13795)

* Update changelog for 1.27.0 (2nd time).

* Update form-data. (#13800)

* Update form-data.

* Revert didOpen changes in favor of adding encoding to didChangeVisibleTextEditors (#13802)

* fixing formatting (#13810)

* Enable CG trigger on insiders branch

* Handle .txx/tpp headers. (#13811)

* Handle .txx headers.

* Add tpp too.

* fix #13818 (#13824)

* Bump tmp from 0.2.3 to 0.2.4 in /Extension (#13825)

Bumps [tmp](https://github.com/raszi/node-tmp) from 0.2.3 to 0.2.4.
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.3...v0.2.4)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sean McManus <[email protected]>

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Joshua Goins <[email protected]>
Co-authored-by: Colen Garoutte-Carson <[email protected]>
Co-authored-by: Matt <[email protected]>
Co-authored-by: Bob Brown <[email protected]>
Co-authored-by: Luca <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-06 17:12:18 -07:00
Sean McManus 8629260605 Merge branch 'main' into seanmcm/vsAug6 2025-08-06 10:40:56 -07:00
Sean McManus eb2ccf85e7 Merge pull request #13760 from microsoft/seanmcm/vsMergeMain
Merge main to vs
2025-07-14 15:31:50 -07:00
Sean McManus 02db9f4391 Merge branch 'main' into seanmcm/vsMergeMain 2025-07-11 18:59:27 -07:00
Sean McManus 6333535e1d Merge pull request #13720 from microsoft/seanmcm/vsMerge
Merge main to vs
2025-06-20 11:59:11 -07:00
Sean McManus 279a470cf6 Merge branch 'main' into seanmcm/vsMerge 2025-06-18 19:12:25 -07:00
5e3ef1cce7 Merge to vs (#13653)
* Remove -D__building_module(x)=0 workaround. (#13621)

* add note about C++ Copilot suggestions improvement (#13624)

* Update changelog for 1.26.1 (#13627)

* Update changelog for 1.26.1

* fix typo (#13630)

1.26.0->1.26.1

* Remove the .type.descriptions since they don't seem to have any effect. (#13648)

* Lock the PATH variable which was incorrectly being translated. (#13649)

* Fix a couple loc issues. (#13650)

---------

Co-authored-by: Luca <[email protected]>
Co-authored-by: heartacker <[email protected]>
2025-05-29 12:43:45 -07:00
Sean McManus d949d36a42 Merge branch 'main' into seanmcm/vsMerge 2025-05-29 12:35:18 -07:00
Sean McManus 0d976f5f9a Merge pull request #13632 from microsoft/seanmcm/updateVsBranch
Update vs branch
2025-05-23 11:37:14 -07:00
Sean McManus 6b29c5e7a1 Merge branch 'vs' into seanmcm/updateVsBranch 2025-05-23 11:36:59 -07:00
Sean McManus 7a5fad9dfb Merge pull request #13588 from microsoft/seanmcm/vs_may5_2025
Merge to vs
2025-05-06 11:42:44 -07:00
Sean McManus 002436e3d8 Merge branch 'main' into seanmcm/vs_may5_2025 2025-05-05 13:59:37 -07:00
Sean McManus 69ce08c0e8 Merge to vs (#13486) 2025-04-15 10:10:15 -07:00
Sean McManus 5534edf309 Merge branch 'main' into seanmcm/mergeToVS 2025-04-10 15:56:02 -07:00
Sean McManus 2487d52ede Merge branch 'main' into seanmcm/mergeToVS 2025-04-10 15:39:54 -07:00
Colen Garoutte-Carson 269c0d3e36 Merge TypeScript main branch to VC (#13431) 2025-03-26 14:19:39 -07:00
Sean McManus ca56eac5bc Merge pull request #13182 from microsoft/main
Merge to the vs branch
2025-01-27 11:09:09 -08:00
Sean McManus 203624e280 Merge pull request #12927 from microsoft/main
Merge to vs
2024-11-05 11:10:21 -08:00
Sean McManus 8bae3c438e Merge pull request #12858 from microsoft/main
Merge to vs
2024-10-21 14:05:03 -07:00
Sean McManus c2975e7970 Merge pull request #12731 from microsoft/main
Merge to vs
2024-09-18 05:21:13 -07:00
Sean McManus 67cf965ab0 Merge pull request #12609 from microsoft/main
Merge to the vs branch
2024-08-21 14:06:34 -07:00
Sean McManus 6e940318b7 Merge pull request #12563 from microsoft/main
Merge to vs branch
2024-08-13 12:16:42 -07:00
Sean McManus 5868163d21 Merge pull request #12468 from microsoft/main
Merge to vs due July 11, 2024 RI
2024-07-15 10:47:41 -07:00
86 changed files with 1554 additions and 317 deletions
+4
View File
@@ -1,3 +1,7 @@
registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/
# Disable postinstall scripts for supply chain security. Allowlist exceptions with npm trust: https://docs.npmjs.com/cli/v11/commands/npm-trust
ignore-scripts=true
min-release-age=7
audit=true
audit-level=high
+1
View File
@@ -23,3 +23,4 @@ jobs:
platform: mac
checkout-ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target-ref || github.ref }}
yarn-args: --network-timeout 100000
+38 -39
View File
@@ -38,6 +38,12 @@ jobs:
run: yarn install ${{ inputs.yarn-args }}
working-directory: Extension
- name: Install gdb (linux)
if: ${{ inputs.platform == 'linux' }}
run: |
sudo apt-get update
sudo apt-get install -y gdb
- name: Compile Sources
run: yarn run compile
working-directory: Extension
@@ -50,53 +56,46 @@ jobs:
run: yarn test
working-directory: Extension
# These tests don't require the binary.
# On Linux, it is failing (before the tests actually run) with: Test run terminated with signal SIGSEGV.
# But it works on Linux during the E2E test.
- name: Run SingleRootProject tests
if: ${{ inputs.platform != 'linux' }}
run: yarn test --scenario=SingleRootProject --skipCheckBinaries
- name: Acquire Native Binaries
run: yarn install-and-copy-binaries-for-test
working-directory: Extension
# NOTE : We can't run the test that require the native binary files
# yet -- there will be an update soon that allows the tester to
# acquire them on-the-fly
# - name: Run languageServer integration tests
# if: ${{ inputs.platform == 'windows' }}
# run: yarn test --scenario=SingleRootProject
# working-directory: Extension
- name: Run languageServer integration tests (Windows)
if: ${{ inputs.platform == 'windows' }}
run: yarn test --scenario=SingleRootProject
working-directory: Extension
# - name: Run E2E IntelliSense features tests
# if: ${{ inputs.platform == 'windows' }}
# run: yarn test --scenario=MultirootDeadlockTest
# working-directory: Extension
- name: Run E2E IntelliSense features tests (Windows)
if: ${{ inputs.platform == 'windows' }}
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
- name: Run RunWithoutDebugging tests (Windows)
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
# - name: Run languageServer integration tests (xvfb)
# if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }}
# uses: coactions/setup-xvfb@v1
# with:
# run: yarn test --scenario=SingleRootProject
# working-directory: Extension
- name: Run languageServer integration tests (linux/macOS)
if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }}
uses: coactions/setup-xvfb@v1
with:
run: yarn test --scenario=SingleRootProject
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=MultirootDeadlockTest
# working-directory: Extension
- name: Run E2E IntelliSense features tests (linux/macOS)
if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }}
uses: coactions/setup-xvfb@v1
with:
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
- name: Run RunWithoutDebugging tests (linux/macOS)
if: ${{ inputs.platform == 'mac' || inputs.platform == 'linux' }}
uses: coactions/setup-xvfb@v1
with:
run: yarn test --scenario=RunWithoutDebugging --scenario-arg=skipExternalConsole
working-directory: Extension
+2
View File
@@ -13,3 +13,5 @@ OneLocBuild
# ignore imported localization xlf directory
vscode-translations-import
.vscode/settings.json
+4
View File
@@ -1,3 +1,7 @@
registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/
# Disable postinstall scripts for supply chain security. Allowlist exceptions with npm trust: https://docs.npmjs.com/cli/v11/commands/npm-trust
ignore-scripts=true
min-release-age=7
audit=true
audit-level=high
+10 -1
View File
@@ -20,9 +20,18 @@ import { verbose } from '../src/Utility/Text/streams';
export const $root = resolve(`${__dirname}/..`);
export let $cmd = 'main';
export let $scenario = '';
export const $scenarioArgs: string[] = [];
// loop through the args and pick out --scenario=... and remove it from the $args and set $scenario
process.argv.slice(2).filter(each => !(each.startsWith('--scenario=') && ($scenario = each.substring('--scenario='.length))));
// parse out the scenario arguments.
process.argv.slice(2).reduce<string[]>((acc, arg) => {
if (arg.startsWith('--scenario-arg=')) {
acc.push(arg.substring('--scenario-arg='.length));
}
return acc;
}, $scenarioArgs);
export const $args = process.argv.slice(2).filter(each => !each.startsWith('--'));
export const $switches = process.argv.slice(2).filter(each => each.startsWith('--'));
@@ -39,7 +48,7 @@ chdir($root);
// dump unhandled async errors to the console and exit.
process.on('unhandledRejection', (reason: any, _promise) => {
error(`${reason?.stack?.split(/\r?\n/).filter(l => !l.includes('node:internal') && !l.includes('node_modules')).join('\n')}`);
error(`${reason?.stack?.split(/\r?\n/).filter((l: string) => !l.includes('node:internal') && !l.includes('node_modules')).join('\n')}`);
process.exit(1);
});
+39 -5
View File
@@ -5,7 +5,8 @@
import { cp, readdir, rm, stat } from 'node:fs/promises';
import { homedir } from 'node:os';
import { join } from 'node:path';
import { basename, join } from 'node:path';
import { verbose } from '../src/Utility/Text/streams';
import { $args, $root, green, heading, note } from './common';
const extensionPrefix = 'ms-vscode.cpptools-';
@@ -73,17 +74,47 @@ async function getInstalledExtensions(root: string): Promise<InstalledExtension[
}
}
async function findLatestInstalledExtension(providedPath?: string): Promise<string> {
if (providedPath) {
return providedPath;
async function findExtensionsFolder(root: string): Promise<string | undefined> {
try {
const entries = await readdir(root, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory()) {
if (entry.name === 'extensions') {
const extensionEntries = await readdir(join(root, entry.name), { withFileTypes: true });
for (const extensionEntry of extensionEntries) {
if (extensionEntry.isDirectory() && extensionEntry.name.startsWith(extensionPrefix)) {
return join(root, entry.name);
}
}
} else {
const result = await findExtensionsFolder(join(root, entry.name));
if (result) {
return result;
}
}
}
}
} catch {
// Ignore errors (permission denied, etc.)
}
return undefined;
}
async function findLatestInstalledExtension(providedPath?: string): Promise<string> {
const searchRoots: string[] = [
join(homedir(), '.vscode', 'extensions'),
join(homedir(), '.vscode-insiders', 'extensions'),
join(homedir(), '.vscode-server', 'extensions'),
join(homedir(), '.vscode-server-insiders', 'extensions')
];
if (providedPath) {
// find a folder called 'extensions' recursively under the provided path and add it to the front of the search roots
const extensionsFolderPath = await findExtensionsFolder(providedPath);
if (extensionsFolderPath) {
verbose(`Found extensions folder under provided path: ${extensionsFolderPath}`);
searchRoots.unshift(extensionsFolderPath);
}
}
const installed: InstalledExtension[] = (await Promise.all(searchRoots.map(each => getInstalledExtensions(each)))).flat();
if (!installed.length) {
@@ -94,7 +125,7 @@ async function findLatestInstalledExtension(providedPath?: string): Promise<stri
return installed[0].path;
}
export async function main(sourcePath = $args[0]) {
export async function main(sourcePath = $args[0]): Promise<string | undefined> {
console.log(heading('Copy installed extension binaries'));
const installedExtensionPath: string = await findLatestInstalledExtension(sourcePath);
@@ -110,4 +141,7 @@ export async function main(sourcePath = $args[0]) {
}
note(`Copied installed binaries into ${$root}`);
const installedVersion = tryParseVersion(basename(installedExtensionPath));
return installedVersion?.join('.');
}
+12 -2
View File
@@ -85,8 +85,13 @@ function replaceReferences(definitions: any, objects: any): any {
objects[key].anyOf = replaceReferences(definitions, objects[key].anyOf);
}
// Recursively replace references if this object has properties.
if (objects[key].hasOwnProperty('type') && objects[key].type === 'object' && objects[key].properties !== null) {
// Handle 'oneOf' with references
if (objects[key].hasOwnProperty('oneOf')) {
objects[key].oneOf = replaceReferences(definitions, objects[key].oneOf);
}
// Recursively replace references if this schema node has properties.
if (objects[key].hasOwnProperty('properties') && objects[key].properties !== null) {
objects[key].properties = replaceReferences(definitions, objects[key].properties);
objects[key].properties = updateDefaults(objects[key].properties, objects[key].default);
}
@@ -117,11 +122,13 @@ function mergeReferences(baseDefinitions: any, additionalDefinitions: any): void
export async function main() {
const packageJSON: any = JSON.parse(await read(resolve($root, 'package.json')));
const schemaJSON: any = JSON.parse(await read(resolve($root, 'tools/OptionsSchema.json')));
const taskDefinitionsJSON: any = JSON.parse(await read(resolve($root, 'tools/TaskDefinitionsSchema.json')));
const symbolSettingsJSON: any = JSON.parse(await read(resolve($root, 'tools/VSSymbolSettings.json')));
mergeReferences(schemaJSON.definitions, symbolSettingsJSON.definitions);
schemaJSON.definitions = replaceReferences(schemaJSON.definitions, schemaJSON.definitions);
taskDefinitionsJSON.definitions = replaceReferences(taskDefinitionsJSON.definitions, taskDefinitionsJSON.definitions);
// Hard Code adding in configurationAttributes launch and attach.
// cppdbg
@@ -132,6 +139,9 @@ export async function main() {
packageJSON.contributes.debuggers[1].configurationAttributes.launch = schemaJSON.definitions.CppvsdbgLaunchOptions;
packageJSON.contributes.debuggers[1].configurationAttributes.attach = schemaJSON.definitions.CppvsdbgAttachOptions;
// task definitions
packageJSON.contributes.taskDefinitions = [taskDefinitionsJSON.definitions.CppBuildTaskDefinition];
let content: string = JSON.stringify(packageJSON, null, 4);
// We use '\u200b' (unicode zero-length space character) to break VS Code's URL detection regex for URLs that are examples. This process will
@@ -0,0 +1,35 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import { runVSCodeCommand } from '@vscode/test-electron';
import { writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { $root, error, heading, note } from './common';
import * as copy from './copyExtensionBinaries';
import { install, isolated, options } from "./vscode";
export async function main() {
console.log(heading(`Install VS Code`));
const vscode = await install();
if (!vscode) {
error('Failed to install VS Code');
return;
}
console.log(heading('Install latest C/C++ Extension'));
const result = await runVSCodeCommand([...vscode.args ?? [], '--install-extension', 'ms-vscode.cpptools', '--pre-release'], options);
if (result.stdout) {
console.log(result.stdout.toString());
}
if (result.stderr) {
error(result.stderr.toString());
}
const binaryVersion = await copy.main(isolated);
if (binaryVersion) {
await writeFile(join($root, 'bin', 'binaryVersion.json'), JSON.stringify({ version: binaryVersion }));
note(`Wrote binary version ${binaryVersion} to bin/binaryVersion.json`);
}
}
+3 -2
View File
@@ -14,7 +14,7 @@ import { filepath } from '../src/Utility/Filesystem/filepath';
import { is } from '../src/Utility/System/guards';
import { verbose } from '../src/Utility/Text/streams';
import { getTestInfo } from '../test/common/selectTests';
import { $args, $root, $scenario, assertAnyFile, assertAnyFolder, brightGreen, checkBinaries, cmdSwitch, cyan, error, gray, green, readJson, red, writeJson } from './common';
import { $args, $root, $scenario, $scenarioArgs, assertAnyFile, assertAnyFolder, brightGreen, checkBinaries, cmdSwitch, cyan, error, gray, green, readJson, red, writeJson } from './common';
import { install, isolated, options } from './vscode';
export { install, reset } from './vscode';
@@ -90,7 +90,8 @@ async function scenarioTests(assets: string, name: string, workspace: string) {
extensionTestsPath: resolve($root, 'dist/test/common/selectTests'),
launchArgs: workspace ? [...options.launchArgs, workspace] : options.launchArgs,
extensionTestsEnv: {
SCENARIO: assets
SCENARIO: assets,
SCENARIO_ARGS: $scenarioArgs.join(',')
}
});
}
+4 -4
View File
@@ -17,7 +17,7 @@ export const settings = resolve(userDir, "User", 'settings.json');
export const options = {
cachePath: `${isolated}/cache`,
launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', `--extensions-dir=${extensionsDir}`, `--user-data-dir=${userDir}`, '--disable-workspace-trust']
launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', '--disable-extensions', `--extensions-dir=${extensionsDir}`, `--user-data-dir=${userDir}`, '--disable-workspace-trust']
};
export async function install() {
@@ -34,9 +34,9 @@ export async function install() {
args.push(`--extensions-dir=${extensionsDir}`, `--user-data-dir=${userDir}`);
// install the appropriate extensions
// spawnSync(cli, [...args, '--install-extension', 'ms-vscode.cpptools'], { encoding: 'utf-8', stdio: 'ignore' });
// spawnSync(cli, [...args, '--install-extension', 'twxs.cmake'], { encoding: 'utf-8', stdio: 'ignore' });
// spawnSync(cli, [...args, '--install-extension', 'ms-vscode.cmake-tools'], { encoding: 'utf-8', stdio: 'ignore' });
// runVSCodeCommand([...args, '--install-extension', 'ms-vscode.cpptools'], options);
// runVSCodeCommand([...args, '--install-extension', 'twxs.cmake'], options);
// runVSCodeCommand([...args, '--install-extension', 'ms-vscode.cmake-tools'], options);
const settingsJson = await readJson(settings, {});
if (!settingsJson["workbench.colorTheme"]) {
settingsJson["workbench.colorTheme"] = "Tomorrow Night Blue";
+2
View File
@@ -27,12 +27,14 @@
"editor.formatOnSave": true,
"editor.defaultFormatter": "vscode.json-language-features",
"editor.tabSize": 4,
"editor.detectIndentation": true,
"files.insertFinalNewline": false
},
"[jsonc]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "vscode.json-language-features",
"editor.tabSize": 4,
"editor.detectIndentation": true,
"files.insertFinalNewline": true
},
"[typescript]": {
+19 -1
View File
@@ -1,9 +1,27 @@
# C/C++ for Visual Studio Code Changelog
## Version 1.33.4: July 8, 2026
### Bug Fixes
* Fix the wording for the `#include` errors detected message. [#8227](https://github.com/microsoft/vscode-cpptools/issues/8227)
* Fix another "directory_cache" crash.
* Update some localization.
## Version 1.33.3: July 6, 2026
### Enhancement
* Allow platform overrides in `cppbuild` tasks. [#11601](https://github.com/microsoft/vscode-cpptools/issues/11601)
### Bug Fixes
* Fix `[[no_unique_address]]` empty-base layout `sizeof` being computed too large. [#14524](https://github.com/microsoft/vscode-cpptools/issues/14524)
* Fix C/C++ debug data-tips on members of a dereferenced expression. [PR #14540](https://github.com/microsoft/vscode-cpptools/pull/14540)
* Thanks for the contribution. [@tieo](https://github.com/tieo)
* Fix `clang-format`/`clang-tidy` version check failing on Windows. [PR #14552](https://github.com/microsoft/vscode-cpptools/pull/14552)
* Fix Windows backslash paths being mangled when adding an SSH target. [PR #14554](https://github.com/microsoft/vscode-cpptools/pull/14554)
* Fix "directory_cache" crashes.
* Fix spurious IntelliSense error on `std::variant` brace-initialization.
## Version 1.33.2: June 26, 2026
### Bug Fixes
* Fix a regression with 'Find All References' with functions that exist in both C and C++ files. [#14546](https://github.com/microsoft/vscode-cpptools/issues/14546)
* Fix some regression crashes.
## Version 1.33.1: June 23, 2026
### Bug Fixes
-34
View File
@@ -3241,40 +3241,6 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------
---------------------------------------------------------
shell-quote 1.8.4 - MIT
https://github.com/ljharb/shell-quote
Copyright (c) 2013 James Halliday ([email protected])
The MIT License
Copyright (c) 2013 James Halliday ([email protected])
Permission is hereby granted, free of charge,
to any person obtaining a copy of this software and
associated documentation files (the "Software"), to
deal in the Software without restriction, including
without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom
the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------
---------------------------------------------------------
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "使用 Shell 的弱引用字符来引用参数(例如在 bash 下的 \")。",
"c_cpp.taskDefinitions.options.description": "其他命令选项。",
"c_cpp.taskDefinitions.options.cwd.description": "已执行程序或脚本的当前工作目录。如果省略,则使用代码的当前工作区根。",
"c_cpp.taskDefinitions.problemMatcher.description": "用于检测任务输出中编译程序错误和警告的一个或多个问题匹配器。",
"c_cpp.taskDefinitions.detail.description": "任务的其他详细信息。",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "相同源树的当前路径和编译时路径。EditorPath 下的文件会映射到 CompileTimePath 路径以进行断点匹配,并在显示 stacktrace 位置时,从 CompileTimePath 映射到 EditorPath。",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "编辑器将使用的源树的路径。",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "用于控制如何找到和加载符号(.pdb 文件)的选项。",
"c_cpp.debuggers.unknownBreakpointHandling.description": "控制在命中时如何处理(通常通过原始 GDB 命令)外部设置的断点。\n允许的值为 \"throw\" (好像应用程序抛出了异常)和 \"stop\" (只会暂停调试会话)。默认值为 \"throw\"。",
"c_cpp.debuggers.debuginfod.description": "控制 GDB 的 debuginfod 行为,以从 debuginfod 服务器下载调试符号。",
"c_cpp.debuggers.debuginfod.enabled.description": "如果为 true (默认值)则启用 GDB 的 debuginfod 支持。设置为 false 可阻止 GDB 联系 debuginfod 服务器。",
"c_cpp.debuggers.debuginfod.enabled.description": "如果为 false (默认值)GDB 将不会连接 debuginfod 服务器。设置为 true 以启用 debuginfod 支持。",
"c_cpp.debuggers.debuginfod.timeout.description": "debuginfod 服务器请求的超时(以秒为单位)。默认值为 30。设置为 0 可使用 GDB/libdebuginfod 默认值(无替代)。",
"c_cpp.debuggers.VSSymbolOptions.description": "提供用于找到符号并将其加载到调试适配器的配置。",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "在其中搜索 .pdb 文件的符号服务器 URL (例如 http://MyExampleSymbolServer)或目录(例如 /build/symbols)的数组。除了默认位置,还将搜索这些目录 - 在模块以及 pdb 最初放置到的路径的旁边。",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "调试程序不得为其加载符号的模块数组。支持通配符(例如: MyCompany.*.dll)。\n\n会忽略此属性,除非“模式”设置为 \"loadAllButExcluded\"。",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "调试程序应为其加载符号的模块数组。支持通配符(例如: MyCompany.*.dll)。\n\n会忽略此属性,除非“模式”设置为 \"loadOnlyIncluded\"。",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "如果为 true,则对于未在 \"includedModules\" 数组中的任何模块,调试程序将在模块本身和启动可执行文件旁边进行检查,但它将不检查符号搜索列表上的路径。此选项默认为 \"true\"\n\n会忽略此属性,除非“模式”设置为 \"loadOnlyIncluded\"。",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "如果为 true,那么在运行但不调试的情况下,当未能在终端中启动程序时不会记录任何警告。",
"c_cpp.semanticTokenTypes.referenceType.description": "C++/CLI 引用类型的样式。",
"c_cpp.semanticTokenTypes.cliProperty.description": "C++/CLI 属性的样式。",
"c_cpp.semanticTokenTypes.genericType.description": "C++/CLI 泛型类型的样式。",
@@ -6,8 +6,7 @@
{
"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\" 的配置不支持“运行但不调试”。"
"debugger.unsupported.properties": "具有以下属性的启动配置无法直接在终端中运行: {0}",
"debugger.fallback.message": "程序输出将改为显示在调试控制台中。",
"debugger.fallback.message2": "若要取消显示此警告,请在启动配置中将 'ignoreRunWithoutDebuggingWarnings' 属性设置为 true。"
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "了解如何使用 vcpkg 为此标头安装库",
"copy.vcpkg.command": "将用于安装“{0}”的 vcpkg 命令复制到剪贴板",
"on.disabled.command": "当 `C_Cpp.intelliSenseEngine` 设置为 `disabled` 时,无法执行与 IntelliSense 相关的命令。",
"switch.header.source": "正在切换标头/源...",
"client.not.found": "未找到客户端",
"ok": "确定",
"install.compiler.mac.title": "现在将安装 clang 编译器",
@@ -346,7 +346,9 @@
"auth_denied": "用户拒绝了授权。",
"auth_unexpected_error": "轮询期间发生意外错误: {0}",
"auth_login_failed": "GitHub 登录失败。尝试从命令行使用 --login 运行以登录。",
"auth_login_failed_plugin": "GitHub 登录失败。运行 npx @microsoft/cpp-language-server --login",
"auth_eula_required": "必须接受 EULA 才能继续。请使用 --accept-eula 运行。",
"auth_eula_required_plugin": "必须接受 EULA 才能继续。运行 npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "已通过 GitHub 身份验证。使用 --force-login 重新进行身份验证。",
"config_unsupported_version": "初始化失败: 配置版本不受支持。仅支持版本 1。",
"config_file_not_found": "初始化失败: 未找到配置文件“{0}”。",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "使用殼層的弱引號字元來引用引數 (弱引號字元例如 \" 在 Bash 下)。",
"c_cpp.taskDefinitions.options.description": "其他命令選項。",
"c_cpp.taskDefinitions.options.cwd.description": "所執行程式或指令碼的目前工作目錄。如果省略,則會使用 Code 的目前工作區根目錄。",
"c_cpp.taskDefinitions.problemMatcher.description": "用來偵測工作輸出中編譯器錯誤和警告的一或多個問題比對器。",
"c_cpp.taskDefinitions.detail.description": "工作的其他詳細資料。",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "相同來源樹狀的目前路徑和編譯時間路徑。在顯示 stacktrace 位置時,在 EditorPath 下找到的檔案會對應到 CompileTimePath 路徑,以進行中斷點必對,並會從 CompileTimePath 對應到 EditorPath。",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "編輯器要使用的來源樹狀路徑。",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "控制如何找到並載入符號 (.pdb 檔案) 的選項。",
"c_cpp.debuggers.unknownBreakpointHandling.description": "控制叫用時如何處理在外部設定的中斷點 (通常是透過原始 GDB 命令)。\n允許的值為 \"throw\",其作用就像應用程式擲出例外,以及 \"stop\",其只會暫停偵錯工作階段。預設值為 \"throw\"。",
"c_cpp.debuggers.debuginfod.description": "控制從 debuginfod 伺服器下載偵錯符號的 GDB debuginfod 行為。",
"c_cpp.debuggers.debuginfod.enabled.description": "如果為 true (預設)則會啟用 GDB 的 debuginfod 支援。設定為 False 以防止 GDB 聯繫 debuginfod 伺服器。",
"c_cpp.debuggers.debuginfod.enabled.description": "如果為 false (預設)GDB 將不會連線到 debuginfod 伺服器。設定為 true 以啟用 debuginfod 支援。",
"c_cpp.debuggers.debuginfod.timeout.description": "debuginfod 伺服器要求的逾時秒數。預設值為 30。設定為 0 以使用 GDB/libdebuginfod 預設值 (無覆寫)。",
"c_cpp.debuggers.VSSymbolOptions.description": "提供將符號尋找及載入至偵錯介面卡的設定。",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "符號陣列伺服器 URL (範例: http://MyExampleSymbolServer) 或目錄 (範例: /build/symbols) 搜尋 .pdb 檔案。除了預設位置 (位於模組旁和 pdb 原先放置的路徑),也會搜尋這些目錄。",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "偵錯工具不應為其載入符號的模組陣列。支援萬用字元 (範例: MyCompany.*.dll)。\n\n除非 '模式' 設定為 'loadAllButExcluded',否則會忽略此屬性。",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "偵錯工具應該為其載入符號的模組陣列。支援萬用字元 (範例: MyCompany.*.dll)。\n\n除非 '模式' 設定為 'loadOnlyIncluded',否則會忽略此屬性。",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "若為 True,針對不在 'includedModules' 陣列中的任何模組,偵錯工具仍會檢查模組本身和啟動可執行檔的旁邊,但不會檢查符號搜尋清單上的路徑。此選項預設為 'true'。\n\n除非 '模式' 設定為 'loadOnlyIncluded',否則會忽略此屬性。",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "如果為 true,當不偵錯執行無法在終端機中啟動程式時,就不會記錄警告。",
"c_cpp.semanticTokenTypes.referenceType.description": "C++/CLI 參考類型的樣式。",
"c_cpp.semanticTokenTypes.cliProperty.description": "C++/CLI 屬性的樣式。",
"c_cpp.semanticTokenTypes.genericType.description": "C++/CLI 泛型類型的樣式。",
@@ -6,8 +6,7 @@
{
"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' 的設定不支援「執行但不進行偵錯」。"
"debugger.unsupported.properties": "具有下列屬性的啟動設定無法直接在終端機中執行: {0}",
"debugger.fallback.message": "程式輸出將會顯示在偵錯主控台中。",
"debugger.fallback.message2": "若要隱藏此警告,請在啟動設定中將 'ignoreRunWithoutDebuggingWarnings' 屬性設為 true。"
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "了解如何使用 vcpkg 安裝此標頭的程式庫",
"copy.vcpkg.command": "將用於安裝 '{0}' 的 vcpkg 命令複製到剪貼簿",
"on.disabled.command": "當 `C_Cpp.intelliSenseEngine` 設為 `disabled` 時,無法執行IntelliSense 的相關命令。",
"switch.header.source": "正在切換標頭/來源...",
"client.not.found": "找不到用戶端",
"ok": "確定",
"install.compiler.mac.title": "現在將安裝 clang 編譯器",
@@ -346,7 +346,9 @@
"auth_denied": "使用者拒絕授權。",
"auth_unexpected_error": "輪詢期間發生未預期的錯誤: {0}",
"auth_login_failed": "GitHub 登入失敗。請嘗試使用命令列中的 --login 進行登入。",
"auth_login_failed_plugin": "GitHub 登入失敗。請執行 npx @microsoft/cpp-language-server --login",
"auth_eula_required": "必須接受 EULA 才能繼續。請使用 --accept-eula 執行。",
"auth_eula_required_plugin": "必須接受 EULA 才能繼續。請執行 npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "已使用 GitHub 驗證。使用 --force-login 重新驗證。",
"config_unsupported_version": "初始化失敗: 不支援的設定版本。僅支援版本 1。",
"config_file_not_found": "初始化失敗: 找不到設定檔 '{0}'。",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Uzavře argument do jednoduchých uvozovek prostředí (například \" pomocí znaku Bash).",
"c_cpp.taskDefinitions.options.description": "Další možnosti příkazu.",
"c_cpp.taskDefinitions.options.cwd.description": "The current working directory of the executed program or script. If omitted Code's current workspace root is used.",
"c_cpp.taskDefinitions.problemMatcher.description": "One or more problem matchers to use to detect compiler errors and warnings in task output.",
"c_cpp.taskDefinitions.detail.description": "Další podrobnosti o úloze.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Aktuální cesta a cesta při kompilaci ke stejným zdrojovým stromům. Soubory, které se najdou na cestě EditorPath, se namapují na cestu CompileTimePath pro odpovídající zarážku, která se při zobrazování umístění stacktrace mapuje z CompileTimePath na EditorPath.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Cesta ke zdrojovému souboru, který se použije v editoru",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Možnosti kontroly způsobu, jakým se hledají a načítají symboly (soubory .pdb).",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Určuje, jak se mají zarážky nastavené externě (obvykle prostřednictvím nezpracovaných příkazů GDB) zpracovávat při průchodu.\nPovolené hodnoty jsou throw, která se chová, jako by aplikace vyvolala výjimku, a stop, která pouze pozastaví ladicí relaci. Výchozí hodnota je throw.",
"c_cpp.debuggers.debuginfod.description": "Řídí chování debuginfod v GDB při stahování symbolů ladění ze serverů debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Při hodnotě true (výchozí) je podpora debuginfod v GDB povolená. Pokud chcete zabránit GDB v kontaktování serverů debuginfod, nastavte hodnotu false.",
"c_cpp.debuggers.debuginfod.enabled.description": "Pokud je false (výchozí), GDB nebude kontaktovat servery debuginfod. Pokud chcete povolit debuginfod, nastavte na true.",
"c_cpp.debuggers.debuginfod.timeout.description": "Časový limit v sekundách pro žádosti serveru debuginfod. Výchozí hodnota je 30. Pokud chcete použít výchozí hodnoty GDB/libdebuginfod, nastavte hodnotu 0 (bez přepsání).",
"c_cpp.debuggers.VSSymbolOptions.description": "Poskytuje konfiguraci pro vyhledávání a načítání symbolů do ladicího adaptéru.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Pole adres URL serveru symbolů (například: http://MyExampleSymbolServer) nebo adresářů (například: /build/symbols) k vyhledávání souborů .pdb. Tyto adresáře budou prohledány kromě výchozích umístění vedle modulu a cesty, kam byl soubor pdb původně přemístěn.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Pole modulů, pro které by ladicí program neměl načítat symboly. Zástupné znaky (například: MyCompany. *.DLL) jsou podporovány.\n\nTato vlastnost je ignorována, pokud není „mode“ nastaven na hodnotu „loadAllButExcluded“.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Pole modulů, pro které má ladicí program načíst symboly. Zástupné znaky (například: MyCompany. *.DLL) jsou podporovány.\n\nTato vlastnost je ignorována, pokud není „mode“ nastaven na hodnotu „loadOnlyIncluded“.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Pokud má hodnotu true, u libovolného modulu, který není v poli „includedModules“, bude ladicí program stále provádět kontrolu vedle samotného modulu a spouštěcího souboru, ale nebude kontrolovat cesty v seznamu hledání symbolů. Tato možnost je standardně nastavena na hodnotu true.\n\nTato vlastnost je ignorována, pokud není „mode“ nastaven na hodnotu „loadOnlyIncluded“.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Pokud je nastavena hodnota true, při neúspěšném spuštění programu v terminálu bez ladění se nezaznamená žádné upozornění.",
"c_cpp.semanticTokenTypes.referenceType.description": "Styl pro referenční typy jazyka C++/CLI.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Styl pro vlastnosti jazyka C++/CLI.",
"c_cpp.semanticTokenTypes.genericType.description": "Styl pro obecné typy jazyka C++/CLI.",
@@ -6,8 +6,7 @@
{
"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."
"debugger.unsupported.properties": "Konfigurace spuštění s následujícími vlastnostmi nelze spustit přímo v terminálu: {0}",
"debugger.fallback.message": "Výstup programu se místo toho zobrazí v konzole ladění.",
"debugger.fallback.message2": "Chcete-li toto upozornění potlačit, nastavte v konfiguraci spuštění vlastnost ignoreRunWithoutDebuggingWarnings na hodnotu true."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Jak nainstalovat knihovnu pro tuto hlavičku pomocí vcpkg",
"copy.vcpkg.command": "Zkopírovat příkaz vcpkg pro instalaci {0} do schránky",
"on.disabled.command": "Příkazy související s IntelliSense se nedají spustit, když je `C_Cpp.intelliSenseEngine` nastavené na `disabled`.",
"switch.header.source": "Přepínání záhlaví/zdroje...",
"client.not.found": "klient se nenašel",
"ok": "OK",
"install.compiler.mac.title": "Kompilátor clang se teď nainstaluje.",
@@ -346,7 +346,9 @@
"auth_denied": "Uživatel zamítl autorizaci.",
"auth_unexpected_error": "Během dotazování došlo k neočekávané chybě: {0}",
"auth_login_failed": "Nepovedlo se přihlásit ke GitHubu. Zkuste se přihlásit spuštěním příkazu --login z příkazového řádku.",
"auth_login_failed_plugin": "Nepovedlo se přihlásit ke GitHubu. Spusťte npx @microsoft/cpp-language-server --login",
"auth_eula_required": "Aby bylo možné pokračovat, musí být přijata smlouva EULA. Spusťte příkaz --accept-eula.",
"auth_eula_required_plugin": "Aby bylo možné pokračovat, musí být přijata smlouva EULA. Spusťte npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Už ověřeno pomocí GitHubu. K opětovnému ověření použijte --force-login.",
"config_unsupported_version": "Inicializace se nezdařila: Nepodporovaná verze konfigurace. Podporuje se jenom verze 1.",
"config_file_not_found": "Inicializace se nezdařila: Konfigurační soubor {0} nebyl nalezen.",
+17 -15
View File
@@ -283,17 +283,17 @@
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Umgebungsvariablen, die an das Pipeprogramm übergeben werden.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Gibt an, ob Anführungszeichen gesetzt werden sollen, wenn die einzelnen pipeProgram-Argumente Zeichen enthalten (z. B. Leerzeichen oder Tabstopps). Bei Einstellung auf \"false\" wird der Debuggerbefehl nicht mehr automatisch in Anführungszeichen gesetzt. Der Standardwert ist \"true\".",
"c_cpp.debuggers.logging.description": "Optionale Flags zum Festlegen, welche Nachrichtentypen in der Debugging-Konsole protokolliert werden sollen.",
"c_cpp.debuggers.logging.exceptions.description": "Optionales Flag zum Festlegen, ob Ausnahmemeldungen in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist TRUE.",
"c_cpp.debuggers.logging.moduleLoad.description": "Optionales Flag zum Festlegen, ob Modulladeereignisse in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist TRUE.",
"c_cpp.debuggers.logging.programOutput.description": "Optionales Flag zum Festlegen, ob die Programmausgabe in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist TRUE.",
"c_cpp.debuggers.logging.engineLogging.description": "Optionales Flag zum Festlegen, ob Nachrichten der Diagnosedebug-Engine in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist FALSE.",
"c_cpp.debuggers.logging.trace.description": "Optionales Flag zum Festlegen, ob die Befehlsablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist FALSE.",
"c_cpp.debuggers.logging.traceResponse.description": "Optionales Flag zum Festlegen, ob die Befehls- und Antwortablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist FALSE.",
"c_cpp.debuggers.logging.exceptions.description": "Optionales Flag zum Festlegen, ob Ausnahmemeldungen in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist \"true\".",
"c_cpp.debuggers.logging.moduleLoad.description": "Optionales Flag zum Festlegen, ob Modulladeereignisse in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist \"true\".",
"c_cpp.debuggers.logging.programOutput.description": "Optionales Flag zum Festlegen, ob die Programmausgabe in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist \"true\".",
"c_cpp.debuggers.logging.engineLogging.description": "Optionales Flag zum Festlegen, ob Nachrichten der Diagnosedebug-Engine in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist \"false\".",
"c_cpp.debuggers.logging.trace.description": "Optionales Flag zum Festlegen, ob die Befehlsablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist \"false\".",
"c_cpp.debuggers.logging.traceResponse.description": "Optionales Flag zum Festlegen, ob die Befehls- und Antwortablaufverfolgung des Diagnoseadapters in der Debugging-Konsole protokolliert werden soll. Der Standardwert ist \"false\".",
"c_cpp.debuggers.cppvsdbg.logging.threadExit.description": "Optionales Flag zum Bestimmen, ob Meldungen zum Beenden des Threads in der Debugging-Konsole protokolliert werden sollen. Standardwert: \"false\".",
"c_cpp.debuggers.cppvsdbg.logging.processExit.description": "Optionale Kennzeichnung zum Bestimmen, ob Meldungen zum Beenden des Zielprozesses in der Debugging-Konsole protokolliert werden sollen. Standardwert: \"true\".",
"c_cpp.debuggers.text.description": "Der auszuführende Debuggerbefehl.",
"c_cpp.debuggers.description.description": "Optionale Beschreibung des Befehls.",
"c_cpp.debuggers.ignoreFailures.description": "Wenn dieser Wert auf TRUE festgelegt ist, werden durch den Befehl verursachte Fehler ignoriert. Der Standardwert ist FALSE.",
"c_cpp.debuggers.ignoreFailures.description": "Wenn dieser Wert auf \"true\" festgelegt ist, werden durch den Befehl verursachte Fehler ignoriert. Der Standardwert ist \"false\".",
"c_cpp.debuggers.program.description": "Vollständiger Pfad zur ausführbaren Programmdatei.",
"c_cpp.debuggers.args.description": "Befehlszeilenargumente, die an das Programm übergeben werden.",
"c_cpp.debuggers.targetArchitecture.description": "Die Architektur der zu debuggenden Komponente. Falls dieser Parameter nicht festgelegt ist, wird die Architektur automatisch erkannt. Zulässige Werte sind \"x86\", \"arm\", \"arm64\", \"mips\", \"x64\", \"amd64\" und \"x86_64\".",
@@ -322,23 +322,23 @@
"c_cpp.debuggers.filterStderr.description": "stderr-Stream für ein vom Server gestartetes Muster suchen und stderr in der Debugausgabe protokollieren. Der Standardwert ist \"false\".",
"c_cpp.debuggers.serverLaunchTimeout.description": "Optionale Zeit in Millisekunden, während der der Debugger auf den Start von debugServer wartet. Der Standardwert ist 10.000.",
"c_cpp.debuggers.coreDumpPath.description": "Optionaler vollständiger Pfad zu einer Kern-Speicherabbilddatei für das angegebene Programm. Der Standardwert ist \"NULL\".",
"c_cpp.debuggers.cppdbg.externalConsole.description": "Wenn dieser Wert auf TRUE festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei FALSE wird die Komponente unter Linux und Windows in der integrierten Konsole angezeigt.",
"c_cpp.debuggers.cppvsdbg.externalConsole.description": "[Veraltet für \"console\"] Wenn dieser Wert auf TRUE festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei FALSE wird keine Konsole gestartet.",
"c_cpp.debuggers.cppdbg.externalConsole.description": "Wenn dieser Wert auf \"true\" festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei \"false\" wird die Komponente unter Linux und Windows in der integrierten Konsole angezeigt.",
"c_cpp.debuggers.cppvsdbg.externalConsole.description": "[Veraltet für \"console\"] Wenn dieser Wert auf \"true\" festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei \"false\" wird keine Konsole gestartet.",
"c_cpp.debuggers.cppvsdbg.console.description": "Gibt an, wo das Debugziel gestartet wird. Wenn keine Angabe vorliegt, wird standardmäßig „internalConsole“ verwendet.",
"c_cpp.debuggers.cppvsdbg.console.internalConsole.description": "Die Ausgabe an die Debugging-Konsole von VS Code. Das Lesen von Konsoleneingaben (z. B. `std::cin` oder `scanf`) wird nicht unterstützt.",
"c_cpp.debuggers.cppvsdbg.console.integratedTerminal.description": "Das integrierte Terminal von VS Code.",
"c_cpp.debuggers.cppvsdbg.console.externalTerminal.description": "Konsolenanwendungen werden in einem externen Terminalfenster gestartet. Das Fenster wird in Neustartszenarien erneut verwendet und beim Beenden der Anwendung nicht automatisch ausgeblendet.",
"c_cpp.debuggers.cppvsdbg.console.newExternalWindow.description": "Konsolenanwendungen werden in ihrem eigenen externen Konsolenfenster gestartet, das beim Beenden der Anwendung ebenfalls beendet wird. Nicht-Konsolenanwendungen werden ohne Terminal ausgeführt, und stdout/stderr wird ignoriert.",
"c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Wenn dieser Wert auf TRUE festgelegt ist, wird für die zu debuggende Komponente die Konsolenumleitung deaktiviert, die für die Unterstützung des integrierten Terminals erforderlich ist.",
"c_cpp.debuggers.avoidWindowsConsoleRedirection.description": "Wenn dieser Wert auf \"true\" festgelegt ist, wird für die zu debuggende Komponente die Konsolenumleitung deaktiviert, die für die Unterstützung des integrierten Terminals erforderlich ist.",
"c_cpp.debuggers.sourceFileMap.markdownDescription": "Optionale Quelldateizuordnungen, die an die Debug-Engine übergeben werden. Beispiel: `{ \"<ursprünglicher Quellpfad>\": \"<aktueller Quellpfad>\" }`.",
"c_cpp.debuggers.processId.anyOf.markdownDescription": "Optionale Prozess-ID, an die der Debugger angefügt werden soll. Verwenden Sie `${command:pickProcess}`, um eine Liste der lokalen ausgeführten Prozesse abzurufen, an die das Anfügen möglich ist. Beachten Sie, dass für einige Plattformen Administratorrechte erforderlich sind, damit an einen Prozess angefügt werden kann.",
"c_cpp.debuggers.program.attach.markdownDescription": "Vollständiger Pfad zur ausführbaren Programmdatei. Der Debugger sucht nach einem laufenden Prozess, der diesem ausführbaren Pfad entspricht, und bindet ihn an. Wenn mehrere Prozesse übereinstimmen, wird eine Auswahlaufforderung angezeigt. Dieses Feld ist erforderlich, um Debugsymbole für den angehängten Prozess zu laden.",
"c_cpp.debuggers.symbolSearchPath.description": "Durch Semikolons getrennte Liste von Verzeichnissen, die für die Suche nach Symboldateien (d. h. PDB- oder .so-Dateien) verwendet werden sollen. Beispiel: „c:\\dir1;c:\\dir2“.",
"c_cpp.debuggers.dumpPath.description": "Optionaler vollständiger Pfad zu einer Dumpdatei für das angegebene Programm. Beispiel: \"c:\\temp\\app.dmp\". Standardwert ist NULL.",
"c_cpp.debuggers.enableDebugHeap.description": "Wenn dieser Wert auf FALSE festgelegt ist, wird der Prozess mit deaktiviertem Debug-Heap gestartet. Hiermit wird die Umgebungsvariable \"_NO_DEBUG_HEAP\" auf \"1\" festgelegt.",
"c_cpp.debuggers.enableDebugHeap.description": "Wenn dieser Wert auf \"false\" festgelegt ist, wird der Prozess mit deaktiviertem Debug-Heap gestartet. Hiermit wird die Umgebungsvariable \"_NO_DEBUG_HEAP\" auf \"1\" festgelegt.",
"c_cpp.debuggers.symbolLoadInfo.description": "Explizite Steuerung des Symbolladevorgangs.",
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Bei TRUE werden Symbole für alle Bibliotheken geladen, andernfalls werden keine solib-Symbole geladen. Der Standardwert ist TRUE.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Liste mit Dateinamen (Platzhalter zulässig), getrennt durch Semikolons `;`. Ändert das Verhalten von „LoadAll“. Wenn „LoadAll“ auf `TRUE` festgelegt ist, werden keine Symbole für Bibliotheken geladen, die einem beliebigen Namen in der Liste entsprechen. Andernfalls werden nur Symbole für übereinstimmende Bibliotheken geladen. Beispiel: `foo.so;bar.so`.",
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Bei \"true\" werden Symbole für alle Bibliotheken geladen, andernfalls werden keine solib-Symbole geladen. Der Standardwert ist \"true\".",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Liste mit Dateinamen (Platzhalter zulässig), getrennt durch Semikolons `;`. Ändert das Verhalten von „LoadAll“. Wenn „LoadAll“ auf \"true\" festgelegt ist, werden keine Symbole für Bibliotheken geladen, die einem beliebigen Namen in der Liste entsprechen. Andernfalls werden nur Symbole für übereinstimmende Bibliotheken geladen. Beispiel: `foo.so;bar.so`.",
"c_cpp.debuggers.requireExactSource.description": "Optionales Flag, um anzufordern, dass der aktuelle Quellcode mit der PDB-Datei übereinstimmt.",
"c_cpp.debuggers.stopAtConnect.description": "Wenn \"true\", sollte der Debugger nach dem Herstellen einer Verbindung mit dem Ziel beendet werden. Wenn \"false\" wird der Debugger nach dem Herstellen der Verbindung fortgesetzt. Entspricht standardmäßig \"false\".",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explizite Steuerung des Hardwarehaltepunktverhaltens für Remoteziele.",
@@ -385,14 +385,15 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Setzt das Argument mithilfe des schwachen Anführungszeichens der Shell in Anführungszeichen (z. B. \" bei Bash).",
"c_cpp.taskDefinitions.options.description": "Zusätzliche Befehlsoptionen.",
"c_cpp.taskDefinitions.options.cwd.description": "Das aktuelle Arbeitsverzeichnis des ausgeführten Programms oder Skripts. Wenn keine Angabe erfolgt, wird das aktuelle Arbeitsbereich-Stammverzeichnis des Codes verwendet.",
"c_cpp.taskDefinitions.problemMatcher.description": "Ein oder mehrere Problemübereinstimmungen, die zum Erkennen von Compilerfehlern und Warnungen in der Taskausgabe verwendet werden sollen.",
"c_cpp.taskDefinitions.detail.description": "Zusätzliche Details zur Aufgabe.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Dies sind die Pfade zu denselben Quellstrukturen einmal aktuell und einmal zur Kompilierzeit. Im EditorPath gefundene Dateien werden zum Haltepunktabgleich dem CompileTimePath-Pfad zugeordnet. Bei der Anzeige von Speicherorten für die Stapelüberwachung erfolgt die Zuordnung vom CompileTimePath zum EditorPath.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Der Pfad zur Quellstruktur, die vom Editor verwendet wird.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "FALSE, wenn dieser Eintrag nur für eine Stapelrahmen-Speicherortzuordnung verwendet wird. TRUE, wenn dieser Eintrag auch zum Angeben von Haltepunktpositionen verwendet werden soll.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.useForBreakpoints.description": "\"false\", wenn dieser Eintrag nur für eine Stapelrahmen-Speicherortzuordnung verwendet wird. \"true\", wenn dieser Eintrag auch zum Angeben von Haltepunktpositionen verwendet werden soll.",
"c_cpp.debuggers.symbolOptions.description": "Optionen zum Steuern, wie Symbole (PDB-Dateien) gefunden und geladen werden.",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Steuert, wie extern gesetzte Haltepunkte (normalerweise über rohe GDB-Befehle) behandelt werden, wenn ihnen begegnet wird.\nErlaubte Werte sind \"throw\", was sich so verhält, als ob eine Ausnahme von der Anwendung ausgelöst würde, und \"stop\", was die Debugsitzung nur pausiert. Der Standardwert ist \"throw\".",
"c_cpp.debuggers.debuginfod.description": "Steuert das debuginfod-Verhalten von GDB beim Herunterladen von Debugsymbolen von debuginfod-Servern.",
"c_cpp.debuggers.debuginfod.enabled.description": "Wenn auf TRUE (Standard) festgelegt, ist die debuginfod-Unterstützung in GDB aktiviert. Legen Sie den Wert auf FALSE fest, um zu verhindern, dass GDB debuginfod-Server kontaktiert.",
"c_cpp.debuggers.debuginfod.enabled.description": "Wenn false (Standard), kann GDB keine Verbindung mit debuginfod-Servern herstellen. Legen Sie den Wert auf true fest, um den debuginfod-Support zu aktivieren.",
"c_cpp.debuggers.debuginfod.timeout.description": "Das Zeitlimit in Sekunden für debuginfod-Serveranforderungen. Standardwert ist 30. Auf 0 festlegen, um die Standardwerte von GDB/libdebuginfod zu verwenden (keine Überschreibung).",
"c_cpp.debuggers.VSSymbolOptions.description": "Stellt eine Konfiguration zum Suchen und Laden von Symbolen in den Debugadapter bereit.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Ein Array von Symbolserver-URLs (Beispiel: http://MyExampleSymbolServer) oder Verzeichnisse (Beispiel:/Build/Symbols) für die Suche nach PDB-Dateien. Diese Verzeichnisse werden zusätzlich zu den Standardspeicherorten durchsucht neben dem Modul und dem Pfad, in dem die PDB ursprünglich abgelegt wurde.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Ein Array von Modulen, für das der Debugger keine Symbole laden soll. Platzhalter (Beispiel: MyCompany. *. dll) werden unterstützt.\n\nDiese Eigenschaft wird ignoriert, wenn „Modus“ nicht auf „loadAllButExcluded“ festgelegt ist.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Ein Array von Modulen, für das der Debugger keine Symbole laden soll. Platzhalter (Beispiel: MyCompany. *. dll) werden unterstützt.\n\nDiese Eigenschaft wird ignoriert, wenn „Modus“ nicht auf „loadOnlyIncluded“ festgelegt ist.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Wenn „true“, wird der Debugger für ein beliebiges Modul, das sich NICHT im Array „includedModules“ befindet, weiterhin neben dem Modul selbst und der ausführbaren Datei, die gestartet wird, überprüfen. Die Pfade in der Symbolsuchliste werden jedoch nicht überprüft. Diese Option ist standardmäßig auf „true“ eingestellt.\n\nDiese Eigenschaft wird ignoriert, wenn „Modus“ nicht auf „loadOnlyIncluded“ festgelegt ist.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Wenn true, wird keine Warnung protokolliert, wenn die Ausführung ohne Debuggen das Programm im Terminal nicht startet.",
"c_cpp.semanticTokenTypes.referenceType.description": "Stil für C++-/CLI-Referenztypen.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Stil für C++-/CLI-Eigenschaften.",
"c_cpp.semanticTokenTypes.genericType.description": "Stil für generische C++-/CLI-Typen.",
@@ -6,8 +6,7 @@
{
"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."
"debugger.unsupported.properties": "Startkonfigurationen mit den folgenden Eigenschaften können nicht direkt im Terminal ausgeführt werden: {0}",
"debugger.fallback.message": "Die Programmausgabe wird stattdessen in der Debugging-Konsole angezeigt.",
"debugger.fallback.message2": "Um diese Warnung zu unterdrücken, legen Sie die Eigenschaft „ignoreRunWithoutDebuggingWarnings“ in Ihrer Startkonfiguration auf \"true\" fest."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Erfahren Sie, wie Sie mit vcpkg eine Bibliothek für diesen Header installieren.",
"copy.vcpkg.command": "vcpkg-Befehl zum Installieren von \"{0}\" in die Zwischenablage kopieren",
"on.disabled.command": "IntelliSense-bezogene Befehle können nicht ausgeführt werden, wenn `C_Cpp.intelliSenseEngine` auf `disabled` festgelegt ist.",
"switch.header.source": "Header/Quelle wird gewechselt...",
"client.not.found": "Client nicht gefunden.",
"ok": "OK",
"install.compiler.mac.title": "Der Clang-Compiler wird jetzt installiert.",
@@ -346,7 +346,9 @@
"auth_denied": "Die Autorisierung wurde vom Benutzer verweigert.",
"auth_unexpected_error": "Unerwarteter Fehler beim Abrufen: {0}",
"auth_login_failed": "Die GitHub-Anmeldung ist fehlgeschlagen. --login über die Befehlszeile ausführen, um sich anzumelden.",
"auth_login_failed_plugin": "Die GitHub-Anmeldung ist fehlgeschlagen. Führen Sie npx @microsoft/cpp-language-server --login aus.",
"auth_eula_required": "EULA muss akzeptiert werden, um den Vorgang fortzusetzen. Mit --accept-eula ausführen.",
"auth_eula_required_plugin": "EULA muss akzeptiert werden, um den Vorgang fortzusetzen. Führen Sie npx @microsoft/cpp-language-server --accept-eula aus.",
"auth_already_authenticated": "Bereits bei GitHub authentifiziert. Verwenden Sie „--force-login“, um sich erneut zu authentifizieren.",
"config_unsupported_version": "Initialisierungsfehler: Nicht unterstützte Konfigurationsversion. Es wird nur Version 1 unterstützt.",
"config_file_not_found": "Initialisierungsfehler: Die Konfigurationsdatei „{0}“ wurde nicht gefunden.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Entrecomilla el argumento con el carácter de comillas dobles del shell (p. ej.: \" con Bash).",
"c_cpp.taskDefinitions.options.description": "Opciones de comando adicionales.",
"c_cpp.taskDefinitions.options.cwd.description": "Directorio de trabajo actual del script o el programa ejecutado. Si se omite, se usa la raíz del área de trabajo actual de Code.",
"c_cpp.taskDefinitions.problemMatcher.description": "Uno o varios detectores de coincidencias de problemas para detectar errores y advertencias del compilador en la salida de la tarea.",
"c_cpp.taskDefinitions.detail.description": "Detalles adicionales de la tarea.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Rutas de acceso actuales y en tiempo de compilación a los mismos árboles de origen. Los archivos que se encuentran en EditorPath se asignan a la ruta de acceso CompileTimePath para la coincidencia de los puntos de interrupción y se asignan de CompileTimePath a EditorPath al mostrar ubicaciones de seguimiento de la pila.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "La ruta de acceso al árbol de origen que el editor va a usar.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Opciones para controlar cómo se encuentran y se cargan los símbolos (archivos .pdb).",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Controla cómo se controlan los puntos de interrupción establecidos externamente (normalmente a través de comandos GDB sin procesar) cuando se alcanzan.\nLos valores permitidos son \"throw\", que actúa como si la aplicación iniciara una excepción y \"stop\", que solo pausa la sesión de depuración. El valor predeterminado es \"throw\".",
"c_cpp.debuggers.debuginfod.description": "Controla el comportamiento de debuginfod de GDB para descargar símbolos de depuración de servidores debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Si es true (valor predeterminado), la compatibilidad con debuginfod de GDB está habilitada. Se establece en false para evitar que GDB se ponga en contacto con los servidores debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Si es false (valor predeterminado), GDB no se pondrá en contacto con los servidores debuginfod. Establézcalo en true para habilitar la compatibilidad con debuginfod.",
"c_cpp.debuggers.debuginfod.timeout.description": "Tiempo de espera, en segundos, para las solicitudes al servidor debuginfod. El valor predeterminado es 30. Se establece en 0 para usar los valores predeterminados de GDB/libdebuginfod (sin invalidación).",
"c_cpp.debuggers.VSSymbolOptions.description": "Proporciona la configuración para buscar y cargar símbolos en el adaptador de depuración.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Matriz de direcciones URL del servidor de símbolos (ejemplo: http://MiServidordeSímblosdeEjemplo) o de directorios (ejemplo: /compilar/symbols) para buscar archivos. pdb. Se buscarán estos directorios además de las ubicaciones predeterminadas, junto al módulo y la ruta de acceso en la que se anuló originalmente el archivo pdb.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Matriz de módulos para los que el depurador NO debería cargar símbolos. Se admiten los caracteres comodín (ejemplo: MiEmpresa.*.dll).\n\nEsta propiedad se ignora a menos que «modo» se establezca como «loadAllButExcluded».",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Matriz de módulos para los que el depurador debería cargar símbolos. Se admiten los caracteres comodín (ejemplo: MiEmpresa.*.dll).\n\nEsta propiedad se ignora a menos que «modo» se establezca como «loadOnlyIncluded».",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Si es verdadero, para cualquier módulo que NO esté en la matriz «includedModules», el depurador seguirá comprobando junto al propio módulo y el ejecutable de inicio, pero no comprobará las rutas en la lista de búsqueda de símbolos. Esta opción tiene el valor predeterminado «verdadero».\n\nEsta propiedad se omite a menos que «modo» esté establecido como «loadOnlyIncluded».",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Si es true, no se registrará ninguna advertencia cuando la ejecución sin depuración no pueda iniciar el programa en el terminal.",
"c_cpp.semanticTokenTypes.referenceType.description": "Estilo para tipos de referencia de C++/CLI.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Estilo para las propiedades de C++/CLI.",
"c_cpp.semanticTokenTypes.genericType.description": "Estilo para tipos genéricos de C++/CLI.",
@@ -6,8 +6,7 @@
{
"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."
"debugger.unsupported.properties": "Las configuraciones de inicio con las siguientes propiedades no se pueden ejecutar directamente en el terminal: {0}",
"debugger.fallback.message": "En su lugar, la salida del programa aparecerá en la Consola de depuración.",
"debugger.fallback.message2": "Para suprimir esta advertencia, establezca la propiedad \"ignoreRunWithoutDebuggingWarnings\" en true en la configuración de inicio."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Más información sobre el modo de instalar una biblioteca para este encabezado con vcpkg",
"copy.vcpkg.command": "Copie el comando vcpkg para instalar \"{0}\" en el Portapapeles",
"on.disabled.command": "Los comandos relacionados con IntelliSense no se pueden ejecutar cuando `C_Cpp.intelliSenseEngine` está establecido en `disabled`.",
"switch.header.source": "Cambiando encabezado/origen...",
"client.not.found": "No se encuentra el cliente",
"ok": "Aceptar",
"install.compiler.mac.title": "El compilador Clang se instalará ahora",
@@ -346,7 +346,9 @@
"auth_denied": "El usuario denegó la autorización.",
"auth_unexpected_error": "Error inesperado durante el sondeo: {0}",
"auth_login_failed": "Error de inicio de sesión de GitHub. Intente ejecutar con --login desde la línea de comandos para iniciar sesión.",
"auth_login_failed_plugin": "Error de inicio de sesión de GitHub. Ejecute npx @microsoft/cpp-language-server --login",
"auth_eula_required": "Se debe aceptar el EULA para continuar. Se ejecuta con --accept-eula.",
"auth_eula_required_plugin": "Se debe aceptar el EULA para continuar. Ejecute npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Ya se ha autenticado con GitHub. Use --force-login para volver a autenticarse.",
"config_unsupported_version": "Error de inicialización: versión de configuración no admitida. Solo se admite la versión 1.",
"config_file_not_found": "Error de inicialización: no se encontró el archivo de configuración ''{0}\".",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Délimite largument en utilisant le caractère de guillemet faible du shell (par exemple \" sous Bash).",
"c_cpp.taskDefinitions.options.description": "Options de commande supplémentaires.",
"c_cpp.taskDefinitions.options.cwd.description": "Répertoire de travail actif du programme ou script exécuté. En cas d'omission, la racine de l'espace de travail actif de Code est utilisée.",
"c_cpp.taskDefinitions.problemMatcher.description": "Un ou plusieurs détecteurs de problèmes à utiliser pour détecter les avertissements et les erreurs du compilateur dans le résultat de la tâche.",
"c_cpp.taskDefinitions.detail.description": "Détails supplémentaires de la tâche.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Chemins actuels et au moment de la compilation des mêmes arborescences sources. Les fichiers situés dans EditorPath sont mappés au chemin CompileTimePath pour les correspondances de points d'arrêt et sont mappés de CompileTimePath à EditorPath au moment de l'affichage des emplacements d'arborescences des appels de procédure.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Chemin de l'arborescence source que l'éditeur va utiliser.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Options permettant de contrôler la façon dont les symboles (fichiers .pdb) sont trouvés et chargés.",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Contrôle la façon dont les points darrêt définis en externe (généralement via des commandes GDB brutes) sont gérés en cas daccès.\nLes valeurs autorisées sont « throw », qui agit comme si une exception était levée par lapplication, et « stop », qui suspend uniquement la session de débogage. La valeur par défaut est « throw ».",
"c_cpp.debuggers.debuginfod.description": "Permet de contrôler le comportement de debuginfod par GDB pour télécharger les symboles de débogage à partir de serveurs debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Si la valeur est true (par défaut), la prise en charge de debuginfod par GDB est activée. Définissez-la sur false pour empêcher GDB de contacter des serveurs debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Si la valeur est false (par défaut), GDB ne contacte pas les serveurs debuginfod. Définissez sur la valeur true pour activer debuginfod.",
"c_cpp.debuggers.debuginfod.timeout.description": "Délai dexpiration en secondes pour les requêtes du serveur debuginfod. La valeur par défaut est 30. Définissez sur 0 pour utiliser les valeurs par défaut de GDB/libdebuginfod (aucune substitution).",
"c_cpp.debuggers.VSSymbolOptions.description": "Fournit la configuration pour localiser et charger des symboles sur ladaptateur de débogage.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Tableau dURL de serveur de symboles (exemple : http://MyExampleSymbolServer) ou répertoires (exemple : /build/symbols) pour rechercher des fichiers .pdb. Ces répertoires seront recherchés en plus des emplacements par défaut, en regard du module et du chemin daccès vers lequel le fichier pdb a été supprimé à lorigine.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Tableau de modules pour lequel le débogueur ne doit PAS charger de symboles. Les caractères génériques (exemple : MonEntreprise.*.dll) sont pris en charge.\n\nCette propriété est ignorée, sauf si « mode » a la valeur «loadAllButExcluded».",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Tableau de modules pour lequel le débogueur doit charger des symboles. Les caractères génériques (exemple : MonEntreprise.*.dll) sont pris en charge.\n\nCette propriété est ignorée, sauf si « mode » a la valeur «loadOnlyIncluded».",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Si la valeur est true, pour tout module qui ne figure pas dans le tableau « includedModules », le débogueur vérifie toujours en regard du module lui-même et de lexécutable de lancement, mais il ne vérifie pas les chemins daccès dans la liste de recherche de symboles. Cette option a la valeur par défaut « true ».\n\nCette propriété est ignorée, sauf si « mode » a la valeur «loadOnlyIncluded».",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Si la valeur est true, aucun avertissement ne sera consigné quand lexécution sans débogage échoue à lancer le programme dans le terminal.",
"c_cpp.semanticTokenTypes.referenceType.description": "Style pour les types référence C++/CLI.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Style pour les propriétés C++/CLI.",
"c_cpp.semanticTokenTypes.genericType.description": "Style pour les types génériques C++/CLI.",
@@ -6,8 +6,7 @@
{
"debugger.not.available": "Le type de débogueur '{0}' nest pas disponible pour les machines non Windows.",
"debugger.noDebug.requestType.not.supported": "Lexécution sans débogage nest prise en charge que pour les configurations de lancement.",
"debugger.noDebug.pipeTransport.not.supported": "Lexécution sans débogage nest pas prise en charge pour les configurations où « pipeTransport » est défini.",
"debugger.noDebug.debugServerPath.not.supported": "Lexécution sans débogage nest pas prise en charge pour les configurations où « debugServerPath » est défini.",
"debugger.noDebug.miDebuggerServerAddress.not.supported": "Lexécution sans débogage nest pas prise en charge pour les configurations où « miDebuggerServerAddress » est défini.",
"debugger.noDebug.coreDumpPath.not.supported": "Lexécution sans débogage nest pas prise en charge pour les configurations où « coreDumpPath » est défini."
"debugger.unsupported.properties": "Les configurations de lancement avec les propriétés suivantes ne peuvent pas être exécutées directement dans le terminal : {0}",
"debugger.fallback.message": "La sortie du programme saffichera dans la Console de débogage à la place.",
"debugger.fallback.message2": "Pour supprimer cet avertissement, définissez la propriété « ignoreRunWithoutDebuggingWarnings » sur true dans votre configuration de lancement."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Découvrir comment installer une bibliothèque pour cet en-tête avec vcpkg",
"copy.vcpkg.command": "Copier la commande vcpkg pour installer '{0}' dans le Presse-papiers",
"on.disabled.command": "Les commandes liées à IntelliSense ne peuvent pas être exécutées quand `C_Cpp.intelliSenseEngine` a la valeur `disabled`.",
"switch.header.source": "Changement den-tête/source en cours... Merci de patienter.",
"client.not.found": "client introuvable",
"ok": "OK",
"install.compiler.mac.title": "Le compilateur clang va maintenant être installé",
@@ -346,7 +346,9 @@
"auth_denied": "Lautorisation a été refusée par lutilisateur(-trice).",
"auth_unexpected_error": "Erreur inattendue lors de linterrogation : {0}",
"auth_login_failed": "Nous navons pas pu effectuer la connexion à GitHub. Essayez dexécuter la commande avec --login depuis la ligne de commande pour vous connecter.",
"auth_login_failed_plugin": "Nous navons pas pu effectuer la connexion à GitHub. Exécutez npx @microsoft/cpp-language-server --login",
"auth_eula_required": "Le CLUF doit être accepté pour continuer. Exécutez avec --accept-eula.",
"auth_eula_required_plugin": "Le CLUF doit être accepté pour continuer. Exécutez npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Déjà authentifié auprès de GitHub. Utilisez --force-login pour vous réauthentifier.",
"config_unsupported_version": "Échec de linitialisation : version de configuration non prise en charge. Seule la version 1 est prise en charge.",
"config_file_not_found": "Échec de linitialisation : le fichier de configuration « {0} » est introuvable.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Racchiude l'argomento tra virgolette usando le virgolette doppie della shell (ad esempio \" in bash).",
"c_cpp.taskDefinitions.options.description": "Opzioni aggiuntive del comando.",
"c_cpp.taskDefinitions.options.cwd.description": "Directory di lavoro corrente del programma o dello script eseguito. Se omesso, viene usata la radice dell'area di lavoro corrente di Visual Studio Code.",
"c_cpp.taskDefinitions.problemMatcher.description": "Uno o più analizzatori di problemi da usare per rilevare errori e avvisi del compilatore nell'output dell'attività.",
"c_cpp.taskDefinitions.detail.description": "Dettagli aggiuntivi dell'attività.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Percorsi correnti e della fase di compilazione degli stessi alberi di origine. I file trovati in EditorPath vengono associati al percorso CompileTimePath per la corrispondenza dei punti di interruzione e associati da CompileTimePath a EditorPath durante la visualizzazione dei percorsi delle analisi dello stack.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Percorso dell'albero di origine che verrà usato dall'editor.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Opzioni per controllare il modo in cui vengono trovati e caricati i simboli (file PDB).",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Controllare la modalità di gestione dei punti di interruzione impostati esternamente (in genere tramite comandi GDB non elaborati) quando vengono selezionati.\nI valori consentiti sono \"throw\", che funziona come se fosse stata generata un'eccezione dall'applicazione e \"stop\", che sospende solo la sessione di debug. Il valore predefinito è \"throw\".",
"c_cpp.debuggers.debuginfod.description": "Controllare il comportamento di debuginfod in GDB per il download dei simboli di debug dai server debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Se true (impostazione predefinita), il supporto a debuginfod di GDB è abilitato. Impostare su false per impedire a GDB di contattare i server debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Se è false (impostazione predefinita), GDB non contatterà i server debuginfod. Impostarlo su true per abilitare debuginfod.",
"c_cpp.debuggers.debuginfod.timeout.description": "Il timeout in secondi per le richieste al server debuginfod. Il valore predefinito è 30. Impostare su 0 per usare le impostazioni predefinite di GDB/libdebuginfod (senza override).",
"c_cpp.debuggers.VSSymbolOptions.description": "Fornisce la configurazione per l'individuazione e il caricamento dei simboli nell'adattatore di debug.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Matrice di URL del server dei simboli, ad esempio http://MyExampleSymbolServer, o di directory, ad esempio /build/symbols, in cui eseguire la ricerca dei file PDB. La ricerca verrà eseguita in queste directory oltre che nei percorsi predefiniti, in aggiunta al modulo e al percorso in cui è stato rilasciato originariamente il file PDB.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Matrice di moduli per cui il debugger non deve caricare i simboli. I caratteri jolly, ad esempio MyCompany.*.dll, sono supportati.\n\nQuesta proprietà viene ignorata a meno che 'mode' non sia impostato su 'loadAllButExcluded'.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Matrice di moduli per cui il debugger deve caricare i simboli. I caratteri jolly, ad esempio MyCompany.*.dll, sono supportati.\n\nQuesta proprietà viene ignorata a meno che 'mode' non sia impostato su 'loadOnlyIncluded'.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Se è true, per qualsiasi modulo non presente nella matrice 'includedModules', il debugger eseguirà comunque il controllo in aggiunta al modulo stesso e all'eseguibile di avvio, ma non controllerà nei percorsi dell'elenco di ricerca dei simboli. L'impostazione predefinita di questa opzione è 'true'.\n\nQuesta proprietà viene ignorata a meno che 'mode' non sia impostato su 'loadOnlyIncluded'.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Se è true, non verrà registrato alcun avviso quando l'esecuzione senza debug non riesce ad avviare il programma nel terminale.",
"c_cpp.semanticTokenTypes.referenceType.description": "Stile per i tipi di riferimento C++/CLI.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Stile per le proprietà C++/CLI.",
"c_cpp.semanticTokenTypes.genericType.description": "Stile per tipi generici C++/CLI.",
@@ -6,8 +6,7 @@
{
"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."
"debugger.unsupported.properties": "Le configurazioni di avvio con le proprietà seguenti non possono essere eseguite direttamente nel terminale: {0}",
"debugger.fallback.message": "L'output del programma verrà invece visualizzato nella Console di debug.",
"debugger.fallback.message2": "Per eliminare questo avviso, impostare la proprietà 'ignoreRunWithoutDebuggingWarnings' su vero nella configurazione di avvio."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Informazioni su come installare una libreria per questa intestazione con vcpkg",
"copy.vcpkg.command": "Copiare il comando vcpkg per installare '{0}' negli Appunti",
"on.disabled.command": "Non è possibile eseguire comandi correlati a IntelliSense quando `C_Cpp.intelliSenseEngine` è impostato su `disabled`.",
"switch.header.source": "Scambio intestazione/origine in corso...",
"client.not.found": "client non trovato",
"ok": "OK",
"install.compiler.mac.title": "Il compilatore clang verrà ora installato",
@@ -346,7 +346,9 @@
"auth_denied": "Autorizzazione negata dall'utente.",
"auth_unexpected_error": "Errore imprevisto durante il polling: {0}",
"auth_login_failed": "Accesso a GitHub non riuscito. Per eseguire l'accesso, provare a eseguire --login dalla riga di comando.",
"auth_login_failed_plugin": "Accesso a GitHub non riuscito. Esegui npx @microsoft/cpp-language-server --login",
"auth_eula_required": "Per continuare, è necessario accettare il contratto di licenza con l'utente finale. Eseguire con --accept-eula.",
"auth_eula_required_plugin": "Per continuare, è necessario accettare il contratto di licenza con l'utente finale. Esegui npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Autenticazione con GitHub già eseguita. Usare --force-login per ripetere l'autenticazione.",
"config_unsupported_version": "Inizializzazione non riuscita: versione di configurazione non supportata. È supportata solo la versione 1.",
"config_file_not_found": "Inizializzazione non riuscita: file di configurazione '{0}' non trovato.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "シェルの弱い引用符文字を使用して引数を引用符で囲みます (例:bash の \")。",
"c_cpp.taskDefinitions.options.description": "追加のコマンド オプション。",
"c_cpp.taskDefinitions.options.cwd.description": "実行されるプログラムまたはスクリプトの現在の作業ディレクトリ。省略すると、Code の現在のワークスペースのルートが使用されます。",
"c_cpp.taskDefinitions.problemMatcher.description": "タスク出力でコンパイラー エラーと警告を検出するために使用する 1 つ以上の問題マッチャー。",
"c_cpp.taskDefinitions.detail.description": "タスクのその他の詳細。",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "同じソース ツリーへの現在およびコンパイル時のパスです。EditorPath で見つかったファイルは、ブレークポイントの一致のために CompileTimePath パスにマップされ、スタック トレースの場所を表示するときに CompileTimePath から EditorPath にマップされます。",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "エディターで使用されるソース ツリーへのパスです。",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "シンボル (.pdb ファイル) の検索と読み込みの方法を制御するオプションです。",
"c_cpp.debuggers.unknownBreakpointHandling.description": "ヒットしたときに外部で設定されたブレークポイント (通常は生の GDB コマンドを使用) を処理する方法を制御します。\n許容される値は、アプリケーションによって例外がスローされたかのように動作する \"throw\" と、デバッグ セッションを一時停止するだけの \"stop\" です。既定値は \"throw\" です。",
"c_cpp.debuggers.debuginfod.description": "debuginfod サーバーからデバッグ シンボルをダウンロードする際の GDB の debuginfod の動作を制御します。",
"c_cpp.debuggers.debuginfod.enabled.description": "true (既定値) の場合、GDB debuginfod サポートは有効です。GDB が debuginfod サーバーに接続できないようにするには、false に設定します。",
"c_cpp.debuggers.debuginfod.enabled.description": "false (既定値) の場合、GDB debuginfod サーバーに接続しません。debuginfod のサポートを有効にするには、true に設定します。",
"c_cpp.debuggers.debuginfod.timeout.description": "debuginfod サーバー要求のタイムアウト (秒)。既定値は 30 です。GDB/libdebuginfod の既定値 (オーバーライドなし) を使用する場合は 0 に設定します。",
"c_cpp.debuggers.VSSymbolOptions.description": "デバッグ アダプターへのシンボルの検索と読み込みのための構成を提供します。",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": ".pdb ファイルを検索するためのシンボル サーバー URL (例: http://MyExampleSymbolServer) の配列またはディレクトリ (例: /build/symbols) の配列です。これらのディレクトリは、既定の場所 (すなわちモジュールと、 pdb が最初にドロップされたパスの横) に加えて、検索されます。",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "デバッガーがシンボルを読み込んではいけないモジュールの配列です。ワイルドカード (例: MyCompany.*.dll) がサポートされています。\n\n'mode' が 'loadAllButExcluded' に設定されていない限り、このプロパティは無視されます。",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "デバッガーがシンボルを読み込むべきモジュールの配列です。ワイルドカード (例: MyCompany.*.dll) がサポートされています。\n\n'mode' が 'loadOnlyIncluded' に設定されていない限り、このプロパティは無視されます。",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "True の場合、'includedModules' 配列にないモジュールの場合、デバッガーはモジュール自体と起動中の実行可能ファイルの横を確認しますが、シンボル検索リストのパスはチェックしません。このオプションの既定値は 'true' です。\n\n'mode' が 'loadOnlyIncluded' に設定されていない限り、このプロパティは無視されます。",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "\"true\" の場合、デバッグなしで実行してもターミナルでプログラムを起動できない場合、警告はログに記録されません。",
"c_cpp.semanticTokenTypes.referenceType.description": "C++/CLI 参照型のスタイルです。",
"c_cpp.semanticTokenTypes.cliProperty.description": "C++/CLI プロパティのスタイルです。",
"c_cpp.semanticTokenTypes.genericType.description": "C++/CLI ジェネリック型のスタイルです。",
@@ -6,8 +6,7 @@
{
"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' が設定された構成では、デバッグなしで実行はサポートされていません。"
"debugger.unsupported.properties": "次のプロパティを持つ起動構成をターミナルで直接実行することはできません: {0}",
"debugger.fallback.message": "代わりに、プログラムの出力がデバッグ コンソールに表示されます。",
"debugger.fallback.message2": "この警告を抑制するには、起動構成で \"ignoreRunWithoutDebuggingWarnings\" プロパティを \"true\" に設定します。"
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "このヘッダーのライブラリを vcpkg でインストールする方法の詳細",
"copy.vcpkg.command": "'{0}' をインストールするための vcpkg コマンドをクリップボードにコピーする",
"on.disabled.command": "`C_Cpp.intelliSenseEngine` が `disabled` に設定されている場合、IntelliSense 関連のコマンドは実行できません。",
"switch.header.source": "ヘッダー/ソースを切り替えています...",
"client.not.found": "クライアントが見つかりませんでした",
"ok": "OK",
"install.compiler.mac.title": "clang コンパイラがインストールされます",
@@ -346,7 +346,9 @@
"auth_denied": "ユーザーによって承認が拒否されました。",
"auth_unexpected_error": "ポーリング中に予期しないエラーが発生しました: {0}",
"auth_login_failed": "GitHub ログインに失敗しました。ログインするには、コマンド ラインから --login を使用して実行してみてください。",
"auth_login_failed_plugin": "GitHub ログインに失敗しました。npx @microsoft/cpp-language-server --login を実行する",
"auth_eula_required": "続行するには、EULA に同意する必要があります。--accept-eula を使用して実行します。",
"auth_eula_required_plugin": "続行するには、EULA に同意する必要があります。npx @microsoft/cpp-language-server --accept-eula を実行する",
"auth_already_authenticated": "GitHub で既に認証されています。--force-login を使用して再認証してください。",
"config_unsupported_version": "初期化に失敗しました: サポートされていない構成バージョンです。バージョン 1 のみサポートされています。",
"config_file_not_found": "初期化に失敗しました: 構成ファイル '{0}' が見つかりません。",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "셸의 약한 따옴표 문자를 사용하여 인수를 따옴표 처리합니다(예: Bash에서 \" 사용).",
"c_cpp.taskDefinitions.options.description": "추가 명령 옵션",
"c_cpp.taskDefinitions.options.cwd.description": "실행된 프로그램 또는 스크립트의 현재 작업 디렉터리입니다. 생략된 경우 Code의 현재 작업 영역 루트가 사용됩니다.",
"c_cpp.taskDefinitions.problemMatcher.description": "작업 출력에서 컴파일러 오류와 경고를 감지하는 데 사용할 문제 매처 하나 이상입니다.",
"c_cpp.taskDefinitions.detail.description": "작업의 추가 세부 정보",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "같은 소스 트리의 현재 및 컴파일 시간 경로입니다. EditorPath에 있는 파일은 중단점 일치를 위해 CompileTimePath 경로에 매핑되고 stacktrace 위치를 표시할 때 CompileTimePath에서 EditorPath로 매핑됩니다.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "편집기가 사용할 소스 트리의 경로입니다.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "기호(.pdb 파일)를 찾아서 로드하는 방법을 제어하는 옵션입니다.",
"c_cpp.debuggers.unknownBreakpointHandling.description": "적중 시 외부에서 설정되는 중단점이(일반적으로 원시 GDB 명령을 통해) 처리되는 방식을 제어합니다.\n허용 값은 애플리케이션에서 예외가 발생한 것처럼 동작하는 \"throw\"와 디버그 세션만 일시 중지하는 \"stop\"입니다. 기본값은 \"throw\"입니다.",
"c_cpp.debuggers.debuginfod.description": "debuginfod 서버에서 디버그 기호를 다운로드할 때 GDB의 debuginfod 동작을 제어합니다.",
"c_cpp.debuggers.debuginfod.enabled.description": "true(기본값)이면 GDB debuginfod 지원이 활성화됩니다. GDB가 debuginfod 서버에 연결하지 않게 하려면 false로 설정하세요.",
"c_cpp.debuggers.debuginfod.enabled.description": "false(기본값)인 경우 GDB debuginfod 서버에 연결하지 않습니다. debuginfod 지원을 활성화하려면 true로 설정합니다.",
"c_cpp.debuggers.debuginfod.timeout.description": "debuginfod 서버 요청에 대한 시간 제한(초)입니다. 기본값은 30입니다. GDB/libdebuginfod 기본값(재정의하지 않음)을 사용하려면 0으로 설정하세요.",
"c_cpp.debuggers.VSSymbolOptions.description": "디버그 어댑터에 기호를 찾고 로드하기 위한 구성을 제공합니다.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": ".pdb 파일을 검색하는 기호 서버 URL(예: http://MyExampleSymbolServer) 또는 디렉터리(예: /build/symbols)의 배열입니다. 이러한 디렉터리가 모듈 및 pdb가 원래 삭제된 경로 옆에 있는 기본 위치 외에 검색됩니다.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "디버거에서 기호를 로드하지 않아야 하는 모듈의 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다.\n\n'모드'가 'loadAllButExcluded'로 설정되어 있지 않으면 이 속성은 무시됩니다.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "디버거에서 기호를 로드해야 하는 모듈의 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다.\n\n'모드'가 'loadOnlyIncluded'로 설정되어 있지 않으면 이 속성은 무시됩니다.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "True 이면 'includedModules' 배열에 없는 모듈에 대해 디버거는 모듈 자체 및 시작 실행 파일 옆을 계속 확인하지만 기호 검색 목록의 경로는 확인하지 않습니다. 이 옵션의 기본값은 'true'입니다.\n\n'모드'가 'loadOnlyIncluded'로 설정되어 있지 않으면 이 속성은 무시됩니다.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "값이 true이면 디버깅하지 않고 실행할 때 터미널에서 프로그램을 시작하지 못해도 경고가 기록되지 않습니다.",
"c_cpp.semanticTokenTypes.referenceType.description": "C++/CLI 참조 형식의 스타일입니다.",
"c_cpp.semanticTokenTypes.cliProperty.description": "C++/CLI 속성의 스타일입니다.",
"c_cpp.semanticTokenTypes.genericType.description": "C++/CLI 제네릭 형식의 스타일입니다.",
@@ -6,8 +6,7 @@
{
"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'가 설정된 구성에는 디버깅 없이 실행이 지원되지 않습니다."
"debugger.unsupported.properties": "다음 속성이 있는 시작 구성은 터미널에서 직접 실행할 수 없습니다. {0}",
"debugger.fallback.message": "프로그램 출력이 대신 디버그 콘솔 표시됩니다.",
"debugger.fallback.message2": "이 경고를 표시하지 않으려면 시작 구성에서 'ignoreRunWithoutDebuggingWarnings' 속성을 true로 설정하세요."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "vcpkg를 사용하여 이 헤더의 라이브러리를 설치하는 방법 알아보기",
"copy.vcpkg.command": "'{0}'을(를) 설치할 vcpkg 명령을 클립보드에 복사",
"on.disabled.command": "IntelliSense 관련 명령은 `C_Cpp.intelliSenseEngine`이 `disabled`로 설정된 경우 실행할 수 없습니다.",
"switch.header.source": "헤더/원본을 전환하는 중...",
"client.not.found": "클라이언트를 찾을 수 없음",
"ok": "확인",
"install.compiler.mac.title": "이제 Clang 컴파일러가 설치됩니다.",
@@ -346,7 +346,9 @@
"auth_denied": "사용자가 권한 부여를 거부했습니다.",
"auth_unexpected_error": "폴링하는 동안 예기치 않은 오류가 발생함: {0}",
"auth_login_failed": "GitHub 로그인에 실패했습니다. 명령줄에서 --login으로 실행하여 로그인해 보세요.",
"auth_login_failed_plugin": "GitHub 로그인에 실패했습니다. npx @microsoft/cpp-language-server --login 실행",
"auth_eula_required": "계속하려면 EULA에 동의해야 합니다. --accept-eula를 사용하여 실행합니다.",
"auth_eula_required_plugin": "계속하려면 EULA에 동의해야 합니다. npx @microsoft/cpp-language-server --accept-eula 실행",
"auth_already_authenticated": "이미 GitHub로 인증되었습니다. --force-login을 사용하여 다시 인증합니다.",
"config_unsupported_version": "초기화 실패: 지원되지 않는 구성 버전입니다. 버전 1만 지원됩니다.",
"config_file_not_found": "초기화 실패: 구성 파일 '{0}'을(를) 찾을 수 없습니다.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Umieszcza argument w cudzysłowach przy użyciu słabego symbolu cudzysłowu powłoki (np. ” w ramach powłoki Bash).",
"c_cpp.taskDefinitions.options.description": "Dodatkowe opcje poleceń.",
"c_cpp.taskDefinitions.options.cwd.description": "The current working directory of the executed program or script. If omitted Code's current workspace root is used.",
"c_cpp.taskDefinitions.problemMatcher.description": "One or more problem matchers to use to detect compiler errors and warnings in task output.",
"c_cpp.taskDefinitions.detail.description": "Dodatkowe dane szczegółowe zadania.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Ścieżki bieżące i czasu kompilacji do tych samych drzew źródeł. Pliki znalezione w ścieżce EditorPath są mapowane na ścieżkę CompileTimePath na potrzeby dopasowywania punktu przerwania i mapowane ze ścieżki CompileTimePath na ścieżkę EditorPath podczas wyświetlania lokalizacji śladu stosu.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Ścieżka do drzewa źródeł, które będzie używane przez edytor.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Opcje umożliwiające kontrolowanie sposobu znajdowania i ładowania symboli (plików PDB).",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Steruje sposobem obsługi punktów przerwania ustawianych zewnętrznie (zwykle za pośrednictwem nieprzetworzonych poleceń GDB) po trafieniu.\nDozwolone wartości to „throw”, które działają tak, jakby aplikacja zgłosiła wyjątek, i „stop”, co tylko wstrzymuje sesję debugowania. Wartość domyślna to „throw”.",
"c_cpp.debuggers.debuginfod.description": "Steruje zachowaniem debuginfod bazy danych GDB na potrzeby pobierania symboli debugowania z serwerów debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Jeśli wartość to true (wartość domyślna), obsługa żądań debuginfod bazy danych GDB jest włączona. Ustaw wartość false, aby uniemożliwić bazie danych GDB kontaktowanie się z serwerami debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Jeśli wartość jest false (ustawienie domyślne), usługa GDB nie będzie łączyć się z serwerami debuginfod. Ustaw na wartość true, aby włączyć element debuginfod.",
"c_cpp.debuggers.debuginfod.timeout.description": "Limit czasu w sekundach dla żądań debuginfod serwera. Wartość domyślna to 30. Ustaw wartość 0, aby używać domyślnych ustawień GDB/libdebuginfod (bez przesłonięcia).",
"c_cpp.debuggers.VSSymbolOptions.description": "Zapewnia konfigurację umożliwiającą lokalizowanie i ładowanie symboli do adaptera debugowania.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Tablica adresów URL serwera symboli (przykład: http://MyExampleSymbolServer) lub katalogów (przykład:/build/Symbols) w celu wyszukania plików PDB. Te katalogi zostaną wyszukane jako uzupełnienie lokalizacji domyślnych — obok modułu i ścieżki, do której plik PDB został pierwotnie porzucony.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Tablica modułów, dla których debuger NIE powinien ładować symboli. Symbole wieloznaczne (przykład: MojaFirma.*.dll) są obsługiwane.\n\nTa właściwość jest ignorowana, chyba że właściwość „mode” jest ustawiona na wartość „loadAllButExcluded”.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Tablica modułów, dla których debuger powinien ładować symbole. Symbole wieloznaczne (przykład: MojaFirma.*.dll) są obsługiwane.\n\nTa właściwość jest ignorowana, chyba że właściwość „mode” jest ustawiona na wartość „loadOnlyIncluded”.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Jeśli ma wartość true, w przypadku każdego modułu NIE BĘDĄCEGO w tablicy „includedModules” debuger będzie nadal sprawdzał obok modułu i uruchamianego pliku wykonywalnego, ale nie będzie sprawdzał ścieżek na liście wyszukiwania symboli. Ta opcja ma wartość domyślną „true”.\n\nTa właściwość jest ignorowana, chyba że właściwość „mode” jest ustawiona na wartość „loadOnlyIncluded”.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "W przypadku wartości true żadne ostrzeżenie nie zostanie zarejestrowane, gdy uruchomienie bez debugowania nie powiedzie się, aby uruchomić program w terminalu.",
"c_cpp.semanticTokenTypes.referenceType.description": "Styl dla typów referencyjnych języka C++/interfejsu wiersza polecenia.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Styl dla właściwości języka C++/interfejsu wiersza polecenia.",
"c_cpp.semanticTokenTypes.genericType.description": "Styl dla typów ogólnych języka C++/interfejsu wiersza polecenia.",
@@ -6,8 +6,7 @@
{
"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”."
"debugger.unsupported.properties": "Nie można uruchomić konfiguracji uruchamiania z następującymi właściwościami bezpośrednio w terminalu: {0}",
"debugger.fallback.message": "Zamiast tego dane wyjściowe programu będą wyświetlane w konsoli debugowania.",
"debugger.fallback.message2": "Aby pominąć to ostrzeżenie, ustaw właściwość „ignoreRunWithoutDebuggingWarnings” na wartość true w konfiguracji uruchamiania."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Dowiedz się, jak zainstalować bibliotekę dla tego nagłówka przy użyciu menedżera vcpkg",
"copy.vcpkg.command": "Skopiuj polecenie vcpkg, aby zainstalować element „{0}” w schowku",
"on.disabled.command": "Nie można wykonywać poleceń związanych z funkcją IntelliSense, gdy właściwość `C_Cpp.intelliSenseEngine` ma wartość `disabled`.",
"switch.header.source": "Trwa przełączanie nagłówka/źródła...",
"client.not.found": "nie znaleziono klienta",
"ok": "OK",
"install.compiler.mac.title": "Kompilator clang zostanie teraz zainstalowany",
@@ -346,7 +346,9 @@
"auth_denied": "Użytkownik odmówił autoryzacji.",
"auth_unexpected_error": "Nieoczekiwany błąd podczas sondowania: {0}",
"auth_login_failed": "Logowanie do GitHub nie powiodło się. Spróbuj uruchomić polecenie --login z wiersza polecenia, aby się zalogować.",
"auth_login_failed_plugin": "Logowanie do usługi GitHub nie powiodło się. Uruchom polecenie npx @microsoft/cpp-language-server --login",
"auth_eula_required": "Aby kontynuować, należy zaakceptować umowę EULA. Uruchom z parametrem --accept-eula.",
"auth_eula_required_plugin": "Aby kontynuować, należy zaakceptować umowę EULA. Uruchom polecenie npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Uwierzytelniono już za pomocą usługi GitHub. Użyj polecenia --force-login, aby przeprowadzić ponowne uwierzytelnienie.",
"config_unsupported_version": "Inicjowanie nie powiodło się: nieobsługiwana wersja konfiguracji. Obsługiwana jest tylko wersja 1.",
"config_file_not_found": "Inicjowanie nie powiodło się: nie znaleziono pliku konfiguracji „{0}”.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Cita o argumento usando o caractere de aspas duplas do shell (por exemplo, \" no bash).",
"c_cpp.taskDefinitions.options.description": "Opções de comando adicionais.",
"c_cpp.taskDefinitions.options.cwd.description": "O diretório de trabalho atual do programa executado ou do script. Se omitido raiz de espaço de trabalho atual do código é usado.",
"c_cpp.taskDefinitions.problemMatcher.description": "One or more problem matchers to use to detect compiler errors and warnings in task output.",
"c_cpp.taskDefinitions.detail.description": "Detalhes adicionais da tarefa.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Os caminhos atual e do tempo de compilação são mapeados para as mesmas árvores de origem. Os arquivos encontrados em EditorPath são mapeados para o caminho CompileTimePath para correspondência de ponto de interrupção e mapeados de CompileTimePath para EditorPath ao exibir os locais de rastreamento de pilha.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "O caminho para a árvore de origem que o editor usará.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Opções para controlar como os símbolos (arquivos .pdb) são encontrados e carregados.",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Controla como os pontos de interrupção definidos externamente (geralmente por meio de comandos GDB brutos) são tratados quando atingidos.\nOs valores permitidos são \"throw\", que age como se uma exceção fosse lançada pelo aplicativo, e \"stop\", que apenas pausa a sessão de depuração. O valor padrão é \"throw\".",
"c_cpp.debuggers.debuginfod.description": "Controla o comportamento do debuginfod do GDB ao baixar símbolos de depuração dos servidores debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Se true (padrão), o suporte de debuginfod do GDB está habilitado. Defina como false para impedir que o GDB entre em contato com servidores depurados.",
"c_cpp.debuggers.debuginfod.enabled.description": "Se false (padrão), o GDB não entrará em contato com servidores debuginfod. Defina como true para habilitar o suporte ao debuginfod.",
"c_cpp.debuggers.debuginfod.timeout.description": "O tempo limite em segundos para solicitações de servidor debuginfod. O padrão é 30. Defina como 0 para usar os padrões GDB/libdebuginfod (sem substituição).",
"c_cpp.debuggers.VSSymbolOptions.description": "Fornece configuração para localizar e carregar símbolos no adaptador de depuração.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Matriz de URLs do servidor de símbolos (exemplo: http://MyExampleSymbolServer) ou diretórios (exemplo: /build/symbols) para pesquisar arquivos .pdb. Esses diretórios serão pesquisados além dos locais padrão, ao lado do módulo e do caminho em que o pdb foi removido originalmente.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Matriz de módulos para a qual o depurador NÃO deve carregar símbolos. Há suporte para curingas (exemplo: MyCompany.*.dll).\n\nEssa propriedade será ignorada, a menos que 'mode' esteja definido como 'loadAllButExcluded'.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Matriz de módulos para a qual o depurador deve carregar símbolos. Há suporte para curingas (exemplo: MyCompany.*.dll).\n\nessa propriedade será ignorada, a menos que 'mode' esteja definido como 'loadOnlyIncluded'.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Se for verdadeira, para qualquer módulo NOT na matriz 'includedModules', o depurador ainda verificará ao lado do próprio módulo e do executável de inicialização, mas não verificará os caminhos na lista de pesquisa de símbolo. Esta opção é padronizada como 'true'.\n\nessa propriedade será ignorada, a menos que 'mode' esteja definido como 'loadOnlyIncluded'.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Se for true, nenhum aviso será registrado quando a execução sem depuração falhar ao iniciar o programa no terminal.",
"c_cpp.semanticTokenTypes.referenceType.description": "Estilo para tipos de referência C++/CLI.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Estilo para propriedades C++/CLI.",
"c_cpp.semanticTokenTypes.genericType.description": "Estilo para tipos genéricos C++/CLI.",
@@ -6,8 +6,7 @@
{
"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\"."
"debugger.unsupported.properties": "As configurações de inicialização com as seguintes propriedades não podem ser executadas diretamente no terminal: {0}",
"debugger.fallback.message": "Em vez disso, a saída do programa será exibida no Console de Depuração.",
"debugger.fallback.message2": "Para suprimir esse aviso, defina a propriedade 'ignoreRunWithoutDebuggingWarnings' como verdadeira na configuração de inicialização."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Saiba como instalar uma biblioteca para este cabeçalho com vcpkg",
"copy.vcpkg.command": "Copiar o comando vcpkg para instalar '{0}' para a área de transferência",
"on.disabled.command": "Comandos relacionados ao IntelliSense não podem ser executados quando `C_Cpp.intelliSenseEngine` está definido como `disabled`.",
"switch.header.source": "Alternando cabeçalho/origem...",
"client.not.found": "o cliente não foi encontrado",
"ok": "OK",
"install.compiler.mac.title": "O compilador clang agora será instalado",
@@ -346,7 +346,9 @@
"auth_denied": "A autorização foi negada pelo usuário.",
"auth_unexpected_error": "Erro inesperado durante a sondagem: {0}",
"auth_login_failed": "Falha no logon do GitHub. Tente executar com --login na linha de comando para fazer logon.",
"auth_login_failed_plugin": "Falha no logon do GitHub. Executar npx @microsoft/cpp-language-server --login",
"auth_eula_required": "O EULA deve ser aceito para continuar. Execute com --accept-eula.",
"auth_eula_required_plugin": "O EULA deve ser aceito para continuar. Executar npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Já autenticado com o GitHub. Use --force-login para autenticar novamente.",
"config_unsupported_version": "Falha na inicialização: versão de configuração sem suporte. Há suporte apenas para a versão 1.",
"config_file_not_found": "Falha na inicialização: arquivo de configuração ''{0}'' não encontrado.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Заключает аргумент в кавычки с помощью слабого символа кавычки оболочки (например, \" в bash).",
"c_cpp.taskDefinitions.options.description": "Дополнительные параметры команды.",
"c_cpp.taskDefinitions.options.cwd.description": "Текущий рабочий каталог выполняемой программы или сценария. Если этот параметр опущен, используется корневой каталог текущей рабочей области Code.",
"c_cpp.taskDefinitions.problemMatcher.description": "Один или несколько сопоставителей проблем для обнаружения ошибок и предупреждений компилятора в выходных данных задачи.",
"c_cpp.taskDefinitions.detail.description": "Дополнительные сведения о задаче.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Текущие пути и пути времени компиляции к одним и тем же деревьям SourceTree. Файлы по пути EditorPath сопоставляются с путем CompileTimePath для сопоставления точек останова, а также сопоставляются из пути CompileTimePath с путем EditorPath при отображении расположений трассировки стека.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Путь к дереву SourceTree, которое будет использоваться редактором.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Параметры, управляющие поиском и загрузкой символов (PDB-файлов).",
"c_cpp.debuggers.unknownBreakpointHandling.description": "Управляет тем, как точки останова, установленные извне (обычно через необработанные команды GDB), обрабатываются при попадании.\nДопустимые значения: \"throw\", который действует так, как если бы приложение выдало исключение, и \"stop\", который только приостанавливает сеанс отладки. Значение по умолчанию — \"throw\".",
"c_cpp.debuggers.debuginfod.description": "Управляет поведением debuginfod в GDB при скачивании символов отладки с серверов debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Если задано значение true (по умолчанию), поддержка debuginfod в GDB включена. Задайте значение false, чтобы запретить GDB обращение к серверам debuginfod.",
"c_cpp.debuggers.debuginfod.enabled.description": "Если установлено значение false (по умолчанию), GDB не будет обращаться к серверам debuginfod. Установите значение true, чтобы включить поддержку debuginfod.",
"c_cpp.debuggers.debuginfod.timeout.description": "Время ожидания запросов к серверу debuginfod в секундах. Значение по умолчанию: 30. Чтобы использовать значения по умолчанию GDB/libdebuginfod (без переопределения), задайте 0.",
"c_cpp.debuggers.VSSymbolOptions.description": "Предоставляет конфигурацию для поиска и загрузки символов в адаптер отладки.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": "Массив URL-адресов сервера символов (например, http://MyExampleSymbolServer) или каталогов (например: /build/symbols) для поиска PDB-файлов. Поиск в этих каталогах осуществляется в дополнение к расположениям по умолчанию — рядом с модулем и путем первоначального удаления PDB-файла.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Массив модулей, для которых отладчик не должен загружать символы. Поддерживаются подстановочные знаки (например: MyCompany.*.dll)\n\nЭто свойство игнорируется, если для \"mode\" задано значение \"loadAllButExcluded\".",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Массив модулей, для которых отладчик должен загружать символы. Поддерживаются подстановочные знаки (например: MyCompany.*.dll)\n\nЭто свойство игнорируется, если для \"mode\" задано значение \"loadOnlyIncluded\".",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "Если значение равно true, для любого модуля, НЕ входящего в массив \"includedModules\", отладчик по-прежнему будет проверять рядом с самим модулем и запускаемым исполняемым файлом, но он не будет проверять пути в списке поиска символов. По умолчанию для этого параметра установлено значение \"true\".\n\nЭто свойство игнорируется, если для параметра \"mode\" установлено значение \"loadOnlyIncluded\".",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "Если значение равно true, предупреждение не будет записано в журнал, если при запуске без отладки не удастся запустить программу в терминале.",
"c_cpp.semanticTokenTypes.referenceType.description": "Стиль для ссылочных типов C++/CLI.",
"c_cpp.semanticTokenTypes.cliProperty.description": "Стиль для свойств C++/CLI.",
"c_cpp.semanticTokenTypes.genericType.description": "Стиль для универсальных типов C++/CLI.",
@@ -6,8 +6,7 @@
{
"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\"."
"debugger.unsupported.properties": "Конфигурации запуска со следующими свойствами нельзя запускать напрямую в терминале: {0}",
"debugger.fallback.message": "Выходные данные программы будут отображаться на консоли отладки.",
"debugger.fallback.message2": "Чтобы скрыть это предупреждение, задайте для свойства ignoreRunWithoutDebuggingWarnings значение true в конфигурации запуска."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "Сведения об установке библиотеки для этого заголовка с помощью vcpkg",
"copy.vcpkg.command": "Копировать команду vcpkg для установки \"{0}\" в буфер обмена",
"on.disabled.command": "Команды, связанные с IntelliSense, не могут быть выполнены, если для `C_Cpp.intelliSenseEngine` установлено значение `disabled`.",
"switch.header.source": "Переключение заголовка/источника...",
"client.not.found": "Клиент не найден.",
"ok": "ОК",
"install.compiler.mac.title": "Будет установлен компилятор clang",
@@ -346,7 +346,9 @@
"auth_denied": "Пользователь отклонил авторизацию.",
"auth_unexpected_error": "Непредвиденная ошибка во время опроса: {0}",
"auth_login_failed": "Не удалось войти в GitHub. Попробуйте использовать --login из командной строки, чтобы войти в систему.",
"auth_login_failed_plugin": "Не удалось войти в GitHub. Запустите npx @microsoft/cpp-language-server --login",
"auth_eula_required": "Чтобы продолжить, примите условия лицензионного соглашения с конечным пользователем. Это можно сделать с помощью --accept-eula.",
"auth_eula_required_plugin": "Для продолжения необходимо принять EULA. Запустите npx @microsoft/cpp-language-server --accept-eula",
"auth_already_authenticated": "Аутентификация в GitHub уже выполнена. Используйте --force-login для повторной аутентификации.",
"config_unsupported_version": "Сбой инициализации: неподдерживаемая версия конфигурации. Поддерживается только версия 1.",
"config_file_not_found": "Сбой инициализации: файл конфигурации \"{0}\" не найден.",
+3 -1
View File
@@ -385,6 +385,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Bağımsız değişkeni kabuğun zayıf alıntı karakteri (ör. \" bash altındaki).",
"c_cpp.taskDefinitions.options.description": "Ek komut seçenekleri.",
"c_cpp.taskDefinitions.options.cwd.description": "Yürütülen program veya betiğin geçerli çalışma dizini. Atlanırsa Kodun geçerli çalışma alanının kökü kullanılır.",
"c_cpp.taskDefinitions.problemMatcher.description": "Görev çıktısında derleyici hatalarını ve uyarılarını algılamak için kullanılacak bir veya daha fazla sorun eşleştiricisi.",
"c_cpp.taskDefinitions.detail.description": "Görevin ek ayrıntıları.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Aynı kaynak ağaçlarına yönelik geçerli ve derleme zamanı yolları. EditorPath altında bulunan dosyalar, kesme noktası eşleştirmesi için CompileTimePath yoluna eşlenir ve yığın izleme konumlarını görüntülerken CompileTimePath öğesinden EditorPath'e eşlenir.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "Düzenleyicinin kullanacağı kaynak ağacının yolu.",
@@ -392,7 +393,7 @@
"c_cpp.debuggers.symbolOptions.description": "Simgelerin (.pdb dosyaları) nasıl bulunup yüklendiğini denetleme seçenekleri.",
"c_cpp.debuggers.unknownBreakpointHandling.description": "İsabet ettiğinde harici olarak (genellikle ham GDB komutları aracılığıyla) ayarlanan kesme noktalarının nasıl işlendiğini kontrol eder.\nİzin verilen değerler, uygulama tarafından bir istisna oluşturulmuş gibi davranan \"throw\" ve yalnızca hata ayıklama oturumunu duraklatan \"stop\" değerleridir. Varsayılan değer \"throw\"dur.",
"c_cpp.debuggers.debuginfod.description": "debuginfod sunucularından hata ayıklama sembollerini indirmek için GDB'nin debuginfod davranışını denetler.",
"c_cpp.debuggers.debuginfod.enabled.description": "True ise (varsayılan), GDBnin debuginfod desteği etkindir. GDB'nin debuginfod sunucularıyla iletişim kurmasını önlemek için false olarak ayarlayın.",
"c_cpp.debuggers.debuginfod.enabled.description": "false ise (varsayılan), GDB debuginfod sunucularıyla iletişim kurmaz. debuginfod desteğini etkinleştirmek için true olarak ayarlayın.",
"c_cpp.debuggers.debuginfod.timeout.description": "debuginfod sunucu istekleri için saniye cinsinden zaman aşımı. Varsayılan değer 30'dur. GDB/libdebuginfod varsayılanlarını kullanmak için 0 değerine ayarlayın (geçersiz kılma yok).",
"c_cpp.debuggers.VSSymbolOptions.description": "Sembolleri bulup hata ayıklama bağdaştırıcısına yüklemeye yönelik yapılandırma sağlar.",
"c_cpp.debuggers.VSSymbolOptions.searchPaths.description": ".pdb dosyalarını aramak için sembol sunucusu URLsi (ör: http://MyExampleSymbolServer) veya dizin (ör. /build/symbols) dizisi. Bu dizinler, modülün yanındaki varsayılan konumların yanı sıra, pdb'nin bırakıldığı yolda arama yapar.",
@@ -406,6 +407,7 @@
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.excludedModules.description": "Hata ayıklayıcısının, sembolleri YÜKLEMEMESİ gereken modül dizisi. Joker karakterler (ör. MyCompany.*.dll) desteklenir.\n\n'Mode' değeri 'loadAllButExcluded' olarak ayarlanmadıkça bu özellik yoksayılır.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includedModules.description": "Hata ayıklayıcısının, sembolleri yüklemesi gereken modül dizisi. Joker karakterler (ör. MyCompany.*.dll) desteklenir.\n\n'Mode' değeri 'loadOnlyIncluded' olarak ayarlanmadıkça bu özellik yoksayılır.",
"c_cpp.debuggers.VSSymbolOptionsModuleFilter.includeSymbolsNextToModules.description": "True ise hata ayıklayıcısı, 'includedModules' dizisinde OLMAYAN herhangi bir modül için modülün ve başlatılan yürütülebilir dosyanın yanında denetlemeye devam eder ancak sembol arama listesindeki yolları denetlemez.\n\nBu seçenek varsayılan olarak 'true' şeklinde ayarlanır. 'Mode', 'loadOnlyIncluded' olarak ayarlanmadıkça bu özellik yoksayılır.",
"c_cpp.debuggers.ignoreRunWithoutDebuggingWarnings.description": "true ise hata ayıklama olmadan çalıştırma terminalde programı başlatamadığında günlüğe hiçbir uyarı kaydedilmez.",
"c_cpp.semanticTokenTypes.referenceType.description": "C++/CLI başvuru türleri için kullanılacak stil.",
"c_cpp.semanticTokenTypes.cliProperty.description": "C++/CLI özellikleri için kullanılacak stil.",
"c_cpp.semanticTokenTypes.genericType.description": "C++/CLI genel türleri için kullanılacak stil.",
@@ -6,8 +6,7 @@
{
"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."
"debugger.unsupported.properties": "Aşağıdaki özelliklere sahip başlatma yapılandırmaları doğrudan terminalde çalıştırılamaz: {0}",
"debugger.fallback.message": "Program çıktısı bunun yerine Hata Ayıklama Konsolu'nda görünecek.",
"debugger.fallback.message2": "Bu uyarıyı gizlemek için başlatma yapılandırmanızda 'ignoreRunWithoutDebuggingWarnings' özelliğini true olarak ayarlayın."
}
@@ -7,6 +7,7 @@
"learn.how.to.install.a.library": "vcpkg ile bu üst bilgi için bir kitaplık yüklemeyi öğrenin",
"copy.vcpkg.command": "'{0}' yükleme vcpkg komutunu panoya kopyalayın",
"on.disabled.command": "`C_Cpp.intelliSenseEngine` `disabled` olarak ayarlandığında IntelliSense ile ilgili komutlar yürütülemez.",
"switch.header.source": "Başlık/Kaynak Değiştiriliyor...",
"client.not.found": "istemci bulunamadı",
"ok": "Tamam",
"install.compiler.mac.title": "Clang derleyicisi şimdi kurulacak",
@@ -346,7 +346,9 @@
"auth_denied": "Yetkilendirme kullanıcı tarafından reddedildi.",
"auth_unexpected_error": "Yoklama sırasında beklenmeyen hata: {0}",
"auth_login_failed": "GitHub oturum açma işlemi başarısız oldu. Oturum açmak için komut satırından --login ile çalıştırmayı deneyin.",
"auth_login_failed_plugin": "GitHub oturum açma işlemi başarısız oldu. npx @microsoft/cpp-language-server --login komutunu çalıştırın",
"auth_eula_required": "Devam etmek için EULA'nın kabul edilmesi gerekiyor. --accept-eula ile çalıştırın.",
"auth_eula_required_plugin": "Devam etmek için EULA'nın kabul edilmesi gerekiyor. npx @microsoft/cpp-language-server --accept-eula komutunu çalıştırın",
"auth_already_authenticated": "GitHub ile zaten kimlik doğrulaması yaptı. Yeniden kimlik doğrulaması yapmak için --force-login kullanın.",
"config_unsupported_version": "Başlatma başarısız oldu: Desteklenmeyen yapılandırma sürümü. Yalnızca 1. sürüm desteklenir.",
"config_file_not_found": "Başlatma başarısız oldu: '{0}' yapılandırma dosyası bulunamadı.",
+325 -3
View File
@@ -2,7 +2,7 @@
"name": "cpptools",
"displayName": "C/C++",
"description": "C/C++ IntelliSense, debugging, and code browsing.",
"version": "1.33.2-main",
"version": "1.33.4-main",
"publisher": "ms-vscode",
"icon": "LanguageCCPP_color_128x.png",
"readme": "README.md",
@@ -529,9 +529,332 @@
}
}
},
"problemMatcher": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "%c_cpp.taskDefinitions.problemMatcher.description%"
},
"detail": {
"type": "string",
"description": "%c_cpp.taskDefinitions.detail.description%"
},
"windows": {
"type": "object",
"properties": {
"command": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
}
]
},
"args": {
"type": "array",
"description": "%c_cpp.taskDefinitions.args.description%",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
}
]
}
},
"options": {
"type": "object",
"description": "%c_cpp.taskDefinitions.options.description%",
"properties": {
"cwd": {
"type": "string",
"description": "%c_cpp.taskDefinitions.options.cwd.description%"
}
}
},
"problemMatcher": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "%c_cpp.taskDefinitions.problemMatcher.description%"
}
}
},
"linux": {
"type": "object",
"properties": {
"command": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
}
]
},
"args": {
"type": "array",
"description": "%c_cpp.taskDefinitions.args.description%",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
}
]
}
},
"options": {
"type": "object",
"description": "%c_cpp.taskDefinitions.options.description%",
"properties": {
"cwd": {
"type": "string",
"description": "%c_cpp.taskDefinitions.options.cwd.description%"
}
}
},
"problemMatcher": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "%c_cpp.taskDefinitions.problemMatcher.description%"
}
}
},
"osx": {
"type": "object",
"properties": {
"command": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
}
]
},
"args": {
"type": "array",
"description": "%c_cpp.taskDefinitions.args.description%",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
}
]
}
},
"options": {
"type": "object",
"description": "%c_cpp.taskDefinitions.options.description%",
"properties": {
"cwd": {
"type": "string",
"description": "%c_cpp.taskDefinitions.options.cwd.description%"
}
}
},
"problemMatcher": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "%c_cpp.taskDefinitions.problemMatcher.description%"
}
}
}
}
}
@@ -6854,6 +7177,7 @@
"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",
"install-and-copy-binaries-for-test": "ts-node -T ./.scripts/installAndCopyBinaries.ts",
"translations-export": "yarn install && yarn prep && yarn generate-native-strings && gulp translations-export",
"translations-generate": "gulp translations-generate",
"translations-import": "gulp translations-import",
@@ -6870,7 +7194,6 @@
"@types/plist": "^3.0.5",
"@types/proxyquire": "^1.3.31",
"@types/semver": "^7.5.8",
"@types/shell-quote": "^1.7.5",
"@types/sinon": "^21.0.0",
"@types/tmp": "^0.2.6",
"@types/which": "^2.0.2",
@@ -6926,7 +7249,6 @@
"node-vswhere": "^1.0.2",
"plist": "^3.1.0",
"posix-getopt": "^1.2.1",
"shell-quote": "1.8.4",
"ssh-config": "^4.4.4",
"tmp": "^0.2.7",
"vscode-cpptools": "^7.1.1",
+1
View File
@@ -1005,6 +1005,7 @@
"c_cpp.taskDefinitions.args.quoting.weak.description": "Quotes the argument using the shell's weak quote character (e.g. \" under bash).",
"c_cpp.taskDefinitions.options.description": "Additional command options.",
"c_cpp.taskDefinitions.options.cwd.description": "The current working directory of the executed program or script. If omitted Code's current workspace root is used.",
"c_cpp.taskDefinitions.problemMatcher.description": "One or more problem matchers to use to detect compiler errors and warnings in task output.",
"c_cpp.taskDefinitions.detail.description": "Additional details of the task.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.description": "Current and compile-time paths to the same source trees. Files found under the EditorPath are mapped to the CompileTimePath path for breakpoint matching and mapped from CompileTimePath to EditorPath when displaying stacktrace locations.",
"c_cpp.debuggers.sourceFileMap.sourceFileMapEntry.editorPath.description": "The path to the source tree the editor will use.",
@@ -0,0 +1,235 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
// The column range and text of the expression a debug data-tip should evaluate.
export interface EvaluatableExpressionInfo {
readonly startColumn: number;
readonly endColumn: number;
readonly expression: string;
}
const wordChar: RegExp = /[\p{L}\p{N}_]/u;
function isWord(ch: string | undefined): boolean {
return ch !== undefined && wordChar.test(ch);
}
// Index just past the `]` that closes the `[` at `open`, or -1 if it is unbalanced.
function matchingClose(line: string, open: number): number {
let depth: number = 0;
for (let j: number = open; j < line.length; j++) {
if (line[j] === '[') {
depth++;
} else if (line[j] === ']') {
depth--;
if (depth === 0) {
return j + 1;
}
}
}
return -1;
}
// Index of the `[` that opens the `]` at `close`, or -1 if it is unbalanced.
function matchingOpen(line: string, close: number): number {
let depth: number = 0;
for (let j: number = close; j >= 0; j--) {
if (line[j] === ']') {
depth++;
} else if (line[j] === '[') {
depth--;
if (depth === 0) {
return j;
}
}
}
return -1;
}
// Start of the access chain that the subscript opening at `open` applies to, without crossing
// `exprStart` or an enclosing (still-open) `[`.
function primaryStart(line: string, open: number, exprStart: number): number {
let s: number = open;
while (s > exprStart) {
const prev: string = line[s - 1];
if (isWord(prev)) {
while (s > exprStart && isWord(line[s - 1])) {
s--;
}
} else if (prev === '.') {
s--;
} else if (prev === '>' && line[s - 2] === '-') {
s -= 2;
} else if (prev === ':' && line[s - 2] === ':') {
s -= 2;
} else if (prev === ']') {
const open2: number = matchingOpen(line, s - 1);
if (open2 < exprStart) {
break;
}
s = open2;
} else {
break;
}
}
return s;
}
// Computes the expression a debug data-tip should evaluate for the token at `character` in `line`,
// or undefined when the cursor is not on an expression token.
//
// Registering an EvaluatableExpressionProvider replaces VS Code's built-in data-tip expression
// detection, so this reproduces that detection for ordinary tokens and additionally resolves access
// chains involving a leading `*`/`&` or array subscripts, which the built-in detection mishandles:
// - A leading `*` is kept only when hovering the final segment of the chain (the value actually
// dereferenced, e.g. `*a.b.c`); on any interior segment it is dropped, so hovering `b` in
// `*a.b.c` gives `a.b` and hovering `b` in `*a.b[i]` gives `a.b` (not `*a.b`, the dereferenced
// struct/array base). A leading `&` is always dropped so the hovered variable shows its value
// rather than its address.
// - Array subscripts are part of the chain, including nested ones like `a[b[i]]`; hovering `c` in
// `a.b[i].c` evaluates `a.b[i].c` rather than a fragment after the `]`, hovering a subscript
// bracket evaluates the indexed element, and hovering the index evaluates it on its own.
//
// This has no vscode dependency so it can be unit tested directly.
export function computeEvaluatableExpression(line: string, character: number): EvaluatableExpressionInfo | undefined {
// Find the access-chain token containing the cursor: an optional leading run of `*`/`&`, then a
// chain of identifiers, `.`, `->`, `::` and balanced `[...]` subscripts. Brackets are matched by
// depth so nested subscripts stay in one token. The cursor is matched with an inclusive end so a
// token is selected when the cursor is at its trailing edge (VS Code's built-in does the same).
let tokenStart: number = -1;
let tokenEnd: number = -1;
const n: number = line.length;
let i: number = 0;
while (i < n) {
const start: number = i;
while (i < n && (line[i] === '*' || line[i] === '&')) {
i++;
}
let chained: boolean = false;
let advanced: boolean = true;
while (i < n && advanced) {
const c: string = line[i];
if (isWord(c)) {
while (i < n && isWord(line[i])) {
i++;
}
chained = true;
} else if (c === '.') {
i++;
chained = true;
} else if (c === '-' && line[i + 1] === '>') {
i += 2;
chained = true;
} else if (c === ':' && line[i + 1] === ':') {
i += 2;
chained = true;
} else if (c === '[') {
const close: number = matchingClose(line, i);
if (close === -1) {
advanced = false;
} else {
i = close;
chained = true;
}
} else {
advanced = false;
}
}
if (chained && start <= character && character <= i) {
tokenStart = start;
tokenEnd = i;
break;
}
i = chained && i > start ? i : start + 1;
}
if (tokenStart === -1) {
return undefined;
}
const leadingMatch: RegExpMatchArray | null = line.substring(tokenStart, tokenEnd).match(/^[*&]+/u);
const leading: string | null = leadingMatch !== null ? leadingMatch[0] : null;
const exprStart: number = tokenStart + (leading !== null ? leading.length : 0);
// A chain can begin with `.` or `->` when its head was skipped (e.g. a call: `foo().bar` leaves
// `.bar`). Such a fragment is not a valid expression, so decline it.
if (line[exprStart] === '.' || (line[exprStart] === '-' && line[exprStart + 1] === '>')) {
return undefined;
}
// On a subscript bracket, evaluate the indexed element: the subscripted primary through that
// subscript, without the leading `*`/`&`.
const cursorChar: string = line.charAt(character);
if (cursorChar === '[' || cursorChar === ']') {
const open: number = cursorChar === '[' ? character : matchingOpen(line, character);
const close: number = cursorChar === '[' ? matchingClose(line, character) : character + 1;
if (open !== -1 && close !== -1) {
let startColumn: number = Math.max(primaryStart(line, open, exprStart), exprStart);
// Keep a leading `*` when the subscript is the final segment (the dereferenced
// element, e.g. `*a.b[i]`); a leading `&`, or an interior subscript, drops it.
if (close === tokenEnd && startColumn === exprStart && leading !== null && /^\*+$/u.test(leading)) {
startColumn = tokenStart;
}
return { startColumn, endColumn: close, expression: line.substring(startColumn, close) };
}
}
// Locate the identifier under the cursor and the offset just past it.
let clipEnd: number = tokenEnd;
let wordStart: number = tokenStart;
let word: string = '';
const wordRegExp: RegExp = /[\p{L}\p{N}_]+/gu;
const tokenText: string = line.substring(tokenStart, tokenEnd);
for (let w: RegExpExecArray | null = wordRegExp.exec(tokenText); w !== null; w = wordRegExp.exec(tokenText)) {
clipEnd = tokenStart + w.index + w[0].length;
wordStart = tokenStart + w.index;
word = w[0];
if (clipEnd >= character) {
break;
}
}
// An identifier inside a `[...]` is the index; it is evaluated on its own. Inside `[...]` the
// chain also spans operators and whitespace (e.g. `a[i + j]`), so only return the identifier
// when the cursor is actually on it; other positions are not tokens.
let depth: number = 0;
for (let k: number = tokenStart; k < character; k++) {
if (line[k] === '[') {
depth++;
} else if (line[k] === ']') {
depth--;
}
}
if (depth > 0) {
if (character < wordStart || character >= clipEnd) {
return undefined;
}
return { startColumn: wordStart, endColumn: clipEnd, expression: word };
}
// Past the last identifier but still on the token's trailing `]` (or its inclusive trailing
// edge), with no identifier left between the cursor and the end: evaluate the indexed
// element, like hovering that closing bracket, so the clip never cuts a subscript in half.
if (line.charAt(tokenEnd - 1) === ']' && !/[\p{L}\p{N}_]/u.test(line.substring(character, tokenEnd))) {
const open: number = matchingOpen(line, tokenEnd - 1);
if (open !== -1) {
let startColumn: number = Math.max(primaryStart(line, open, exprStart), exprStart);
if (startColumn === exprStart && leading !== null && /^\*+$/u.test(leading)) {
startColumn = tokenStart;
}
return { startColumn, endColumn: tokenEnd, expression: line.substring(startColumn, tokenEnd) };
}
}
// The leading `*`/`&` belongs to the final segment of the chain. A `*` is kept only when the
// cursor is on that final segment (the value actually dereferenced, e.g. `*a.b.c`). On any
// interior segment it is dropped, since `*a.b` would dereference the struct `a.b` and `*a.b[i]`
// the array base rather than the indexed element. A leading `&` is always dropped so hovering
// the variable shows its value, not its address.
const keepLeading: boolean = leading !== null && clipEnd >= tokenEnd && /^\*+$/u.test(leading);
if (!keepLeading) {
return { startColumn: exprStart, endColumn: clipEnd, expression: line.substring(exprStart, clipEnd) };
}
return { startColumn: tokenStart, endColumn: clipEnd, expression: line.substring(tokenStart, clipEnd) };
}
+18
View File
@@ -0,0 +1,18 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import { computeEvaluatableExpression, EvaluatableExpressionInfo } from './evaluatableExpression';
// Provides the expression a C/C++ debug data-tip evaluates when hovering a variable. The actual
// computation lives in `evaluatableExpression.ts` (no vscode dependency) so it can be unit tested.
export class EvaluatableExpressionProvider implements vscode.EvaluatableExpressionProvider {
public provideEvaluatableExpression(document: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult<vscode.EvaluatableExpression> {
const info: EvaluatableExpressionInfo | undefined = computeEvaluatableExpression(document.lineAt(position.line).text, position.character);
if (info === undefined) {
return undefined;
}
return new vscode.EvaluatableExpression(new vscode.Range(position.line, info.startColumn, position.line, info.endColumn), info.expression);
}
}
+5 -1
View File
@@ -14,13 +14,14 @@ import { SshTargetsProvider, getActiveSshTarget, initializeSshTargets, selectSsh
import { TargetLeafNode, setActiveSshTarget } from '../SSH/TargetsView/targetNodes';
import { sshCommandToConfig } from '../SSH/sshCommandToConfig';
import { getSshConfiguration, getSshConfigurationFiles, parseFailures, writeSshConfiguration } from '../SSH/sshHosts';
import { pathAccessible } from '../common';
import { documentSelector, pathAccessible } from '../common';
import { instrument } from '../instrumentation';
import { getSshChannel } from '../logger';
import { AttachItemsProvider, AttachPicker, RemoteAttachPicker } from './attachToProcess';
import { ConfigurationAssetProviderFactory, ConfigurationSnippetProvider, DebugConfigurationProvider, IConfigurationAssetProvider } from './configurationProvider';
import { DebuggerType } from './configurations';
import { CppdbgDebugAdapterDescriptorFactory, CppvsdbgDebugAdapterDescriptorFactory } from './debugAdapterDescriptorFactory';
import { EvaluatableExpressionProvider } from './evaluatableExpressionProvider';
import { NativeAttachItemsProviderFactory } from './nativeAttach';
// The extension deactivate method is asynchronous, so we handle the disposables ourselves instead of using extensionContext.subscriptions.
@@ -82,6 +83,9 @@ export async function initialize(context: vscode.ExtensionContext): Promise<void
disposables.push(vscode.debug.registerDebugAdapterDescriptorFactory(DebuggerType.cppvsdbg, new CppvsdbgDebugAdapterDescriptorFactory(context)));
disposables.push(vscode.debug.registerDebugAdapterDescriptorFactory(DebuggerType.cppdbg, new CppdbgDebugAdapterDescriptorFactory(context)));
// Supplies the expression evaluated by debug data-tips when hovering C/C++ source.
disposables.push(vscode.languages.registerEvaluatableExpressionProvider(documentSelector, instrument(new EvaluatableExpressionProvider())));
// SSH Targets View
await initializeSshTargets();
const sshTargetsProvider: SshTargetsProvider = new SshTargetsProvider();
@@ -24,8 +24,18 @@ export interface CppBuildTaskDefinition extends TaskDefinition {
type: string;
label: string; // The label appears in tasks.json file.
command: string | util.IQuotedString;
args: (string | util.IQuotedString)[];
options: cp.ExecOptions | cp.SpawnOptions | undefined;
args?: (string | util.IQuotedString)[];
options?: cp.ExecOptions | undefined;
windows?: CppBuildTaskPlatformOverride;
linux?: CppBuildTaskPlatformOverride;
osx?: CppBuildTaskPlatformOverride;
}
interface CppBuildTaskPlatformOverride {
command?: string | util.IQuotedString;
args?: (string | util.IQuotedString)[];
options?: cp.ExecOptions | undefined;
problemMatcher?: string | string[];
}
export class CppBuildTask extends Task {
@@ -50,7 +60,7 @@ export class CppBuildTaskProvider implements TaskProvider {
const execution: ProcessExecution | ShellExecution | CustomExecution | undefined = _task.execution;
if (!execution) {
const definition: CppBuildTaskDefinition = <any>_task.definition;
_task = this.getTask(definition.command, false, definition.args ? definition.args : [], definition, _task.detail);
_task = this.getTask(definition, _task.detail);
return _task;
}
return undefined;
@@ -59,7 +69,7 @@ export class CppBuildTaskProvider implements TaskProvider {
public resolveInsiderTask(_task: CppBuildTask): CppBuildTask | undefined {
const definition: CppBuildTaskDefinition = <any>_task.definition;
definition.label = definition.label.replace(ext.configPrefix, "");
_task = this.getTask(definition.command, false, definition.args ? definition.args : [], definition, _task.detail);
_task = this.getTask(definition, _task.detail);
return _task;
}
@@ -152,83 +162,118 @@ export class CppBuildTaskProvider implements TaskProvider {
return emptyTasks;
}
// Create a build task per compiler path
// Create a build task per compiler path.
const result: CppBuildTask[] = [];
// Task for valid user compiler path setting
// Task for valid user compiler path setting.
if (isCompilerValid && userCompilerPath) {
result.push(this.getTask(userCompilerPath, appendSourceToName, userCompilerPathAndArgs?.allCompilerArgs));
result.push(this.generateTask(userCompilerPath, appendSourceToName, userCompilerPathAndArgs?.allCompilerArgs));
}
// Tasks for known compiler paths
// Tasks for known compiler paths.
if (knownCompilerPaths) {
result.push(...knownCompilerPaths.map<Task>(compilerPath => this.getTask(compilerPath, appendSourceToName, undefined)));
result.push(...knownCompilerPaths.map<CppBuildTask>(compilerPath => this.generateTask(compilerPath, appendSourceToName, undefined)));
}
return result;
}
private getTask: (compilerPath: string | util.IQuotedString, appendSourceToName: boolean, compilerArgs?: (string | util.IQuotedString)[], definition?: CppBuildTaskDefinition, detail?: string) => Task = (compilerPath: string | util.IQuotedString, appendSourceToName: boolean, compilerArgs?: (string | util.IQuotedString)[], definition?: CppBuildTaskDefinition, detail?: string) => {
private generateTask(compilerPath: string | util.IQuotedString, appendSourceToName: boolean, compilerArgs?: (string | util.IQuotedString)[]): CppBuildTask {
const compilerPathString: string = util.isString(compilerPath) ? compilerPath : compilerPath.value;
const compilerPathBase: string = path.basename(compilerPathString);
const isCl: boolean = compilerPathBase.toLowerCase() === "cl.exe";
const isClang: boolean = !isCl && compilerPathBase.toLowerCase().includes("clang");
// Double-quote the command if needed.
const resolvedCompilerPathString: string = isCl ? compilerPathBase : compilerPathString;
let resolvedCompilerPath: string | util.IQuotedString = compilerPath;
if (isCl) {
resolvedCompilerPath = compilerPathBase;
}
const compilerName: string = path.basename(compilerPathString);
const isCl: boolean = compilerName.toLowerCase() === "cl.exe";
const isClang: boolean = !isCl && compilerName.toLowerCase().includes("clang");
if (!definition) {
const isWindows: boolean = os.platform() === 'win32';
const taskLabel: string = ((appendSourceToName && !compilerPathBase.startsWith(ext.configPrefix)) ?
ext.configPrefix : "") + compilerPathBase + " " + localize("build.active.file", "build active file");
const programName: string = util.defaultExePath();
let args: (string | util.IQuotedString)[] = isCl ?
['/Zi', '/EHsc', '/nologo', `/Fe${programName}`, '${file}'] :
isClang ?
['-fcolor-diagnostics', '-fansi-escape-codes', '-g', '${file}', '-o', programName] :
['-fdiagnostics-color=always', '-g', '${file}', '-o', programName];
const isWindows: boolean = os.platform() === 'win32';
const taskLabel: string = ((appendSourceToName && !compilerName.startsWith(ext.configPrefix)) ?
ext.configPrefix : "") + compilerName + " " + localize("build.active.file", "build active file");
const programName: string = util.defaultExePath();
let args: (string | util.IQuotedString)[] = isCl ?
['/Zi', '/EHsc', '/nologo', `/Fe${programName}`, '${file}'] :
isClang ?
['-fcolor-diagnostics', '-fansi-escape-codes', '-g', '${file}', '-o', programName] :
['-fdiagnostics-color=always', '-g', '${file}', '-o', programName];
if (compilerArgs && compilerArgs.length > 0) {
args = args.concat(compilerArgs);
}
const cwd: string = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPathString)) ? path.dirname(compilerPathString) : "${fileDirname}";
const options: cp.ExecOptions | cp.SpawnOptions | undefined = { cwd: cwd };
definition = {
type: CppBuildTaskProvider.CppBuildScriptType,
label: taskLabel,
command: compilerPath,
args: args,
options: options
};
if (isCl) {
definition.command = compilerPathBase;
}
if (compilerArgs && compilerArgs.length > 0) {
args = args.concat(compilerArgs);
}
const cwd: string = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPathString)) ? path.dirname(compilerPathString) : "${fileDirname}";
const options: cp.ExecOptions | undefined = { cwd: cwd };
const definition: CppBuildTaskDefinition = {
type: CppBuildTaskProvider.CppBuildScriptType,
label: taskLabel,
command: isCl ? compilerName : compilerPath,
args: args,
options: options
};
return this.getTask(definition);
}
private getTask(definition: CppBuildTaskDefinition, detail?: string): CppBuildTask {
const platformDefinition: CppBuildTaskDefinition = this.applyPlatformOverrides(definition);
const command: string = util.isString(platformDefinition.command) ? platformDefinition.command : platformDefinition.command.value;
const compilerName: string = path.basename(command);
const isCl: boolean = compilerName.toLowerCase() === "cl.exe";
const isClang: boolean = !isCl && compilerName.toLowerCase().includes("clang");
const editor: TextEditor | undefined = window.activeTextEditor;
const folder: WorkspaceFolder | undefined = editor ? workspace.getWorkspaceFolder(editor.document.uri) : undefined;
const taskUsesActiveFile: boolean = definition.args.some(arg => {
const taskUsesActiveFile: boolean = platformDefinition.args?.some(arg => {
if (util.isString(arg)) {
return arg.indexOf('${file}') >= 0;
}
return arg.value.indexOf('${file}') >= 0;
}); // Need to check this before ${file} is resolved
}) || false; // Need to check this before ${file} is resolved
const scope: WorkspaceFolder | TaskScope = folder ? folder : TaskScope.Workspace;
const task: CppBuildTask = new Task(definition, scope, definition.label, ext.CppSourceStr,
new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> =>
// When the task is executed, this callback will run. Here, we setup for running the task.
new CustomBuildTaskTerminal(resolvedCompilerPath, resolvedDefinition.args, resolvedDefinition.options, { taskUsesActiveFile, insertStd: isClang && os.platform() === 'darwin' })
), isCl ? '$msCompile' : '$gcc');
const customExecution: CustomExecution = new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => {
// When the task is executed, this callback will run. Here, we setup for running the task.
// Apply platform-specific overrides (windows/linux/osx) at execution time so that VS Code
// can still match the task definition by its original shape during the resolve phase.
const effectiveDefinition: CppBuildTaskDefinition = this.applyPlatformOverrides(resolvedDefinition as CppBuildTaskDefinition);
const effectiveArgs: (string | util.IQuotedString)[] = effectiveDefinition.args ? effectiveDefinition.args : [];
return new CustomBuildTaskTerminal(
effectiveDefinition.command,
effectiveArgs,
effectiveDefinition.options,
{ taskUsesActiveFile, insertStd: isClang && os.platform() === 'darwin' }
);
});
const task: CppBuildTask = new CppBuildTask(definition, scope, definition.label, ext.CppSourceStr, customExecution, platformDefinition.problemMatcher ?? (isCl ? '$msCompile' : '$gcc'));
task.group = TaskGroup.Build;
task.detail = detail ? detail : localize("compiler.details", "compiler:") + " " + resolvedCompilerPathString;
task.detail = detail ? detail : localize("compiler.details", "compiler:") + " " + (isCl ? compilerName : command);
return task;
};
}
private applyPlatformOverrides(definition: CppBuildTaskDefinition): CppBuildTaskDefinition {
const platform: NodeJS.Platform = os.platform();
let platformOverride: CppBuildTaskPlatformOverride | undefined;
if (platform === 'win32') {
platformOverride = definition.windows;
} else if (platform === 'linux') {
platformOverride = definition.linux;
} else if (platform === 'darwin') {
platformOverride = definition.osx;
}
if (!platformOverride) {
return definition;
}
const mergedDefinition: CppBuildTaskDefinition = {
...definition,
command: platformOverride.command ?? definition.command,
args: platformOverride.args ?? definition.args,
options: platformOverride.options ?? definition.options,
problemMatcher: platformOverride.problemMatcher ?? definition.problemMatcher
};
return mergedDefinition;
}
public async getJsonTasks(): Promise<CppBuildTask[]> {
const rawJson: any = await this.getRawTasksJson();
@@ -242,9 +287,13 @@ export class CppBuildTaskProvider implements TaskProvider {
label: task.label,
command: task.command,
args: task.args,
options: task.options
options: task.options,
windows: task.windows,
linux: task.linux,
osx: task.osx,
problemMatcher: task.problemMatcher
};
const cppBuildTask: CppBuildTask = new Task(definition, TaskScope.Workspace, task.label, ext.CppSourceStr);
const cppBuildTask: CppBuildTask = new CppBuildTask(definition, TaskScope.Workspace, task.label, ext.CppSourceStr);
cppBuildTask.detail = task.detail;
cppBuildTask.existing = true;
if (util.isObject(task.group) && task.group.isDefault) {
+48 -36
View File
@@ -1165,13 +1165,10 @@ export function watchForCrashes(crashDirectory: string): void {
let previousCrashData: string;
let previousCrashCount: number = 0;
function logCrashTelemetry(data: string, type: string, offsetData?: string, crashLog?: string): void {
function logCrashTelemetry(data: string, type: string, crashLog?: string): void {
const crashObject: Record<string, string> = {};
const crashCountObject: Record<string, number> = {};
crashObject.CrashingThreadCallStack = data;
if (offsetData !== undefined) {
crashObject.CrashingThreadCallStackOffsets = offsetData;
}
if (crashLog !== undefined) {
crashObject.CrashLog = crashLog;
}
@@ -1185,8 +1182,8 @@ function logMacCrashTelemetry(data: string): void {
logCrashTelemetry(data, "MacCrash");
}
function logCppCrashTelemetry(data: string, offsetData?: string, crashLog?: string): void {
logCrashTelemetry(data, "CppCrash", offsetData, crashLog);
function logCppCrashTelemetry(data: string, crashLog?: string): void {
logCrashTelemetry(data, "CppCrash", crashLog);
}
function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, data: string): void {
@@ -1292,6 +1289,39 @@ function containsFilteredTelemetryData(str: string): boolean {
return regex.test(str);
}
// Non-null fault addresses are randomized by ASLR (and use-after-free/wild pointers vary run to
// run), so embedding the raw value in CrashingThreadCallStack would fragment crash buckets and
// make CrashCount meaningless. Preserve near-null addresses (typical null-pointer dereferences,
// which are stable and useful for bucketing), but replace arbitrary addresses with a stable
// placeholder so identical crashes still de-duplicate.
function bucketSignalAddress(address: string): string {
let value: bigint;
try {
value = BigInt(address.trim());
} catch {
return address; // Not a parseable address; leave it untouched.
}
// 0x10000 (64 KB) covers null plus small member/array offsets off a null pointer.
return value < 0x10000n ? address : "<non-null>";
}
// An unsymbolized frame is reported as a raw runtime address. Addresses in the fixed-base main
// executable (non-PIE on Linux) stay constant across runs and are useful for bucketing, but
// addresses in the ASLR-randomized shared-library/mmap region (Linux 0x7f..., and on macOS the
// PIE main image and dyld shared cache) shift every launch and would fragment crash buckets. Keep
// the low, fixed addresses but replace high (relocated) ones with a stable placeholder. 4 GB is a
// safe cut: a non-PIE executable's own code loads well below it, while the relocated region is far
// above it.
function bucketFrameAddress(address: string): string {
let value: bigint;
try {
value = BigInt(address.trim());
} catch {
return address; // Not a parseable address; leave it untouched.
}
return value < 0x100000000n ? address : "<relocated>";
}
async function handleCrashFileRead(crashDirectory: string, crashFile: string, crashDate: Date, err: NodeJS.ErrnoException | undefined | null, data: string): Promise<void> {
if (err) {
if (err.code === "ENOENT") {
@@ -1301,16 +1331,15 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
}
const lines: string[] = data.split("\n");
let addressData: string;
const isCppToolsSrv2: boolean = crashFile.startsWith("cpptools-srv2");
const isCppToolsSrv: boolean = crashFile.startsWith("cpptools-srv");
const telemetryHeader: string = (isCppToolsSrv2 ? "cpptools-srv2.txt" : isCppToolsSrv ? "cpptools-srv.txt" : crashFile) + "\n";
let signalInfo: string;
const processName: string = (crashFile.startsWith("cpptools-srv2") ? "cpptools-srv2 process" :
crashFile.startsWith("cpptools-srv") ? "cpptools-srv process" :
crashFile.startsWith("cpptools-wordexp") ? "cpptools-wordexp process" : "cpptools process") + "\n";
const filtPath: string | null = which.sync("c++filt", { nothrow: true });
const isMac: boolean = process.platform === "darwin";
const startStr: string = isMac ? " _" : "<";
const offsetStr: string = isMac ? " + " : "+";
const endOffsetStr: string = isMac ? " " : " <";
const dotStr: string = "…\n";
let signalType: string;
let crashLog: string = "";
let crashStackStartLine: number = 0;
@@ -1333,16 +1362,16 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
}
if (lines[crashStackStartLine].startsWith("SIG")) {
signalType = `${lines[crashStackStartLine]}\n`;
addressData = `${lines[crashStackStartLine + 1]}:${lines[crashStackStartLine + 2]}\n`; // signalCode:signalAddr
signalInfo = `si_code=${lines[crashStackStartLine + 1]}, si_addr=${bucketSignalAddress(lines[crashStackStartLine + 2])}\n`;
crashStackStartLine += 3;
} else {
// The signal type may fail to be written.
// Intentionally different from SIGUNKNOWN from cpptools,
// and not SIG-? to avoid matching the regex in containsFilteredTelemetryData.
signalType = "SIGMISSING\n";
addressData = ".\n";
signalInfo = "";
}
data = telemetryHeader + signalType;
data = processName + signalType + signalInfo;
let crashCallStack: string = "";
let validFrameFound: boolean = false;
for (let lineNum: number = crashStackStartLine; lineNum < lines.length - 3; ++lineNum) { // skip last lines
@@ -1350,23 +1379,21 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
const startPos: number = line.indexOf(startStr);
let pendingCallStack: string = "";
if (startPos === -1 || line[startPos + (isMac ? 1 : 4)] === "+") {
pendingCallStack = dotStr;
const startAddressPos: number = line.indexOf("0x");
const endAddressPos: number = line.indexOf(endOffsetStr, startAddressPos + 2);
if (startAddressPos === -1 || endAddressPos === -1 || startAddressPos >= endAddressPos) {
addressData += "Unexpected offset\n";
pendingCallStack = "Unexpected offset\n";
} else {
let pendingAddressData: string = line.substring(startAddressPos, endAddressPos) + "\n";
let pendingAddressData: string = bucketFrameAddress(line.substring(startAddressPos, endAddressPos)) + "\n";
if (containsFilteredTelemetryData(pendingAddressData)) {
pendingAddressData = "?\n";
}
addressData += pendingAddressData;
pendingCallStack = pendingAddressData;
}
} else {
const offsetPos: number = line.indexOf(offsetStr, startPos + startStr.length);
if (offsetPos === -1) {
pendingCallStack = "Missing offsetStr\n";
addressData += "\n";
} else {
const startPos2: number = startPos + 1;
let funcStr: string = line.substring(startPos2, offsetPos);
@@ -1397,18 +1424,6 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
// Compute pendingOffset.
if (isMac) {
pendingOffset += line.substring(offsetPos2);
const startAddressPos: number = line.indexOf("0x");
if (startAddressPos === -1 || startAddressPos >= startPos) {
// unexpected
pendingOffset += "<Missing 0x>";
addressData += "\n";
} else {
let pendingAddressData: string = line.substring(startAddressPos, startPos) + "\n";
if (containsFilteredTelemetryData(pendingAddressData)) {
pendingAddressData = "?\n";
}
addressData += pendingAddressData;
}
} else {
const endPos: number = line.indexOf(">", offsetPos2);
if (endPos === -1) {
@@ -1416,8 +1431,6 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
} else {
pendingOffset += line.substring(offsetPos2, endPos);
}
addressData += "\n";
// TODO: It seems like addressData should be obtained on Linux in case the function is filtered.
}
pendingOffset += "\n";
pendingCallStack = funcStr + pendingOffset;
@@ -1447,19 +1460,18 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr
}
crashCallStack = crashCallStack.trimEnd();
addressData = addressData.trimEnd();
if (crashCallStack !== prevCppCrashCallStackData) {
prevCppCrashCallStackData = crashCallStack;
if (lines.length >= 6 && util.getLoggingLevel() >= 1) {
getCrashCallStacksChannel().appendLine(`\n${isCppToolsSrv2 ? "cpptools-srv2" : isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}${crashLog.length > 0 ? "\n\n" + crashLog : ""}`);
getCrashCallStacksChannel().appendLine(`\n${processName}${crashDate.toLocaleString()}\n${signalType}${signalInfo}${crashCallStack}${crashLog.length > 0 ? "\n\n" + crashLog : ""}`);
}
}
data += crashCallStack;
logCppCrashTelemetry(data, addressData, crashLog);
logCppCrashTelemetry(data, crashLog);
await util.deleteFile(path.resolve(crashDirectory, crashFile)).catch(logAndReturn.undefined);
if (crashFile === "cpptools.txt") {
+3 -4
View File
@@ -4,11 +4,10 @@
* ------------------------------------------------------------------------------------------ */
'use strict';
import { execSync } from 'child_process';
import { execFileSync } from 'child_process';
import * as os from 'os';
import * as path from 'path';
import * as semver from 'semver';
import { quote } from 'shell-quote';
import * as vscode from 'vscode';
import * as nls from 'vscode-nls';
import * as which from 'which';
@@ -297,7 +296,7 @@ export class CppSettings extends Settings {
let bundledVersion: string;
try {
const bundledPath: string = getExtensionFilePath(`./LLVM/bin/${clangName}`);
const output: string = execSync(quote([bundledPath, '--version'])).toString();
const output: string = execFileSync(bundledPath, ['--version']).toString();
bundledVersion = output.match(/(\d+\.\d+\.\d+)/)?.[1] ?? "";
if (!semver.valid(bundledVersion)) {
return path;
@@ -309,7 +308,7 @@ export class CppSettings extends Settings {
// Invoke the version on the system to compare versions. Use ours if it's more recent.
try {
const output: string = execSync(`"${path}" --version`).toString();
const output: string = execFileSync(path, ['--version']).toString();
const userVersion = output.match(/(\d+\.\d+\.\d+)/)?.[1] ?? "";
if (semver.ltr(userVersion, bundledVersion)) {
path = "";
+71 -4
View File
@@ -4,7 +4,6 @@
* ------------------------------------------------------------------------------------------ */
import { BasicParser, IParsedOption } from 'posix-getopt';
import { parse } from 'shell-quote';
/**
* Mapping of flags to functions that add the relevant flag to the map of
@@ -124,7 +123,11 @@ export class CommandParseError extends Error { }
* Attempts to convert an SSH command to an SSH config entry.
*/
export function sshCommandToConfig(command: string, name?: string): { [key: string]: string } {
const parts: string[] = parse(command) as string[];
// Split the command line into arguments. We deliberately use shell-like tokenization that
// strips single and double quotes and lets an unquoted backslash escape a following space,
// while keeping backslashes before other characters literal, so both Unix paths with escaped
// spaces (e.g. /home/me/my\ key) and Windows paths (e.g. C:\Users\me\key) are preserved.
const parts: string[] = splitArgs(command);
// ignore 'ssh' if the user entered that as their first word
if (parts[0] === 'ssh') {
@@ -167,6 +170,70 @@ export function sshCommandToConfig(command: string, name?: string): { [key: stri
return { Host, HostName, ...options };
}
/**
* Splits a command line into arguments using shell-like tokenization that behaves
* consistently across platforms. Both single and double quotes group their contents
* and are removed, and unquoted whitespace separates arguments.
*
* Outside of quotes, a backslash escapes only a following whitespace character (so a
* Unix path such as `/home/me/my\ key` keeps its space as a single argument). Before
* any other character a backslash is kept literal, so Windows paths such as
* `C:\Users\me\key` are preserved rather than being consumed as escape sequences.
*
* This tokenizer is intentionally lenient for a single-line input box: an unterminated
* quote is not treated as an error but simply runs to the end of the string.
*/
export function splitArgs(command: string): string[] {
const args: string[] = [];
let current: string = '';
let inToken: boolean = false;
let quoteChar: string | undefined;
for (let i: number = 0; i < command.length; i++) {
const c: string = command[i];
if (quoteChar !== undefined) {
if (c === quoteChar) {
quoteChar = undefined;
} else {
current += c;
}
continue;
}
if (c === '"' || c === '\'') {
quoteChar = c;
inToken = true;
continue;
}
if (c === '\\') {
const next: string | undefined = command[i + 1];
// Only escape a following whitespace character; otherwise keep the backslash
// literal so Windows path separators survive.
if (next === ' ' || next === '\t' || next === '\r' || next === '\n') {
current += next;
inToken = true;
i++;
continue;
}
current += c;
inToken = true;
continue;
}
if (c === ' ' || c === '\t' || c === '\r' || c === '\n') {
if (inToken) {
args.push(current);
current = '';
inToken = false;
}
continue;
}
current += c;
inToken = true;
}
if (inToken) {
args.push(current);
}
return args;
}
/**
* Parses flags from the given array of arguments, returning the index of the
* next non-flag in the input (or the total length of the input if none are found).
@@ -218,8 +285,8 @@ function parseFlags(input: string[], entries: { [key: string]: string }): number
* are not mentioned on the ssh(1) man page and don't seem to have use in the
* wild. In the OpenSSH source, they appear to be ignored[3].
*
* The `shell-quote` library, like libc does for OpenSSH, takes care of dealing
* with quotations for for us.
* The `splitArgs` tokenizer has already stripped any surrounding quotes before this
* function sees a token, so it only has to deal with the unquoted connection string.
*
* 1. https://github.com/openssh/openssh-portable/blob/e3b6c966b79c3ea5d51b923c3bbdc41e13b96ea0/ssh.c#L999
* 2. https://tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri-04#section-3.3
+2 -2
View File
@@ -14,12 +14,12 @@ import * as vscode from 'vscode';
import { DocumentFilter, Range } from 'vscode-languageclient';
import * as nls from 'vscode-nls';
import { TargetPopulation } from 'vscode-tas-client';
import * as which from "which";
import { ManualPromise } from './Utility/Async/manualPromise';
import { isWindows } from './constants';
import { getOutputChannelLogger, showOutputChannel } from './logger';
import { PlatformInformation } from './platform';
import * as Telemetry from './telemetry';
import which = require('which');
nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
@@ -1528,7 +1528,7 @@ export interface ISshLocalForwardInfo {
export function whichAsync(name: string, path?: string): Promise<string | undefined> {
return new Promise<string | undefined>(resolve => {
which(name, path ? { path } : {}, (err, resolved) => {
which(name, path ? { path } : {}, (err: Error | null, resolved: string | undefined) => {
if (err) {
resolve(undefined);
} else {
+4 -4
View File
@@ -10,7 +10,7 @@
"edit_include_path": "Edit \"includePath\" setting",
"disable_error_squiggles": "Disable error squiggles",
"enable_error_squiggles": "Enable all error squiggles",
"include_errors_update_include_path_squiggles_disables": "#include errors detected. Please update your includePath. Squiggles are disabled for this translation unit ({0}).",
"include_errors_update_include_path_squiggles_disabled2": "#include errors detected. Please update your includePath. Syntax errors for this file will not be reported until included files are found.",
"include_errors_update_include_path_intellisense_disabled": "#include errors detected. Please update your includePath. IntelliSense features for this translation unit ({0}) will be provided by the Tag Parser.",
"include_errors_update_compile_commands_or_include_path_intellisense_disabled": "#include errors detected. Consider updating your compile_commands.json or includePath. IntelliSense features for this translation unit ({0}) will be provided by the Tag Parser.",
"could_not_parse_compile_commands": "\"{0}\" could not be parsed. 'includePath' from c_cpp_properties.json in folder '{1}' will be used instead.",
@@ -120,7 +120,7 @@
"formatting_diff": "Formatting diffed output:",
"disable_inactive_regions": "Disable inactive region colorization",
"error_limit_exceeded": "Error limit exceeded, {0} error(s) not reported.",
"include_errors_update_compile_commands_or_include_path_squiggles_disabled": "#include errors detected. Consider updating your compile_commands.json or includePath. Squiggles are disabled for this translation unit ({0}).",
"include_errors_update_compile_commands_or_include_path_squiggles_disabled2": "#include errors detected. Consider updating your compile_commands.json or includePath. Syntax errors for this file will not be reported until included files are found.",
"cannot_reset_database": "The IntelliSense database could not be reset. To manually reset, close all VS Code instances and then delete this file: {0}",
"formatting_failed_see_output": "Formatting failed. See the output window for details.",
"populating_include_completion_cache": "Populating include completion cache.",
@@ -158,7 +158,7 @@
"fallback_to_no_bitness": "Failed to query compiler. Falling back to no bitness.",
"intellisense_client_creation_aborted": "IntelliSense client creation aborted: {0}",
"include_errors_config_provider_intellisense_disabled": "#include errors detected based on information provided by the configurationProvider setting. IntelliSense features for this translation unit ({0}) will be provided by the Tag Parser.",
"include_errors_config_provider_squiggles_disabled": "#include errors detected based on information provided by the configurationProvider setting. Squiggles are disabled for this translation unit ({0}).",
"include_errors_config_provider_squiggles_disabled2": "#include errors detected based on information provided by the configurationProvider setting. Syntax errors for this file will not be reported until included files are found.",
"preprocessor_keyword": {
"text": "preprocessor keyword",
"hint": "Refers to C/C++ processor keywords"
@@ -699,4 +699,4 @@
"help_allow_missing_lsp_config": "Allow the server to start even if the specified --lsp-config file does not exist.",
"initialize_failed_during_engine_setup": "Initialization failed during engine setup.",
"important_label": "Important:"
}
}
+72 -30
View File
@@ -3,8 +3,8 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import { readdir } from 'fs/promises';
import { IOptions, glob as globSync } from 'glob';
import { readdir, readFile } from 'fs/promises';
import { glob as globSync, IOptions } from 'glob';
import * as Mocha from 'mocha';
import { basename, dirname, resolve } from 'path';
import { env } from 'process';
@@ -73,10 +73,49 @@ export async function getTestInfo(...scenarioOptions: (string | undefined)[]) {
return undefined;
}
export function run (testsRoot: string, cb: (error: any, failures?: number) => void): void {
/**
* This code runs in the extension host process, and not in the launch (main.ts) process.
* When running tests after using `yarn install-and-copy-binaries-for-test`, this function determines
* if the tests should be skipped based on whether the binary version copied for tests is compatible
* with the minimum required version. The minimum required binary version is defined in the
* `minBinaryVersion.json` file and changes when there are breaking changes in the communication
* protocol or messages.
*
* When running locally, the function is expected to always return false since you're more likely to
* have the correct binaries available. If you ever ran `yarn install-and-copy-binaries-for-test` locally
* and the binaries are too old, this function will return true and skip the tests. The remedy is to
* delete the `bin/binaryVersion.json` file and/or re-run `yarn install-and-copy-binaries-for-test` to
* get the latest binaries.
* @returns A promise that resolves to a boolean indicating whether the tests should be skipped.
*/
async function shouldSkipTests(): Promise<boolean> {
try {
const binaryVersion = JSON.parse(await readFile(`${$root}/bin/binaryVersion.json`, 'utf-8')) as { version: string } | undefined;
const binaryCompat = JSON.parse(await readFile(`${$root}/test/minBinaryVersion.json`, 'utf-8')) as { minBinaryVersion: string } | undefined;
if (binaryCompat?.minBinaryVersion && binaryVersion?.version) {
const minParts = binaryCompat.minBinaryVersion.split('.').map(Number);
const actualParts = binaryVersion.version.split('.').map(Number);
const maxLen = Math.max(minParts.length, actualParts.length);
let tooOld = false;
for (let i = 0; i < maxLen; i++) {
const diff = (actualParts[i] ?? 0) - (minParts[i] ?? 0);
if (diff < 0) { tooOld = true; break; }
if (diff > 0) { break; }
}
if (tooOld) {
console.warn(`\nBinary-dependent tests SKIPPED: installed binary version ${binaryVersion.version} is below the required minimum ${binaryCompat.minBinaryVersion}.`);
console.warn(`Tests will re-enable automatically once binaries >= ${binaryCompat.minBinaryVersion} are installed or 'bin/binaryVersion.json' is removed.\n`);
return true;
}
}
} catch {
}
return false;
}
export function run(testsRoot: string, cb: (error: any, failures?: number) => void): void {
/**
* This code runs in the extension host process, and not in the launch (main.ts) process.
*/
let location = '';
// scan through the $args to find the --scenario=...
@@ -87,34 +126,37 @@ export function run (testsRoot: string, cb: (error: any, failures?: number) => v
console.error(`The Scenario folder must be specified either by '--scenario=...' or an environment variable 'SCENARIO=...'`);
process.exit(1);
}
const { name} = testInfo;
const { name } = testInfo;
void glob(`${$root}/dist/test/scenarios/${name}/tests/**/**.test.js`).then((files) => {
if (await shouldSkipTests()) {
cb(null, 0);
return;
}
try {
if (!files.length) {
throw new Error(`Unable to find unit tests for ${name} at '${$root}/dist/test/scenarios/${name}/tests/**/**.test.js'`);
}
const mocha = new Mocha({
ui: 'tdd',
timeout: 500000,
require: ['source-map-support/register'],
color: true
});
// Add files to the test suite
files.forEach(f => mocha.addFile(resolve(testsRoot, f)));
console.log('\n\n=============================================\n Test Output\n\n');
// Run the mocha test
mocha.run((failures: any) => {
cb(null, failures);
console.log('\n\n=============================================\n\n');
});
} catch (err) {
console.error(err);
cb(err);
const files = await glob(`${$root}/dist/test/scenarios/${name}/tests/**/**.test.js`).catch(returns.none);
try {
if (!files.length) {
throw new Error(`Unable to find unit tests for ${name} at '${$root}/dist/test/scenarios/${name}/tests/**/**.test.js'`);
}
});
const mocha = new Mocha({
ui: 'tdd',
timeout: 500000,
require: ['source-map-support/register'],
color: true
});
// Add files to the test suite
files.forEach(f => mocha.addFile(resolve(testsRoot, f)));
console.log('\n\n=============================================\n Test Output\n\n');
// Run the mocha test
mocha.run((failures: any) => {
cb(null, failures);
console.log('\n\n=============================================\n\n');
});
} catch (err) {
console.error(err);
cb(err);
}
});
}
+3
View File
@@ -0,0 +1,3 @@
{
"minBinaryVersion": "1.33.0"
}
@@ -108,6 +108,7 @@ suite('Run Without Debugging Terminal and Arguments Test', function (this: Mocha
'two words',
path.join(workspacePath, 'input folder', 'three words.txt')
];
const skipExternalConsole = process.env.SCENARIO_ARGS?.split(',').includes('skipExternalConsole');
suiteSetup(async function (): Promise<void> {
const extension: vscode.Extension<any> = vscode.extensions.getExtension('ms-vscode.cpptools') || assert.fail('Extension not found');
@@ -169,7 +170,8 @@ suite('Run Without Debugging Terminal and Arguments Test', function (this: Mocha
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 () => {
const testFunc = skipExternalConsole && consoleCase.consoleMode === 'externalTerminal' ? test.skip : test;
testFunc(`No-debug launch via ${consoleCase.label} handles ${programCase.label}${profileSuffix}`, async () => {
await setWindowsDefaultTerminalProfile(profile);
disposeTerminals(executablePaths);
@@ -0,0 +1,115 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import { describe, it } from 'mocha';
import { strictEqual } from 'node:assert';
import { computeEvaluatableExpression } from '../../src/Debugger/evaluatableExpression';
// In each input the `|` marks the cursor; it is removed (at that single index) before evaluating.
function evaluate(marked: string): string | undefined {
const character: number = marked.indexOf('|');
const line: string = marked.slice(0, character) + marked.slice(character + 1);
return computeEvaluatableExpression(line, character)?.expression;
}
describe('computeEvaluatableExpression', () => {
it('returns undefined when the cursor is not on a token', () => {
strictEqual(evaluate('a + | b'), undefined);
});
it('evaluates a plain identifier', () => {
strictEqual(evaluate('|x'), 'x');
});
it('drops a leading * for an interior member of a dot chain', () => {
strictEqual(evaluate('*|a.b.c'), 'a');
strictEqual(evaluate('*a.|b.c'), 'a.b');
});
it('keeps a leading * on the final member', () => {
strictEqual(evaluate('*a.b.|c'), '*a.b.c');
});
it('drops a leading * on an interior member before -> and keeps it on the final member', () => {
strictEqual(evaluate('*|ptr->member'), 'ptr');
strictEqual(evaluate('*ptr->|member'), '*ptr->member');
});
it('drops a leading * before a subscript (the array base is not the dereferenced value)', () => {
strictEqual(evaluate('*a.|b[i]'), 'a.b');
strictEqual(evaluate('*dbbolz.|nullzwang_ok[DBBOLZ_A_AUS]'), 'dbbolz.nullzwang_ok');
});
it('drops a leading & so the variable shows its value, not its address', () => {
strictEqual(evaluate('&|nullzwang_ok'), 'nullzwang_ok');
strictEqual(evaluate('&a.b.|c'), 'a.b.c');
});
it('leaves -> chains without a leading operator unchanged', () => {
strictEqual(evaluate('p->|q->r'), 'p->q');
strictEqual(evaluate('p->q->|r'), 'p->q->r');
});
it('keeps array subscripts in the chain', () => {
strictEqual(evaluate('a.|b[i].c'), 'a.b');
strictEqual(evaluate('a.b[i].|c'), 'a.b[i].c');
strictEqual(evaluate('dbbolz.dbbolz_anst[out_idx].|anw_dig'), 'dbbolz.dbbolz_anst[out_idx].anw_dig');
strictEqual(evaluate('dbbolz.dbbolz_anst[out_idx].anw_dig.|stsdig'), 'dbbolz.dbbolz_anst[out_idx].anw_dig.stsdig');
});
it('evaluates the element when on a subscript bracket, without the leading operator', () => {
strictEqual(evaluate('a.b|[i].c'), 'a.b[i]');
strictEqual(evaluate('a.b[i|].c'), 'a.b[i]');
strictEqual(evaluate('&dbbolz.dbbolz_anst[out_idx].fg|[kanal_idx]'), 'dbbolz.dbbolz_anst[out_idx].fg[kanal_idx]');
});
it('evaluates the index on its own when inside a subscript', () => {
strictEqual(evaluate('a.b[|i].c'), 'i');
strictEqual(evaluate('&dbbolz.dbbolz_anst[out_idx].fg[|kanal_idx]'), 'kanal_idx');
});
it('keeps :: scoped names together', () => {
strictEqual(evaluate('ns::|var'), 'ns::var');
strictEqual(evaluate('ns::var::|z'), 'ns::var::z');
});
it('returns undefined for a fragment that begins with a connector', () => {
// The head of the expression (a call) is skipped by the tokenizer, leaving a `.`/`->` start.
strictEqual(evaluate('foo().|bar'), undefined);
strictEqual(evaluate('obj->fn()->|field'), undefined);
strictEqual(evaluate('(*this).|member'), undefined);
});
it('returns undefined when the cursor is on an operator or space inside a subscript', () => {
strictEqual(evaluate('a[i |+ j].c'), undefined);
strictEqual(evaluate('a[i +| j].c'), undefined);
strictEqual(evaluate('a[i +|j].c'), 'j');
strictEqual(evaluate('a[i|+1].c'), undefined);
});
it('treats nested subscripts as balanced brackets', () => {
strictEqual(evaluate('a|[b[i]]'), 'a[b[i]]');
strictEqual(evaluate('a[b|[i]]'), 'b[i]');
strictEqual(evaluate('a[b[|i]]'), 'i');
strictEqual(evaluate('a[b[i]|]'), 'a[b[i]]');
});
it('keeps a trailing subscript whole when hovering past the last identifier', () => {
strictEqual(evaluate('a[i]|'), 'a[i]');
strictEqual(evaluate('*a.b[i]|'), '*a.b[i]');
});
it('keeps a leading * on a final subscript element but drops it on an interior one', () => {
strictEqual(evaluate('*a.b|[i]'), '*a.b[i]');
strictEqual(evaluate('*a.b[i|]'), '*a.b[i]');
strictEqual(evaluate('*a.b|[i].c'), 'a.b[i]');
strictEqual(evaluate('&a|[i]'), 'a[i]');
});
it('does not grab the whole element when hovering an interior connector', () => {
strictEqual(evaluate('*x|.y[i]'), 'x');
strictEqual(evaluate('*dbbolz|.nullzwang_ok[DBBOLZ_A_AUS]'), 'dbbolz');
});
});
@@ -0,0 +1,95 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import { deepStrictEqual, strictEqual } from 'assert';
import { describe, it } from 'mocha';
import { splitArgs, sshCommandToConfig } from '../../src/SSH/sshCommandToConfig';
// eslint-disable-next-line import/no-unassigned-import
require('source-map-support/register');
describe('splitArgs', () => {
// [description, input, expected tokens]
const cases: [string, string, string[]][] = [
['empty string', '', []],
['whitespace only', ' \t ', []],
['simple words', 'ssh user@host', ['ssh', 'user@host']],
['collapses runs of whitespace', 'ssh \t user@host', ['ssh', 'user@host']],
['trims leading/trailing whitespace', ' ssh user@host ', ['ssh', 'user@host']],
// Windows paths: backslashes must stay literal (the original bug).
['bare Windows path', 'ssh -i C:\\Users\\me\\key user@host', ['ssh', '-i', 'C:\\Users\\me\\key', 'user@host']],
['double-quoted Windows path with spaces', 'ssh -i "C:\\Program Files\\me\\key" user@host', ['ssh', '-i', 'C:\\Program Files\\me\\key', 'user@host']],
['single-quoted Windows path with spaces', "ssh -i 'C:\\Program Files\\me\\key' user@host", ['ssh', '-i', 'C:\\Program Files\\me\\key', 'user@host']],
['single-quoted Windows path without spaces', "ssh -i 'C:\\Users\\me\\key' user@host", ['ssh', '-i', 'C:\\Users\\me\\key', 'user@host']],
// Quote handling.
['strips double quotes', '"a b" c', ['a b', 'c']],
['strips single quotes', "'a b' c", ['a b', 'c']],
['quotes joined to adjacent text', 'a"b c"d', ['ab cd']],
['single quotes inside double quotes are literal', '"it\'s here"', ["it's here"]],
['double quotes inside single quotes are literal', "'say \"hi\"'", ['say "hi"']],
['empty double-quoted token is preserved', 'a "" b', ['a', '', 'b']],
['empty single-quoted token is preserved', "a '' b", ['a', '', 'b']],
// Forward-slash (POSIX-style) paths are unaffected.
['forward-slash path', 'ssh -i /home/me/.ssh/id_rsa user@host', ['ssh', '-i', '/home/me/.ssh/id_rsa', 'user@host']],
// An unquoted backslash escapes a following whitespace character (POSIX behavior), so a
// Unix path with an escaped space stays a single argument.
['backslash escapes a space', 'ssh -i /home/me/my\\ key user@host', ['ssh', '-i', '/home/me/my key', 'user@host']],
['backslash escapes multiple spaces', 'ssh -i /home/me/key\\ with\\ spaces user@host', ['ssh', '-i', '/home/me/key with spaces', 'user@host']],
['backslash escapes a tab', 'a\\\tb', ['a\tb']],
['trailing backslash is literal', 'foo\\', ['foo\\']],
['backslash before a letter stays literal (Windows path)', 'C:\\Users\\me', ['C:\\Users\\me']],
['UNC path keeps doubled backslashes', '\\\\server\\share', ['\\\\server\\share']],
// A backslash that ends a quoted segment is literal and must not escape the following
// separator (only an unquoted backslash directly before whitespace escapes).
['quoted path ending in backslash is not joined to the next arg', '"C:\\Program Files\\" next', ['C:\\Program Files\\', 'next']],
// Lenient handling of an unterminated quote: runs to end of string.
['unterminated double quote runs to end', 'ssh -i "C:\\Users\\me', ['ssh', '-i', 'C:\\Users\\me']],
['unterminated single quote runs to end', "ssh -i 'C:\\Users\\me", ['ssh', '-i', 'C:\\Users\\me']]
];
for (const [description, input, expected] of cases) {
it(`${description}: ${JSON.stringify(input)}`, () => {
deepStrictEqual(splitArgs(input), expected);
});
}
});
describe('sshCommandToConfig', () => {
it('preserves a bare Windows identity-file path', () => {
const config = sshCommandToConfig('ssh -i C:\\Users\\me\\.ssh\\id_rsa user@host');
strictEqual(config.IdentityFile, 'C:\\Users\\me\\.ssh\\id_rsa');
strictEqual(config.HostName, 'host');
strictEqual(config.User, 'user');
});
it('preserves a single-quoted Windows identity-file path with spaces', () => {
const config = sshCommandToConfig("ssh -i 'C:\\Program Files\\me\\key' user@host");
strictEqual(config.IdentityFile, 'C:\\Program Files\\me\\key');
});
it('preserves a double-quoted Windows identity-file path with spaces', () => {
const config = sshCommandToConfig('ssh -i "C:\\Program Files\\me\\key" user@host');
strictEqual(config.IdentityFile, 'C:\\Program Files\\me\\key');
});
it('preserves a Unix identity-file path with a backslash-escaped space', () => {
const config = sshCommandToConfig('ssh -i /home/me/my\\ key user@host');
strictEqual(config.IdentityFile, '/home/me/my key');
strictEqual(config.HostName, 'host');
strictEqual(config.User, 'user');
});
it('parses host, user, and port from the connection string', () => {
const config = sshCommandToConfig('ssh -p 2222 user@host');
strictEqual(config.HostName, 'host');
strictEqual(config.User, 'user');
strictEqual(config.Port, '2222');
});
});
+138
View File
@@ -0,0 +1,138 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "VS Code task definitions",
"description": "A json schema for VS Code task definitions contributed by the C/C++ extension",
"type": "object",
"definitions": {
"TaskStringWithQuoting": {
"type": "object",
"required": [
"value",
"quoting"
],
"properties": {
"value": {
"type": "string",
"description": "%c_cpp.taskDefinitions.args.value.description%"
},
"quoting": {
"type": "string",
"enum": [
"escape",
"strong",
"weak"
],
"enumDescriptions": [
"%c_cpp.taskDefinitions.args.quoting.escape.description%",
"%c_cpp.taskDefinitions.args.quoting.strong.description%",
"%c_cpp.taskDefinitions.args.quoting.weak.description%"
],
"default": "strong",
"description": "%c_cpp.taskDefinitions.args.quoting.description%"
}
}
},
"TaskStringOrQuotedString": {
"oneOf": [
{
"type": "string"
},
{
"$ref": "#/definitions/TaskStringWithQuoting"
}
]
},
"CppBuildTaskOptions": {
"type": "object",
"description": "%c_cpp.taskDefinitions.options.description%",
"properties": {
"cwd": {
"type": "string",
"description": "%c_cpp.taskDefinitions.options.cwd.description%"
}
}
},
"CppBuildTaskProblemMatcher": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "%c_cpp.taskDefinitions.problemMatcher.description%"
},
"CppBuildTaskPlatformOverride": {
"type": "object",
"properties": {
"command": {
"$ref": "#/definitions/TaskStringOrQuotedString"
},
"args": {
"type": "array",
"description": "%c_cpp.taskDefinitions.args.description%",
"items": {
"$ref": "#/definitions/TaskStringOrQuotedString"
}
},
"options": {
"$ref": "#/definitions/CppBuildTaskOptions"
},
"problemMatcher": {
"$ref": "#/definitions/CppBuildTaskProblemMatcher"
}
}
},
"CppBuildTaskDefinition": {
"type": "cppbuild",
"required": [
"command",
"label"
],
"properties": {
"label": {
"type": "string",
"description": "%c_cpp.taskDefinitions.name.description%"
},
"command": {
"$ref": "#/definitions/TaskStringOrQuotedString"
},
"args": {
"type": "array",
"description": "%c_cpp.taskDefinitions.args.description%",
"items": {
"$ref": "#/definitions/TaskStringOrQuotedString"
}
},
"options": {
"$ref": "#/definitions/CppBuildTaskOptions"
},
"problemMatcher": {
"$ref": "#/definitions/CppBuildTaskProblemMatcher"
},
"detail": {
"type": "string",
"description": "%c_cpp.taskDefinitions.detail.description%"
},
"windows": {
"$ref": "#/definitions/CppBuildTaskPlatformOverride"
},
"linux": {
"$ref": "#/definitions/CppBuildTaskPlatformOverride"
},
"osx": {
"$ref": "#/definitions/CppBuildTaskPlatformOverride"
}
}
},
"TaskDefinitions": [
{
"$ref": "#/definitions/CppBuildTaskDefinition"
}
]
}
}
-10
View File
@@ -896,11 +896,6 @@
resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528"
integrity sha1-POOvGlUk7zJ9Lank/YttlcjXBSg=
"@types/shell-quote@^1.7.5":
version "1.7.5"
resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/shell-quote/-/shell-quote-1.7.5.tgz#6db4704742d307cd6d604e124e3ad6cd5ed943f3"
integrity sha1-bbRwR0LTB81tYE4STjrWzV7ZQ/M=
"@types/sinon@^21.0.0":
version "21.0.0"
resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/@types/sinon/-/sinon-21.0.0.tgz#3a598a29b3aec0512a21e57ae0fd4c09aa013ca9"
@@ -5508,11 +5503,6 @@ shebang-regex@^3.0.0:
resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=
[email protected]:
version "1.8.4"
resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/shell-quote/-/shell-quote-1.8.4.tgz#2edd9a4dcefc96649e2e2cb12f637b1f1d92a190"
integrity sha1-Lt2aTc78lmSeLiyxL2N7Hx2SoZA=
side-channel-list@^1.0.0:
version "1.0.0"
resolved "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+4
View File
@@ -2,3 +2,7 @@ registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_Public
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
min-release-age=7
audit=true
audit-level=high
+4
View File
@@ -2,3 +2,7 @@ registry=https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_Public
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
min-release-age=7
audit=true
audit-level=high