Compare commits

...
84 Commits
Author SHA1 Message Date
Sean McManus 3512a088d6 Merge pull request #7537 from microsoft/seanmmc/1_4_0_insiders2
1.4.0-insiders2
2021-05-17 14:09:30 -07:00
Sean McManus 8ec3dfa3fd Merge branch 'main' into seanmmc/1_4_0_insiders2 2021-05-17 12:58:47 -07:00
Sean McManus e5cdfac6b7 1.4.0-insiders2 changelog (#7536)
* Update changelog.
2021-05-17 12:50:52 -07:00
Colen Garoutte-Carson f7543e3aaa Add Getting Started Walkthrough (#7512) 2021-05-17 12:14:54 -07:00
Sean McManus 7a2de290cf Delay settings UI update so it's not blank. (#7524)
* Delay settings UI update so it's not blank.
2021-05-14 14:14:36 -07:00
csigs 8c49ac2a8d Localization - Translated Strings (#7521) 2021-05-14 11:13:27 -07:00
Sean McManus 557ced4b75 Add capabilities. (#7486) 2021-05-13 19:14:27 -07:00
Sean McManus 106bde2dc6 Merge pull request #7464 from microsoft/seanmcm/updateIntelliSenseStrings2
Update IntelliSense error strings.
2021-05-10 13:23:44 -07:00
Sean McManus a509b332b5 Merge branch 'main' into seanmcm/updateIntelliSenseStrings2 2021-05-10 13:13:06 -07:00
Sean McManus 905f8dc216 Merge pull request #7504 from microsoft/seanmcm/1_4_0_insidersMerge2
1.4.0-insiders merge2
2021-05-10 11:55:49 -07:00
Sean McManus 6464f55fcf Merge branch 'main' into seanmcm/1_4_0_insidersMerge2 2021-05-10 09:54:57 -07:00
Elaheh Rashedi 6ae687faa3 check if the directory exists (#7487) 2021-05-10 08:12:48 -07:00
Colen Garoutte-Carson 2e00bb9a31 Minor spelling fix (#7490) 2021-05-07 18:18:14 -07:00
csigs 10090a03a6 Localization - Translated Strings (#7485) 2021-05-07 12:39:15 -07:00
Colen Garoutte-Carson 1f278e75c3 Consolidate localization import and export into same YML. Use LCL hosted by the Loc team. (#7479) 2021-05-07 11:42:17 -07:00
Sean McManus dba4a28d88 Merge pull request #7480 from microsoft/seanmcm/1_4_0_insiders
1.4.0-insiders
2021-05-06 19:39:23 -07:00
Sean McManus bcc256ec16 Update version. (#7481) 2021-05-06 19:00:14 -07:00
Sean McManus 53a3864fdc Update version. 2021-05-06 18:46:06 -07:00
Sean McManus 0ea25159d4 Merge branch 'main' into seanmcm/1_4_0_insiders 2021-05-06 18:41:47 -07:00
Sean McManus 42fe8076e6 Update changelog for 1.4.0-insiders (#7476)
* Update changelog.
2021-05-06 18:35:25 -07:00
Colen Garoutte-Carson 5297166d4f Use CancellationError to avoid logging of cancels as errors (#7477) 2021-05-06 16:31:24 -07:00
dependabot[bot] b89e45a4b6 Bump lodash from 4.17.20 to 4.17.21 in /.github/actions (#7475)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <[email protected]>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-06 15:05:44 -07:00
Sean McManus 060c14117c Update hosted-git-info. (#7474) 2021-05-06 14:50:39 -07:00
csigs b00df8d64d Localization - Translated Strings (#7469) 2021-05-06 10:02:38 -07:00
Elaheh Rashedi 4e7b679889 refactoring async/await 2021-05-05 15:26:49 -07:00
Gregg Miskelly 30950f0aaa Update cppvsdbg debug adapter (#7467)
Changes:
* Adds support for loading Concord extensions to the cppvsdbg debug adapter (see [documentation](https://github.com/microsoft/ConcordExtensibilitySamples/wiki/Support-for-VS-Code-cppvsdbg-Scenarios) for more information)
* Adds support for exception conditions to cppvsdbg (see documentation file in this PR for more information)
2021-05-05 14:29:17 -07:00
Sean McManus 385c336ba7 Update ESLint. (#7466) 2021-05-05 12:04:06 -07:00
Sean McManus b8fae51686 Update IntelliSense error strings. 2021-05-04 17:59:45 -07:00
csigs c750359475 Localization - Translated Strings (#7460) 2021-05-03 16:18:39 -07:00
Elaheh Rashedi 618c9c7d0c refactoring async/await (#7277)
refactor with <async/await>
2021-05-03 15:33:01 -07:00
Colen Garoutte-Carson 8b36869283 Switch to new localization pipeline (#7441) 2021-05-03 13:41:03 -07:00
Sean McManus 64c9e5f67a Fix policheck issues. (#7458)
* Fix policheck issues.
2021-05-03 11:10:05 -07:00
Sean McManus 5dae210933 Fix squiggle on empty compilerPath. (#7457) 2021-05-03 10:53:32 -07:00
Alan LeungandAndrew Wang 85312ed31d Add embedded debugging support options (#7449)
* Add stopAtConnect and hardwareBreakpoints options

* Run yarn generateOptionsSchema

Co-authored-by: Andrew Wang <[email protected]>
2021-04-30 17:07:03 -07:00
Philip Craig 19db7fe4b5 Fix typo "apline" to "alpine" (#7438) 2021-04-30 16:53:51 -07:00
Sean McManus 38e90ce750 Update fwlinks for clang-format 12 (#7447)
* Update fwlinks for clang-format.
* Update hashes.
2021-04-30 16:35:47 -07:00
Sean McManus 76f22333e6 Update environement description. (#7417) 2021-04-23 14:48:30 -07:00
Sean McManus 740c141887 Update common.json. (#7416) 2021-04-23 14:22:42 -07:00
Colen Garoutte-Carson b00eaa2670 Some cleanup of use of zipfile (#7410) 2021-04-23 13:42:20 -07:00
Sean McManus 3a839384bb Merge pull request #7363 from HackintoshwithUbuntu/main
Changing default launch.json from "${workspaceFolder}" to "${fileDirname}"
2021-04-21 14:43:26 -07:00
Sean McManus 5f307788e2 Merge branch 'main' into main 2021-04-21 14:34:53 -07:00
Colen Garoutte-Carson ce9ab28489 Remove VSIX binary compat warning on some platform/arch combos (#7397) 2021-04-21 12:22:49 -07:00
Colen Garoutte-Carson 3ca675fd58 Add action workflows for 'enhancement' label (#7398) 2021-04-21 12:12:55 -07:00
Sean McManus 09519ae210 Merge branch 'main' into main 2021-04-21 10:11:09 -07:00
Elaheh Rashedi a370b3d064 separate handling compiler squiggles from other paths (#7343)
* separate compiler squiggles
2021-04-20 13:10:31 -07:00
Sean McManus 164a2962b6 Update changelog for 1.3.1. (#7391)
* Update changelog for 1.3.1.
* Update version.
2021-04-19 14:53:42 -07:00
Sean McManus 5f14aab942 Merge branch 'main' into main 2021-04-16 15:56:57 -07:00
Syed Ahmad 1502b87e47 update ${workspaceFolder} to ${fileDirname} #7362 2021-04-16 10:12:48 +10:00
Sean McManus 88768b9c28 Attempt to fix random yarn timeout on Mac. (#7371)
* Attempt to fix random yarn timeout on Mac.
2021-04-15 13:04:42 -07:00
Sean McManus 94ab7f9087 Fix 32-bit Windows. (#7373) 2021-04-15 12:45:22 -07:00
csigsandDevDiv Build Lab - Dev14 e5abb36d32 Localization - Translated Strings (#7366)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-04-15 09:58:45 -07:00
Syed Ahmad 91393ad80e update ${workspaceFolder} to ${fileDirname} #7362 2021-04-15 16:29:10 +10:00
Syed Ahmad ad6fd53398 update ${workspaceFolder} to ${fileDirname} #7362 2021-04-15 16:27:47 +10:00
Yonggang Luo d85e30e746 Logging invalid provided cpp configuration (#7350) 2021-04-14 10:02:46 -07:00
csigsandDevDiv Build Lab - Dev14 1935d85357 Localization - Translated Strings (#7361)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-04-14 09:55:21 -07:00
Sean McManus 18f29bffa8 Fix activation. (#7345) 2021-04-13 17:56:49 -07:00
csigsandDevDiv Build Lab - Dev14 f0a8c1aa16 Localization - Translated Strings (#7357)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-04-13 16:34:28 -07:00
csigsandDevDiv Build Lab - Dev14 f3c8c5f389 Localization - Translated Strings (#7353)
Co-authored-by: DevDiv Build Lab - Dev14 <[email protected]>
2021-04-13 10:05:13 -07:00
Colen Garoutte-Carson 143207aadb Merge to insiders (#7320) 2021-04-08 15:22:46 -07:00
Michelle Matias 0edf6c3ea7 Merge pull request #7304 from microsoft/mimatias/insiders4-2
1.3.0-insiders4 (#2)
2021-04-06 16:39:09 -07:00
Michelle Matias 4e22b6577f Merge pull request #7302 from microsoft/mimatias/insiders4
1.3.0-insiders4
2021-04-06 11:48:40 -07:00
Michelle Matias 1ab60bc247 Merge branch 'insiders' into mimatias/insiders4 2021-04-06 11:45:09 -07:00
Colen Garoutte-Carson 33eb2f6abe Add some files missed when merging to Insiders branch (#7271) 2021-04-01 12:15:23 -07:00
Colen Garoutte-Carson 11262438e3 Merge main into insiders (#7266) 2021-03-31 19:16:40 -07:00
Colen Garoutte-Carson 673a68d4cc Merge to insiders (#7236) 2021-03-25 14:05:32 -07:00
Sean McManus 437d9b333a Merge pull request #7223 from microsoft/1_3_0_insiders2
1.3.0-insiders2 merge
2021-03-24 12:10:49 -07:00
Sean McManus 0139274856 Change date. 2021-03-24 12:09:28 -07:00
Sean McManus 87cfa702bc Update changelog. 2021-03-24 06:04:49 -07:00
Sean McManus 013bff267e Merge branch 'insiders' into 1_3_0_insiders2 2021-03-24 05:53:35 -07:00
Colen Garoutte-Carson d942d64b7b Merge main to insiders (#7186) 2021-03-16 20:56:48 -07:00
Colen Garoutte-Carson 1a2bf6fc4c Merge main into insiders (#7180) 2021-03-16 17:44:59 -07:00
Sean McManus 32c1d6bf52 Merge pull request #6997 from microsoft/main
Merge for 1.2.2-insiders2
2021-02-18 18:13:59 -08:00
Sean McManus ebd5314b48 Merge pull request #6986 from microsoft/seanmcm/1_2_2_insiders
1.2.2-insiders
2021-02-17 15:01:04 -08:00
Sean McManus 5c7f551dba Merge. 2021-02-17 14:57:49 -08:00
Sean McManus 6ccea3878b Merge pull request #6853 from microsoft/seanmcm/1_2_0_insiders3
1.2.0-insiders3
2021-01-26 18:22:11 -08:00
Sean McManus e5fd036af9 Update changelog. 2021-01-26 17:40:57 -08:00
Sean McManus 4254419e76 Merge branch 'main' into seanmcm/1_2_0_insiders3 2021-01-26 17:27:51 -08:00
Sean McManus f9ecc9c6f9 Merge pull request #6820 from microsoft/seanmcm/1_2_0_insiders2
1.2.0-insiders2
2021-01-19 20:26:53 -08:00
Sean McManus 9405f41521 Merge branch 'main' into seanmcm/1_2_0_insiders2 2021-01-19 18:22:49 -08:00
Sean McManus 37cca41225 Merge pull request #6785 from microsoft/seanmcm/1_2_0_insiders_updates
1 2 0 insiders updates
2021-01-14 18:22:43 -08:00
Sean McManus ed584b23e2 Merge branch 'main' into seanmcm/1_2_0_insiders_updates 2021-01-14 18:21:56 -08:00
Sean McManus f7cab674a4 Merge branch 'main' into seanmcm/1_2_0_insiders_updates 2021-01-14 17:31:47 -08:00
Sean McManus 42586081fa Merge pull request #6777 from microsoft/seanmcm/1_2_0_insiders
Merge latest changes for 1.2.0-insiders
2021-01-13 18:56:37 -08:00
Sean McManus c49e51d386 Fix extra space. 2021-01-13 18:53:52 -08:00
127 changed files with 3110 additions and 1713 deletions
+3 -3
View File
@@ -940,9 +940,9 @@
}
},
"lodash": {
"version": "4.17.20",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"lodash.get": {
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
node-version: 14.16.x
- name: Install Dependencies
run: yarn install
run: yarn install --network-timeout 100000
working-directory: Extension
- name: Generate hashes for runtime dependency packages
@@ -0,0 +1,30 @@
name: Enhancement Closer (no milestone)
on:
schedule:
- cron: 50 11 * * * # Run at 11:50 AM UTC (3:50 AM PST, 4:50 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: enhancement
ignoreLabels: debugger,internal,Feature Request
addLabels: more votes needed
closeDays: 60
maximumVotes: 2
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
setMilestoneId: 30
ignoreMilestoneNames: "*"
@@ -0,0 +1,30 @@
name: Enhancement Closer (Triage)
on:
schedule:
- cron: 40 11 * * * # Run at 11:40 AM UTC (3:40 AM PST, 4:40 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Stale Closer
uses: ./.github/actions/StaleCloser
with:
readonly: ${{ github.event.inputs.readonly }}
labels: enhancement
ignoreLabels: debugger,internal,Feature Request
addLabels: more votes needed
closeDays: 60
maximumVotes: 2
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
milestoneName: Triage
milestoneId: 30
@@ -0,0 +1,31 @@
name: Enhancement Reopener
on:
schedule:
- cron: 20 12 * * * # Run at 12:20 PM UTC (4:20 AM PST, 5:20 AM PDT)
workflow_dispatch:
inputs:
readonly:
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
default: false
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
uses: actions/checkout@v2
- name: Install Actions
run: cd ./.github/actions && npm install --production && cd ../..
- name: Run Reopener
uses: ./.github/actions/Reopener
with:
readonly: ${{ github.event.inputs.readonly }}
alsoApplyToOpenIssues: true
reopenComment: This feature request has received enough votes to be added to our backlog.
labels: enhancement
minimumVotes: 3
ignoreLabels: debugger,internal,Feature Request
milestoneId: 30
milestoneName: Triage
setMilestoneId: 28
removeLabels: more votes needed
+2 -1
View File
@@ -6,7 +6,8 @@ browse*.db*
*.exe
*.ilk
# ignore exported localization xlf directory
# ignore exported localization xlf and LCL directories
Build/loc/LCL
vscode-extensions-localization-export
# ignore imported localization xlf directory
+14
View File
@@ -0,0 +1,14 @@
{
"Projects": [
{
"LanguangeSet": "VS_Main_Languages",
"LocItems": [
{
"SourceFile": "vscode-extensions-localization-export\\vscode-extensions\\vscode-cpptools.xlf",
"Languages": "cs;de;es;fr;it;ja;ko;pl;pt-BR;ru;tr;zh-Hans;zh-Hant",
"LclFile": "Build\\loc\\LCL\\{Lang}\\vscode-cpptools.xlf.lcl"
}
]
}
]
}
+53
View File
@@ -0,0 +1,53 @@
# ==================================================================================
# Pipeline for VsCodeExtension-Localization build definition
# Runs OneLocBuild task to localize xlf file
# ==================================================================================
resources:
repositories:
- repository: self
clean: true
trigger: none
pr: none
schedules:
- cron: "0 7 * * *"
displayName: Daily 7 AM
branches:
include:
- main
pool:
vmImage: 'windows-latest'
steps:
- task: CmdLine@2
inputs:
script: 'cd Extension && yarn install'
- task: CmdLine@2
inputs:
script: 'cd ./Extension && yarn run translations-export && cd ..'
- task: OneLocBuild@2
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
inputs:
locProj: 'Build/loc/LocProject.json'
outDir: '$(Build.ArtifactStagingDirectory)'
isCreatePrSelected: false
prSourceBranchPrefix: 'locfiles'
packageSourceAuth: 'patAuth'
patVariable: '$(OneLocBuildPat)'
LclSource: lclFilesfromPackage
LclPackageId: 'LCL-JUNO-PROD-VCPP'
- task: CmdLine@2
inputs:
script: 'cd Extension && node ./translations_auto_pr.js microsoft vscode-cpptools csigs $(csigsPat) csigs [email protected] "$(Build.ArtifactStagingDirectory)/loc" vscode-extensions-localization-export/vscode-extensions && cd ..'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
@@ -0,0 +1,20 @@
# Exception Settings
The Microsoft Windows C/C++ debugger (cppvsdbg) supports configuration options for if the debugger stops when exceptions are thrown. This is done with the 'All Exceptions' check box in the BREAKPOINTS section of the 'Run and Debug' view.
Note that the BREAKPOINTS section will be missing this entry until the first time that the folder has been debugged with the 'cppvsdbg' debugger.
Checking 'All Exceptions' will configure the debugger to stop when an exception is thrown.
##### Exception Conditions
The 'All Exceptions' checkbox support conditions to break on only selected exception types (C++ exceptions) or codes (Win32 exceptions). To edit the condition, click on the pencil icon or right click on the entry and invoke 'Edit Condition'. The condition is a comma-separated list of exception types and codes to break on, or if the list starts with '!', a list of exception types and codes to ignore.
Examples conditions:
| Example condition value | Result |
|-------------------------|--------|
| 0xC0000005, 0xC0000094 | Break on Win32 Access Violation exceptions and integer division by zero exceptions |
| std::out_of_range, 0xC0000005 | This will break on out-of-range exceptions, and access violation exceptions |
| !MyExceptionClass | This will break on all exceptions except C++ `MyExceptionClass` exceptions |
| !MyExceptionClass, 0x6831C815 | This will break on all exceptions except C++ `MyExceptionClass` exceptions and Win32 exceptions with custom code 0x6831C815 |
+9 -2
View File
@@ -19,7 +19,14 @@ module.exports = {
"rules": {
"@typescript-eslint/adjacent-overload-signatures": "error",
"@typescript-eslint/array-type": "error",
"@typescript-eslint/class-name-casing": "error",
"camelcase": "off",
"@typescript-eslint/naming-convention": [
"error",
{
"selector": "typeLike",
"format": ["PascalCase"]
}
],
"@typescript-eslint/indent": "error",
"@typescript-eslint/member-delimiter-style": [
"error",
@@ -71,7 +78,7 @@ module.exports = {
"no-fallthrough": "error",
"no-invalid-this": "error",
"no-irregular-whitespace": "error",
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1, "maxBOF": 0}],
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1, "maxBOF": 0 }],
"no-new-wrappers": "error",
"no-redeclare": "error",
"no-return-await": "error",
+55 -6
View File
@@ -1,5 +1,54 @@
# C/C++ for Visual Studio Code Change Log
## Version 1.4.0-insiders2: May 17, 2021
### New Features
* Add a C++ walkthrough to the "Getting Started" page. [#7273](https://github.com/microsoft/vscode-cpptools/issues/7273)
* Currently, it's only usable when `"workbench.welcomePage.experimental.extensionContributions": true` is set with VS Code Insiders.
### Bug Fixes
* Fix an incorrect IntelliSense error with object initialization. [#3212](https://github.com/microsoft/vscode-cpptools/issues/3212)
* Fix macros getting undefined when duplicate `#include` are used. [#5182](https://github.com/microsoft/vscode-cpptools/issues/5182], [#7270](https://github.com/microsoft/vscode-cpptools/issues/7270)
* Fix IntelliSense crash with `#pragma GCC target`. [#6698](https://github.com/microsoft/vscode-cpptools/issues/6698), [#7377](https://github.com/microsoft/vscode-cpptools/issues/7377)
* Fix completion at the end of a file. [#7472](https://github.com/microsoft/vscode-cpptools/issues/7472)
* Fix completion of constructors. [#7505](https://github.com/microsoft/vscode-cpptools/issues/7505)
* Fix IntelliSense crash with the arrow library. [#7518](https://github.com/microsoft/vscode-cpptools/issues/7518)
* Fix the configuration UI randomly being blank (more frequently when remote). [#7523](https://github.com/microsoft/vscode-cpptools/issues/7523)
* Fix IntelliSense mode switching from `linux` to `macos` if `__unix__` is defined but `__linux__` is not. [#7525](https://github.com/microsoft/vscode-cpptools/issues/7525)
* Reduce IntelliSense memory and CPU usage in certain scenarios.
## Version 1.4.0-insiders: May 10, 2021
### Enhancements
* Update to clang-format 12. [#6434](https://github.com/microsoft/vscode-cpptools/issues/6434)
* Fix file:line path for $FILEPOS [#7193](https://github.com/microsoft/vscode-cpptools/issues/7193)
* [#1124](https://github.com/microsoft/MIEngine/pull/1124)
* Add `stopAtConnect` and `hardwareBreakpoints` launch options [PR #7449](https://github.com/microsoft/vscode-cpptools/pull/7449)
* `stopAtConnect` stops the debugger on connection to a remote target [PR MIEngine#1109](https://github.com/microsoft/MIEngine/pull/1109)
* `hardwareBreakpoints` controls usage and number of remote hardware breakpoints [PR MIEngine#1128](https://github.com/microsoft/MIEngine/pull/1128)
* Add support for loading Concord extensions to the cppvsdbg debug adapter (see [documentation](https://github.com/microsoft/ConcordExtensibilitySamples/wiki/Support-for-VS-Code-cppvsdbg-Scenarios) for more information)
* Add support for exception conditions to cppvsdbg (see [documentation](https://aka.ms/VSCode-Cpp-ExceptionSettings) for more information)
### Bug Fixes
* Fix IntelliSense errors with designated initializers. [#3491](https://github.com/microsoft/vscode-cpptools/issues/3491), [#5500](https://github.com/microsoft/vscode-cpptools/issues/5550)
* Fix IntelliSense configuration with cl.exe compiler args `/external:I`, `/Zc:preprocessor`, and others. [#4980](https://github.com/microsoft/vscode-cpptools/issues/4980), [#6531](https://github.com/microsoft/vscode-cpptools/issues/6531), [#7259](https://github.com/microsoft/vscode-cpptools/issues/7259)
* Fix provider failed error logging. [#5487](https://github.com/microsoft/vscode-cpptools/issues/5487)
* Fix -idirafter directories being included too early. [#7129](https://github.com/microsoft/vscode-cpptools/issues/7129)
* Filter out C++ std when querying the compiler as C (and vice versa). [#7269](https://github.com/microsoft/vscode-cpptools/issues/7269)
* Fix files.exclude ending with `/folder/**` not excluding `/folder`. [#7331](https://github.com/microsoft/vscode-cpptools/issues/7331)
* Fix VS Code UI freezing when hovering over very large literals. [#7334](https://github.com/microsoft/vscode-cpptools/issues/7334)
* Fix clang-format formatting bug when new lines are removed. [#7360](https://github.com/microsoft/vscode-cpptools/issues/7360)
* Change default cwd in launch.json to `${fileDirname}`. [#7362](https://github.com/microsoft/vscode-cpptools/issues/7362)
* Syed Ahmad (@HackintoshwithUbuntu) [PR #7363](https://github.com/microsoft/vscode-cpptools/pull/7363)
* Fix the compile commands entry not being used when -Werror is used. [#7388](https://github.com/microsoft/vscode-cpptools/issues/7388)
* Fix some potential race conditions during vsix installation. [#7405](https://github.com/microsoft/vscode-cpptools/issues/7405)
* Fix a crash on Linux with a `/**` includePath.
## Version 1.3.1: April 19, 2021
### Bug Fixes
* Fix extension not activating when `/.vscode/c_cpp_properties.json` exists but no C/C++ file is open. [#7344](https://github.com/microsoft/vscode-cpptools/issues/7344)
* Fix logging for an invalid provider configuration.
* Yonggang Luo (@lygstate) [PR #7350](https://github.com/microsoft/vscode-cpptools/pull/7350)
* Fix extension activation with 32-bit Windows. [#7368](https://github.com/microsoft/vscode-cpptools/issues/7368)
## Version 1.3.0: April 13, 2021
### New Features
* Add language service support for CUDA.
@@ -457,7 +506,7 @@
* Fix `compile_commands.json` prompt appearing when a configuration provider is used. [#3972](https://github.com/microsoft/vscode-cpptools/issues/3972)
* Improve IntelliSense performance with range-v3. [#4414](https://github.com/microsoft/vscode-cpptools/issues/4414)
* Fix template members not being nested under the template type in the Outline view. [#4466](https://github.com/microsoft/vscode-cpptools/issues/4466)
* Fix an issue in which failure to invoke a compiler could result in a hang on Linux and Mac. [#4627](https://github.com/microsoft/vscode-cpptools/issues/4627)
* Fix an issue in which failure to invoke a compiler could result in a loss of functionality on Linux and Mac. [#4627](https://github.com/microsoft/vscode-cpptools/issues/4627)
* Fix custom configurations sometimes not being applied to headers. [#4649](https://github.com/microsoft/vscode-cpptools/issues/4649)
* Fix headers opening into header-only TU's instead of TU's for candidate source files. [#4696](https://github.com/microsoft/vscode-cpptools/issues/4696)
* Fix the missing description of `C_Cpp.clang_format_style`.
@@ -488,7 +537,7 @@
* Fix child process creation when the Windows code page is set to a language with non-ASCII characters and there are non-ASCII characters in the extension's install path. [#1560](https://github.com/microsoft/vscode-cpptools/issues/1560)
* Fix path canonicalization of UNC paths to avoid duplicate files opening with different casing. [#2528](https://github.com/microsoft/vscode-cpptools/issues/2528), [#3980](https://github.com/microsoft/vscode-cpptools/issues/3980)
* Fix header opening without IntelliSense due to creation of a TU from a source file that includes the header in an inactive region. [#4320](https://github.com/microsoft/vscode-cpptools/issues/4320)
* Fix a hang in the extension process that can occur when using a scope named 'interface'. [#4470](https://github.com/microsoft/vscode-cpptools/issues/4470)
* Fix an infinite loop in the extension process that can occur when using a scope named 'interface'. [#4470](https://github.com/microsoft/vscode-cpptools/issues/4470)
* Fix an issue with the Rename UI that could cause the rename to not be applied. [#4504](https://github.com/microsoft/vscode-cpptools/issues/4504)
* Show an error message when a Rename fails due to the symbol not being found. [#4510](https://github.com/microsoft/vscode-cpptools/issues/4510)
* Fix `launch.json` creation due to localized strings containing quotes. [#4526](https://github.com/microsoft/vscode-cpptools/issues/4526)
@@ -505,7 +554,7 @@
### Bug Fixes
* Fix `launch.json` creation when using non-English display languages. [#4464](https://github.com/microsoft/vscode-cpptools/issues/4464)
* Fix CHS translation. [#4422](https://github.com/microsoft/vscode-cpptools/issues/4422)
* Fix debugging hang when Windows 10 Beta Unicode (UTF-8) support is enabled. [#1527](https://github.com/microsoft/vscode-cpptools/issues/1527)
* Fix debugging not working when Windows 10 Beta Unicode (UTF-8) support is enabled. [#1527](https://github.com/microsoft/vscode-cpptools/issues/1527)
## Version 0.26.0: October 15, 2019
### New Features
@@ -911,7 +960,7 @@
* Fix `Go to Definition` bug (missing symbols outside the workspace). [#2281](https://github.com/Microsoft/vscode-cpptools/issues/2281)
* Fix incorrect hover in enum definitions. [#2286](https://github.com/Microsoft/vscode-cpptools/issues/2286)
* Add a setting to silence configuration provider warnings. [#2292](https://github.com/Microsoft/vscode-cpptools/issues/2292)
* Fix debugging async Visual C++ causing debugger to hang.
* Fix debugging async Visual C++ causing the debugger to stop responding.
* Fix `main` snippet.
## Version 0.17.6: July 2, 2018
@@ -1179,8 +1228,8 @@
* Add `Edit Configurations...` command to the `Select a Configuration...` dropdown.
* Update Microsoft Visual C++ debugger to Visual Studio 2017 released components.
* Fix issue with showing wrong thread. [#550](https://github.com/Microsoft/vscode-cpptools/issues/550)
* Fix issue with binaries compiled with /FASTLINK causing debugger to hang. [#484](https://github.com/Microsoft/vscode-cpptools/issues/484)
* Fix issue in MinGW/Cygwin debugging where stop debugging causes VS Code to hang. [PR Microsoft/MIEngine#636](https://github.com/Microsoft/MIEngine/pull/636)
* Fix issue with binaries compiled with /FASTLINK causing the debugger to stop responding. [#484](https://github.com/Microsoft/vscode-cpptools/issues/484)
* Fix issue in MinGW/Cygwin debugging where stop debugging causes VS Code to stop responding. [PR Microsoft/MIEngine#636](https://github.com/Microsoft/MIEngine/pull/636)
## Version 0.12.0: June 26, 2017
* The default IntelliSense engine now provides semantic-aware autocomplete suggestions for `.`, `->`, and `::` operators. [#13](https://github.com/Microsoft/vscode-cpptools/issues/13)
+2 -2
View File
@@ -26,8 +26,8 @@
"replace": "--using_directory\n$1"
},
{
"match": "^/dE--header_only_fallback",
"replace": "--header_only_fallback"
"match": "^/dE--(.*)",
"replace": "--$1"
}
]
}
+11 -2
View File
@@ -3350,7 +3350,7 @@
"libovolný druh souboru modulu",
"nejde přečíst soubor modulu",
"předdefinovaná funkce není k dispozici, protože typ char8_t se nepodporuje s aktuálními možnostmi",
"možnost příkazového řádku --ms_await nejde zadat, pokud jsou povolené korutiny C++20",
null,
"nestandardní použití explicitního konstruktoru %nod pro inicializaci výchozího agregačního elementu",
"zdroj nebo cíl vnitřní funkce memcpy-like neukazuje na objekt",
"vnitřní funkce memcpy-like se pokouší o kopírování reprezentačně odlišných typů %t1 a %t2",
@@ -3373,5 +3373,14 @@
"__is_signed už není klíčové slovo.",
"Rozměr pole musí mít konstantní celočíselnou hodnotu bez znaménka.",
"Soubor IFC %sq má nepodporovanou verzi %d1.%d2.",
"Moduly se v tomto režimu nepovolily."
"Moduly se v tomto režimu nepovolily.",
"Název modulu nesmí obsahovat slovo import.",
"Název modulu nesmí obsahovat slovo module.",
"Když se %sq používá v direktivě import, nemůže to být makro.",
null,
"%n není výčtový typ.",
"Enumerátor %no2 je v konfliktu s %n1.",
"Enumerátor %no se už v tomto oboru %p deklaroval.",
"specifikace throw() není součástí standardu C++20 a novějších",
"více než jedna položka v mapě jednotky hlavičky odpovídá %s"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"Beliebige Art von Moduldatei",
"Die Moduldatei kann nicht gelesen werden.",
"Die integrierte Funktion ist nicht verfügbar, weil der char8_t-Typ mit den aktuellen Optionen nicht unterstützt wird.",
"Die Befehlszeilenoption \"--ms_await\" kann nicht angegeben werden, wenn C++20-Coroutinen aktiviert sind.",
null,
"Nicht standardmäßige Verwendung des expliziten Konstruktors \"%nod\" für die standardmäßige Aggregatelementinitialisierung",
"Die Quelle oder das Ziel des memcpy-ähnlichen systeminternen Objekts verweist nicht auf ein Objekt.",
"Ein memcpy-ähnliches systeminternes Objekt versucht, die darstellerisch unterschiedlichen Typen %t1 und %t2 zu kopieren.",
@@ -3373,5 +3373,14 @@
"\"__is_signed\" kann ab jetzt nicht mehr als Schlüsselwort verwendet werden.",
"Eine Arraydimension muss einen konstanten ganzzahligen Wert ohne Vorzeichen aufweisen.",
"Die IFC-Datei \"%sq\" weist eine nicht unterstützte Version %d1.%d2 auf.",
"Module sind in diesem Modus nicht aktiviert."
"Module sind in diesem Modus nicht aktiviert.",
"\"Import\" ist in einem Modulnamen unzulässig.",
"\"Modul\" ist in einem Modulnamen unzulässig.",
"\"%sq\" kann kein Makro sein, wenn es in einer Importdirektive verwendet wird.",
null,
"\"%n\" ist kein Enumerationstyp.",
"Der Enumerator \"%no2\" steht in Konflikt mit \"%n1\".",
"Der Enumerator \"%no\" wurde bereits in diesem Bereich (%p) deklariert.",
"Die Spezifikation \"throw()\" ist nicht in C++ 20 und höher enthalten.",
"Mehrere Einträge in der Headereinheitenzuordnung stimmen mit \"%s\" überein."
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"cualquier tipo de archivo de módulo",
"no se puede leer el archivo de módulo",
"la función integrada no está disponible porque no se admite el tipo char8_t con las opciones actuales",
"no se puede especificar la opción de línea de comandos --ms_await si están habilitadas las corrutinas de C++ 20",
null,
"uso no estándar de %nod de constructor explícito para la inicialización predeterminada del elemento de agregado",
"el origen o el destino del intento intrínseco de tipo memcpy no apunta a un objeto",
"intentos intrínsecos de tipo memcpy para copiar los tipos %t1 y %t2 diferentes de forma representativa",
@@ -3373,5 +3373,14 @@
"__is_signed ya no es una palabra clave a partir de este punto",
"una dimensión de matriz debe tener un valor entero sin signo constante",
"El archivo IFC %sq tiene la versión no compatible %d1.%d2",
"los módulos no están habilitados en este modo"
"los módulos no están habilitados en este modo",
"No se permite \"import\" en un nombre de módulo",
"No se permite usar \"módulo\" en un nombre de módulo",
"%sq no puede ser una macro cuando se use en una directiva import",
null,
"%n no es un tipo de enumeración",
"el enumerador %no2 entra en conflicto con %n1",
"el enumerador %no ya se ha declarado en el ámbito %p",
"la especificación \"throw()\" no forma parte de C++20 y versiones posteriores",
"más que la entrada en el mapa de la unidad del encabezado coincide con \"%s\""
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"n'importe quel genre de fichier de module",
"impossible de lire le fichier de module",
"la fonction intégrée n'est pas disponible, car le type char8_t n'est pas pris en charge avec les options actuelles",
"l'option de ligne de commande --ms_await ne peut pas être spécifiée si les coroutines C++20 sont activées",
null,
"utilisation non standard du constructeur explicite %nod pour l'initialisation de l'élément d'agrégation par défaut",
"la source ou la destination de l'intrinsèque de type memcpy ne pointe pas vers un objet",
"l'intrinsèque de type memcpy tente de copier les types représentatifs distincts %t1 et %t2",
@@ -3373,5 +3373,14 @@
"__is_signed n'est plus un mot clé à partir de ce point",
"une dimension de tableau doit avoir une valeur d'entier non signé constante",
"le fichier IFC %sq a une version non prise en charge : %d1.%d2",
"les modules ne sont pas activés dans ce mode"
"les modules ne sont pas activés dans ce mode",
"'import' n'est pas autorisé dans un nom de module",
"'module' n'est pas autorisé dans un nom de module",
"%sq ne peut pas être une macro quand il est utilisé dans une directive import",
null,
"%n n'est pas un type énumération",
"l'énumérateur %no2 est en conflit avec %n1",
"l'énumérateur %no a déjà été déclaré dans cette étendue %p",
"la spécification 'throw()' ne fait pas partie de C++20 ni des versions ultérieures",
"plusieurs entrées dans le mappage d'unité d'en-tête correspondent à '%s'"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"qualsiasi tipo di modulo",
"non è possibile leggere il file del modulo",
"la funzione predefinita non è disponibile perché il tipo char8_t non è supportato con le opzioni correnti",
"non è possibile specificare l'opzione della riga di comando --ms_await se le coroutine di C++20 sono abilitate",
null,
"uso non standard del costruttore esplicito %nod per l'inizializzazione dell'elemento di aggregazione predefinito",
"l'origine o la destinazione dell'intrinseco simile a memcpy non punta a un oggetto",
"l'intrinseco simile a memcpy prova a copiare i tipi distinti dal punto di vista della rappresentazione %t1 e %t2",
@@ -3373,5 +3373,14 @@
"__is_signed non è più una parola chiave a partire da questo punto",
"una dimensione di matrice deve avere un valore intero senza segno costante",
"il file IFC %sq ha una versione %d1.%d2 non supportata",
"i moduli non sono abilitati in questa modalità"
"i moduli non sono abilitati in questa modalità",
"Il nome di un modulo non può contenere 'import'",
"Il nome di un modulo non può contenere 'module'",
"%sq non può essere una macro se usata in una direttiva di importazione",
null,
"%n non è un tipo di enumerazione",
"l'enumeratore %no2 è in conflitto con %n1",
"l'enumeratore %no è già stato dichiarato in questo ambito %p",
"la specifica 'throw()' non fa parte di C++20 e versioni successive",
"più di una voce nel mapping dell'unità intestazione corrisponde a '%s'"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"あらゆる種類のモジュール ファイル",
"モジュール ファイルを読み取れません",
"現在のオプションで char8_t 型がサポートされていないので、ビルトイン関数を使用できません",
"--ms_await コマンド ライン オプションは、C++20 コルーチンが有効になっている場合は指定できません",
null,
"既定の集約要素の初期化における明示的なコンストラクター %nod の非標準的な使用",
"memcpy に似た組み込み関数のソースやターゲットでオブジェクトが指定されていません",
"memcpy に似た組み込み関数により、表現上個別の型である %t1 と %t2 のコピーが試行されます",
@@ -3373,5 +3373,14 @@
"__is_signed はこのポイントからキーワードではなくなりました",
"配列の次元には定数の符号なし整数値を指定する必要があります",
"IFC ファイル %sq は、サポートされていないバージョン %d1.%d2 です",
"このモードではモジュールは無効です"
"このモードではモジュールは無効です",
"'import' は、モジュール名には使用できません",
"'module' は、モジュール名には使用できません",
"import ディレクティブで使用する場合、%sq をマクロにすることはできません",
null,
"%n は列挙型ではありません",
"列挙子 %no2 が %n1 と競合しています",
"列挙子 %no はこのスコープ %p で既に宣言されています",
"'throw()' 仕様は C++20 以降に含まれていません",
"ヘッダー ユニット マップのエントリより多くが '%s' に一致しています"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"모든 종류의 모듈 파일",
"모듈 파일을 읽을 수 없음",
"char8_t 형식이 현재 옵션에서 지원되지 않기 때문에 기본 제공 함수를 사용할 수 없습니다.",
"C++20 코루틴을 사용하도록 설정한 경우 --ms_await 명령줄 옵션을 지정할 수 없습니다.",
null,
"기본 집계 요소 초기화에 명시적 생성자 %nod의 비표준 사용",
"memcpy 유사 내장의 소스 또는 대상이 개체를 가리키지 않음",
"memcpy 유사 내장이 대표적으로 차별화된 형식 %t1 및 %t2을(를) 복사하려고 시도함",
@@ -3373,5 +3373,14 @@
"__is_signed는 이 시점부터 더 이상 키워드가 아님",
"배열 차원에는 상수인 부호 없는 정수 값이 있어야 함",
"IFC 파일 %sq에 지원되지 않는 버전 %d1.%d2이(가) 있음",
"이 모드에서 모듈을 사용할 수 없음"
"이 모드에서 모듈을 사용할 수 없음",
"'import'는 모듈 이름에 사용할 수 없습니다.",
"'module'은 모듈 이름에 사용할 수 없습니다.",
"import 지시문에 사용된 경우 %sq은(는) 매크로일 수 없습니다.",
null,
"%n은(는) 열거형 형식이 아닙니다.",
"열거자 %no2이(가) %n1과(와) 충돌합니다.",
"열거자 %no은(는) 이미 이 범위 %p에 선언되었습니다.",
"'throw()' 사양은 C++20 이상에 포함되지 않습니다.",
"헤더 단위 맵의 입력보다 많은 항목이 '%s'과(와) 일치합니다."
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"dowolny rodzaj pliku modułu",
"nie można odczytać pliku modułu",
"wbudowana funkcja jest niedostępna, ponieważ typ char8_t nie jest obsługiwany z bieżącymi opcjami",
"nie można określić opcji wiersza polecenia --ms_await, jeśli włączono koprocedury języka C++20",
null,
"niestandardowe użycie konstruktora jawnego %nod dla domyślnej inicjalizacji elementu agregacji",
"element źródłowy lub docelowy funkcji wewnętrznej podobnej do memcpy nie wskazuje obiektu",
"Funkcja wewnętrzna podobna do memcpy próbuje skopiować reprezentacyjnie odrębne typy %t1 i %t2",
@@ -3373,5 +3373,14 @@
"Od tego punktu __is_signed nie jest już słowem kluczowym",
"wymiar tablicy musi mieć stałą wartość całkowitą bez znaku",
"Plik IFC %sq ma nieobsługiwaną wersję %d1.%d2",
"moduły nie są włączone w tym trybie"
"moduły nie są włączone w tym trybie",
"Ciąg „import” nie jest dozwolony w nazwie modułu",
"Ciąg „module” nie jest dozwolony w nazwie modułu",
"Element %sq nie może być makrem, gdy jest używany w dyrektywie importu",
null,
"Element %n nie jest typem wyliczenia",
"moduł wyliczający %no2 powoduje konflikt z elementem %n1",
"moduł wyliczający %no został już zadeklarowany w tym zakresie %p",
"Specyfikacja „throw()” nie jest częścią języka C++20 i nowszych",
"więcej niż wpis na mapie jednostek nagłówka pasuje do „%s”"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"qualquer tipo de arquivo de módulo",
"não é possível ler o arquivo de módulo",
"a função interna não está disponível porque não há suporte para o tipo char8_t com as opções atuais",
"a opção da linha de comando --ms_await não poderá ser especificada se as corrotinas do C++20 estiverem habilitadas",
null,
"o uso não padrão do construtor explícito %nod para inicialização do elemento de agregação padrão",
"a origem ou o destino do intrínseco similar a memcpy não aponta para um objeto",
"tentativas intrínsecas similares a memcpy de copiar tipos representacionalmente distintos %t1 e %t2",
@@ -3373,5 +3373,14 @@
"__is_signed não é mais uma palavra-chave deste ponto",
"uma dimensão de matriz precisa ter um valor inteiro sem sinal constante",
"O arquivo IFC %sq tem uma versão sem suporte %d1.%d2",
"os módulos não estão habilitados neste modo"
"os módulos não estão habilitados neste modo",
"'import' não é permitido em um nome de módulo",
"'module' não é permitido em um nome de módulo",
"O %sq não poderá ser uma macro quando for usado em uma diretiva de importação",
null,
"O %n não é um tipo de enumeração",
"o enumerador %no2 entra em conflito com %n1",
"o enumerador %no já foi declarado neste escopo %p",
"a especificação 'throw()' não faz parte de C++ 20 e posteriores",
"mais de uma entrada no mapa de unidades de cabeçalho corresponde a '%s'"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"любой тип файла модуля",
"не удалось прочитать файл модуля",
"встроенная функция недоступна, так как тип char8_t не поддерживается с текущими параметрами.",
"невозможно указать параметр командной строки --ms_await, если включены сопрограммы C++20.",
null,
"нестандартное использование явного конструктора %nod для агрегатной инициализации элементов по умолчанию.",
"источник или назначение встроенной функции, похожей на memcpy, не указывает на объект",
"Встроенная функция, похожая на memcpy, пытается скопировать различные с точки зрения представления типы %t1 и %t2",
@@ -3373,5 +3373,14 @@
"__is_signed больше не является ключевым словом из этой точки",
"измерение массива должно иметь постоянное целочисленное значение без знака",
"файл IFC %sq имеет неподдерживаемую версию %d1.%d2",
"модули не включены в этом режиме"
"модули не включены в этом режиме",
"слово \"import\" не допускается в имени модуля",
"слово \"module\" не допускается в имени модуля",
"%sq не может быть макросом при использовании в директиве импорта",
null,
"%n не является типом перечисления",
"перечислитель %no2 конфликтует с %n1",
"перечислитель %no уже объявлен в этой области %p",
"спецификация \"throw()\" не входит в C++20 и более поздние версии",
"несколько записей в карте блока заголовка соответствуют \"%s\""
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"herhangi bir türde modül dosyası",
"modül dosyası okunamıyor",
"char8_t türü geçerli seçeneklerle desteklenmediği için yerleşik işlev kullanılamıyor",
"C++20 eş yordamları etkinleştirilirse --ms_await komut satırı seçeneği belirtilemez",
null,
"varsayılan toplama öğesi başlatma için açık oluşturucu %nod için standart olmayan kullanım",
"memcpy benzeri iç öğenin kaynağı veya hedefi bir nesneye işaret etmiyor",
"memcpy benzeri iç öğe, temsili olarak farklı %t1 ve %t2 türlerini kopyalamaya çalışıyor",
@@ -3373,5 +3373,14 @@
"__is_signed şu andan itibaren bir anahtar sözcük değil",
"dizi boyutu sabit bir işaretsiz tamsayı değerine sahip olmalıdır",
"%sq IFC dosyasının sürümü desteklenmiyor: %d1.%d2",
"modüller bu modda etkin değil"
"modüller bu modda etkin değil",
"'import', modül adında kullanılamaz.",
"Modül adında 'module' kullanılmasına izin verilmez",
"%sq, içeri aktarma yönergesinde kullanıldığında makro olamaz",
null,
"%n sabit listesi türü değil",
"%no2 numaralandırıcısı %n1 ile çakışıyor",
"%no numaralandırıcısı bu %p kapsamında zaten bildirildi",
"'throw ()' belirtimi C++ 20 ve üzeri sürümlerin bir parçası değil",
"üst bilgi birimi eşlemesindeki giriş sayısı '%s' ile eşleşiyor:"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"任何类型的模块文件",
"无法读取模块文件",
"内置函数不可用,因为当前选项不支持 char8_t 类型",
"如果启用了 C++20 协同程序,则无法指定 --ms_await 命令行选项",
null,
"对默认聚合元素初始化使用显式构造函数 %nod 不是标准做法",
"与 memcpy 类似的固有项的源或目标不指向对象",
"与 memcpy 类似的固有项尝试复制在表达上不同的类型 %t1 和 %t2",
@@ -3373,5 +3373,14 @@
"__is_signed 不再是从此点开始的关键字",
"数组维度必须具有常量无符号整数值",
"IFC 文件 %sq 具有不受支持的版本 %d1。%d2",
"此模式中没有启用模块"
"此模式中没有启用模块",
"模块名称中不允许使用 \"import\"",
"模块名称中不允许使用 \"module\"",
"在 import 指令中使用时,%sq 不能是宏",
null,
"%n 不是枚举类型",
"枚举器 %no2 与 %n1 冲突",
"枚举器 %no 已在此范围 %p 中进行声明",
"\"throw()\" 规范不是 C++20 及更高版本的一部分",
"标头单元映射中的多个条目与“%s”匹配"
]
+11 -2
View File
@@ -3350,7 +3350,7 @@
"任何類型的模組檔案",
"無法讀取模組檔案",
"因為目前的選項不支援 char8_t 類型,所以無法使用內建函式",
"如果啟用 C++ 20 協同程式,就不能指定 --ms_await 命令列選項",
null,
"非標準地使用明確的建構函式 %nod 進行預設彙總元素初始化",
"內建類 memcpy 的來源或目的地未指向物件",
"內建類 memcpy 嘗試複製具象相異類型 %t1 與 %t2",
@@ -3373,5 +3373,14 @@
"__is_signed 從現在起已不再是關鍵字",
"陣列維度必須要有不帶正負號的常數整數值",
"IFC 檔案 %sq 的版本為不支援的 %d1.%d2",
"此模式下未啟用的模組"
"此模式下未啟用的模組",
"模組名稱中不得包含 'import'",
"模組名稱中不得包含 'module'",
"當 %sq 用於 import 指示詞中時,不得為巨集",
null,
"%n 不是列舉類型",
"列舉程式 %no2 與 %n1 衝突",
"列舉程式 %no 已於此範圍 %p 中宣告",
"'throw()' 規格不屬於 C++20 及更新版本",
"項目超過標頭單位對應相符中的 '%s'"
]
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "选择配置...",
"c_cpp.command.configurationProviderSelect.title": "更改配置提供程序...",
"c_cpp.command.configurationEditJSON.title": "编辑配置(JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "当它们是依赖项时,从 nan 和 node-addon-api 添加 include 路径。",
"c_cpp.configuration.renameRequiresIdentifier.description": "如果为 true,则“重命名符号”将需要有效的 C/C++ 标识符。",
"c_cpp.configuration.autocompleteAddParentheses.description": "如果为 true,则自动完成功能将在函数调用后自动添加 \"(\",这种情况下还可以添加 \")\",具体取决于 \"editor.autoClosingBrackets\" 设置的值。",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "为排除文件夹(和文件配置 glob 模式,如果 \"C_Cpp. exclusionPolicy\" 已更改)。这些是除了\"files.exclude\" 之外的 C/C + + 特定扩展,但与 \"files.exclude\" 不同,他们不从资源管理器视图中删除。了解 glob 模式的详细信息 [here] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)",
"c_cpp.configuration.filesExcludeBoolean.description": "匹配文件路径所依据的 glob 模式。设置为 true false 可启用或禁用该模式。",
"c_cpp.configuration.filesExcludeWhen.description": "对匹配文件的同级文件的其他检查。使用 $(basename) 作为匹配文件名的变量。",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "如果为 true,调试程序 shell 命令替换将使用过时的反引号(`)。",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: 其他引用结果",
"c_cpp.debuggers.pipeTransport.description": "如果存在,这会指示调试程序使用其他可执行文件作为管道来连接到远程计算机,此管道将在 VS Code 和已启用 MI 的调试程序后端可执行文件(如 gdb)之间中继标准输入/输入。",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "要执行的完全限定的管道命令。",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "传递给管道程序配置连接的命令行参数。",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "传递给程序的环境变量。",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "如果 pipeProgram 的单个参数包含字符(如空格或制表符),是否应引用它? 如果为 \"false\",则将不再自动引用调试程序命令。\n默认为 \"true\"。",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "用于确定应将哪些类型的消息记录到调试控制台的可选标志。",
"c_cpp.debuggers.logging.exceptions.description": "用于确定是否应将异常消息记录到调试控制台的可选标志。默认为 true。",
"c_cpp.debuggers.logging.moduleLoad.description": "用于确定是否应将模块加载事件记录到调试控制台的可选标志。默认为 true。",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "调试此进程时要使用的 .natvis 文件。此选项与 GDB 整齐打印不兼容。如果使用此设置,请同时查看 \"showDisplayString\"。",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "调试此进程时要使用的 .natvis 文件。",
"c_cpp.debuggers.showDisplayString.description": "指定了 visualizerFile 时,showDisplayString 将启用显示字符串。启用此选项可能会导致调试期间的性能下降。",
"c_cpp.debuggers.environment.description": "要添加到程序环境的环境变量。示例: [ { \"name\": \"squid\", \"value\": \"clam\" } ]。",
"c_cpp.debuggers.environment.description": "要添加到程序环境的环境变量。示例: [ { \"name\": \"config\", \"value\": \"Debug\" } ],而不是 [ { \"config\": \"Debug\" } ]。",
"c_cpp.debuggers.envFile.description": "包含环境变量定义的文件的绝对路径。此文件具有每行由等号分隔的键值对。例如: 键=值",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "要用于搜索 .so 文件的目录列表(以分号分隔)。示例: \"c:\\dir1;c:\\dir2\"。",
"c_cpp.debuggers.MIMode.description": "指示 MIDebugEngine 要连接到的控制台调试程序。允许的值为 \"gdb\"、\"lldb\"。",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "如果为 true,则将加载所有 lib 的符号;否则不加载任何 solib 符号。默认值为 true。",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "以分号 \";\" 分隔的文件名列表(允许使用通配符)。修改 LoadAll 的行为。如果 LoadAll 为 true,则不加载与列表中任何名称匹配的 lib 的符号。否则,仅为匹配的 lib 加载符号。示例: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "可选标志,用于要求当前源代码与 pdb 匹配。",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "任务的名称",
"c_cpp.taskDefinitions.command.description": "执行编译的编译器或脚本的路径",
"c_cpp.taskDefinitions.args.description": "要传递给编译器或编译脚本的其他参数",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "体系结构 {0} 不受支持。",
"apline.containers.not.supported": "Alpine 容器不受支持。",
"download.button": "转到下载页",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "此 {0} {1} 版本的扩展与你的 OS 不兼容,请下载并安装 \"{2}\" 版本的扩展。",
"extension.installation.failed": "C/C++ 扩展安装失败。为使函数正常工作,需要修复或重新安装 C/C++ 语言功能的扩展。",
"remove.extension": "尝试修复",
"jason.files.missing": "C/C++ 扩展安装失败。为使函数正常工作,需要重新安装 C/C++ 语言功能的扩展。",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "错误: fs.rename 失败,原因为“{0}”。请手动删除 {1} 以启用调试。",
"failed.at.stage": "在阶段 {0} 失败",
"failed.at.stage2": "如果在脱机环境中工作或反复看到此错误,请尝试从 {0} 下载预包含了所有依赖项的扩展版本,然后使用 VS Code 中的“从 VSIX 安装”命令来安装它。",
"finished.installing.dependencies": "已完成安装依赖项"
"finished.installing.dependencies": "已完成安装依赖项",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Zip 文件错误",
"create.directory.error": "创建目录时出错",
"zip.stream.error": "读取 zip 流时出错",
"read.stream.error": "“读取”流中出错",
"unlink.error": "取消链接文件 {0} 时出错",
"rename.error": "重命名文件 {0} 时出错",
"read.stream.error": "“读取”流中出错",
"write.stream.error": "“写入”流中出错",
"file.already.exists": "警告: 文件“{0}”已存在,但未更新。"
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "選取組態...",
"c_cpp.command.configurationProviderSelect.title": "變更組態提供者...",
"c_cpp.command.configurationEditJSON.title": "編輯組態 (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "當 nan 和 node-addon-api 為相依性時,從中新增 include 路徑。",
"c_cpp.configuration.renameRequiresIdentifier.description": "若為 true,則「重新命名符號」需要有效的 C/C++ 識別碼。",
"c_cpp.configuration.autocompleteAddParentheses.description": "若為 true,自動完成將會在函式呼叫之後自動新增 \"(\",在這種情況下也可能會新增 \")\",取決於 \"editor.autoClosingBrackets\" 設定的值。",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "設定 Glob 模式以排除資料夾 (如果變更 \"C_Cpp.exclusionPolicy\",則排除檔案)。這些模式為 C/C++ 延伸模組所特有,是 \"files.exclude\" 的補充,但與 \"files.exclude\" 不同,系統不會將它們從 Explorer 檢視中移除。請在 [此處](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) 了解 Glob 模式的詳細資訊。",
"c_cpp.configuration.filesExcludeBoolean.description": "要符合檔案路徑的 Glob 模式。設為 True 或 False 可啟用或停用模式。",
"c_cpp.configuration.filesExcludeWhen.description": "在相符檔案同層級上額外的檢查。請使用 $(basename) 作為相符檔案名稱的變數。",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "若為 true,偵錯工具殼層命令替代將會使用已淘汰的反引號 (`)。",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: 其他參考結果",
"c_cpp.debuggers.pipeTransport.description": "出現時,會指示偵錯工具使用另一個可執行檔來連線至遠端電腦,該管道會在 VS Code 與 MI 啟用偵錯工具後端可執行檔之間傳送標準輸入/輸出 (例如 gdb)。",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "要執行的完整管道命令。",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "傳遞至管道程式以設定連線的命令列引數。",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "傳遞至管道程式的環境變數。",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": " pipeProgram 的個別引數包含字元 (例如空格或定位字元),是否應該加上引號? 若設定為 'false',不會再自動為偵錯工具命令加上引號。\n預設為 'true'",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "選擇性旗標,用以判斷應記錄到偵錯主控台的訊息類型。",
"c_cpp.debuggers.logging.exceptions.description": "選擇性旗標,用以判斷是否應將例外狀況訊息記錄到偵錯主控台。預設為 true。",
"c_cpp.debuggers.logging.moduleLoad.description": "選擇性旗標,用以判斷是否應將模組載入事件記錄到偵錯主控台。預設為 true。",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "偵錯此處理序時要使用的 .natvis 檔案。此選項與 GDB 美化顯示不相容。若使用此設定,也請參閱 \"showDisplayString\"。",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "偵錯此處理序時要使用的 .natvis 檔案。",
"c_cpp.debuggers.showDisplayString.description": "指定 visualizerFile 時,showDisplayString 會啟用顯示字串。開啟此選項可能會導致偵錯期間的效能變慢。",
"c_cpp.debuggers.environment.description": "要新增至程式環境的環境變數。範例: [ { \"name\": \"squid\", \"value\": \"clam\" } ]。",
"c_cpp.debuggers.environment.description": "要新增至程式環境的環境變數。範例: [ { \"name\": \"config\", \"value\": \"Debug\" } ],非 [ { \"config\": \"Debug\" } ]。",
"c_cpp.debuggers.envFile.description": "包含環境變數定義之檔案的絕對路徑。此檔案具有以等號分隔每行的索引鍵值組。例如「鍵=值」",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "要用於搜尋 .so 檔案的目錄清單 (以分號分隔)。範例: \"c:\\dir1;c:\\dir2\"。",
"c_cpp.debuggers.MIMode.description": "表示 MIDebugEngine 將連線的主控台偵錯工具。允許的值為 \"gdb\" \"lldb\"。",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "若為 true,將會載入所有程式庫的符號,否則不會載入任何 solib 符號。預設值為 true。",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "以分號 ';' 分隔的檔名清單 (允許使用萬用字元)。修改 LoadAll 的行為。如果 LoadAll 為 true,則不會載入與清單中任何名稱相符的程式庫符號。否則只會載入相符的程式庫符號。範例: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "要求目前原始程式碼與 pdb 相符的選用旗標。",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "工作的名稱",
"c_cpp.taskDefinitions.command.description": "執行編譯的編譯器或指令碼路徑",
"c_cpp.taskDefinitions.args.description": "要傳遞給編譯器或編譯指令碼的其他引數",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "不支援架構 {0}。 ",
"apline.containers.not.supported": "不支援 Alpine 容器。",
"download.button": "前往 &#91;下載&#92; 頁面",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "此 {0} {1} 版延伸模組與您的作業系統不相容。請下載並安裝 \"{2}\" 版延伸模組。",
"extension.installation.failed": "無法成功安裝 C/C++ 延伸模組。您必須修復或重新安裝 C/C++ 語言功能的延伸模組,才可正常運作。",
"remove.extension": "嘗試修復",
"jason.files.missing": "無法成功安裝 C/C++ 延伸模組。您必須重新安裝 C/C++ 語言功能的延伸模組,才可正常運作。",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "錯誤: fs.rename 失敗,\"{0}\"。請手動刪除 {1} 以啟用偵錯。",
"failed.at.stage": "在階段 {0} 失敗",
"failed.at.stage2": "如果在離線環境中作業,或重複看到此錯誤,請嘗試下載具備 {0} 所有預先內含之相依性的延伸模組版本,然後在 VS Code 中使用 \"Install from VSIX\" 命令加以安裝。",
"finished.installing.dependencies": "已完成安裝相依性"
"finished.installing.dependencies": "已完成安裝相依性",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Zip 檔案錯誤",
"create.directory.error": "建立目錄時發生錯誤",
"zip.stream.error": "讀取 zip 串流時發生錯誤",
"read.stream.error": "讀取串流中發生錯誤",
"unlink.error": "將檔案 {0} 取消連結時發生錯誤",
"rename.error": "重新命名檔案 {0} 時發生錯誤",
"read.stream.error": "讀取串流中發生錯誤",
"write.stream.error": "寫入串流中發生錯誤",
"file.already.exists": "警告: 檔案 '{0}' 已經存在但未更新。"
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Vybrat konfiguraci...",
"c_cpp.command.configurationProviderSelect.title": "Změnit poskytovatele konfigurací...",
"c_cpp.command.configurationEditJSON.title": "Upravit konfigurace (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Pokud existují závislosti, přidejte cesty pro zahrnuté soubory z nan a node-addon-api.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Když se tato hodnota nastaví na true, operace Přejmenovat symbol bude vyžadovat platný identifikátor C/C++.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Pokud je true, automatické dokončování automaticky přidá za volání funkcí znak (. V takovém případě se může přidat i znak ), záleží na hodnotě nastavení editor.autoClosingBrackets.",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Nakonfigurujte vzory glob pro vyloučení složek (a souborů, pokud se změní C_Cpp.exclusionPolicy). Ty jsou specifické pro rozšíření C/C++ a doplňují files.exclude, ale na rozdíl od files.exclude se neodebírají ze zobrazení Průzkumník. Přečtěte si další informace o vzorech glob [tady] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "Vzor glob pro hledání shod s cestami k souborům. Pokud chcete vzor povolit, nastavte hodnotu true, pokud ho chcete zakázat, nastavte hodnotu false.",
"c_cpp.configuration.filesExcludeWhen.description": "Další kontrola položek na stejné úrovni u odpovídajícího souboru. Jako proměnnou názvu odpovídajícího souboru použijte $(basename).",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Když se nastaví na true, nahrazování příkazů shellu ladicího programu bude používat starou verzi obrácené čárky (`).",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: výsledky jiných odkazů",
"c_cpp.debuggers.pipeTransport.description": "Pokud je k dispozici, předá ladicímu programu informaci, aby se připojil ke vzdálenému počítači pomocí dalšího spustitelného souboru jako kanál, který bude přenášet standardní vstup a výstup mezi nástrojem VS Code a spustitelným souborem back-endu ladicího programu s podporou MI (třeba gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Plně kvalifikovaný příkaz kanálu, který se má provést",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Argumenty příkazového řádku, které se předávají do cílového programu, aby se nakonfigurovalo připojení",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Proměnné prostředí, které se předávají do cílového programu",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Pokud jednotlivé argumenty pro pipeProgram obsahují znaky (například mezery nebo tabulátory), mají se používat uvozovky? Pokud se nastaví hodnota false, nebudou se už v příkazu ladicího programu automaticky používat uvozovky. \nVýchozí hodnota je true.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Nepovinné příznaky, které určují, které typy zpráv se mají protokolovat do konzoly ladění",
"c_cpp.debuggers.logging.exceptions.description": "Nepovinný příznak, který určuje, jestli se do konzoly ladění mají protokolovat zprávy výjimek. Výchozí hodnota je true.",
"c_cpp.debuggers.logging.moduleLoad.description": "Nepovinný příznak, který určuje, jestli se do konzoly ladění mají protokolovat události načítání modulu. Výchozí hodnota je true.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Soubor .natvis, který se použije při ladění tohoto procesu. Tato možnost není kompatibilní s přehledným výpisem GDB. Pokud používáte toto nastavení, podívejte se i na showDisplayString.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Soubor .natvis, který se použije při ladění tohoto procesu.",
"c_cpp.debuggers.showDisplayString.description": "Když se zadá visualizerFile, showDisplayString povolí zobrazovaný řetězec. Když se tato možnost zapne, může to způsobit nižší výkon při ladění.",
"c_cpp.debuggers.environment.description": "Proměnné prostředí, které se mají přidat do prostředí pro program. Příklad: [ { \"name\": \"squid\", \"value\": \"clam\" } ]",
"c_cpp.debuggers.environment.description": "Proměnné prostředí, které se mají přidat do prostředí pro program. Příklad: [ { \"name\": \"config\", \"value\": \"Debug\" } ], ne [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Absolutní cesta k souboru, který obsahuje definice proměnných prostředí. Tento soubor obsahuje na každém řádku pár klíč-hodnota rozdělený znakem rovnítka. Např. KLÍČ=HODNOTA.",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Seznam středníkem oddělených adresářů, ve kterých se budou hledat soubory .so. Příklad: c:\\dir1;c:\\dir2",
"c_cpp.debuggers.MIMode.description": "Určuje ladicí program konzoly, ke kterému se připojí MIDebugEngine. Povolené hodnoty jsou gdb a lldb.",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "V případě hodnoty true se načtou symboly pro všechny knihovny (lib), jinak se nenačtou žádné symboly solib. Výchozí hodnota je true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Seznam názvů souborů (s povolenými zástupnými znaky) oddělených středníky (;). Upraví chování pro LoadAll. Hodnota true pro LoadAll znamená, že se nemají načítat symboly pro knihovny (lib), které odpovídají libovolnému názvu v seznamu. V opačném případě se mají načíst symboly pro všechny odpovídající knihovny. Příklad: foo.so;bar.so",
"c_cpp.debuggers.requireExactSource.description": "Volitelný příznak, který vyžaduje, aby aktuální zdrojový kód odpovídal souboru pdb",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Název úlohy",
"c_cpp.taskDefinitions.command.description": "Cesta ke kompilátoru nebo skriptu, který provádí kompilaci",
"c_cpp.taskDefinitions.args.description": "Další argumenty, které se mají předat kompilátoru nebo kompilačnímu skriptu",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "Architektura {0} se nepodporuje. ",
"apline.containers.not.supported": "Kontejnery Alpine se nepodporují.",
"download.button": "Přejít na stránku stahování",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Tato verze rozšíření pro {0} {1} není kompatibilní s vaším operačním systémem. Stáhněte a nainstalujte si prosím verzi rozšíření {2}.",
"extension.installation.failed": "Nepovedlo se úspěšně nainstalovat rozšíření jazyka C/C++. Aby rozšíření pro funkce jazyka C/C++ fungovalo správně, bude nutné ho opravit nebo přeinstalovat.",
"remove.extension": "Pokusit se o opravu",
"jason.files.missing": "Nepovedlo se úspěšně nainstalovat rozšíření jazyka C/C++. Aby rozšíření pro funkce jazyka C/C++ fungovalo správně, bude nutné ho přeinstalovat.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "CHYBA: Operace fs.rename neproběhla úspěšně s chybou {0}. Pokud chcete povolit ladění, odstraňte {1} ručně.",
"failed.at.stage": "Chyba ve fázi: {0}",
"failed.at.stage2": "Pokud pracujete v offline prostředí nebo se vám tato chyba zobrazuje opakovaně, zkuste si z {0} stáhnout verzi rozšíření, která už má všechny závislosti předem zahrnuté, a pak ji nainstalujte v nástroji VS Code pomocí příkazu Nainstalovat z VSIX.",
"finished.installing.dependencies": "Dokončila se instalace závislostí."
"finished.installing.dependencies": "Dokončila se instalace závislostí.",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Chyba souboru ZIP",
"create.directory.error": "Při vytváření adresáře došlo k chybě.",
"zip.stream.error": "Chyba při čtení streamu ZIP",
"read.stream.error": "Ve streamu pro čtení došlo k chybě.",
"unlink.error": "Při rušení propojení souboru {0} došlo k chybě.",
"rename.error": "Při přejmenování souboru {0} došlo k chybě.",
"read.stream.error": "Ve streamu pro čtení došlo k chybě.",
"write.stream.error": "Ve streamu pro zápis došlo k chybě.",
"file.already.exists": "Upozornění: Soubor {0} už existuje a neaktualizoval se."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Konfiguration auswählen...",
"c_cpp.command.configurationProviderSelect.title": "Konfigurationsanbieter ändern...",
"c_cpp.command.configurationEditJSON.title": "Konfigurationen bearbeiten (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Fügen Sie Includepfade aus \"nan\" und \"node-addon-api\" hinzu, wenn es sich um Abhängigkeiten handelt.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Bei TRUE ist für \"Symbol umbenennen\" ein gültiger C-/C++-Bezeichner erforderlich.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Bei TRUE fügt AutoVervollständigen automatisch \"(\" nach Funktionsaufrufen hinzu. In diesem Fall kann \")\" abhängig vom Wert der Einstellung \"editor.autoClosingBrackets\" ebenfalls hinzugefügt werden.",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Konfigurieren Sie Globmuster für das Ausschließen von Ordnern (und Dateien, wenn \"C_Cpp.exclusionPolicy\" geändert wird). Diese sind spezifisch für die C/C++-Erweiterung und zusätzlich zu \"files.exclude\", aber im Gegensatz zu \"files.exclude\" werden sie nicht aus der Explorer-Ansicht entfernt. Weitere Informationen zu Globmustern finden Sie [hier](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "Das Globmuster, mit dem Dateipfade verglichen werden sollen. Legen Sie diesen Wert auf \"true\" oder \"false\" fest, um das Muster zu aktivieren bzw. zu deaktivieren.",
"c_cpp.configuration.filesExcludeWhen.description": "Zusätzliche Überprüfung der gleichgeordneten Elemente einer entsprechenden Datei. Verwenden Sie \"$(basename)\" als Variable für den entsprechenden Dateinamen.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Bei Festlegung auf TRUE verwendet die Befehlsersetzung der Debugger-Shell obsolete Backtick-Zeichen (`).",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: andere Verweisergebnisse",
"c_cpp.debuggers.pipeTransport.description": "Falls angegeben, weist diese Option den Debugger an, eine Verbindung mit einem Remotecomputer mithilfe einer anderen ausführbaren Datei als Pipe herzustellen, die Standardeingaben/-ausgaben zwischen VS Code und der ausführbaren Back-End-Datei für den MI-fähigen Debugger weiterleitet (z. B. gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Der vollqualifizierte auszuführende Pipebefehl.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Befehlszeilenargumente, die zum Konfigurieren der Verbindung an das Pipeprogramm übergeben werden.",
"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. \nDer Standardwert ist \"true\".",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is '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.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Die .natvis-Datei, die beim Debuggen dieses Prozesses verwendet werden soll. Diese Option ist nicht mit der automatischen Strukturierung und Einrückung von GDB kompatibel. Weitere Informationen finden Sie auch bei \"showDisplayString\", wenn Sie diese Einstellung verwenden.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Die .natvis-Datei, die beim Debuggen dieses Prozesses verwendet werden soll.",
"c_cpp.debuggers.showDisplayString.description": "Wenn eine visualizerFile angegeben wird, wird die Anzeigezeichenfolge von showDisplayString aktiviert. Durch Aktivieren dieser Option kann die Leistung während des Debuggings verlangsamt werden.",
"c_cpp.debuggers.environment.description": "Umgebungsvariablen, die der Umgebung für das Programm hinzugefügt werden sollen. Beispiel: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Umgebungsvariablen, die der Umgebung für das Programm hinzugefügt werden sollen. Beispiel: [ { \"name\": \"config\", \"value\": \"Debug\" } ], not [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Absoluter Pfad zu einer Datei mit Umgebungsvariablendefinitionen. Für diese Datei sind Schlüssel-Wert-Paare pro Zeile durch ein Gleichheitszeichen getrennt. Beispiel: SCHLÜSSEL=WERT",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Durch Semikolons getrennte Liste von Verzeichnissen, die für die Suche nach SO-Dateien verwendet werden sollen. Beispiel: \"c:\\dir1;c:\\dir2\".",
"c_cpp.debuggers.MIMode.description": "Hiermit wird der Konsolendebugger angegeben, mit dem die MIDebugEngine eine Verbindung herstellt. Zulässige Werte sind \"gdb\" und \"lldb\".",
@@ -240,6 +241,10 @@
"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 der Dateinamen (Platzhalter zulässig), durch Semikolons \";\" getrennt. Ä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": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Der Name der Aufgabe",
"c_cpp.taskDefinitions.command.description": "Der Pfad zu einem Compiler oder einem Skript, über den/das die Kompilierung ausgeführt wird",
"c_cpp.taskDefinitions.args.description": "Zusätzliche Argumente, die an den Compiler oder das Kompilierungsskript übergeben werden sollen",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "Die Architektur \"{0}\" wird nicht unterstützt. ",
"apline.containers.not.supported": "Alpine-Container werden nicht unterstützt.",
"download.button": "Gehe zu Downloadseite",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Diese Version {0} {1} der Erweiterung ist nicht mit Ihrem Betriebssystem kompatibel. Laden Sie Version \"{2}\" der Erweiterung herunter, und installieren Sie sie.",
"extension.installation.failed": "Die C/C++-Erweiterung konnte nicht erfolgreich installiert werden. Sie müssen die Erweiterung für C/C++-Sprachfeatures reparieren oder neu installieren, damit die Erweiterung ordnungsgemäß funktioniert.",
"remove.extension": "Reparaturversuch",
"jason.files.missing": "Die C/C++-Erweiterung konnte nicht erfolgreich installiert werden. Sie müssen die Erweiterung für C/C++-Sprachfeatures neu installieren, damit die Erweiterung ordnungsgemäß funktioniert.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "FEHLER bei \"fs.rename\": {0}. Löschen Sie \"{1}\" manuell, um das Debugging zu aktivieren.",
"failed.at.stage": "Fehler in Stufe: {0}",
"failed.at.stage2": "Wenn Sie in einer Offlineumgebung arbeiten oder dieser Fehler wiederholt angezeigt wird, laden Sie eine Version der Erweiterung herunter, in die alle Abhängigkeiten von {0} bereits integriert sind. Verwenden Sie anschließend den Befehl \"Aus VSIX installieren\" in VS Code, um die Version zu installieren.",
"finished.installing.dependencies": "Installation der Abhängigkeiten abgeschlossen"
"finished.installing.dependencies": "Installation der Abhängigkeiten abgeschlossen",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Fehler in ZIP-Datei.",
"create.directory.error": "Fehler beim Erstellen des Verzeichnisses.",
"zip.stream.error": "Fehler beim Lesen des ZIP-Datenstroms.",
"read.stream.error": "Fehler im Lesedatenstrom.",
"unlink.error": "Fehler beim Aufheben der Verknüpfung für die Datei \"{0}\".",
"rename.error": "Fehler beim Umbenennen der Datei\"{0}\".",
"read.stream.error": "Fehler im Lesedatenstrom.",
"write.stream.error": "Fehler im Schreibdatenstrom.",
"file.already.exists": "Warnung: Die Datei \"{0}\" ist bereits vorhanden und wurde nicht aktualisiert."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Seleccione una configuración...",
"c_cpp.command.configurationProviderSelect.title": "Cambiar el proveedor de configuración...",
"c_cpp.command.configurationEditJSON.title": "Editar configuraciones (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Agregue rutas de acceso de inclusión de nan y node-addon-api cuando sean dependencias.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Si es true, \"Cambiar el nombre del símbolo\" requerirá un identificador de C/C++ válido.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Si es true, la opción de autocompletar agregará \"(\" de forma automática después de las llamadas a funciones, en cuyo caso puede que también se agregue \")\", en función del valor de la configuración de \"editor.autoClosingBrackets\".",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Configure patrones globales para excluir carpetas (y archivos si se cambia \"C_Cpp. exclusionPolicy\"). Estos son específicos de la extensión de C/C++ y se agregan a \"files. Exclude\", pero a diferencia de \"files. Exclude\" no se quitan de la vista del explorador. Más información acerca de los patrones de globales [here] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "El patrón global con el que se harán coincidir las rutas de acceso de los archivos. Establézcalo en true o false para habilitarlo o deshabilitarlo.",
"c_cpp.configuration.filesExcludeWhen.description": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Use $(nombreBase) como variable para el nombre de archivo que coincide.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Si es true, la sustitución de comandos del shell del depurador usará la marca de comilla simple (') obsoleta.",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: resultados de otras referencias",
"c_cpp.debuggers.pipeTransport.description": "Cuando se especifica, indica al depurador que se conecte a un equipo remoto usando otro archivo ejecutable como canalización que retransmitirá la entrada o la salida estándar entre VS Code y el archivo ejecutable del back-end del depurador habilitado para MI (por ejemplo, gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Comando de canalización completo para ejecutar.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Argumentos de la línea de comandos que se pasan al programa de canalización para configurar la conexión.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Variables de entorno que se pasan al programa de canalización.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Si los argumentos individuales de pipeProgram contienen caracteres (como espacios o tabulaciones), ¿debe incluirse entre comillas? Si es \"false\", el comando del depurador dejará de incluirse entre comillas automáticamente. \nEl valor predeterminado es \"true\".",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Marcas opcionales que determinan los tipos de mensajes que deben registrarse en la Consola de depuración.",
"c_cpp.debuggers.logging.exceptions.description": "Marca opcional que determina si los mensajes de excepción deben registrarse en la Consola de depuración. El valor predeterminado es true.",
"c_cpp.debuggers.logging.moduleLoad.description": "Marca opcional que determina si los eventos de carga de módulos deben registrarse en la Consola de depuración. El valor predeterminado es true.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Archivo .natvis que debe usarse para depurar este proceso. Esta opción no es compatible con la impresión con sangría de GDB. Vea también \"showDisplayString\" si utiliza esta configuración.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Archivo. natvis que debe usarse para depurar este proceso.",
"c_cpp.debuggers.showDisplayString.description": "Cuando se especifica visualizerFile, showDisplayString habilita la cadena para mostrar. La activación de esta opción puede ralentizar el rendimiento durante la depuración.",
"c_cpp.debuggers.environment.description": "Variables de entorno que se agregan al entorno del programa. Ejemplo: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Variables del entorno que se agregan al entorno del programa. Ejemplo: [ { \"name\": \"config\", \"value\": \"Debug\" } ], no [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Ruta de acceso absoluta a un archivo que contiene definiciones de variables de entorno. Este archivo tiene pares clave-valor separados por un signo igual por línea. Por ejemplo, CLAVE=VALOR.",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Lista de directorios separados por punto y coma que debe usarse para buscar archivos .so. Ejemplo: \"c:\\dir1;c:\\dir2\".",
"c_cpp.debuggers.MIMode.description": "Indica el depurador de la consola al que debe conectarse MIDebugEngine. Los valores permitidos son \"gdb\" y \"lldb\".",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Si es true, se cargan los símbolos de todas las bibliotecas; de lo contrario, no se cargará ningún símbolo de la biblioteca compartida (solib). El valor predeterminado es true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Lista de nombres de archivo (se permiten comodines) separados por punto y coma \";\". Modifica el comportamiento de LoadAll. Si LoadAll es true, no se cargan los símbolos para las bibliotecas que coincidan con cualquier nombre de la lista. De lo contrario, solo se cargan los símbolos para las bibliotecas que coincidan. Ejemplo: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "Marca opcional que requiere que el código fuente actual coincida con el archivo PDB.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Nombre de la tarea",
"c_cpp.taskDefinitions.command.description": "Ruta de acceso a un compilador o script que realiza la compilación.",
"c_cpp.taskDefinitions.args.description": "Argumentos adicionales que se pasan al compilador o al script de compilación",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "La arquitectura {0} no se admite. ",
"apline.containers.not.supported": "Los contenedores de Alpine no se admiten.",
"download.button": "Ir a la página de descarga",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "La versión para {0} {1} de la extensión no es compatible con el sistema operativo. Descargue la versión \"{2}\" de la extensión e instálela.",
"extension.installation.failed": "Error de instalación de la extensión de C/C++. Tendrá que reparar o reinstalar la extensión para que las características del lenguaje C/C++ funcionen correctamente.",
"remove.extension": "Intentar reparar",
"jason.files.missing": "Error de instalación de la extensión de C/C++. Tendrá que reinstalar la extensión para que las características del lenguaje C/C++ funcionen correctamente.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "ERROR: No se puedo ejecutar fs.rename con \"{0}\". Elimine {1} manualmente para habilitar la depuración.",
"failed.at.stage": "Error en la fase: {0}",
"failed.at.stage2": "Si trabaja en un entorno sin conexión o este error se repite, pruebe a descargar una versión de la extensión con todas las dependencias previamente incluidas de {0} y, a continuación, use el comando \"Instalar desde VSIX\" en VS Code para instalarla.",
"finished.installing.dependencies": "Ha finalizado la instalación de dependencias"
"finished.installing.dependencies": "Ha finalizado la instalación de dependencias",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Error de archivo ZIP",
"create.directory.error": "Error al crear el directorio",
"zip.stream.error": "Error al leer la secuencia ZIP",
"read.stream.error": "Error en la secuencia de lectura",
"unlink.error": "Error al desvincular el archivo {0}",
"rename.error": "Error al cambiar el nombre del archivo {0}",
"read.stream.error": "Error en la secuencia de lectura",
"write.stream.error": "Error en la secuencia de escritura",
"file.already.exists": "Advertencia: El archivo \"{0}\" ya existe y no se ha actualizado."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Sélectionner une configuration...",
"c_cpp.command.configurationProviderSelect.title": "Changer le fournisseur de configuration...",
"c_cpp.command.configurationEditJSON.title": "Modifier les configurations (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Ajoute des chemins include à partir de nan et node-addon-api quand il s'agit de dépendances.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Si la valeur est true, l'opération Renommer le symbole nécessite un identificateur C/C++ valide.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Si la valeur est true, l'autocomplétion ajoute automatiquement \"(\" après les appels de fonction. Dans ce cas \")\" peut également être ajouté, en fonction de la valeur du paramètre \"editor.autoClosingBrackets\".",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Configurez des modèles Glob pour lexclusion des dossiers (et des fichiers si « C_Cpp.exclusionPolicy » est modifié). Ceux-ci sont spécifiques à lextension C/C++ et sajoutent à « files.exclude », mais contrairement à « files.exclude », ils ne sont pas supprimés de laffichage de lExplorateur. Vous pourrez en savoir plus sur les modèles Glob [ici] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "Modèle Glob auquel les chemins de fichiers doivent correspondre. Affectez la valeur true ou false pour activer ou désactiver le modèle.",
"c_cpp.configuration.filesExcludeWhen.description": "Vérification supplémentaire des frères d'un fichier correspondant. Utilisez $(basename) comme variable pour le nom de fichier correspondant.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Si la valeur est true, le remplacement de la commande d'interpréteur de commandes du débogueur utilise un accent grave (`) obsolète.",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++ : Autres résultats des références",
"c_cpp.debuggers.pipeTransport.description": "Quand ce paramètre est présent, indique au débogueur de se connecter à un ordinateur distant en se servant d'un autre exécutable comme canal de relais d'entrée/de sortie standard entre VS Code et l'exécutable du back-end du débogueur MI (par exemple, gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Commande canal complète à exécuter.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Arguments de ligne de commande passés au programme canal pour configurer la connexion.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Variables d'environnement passées au programme canal.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Si des arguments individuels de pipeProgram contiennent des caractères (par exemple des espaces ou des tabulations), doivent-ils être placés entre guillemets ? Si la valeur est 'false', la commande de débogueur n'est plus automatiquement placée entre guillemets. \nLa valeur par défaut est 'true'.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Indicateurs facultatifs pour déterminer les types de messages à journaliser dans la console de débogage.",
"c_cpp.debuggers.logging.exceptions.description": "Indicateur facultatif pour déterminer si les messages d'exception doivent être journalisés dans la console de débogage. La valeur par défaut est true.",
"c_cpp.debuggers.logging.moduleLoad.description": "Indicateur facultatif pour déterminer si les événements de chargement de module doivent être journalisés dans la console de débogage. La valeur par défaut est true.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Fichier .natvis à utiliser pendant le débogage de ce processus. Cette option n'est pas compatible avec l'impression en mode Pretty GDB. Consultez également \"showDisplayString\" en cas d'utilisation de ce paramètre.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Fichier .natvis à utiliser pendant le débogage de ce processus.",
"c_cpp.debuggers.showDisplayString.description": "Quand un visualizerFile est spécifié, showDisplayString active la chaîne d'affichage. Si vous activez cette option, les performances peuvent être ralenties pendant le débogage.",
"c_cpp.debuggers.environment.description": "Variables d'environnement à ajouter à l'environnement du programme. Exemple : [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Variables denvironnement à ajouter à lenvironnement du programme. Exemple : [ { « nom »: « config », « valeur » : « Débogage » } ], et non [ { « config »: « Débogage » } ].",
"c_cpp.debuggers.envFile.description": "Chemin absolu d'un fichier contenant des définitions de variable d'environnement. Ce fichier a des paires clé-valeur séparées par un signe égal par ligne. Par exemple, CLÉ=VALEUR",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Liste de répertoires séparés par des points-virgules à utiliser pour rechercher des fichiers .so. Exemple : \"c:\\dir1;c:\\dir2\".",
"c_cpp.debuggers.MIMode.description": "Indique le débogueur de console auquel MIDebugEngine se connecte. Les valeurs autorisées sont \"gdb\" \"lldb\".",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Si la valeur est true, les symboles de toutes les bibliothèques sont chargés. Sinon, aucun symbole solib n'est chargé. La valeur par défaut est true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Liste des noms de fichiers (caractères génériques autorisés) séparés par des points-virgules ';'. Modifie le comportement de LoadAll. Si LoadAll a la valeur true, les symboles des bibliothèques correspondant à un nom de la liste ne sont pas chargés. Sinon, les symboles des bibliothèques ayant une correspondance sont chargés. Exemple : \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "Indicateur facultatif pour exiger que le code source actuel corresponde au fichier pdb.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Nom de la tâche",
"c_cpp.taskDefinitions.command.description": "Chemin d'un compilateur ou d'un script qui effectue la compilation",
"c_cpp.taskDefinitions.args.description": "Arguments supplémentaires à passer au compilateur ou au script de compilation",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "L'architecture {0} n'est pas prise en charge. ",
"apline.containers.not.supported": "Les conteneurs Alpine ne sont pas pris en charge.",
"download.button": "Accéder à la page de téléchargement",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Cette version {0} {1} de l'extension est incompatible avec votre système d'exploitation. Téléchargez et installez la version {2} de l'extension.",
"extension.installation.failed": "Échec de l'installation de l'extension C/C++. Vous devez réparer ou réinstaller l'extension pour que les fonctionnalités du langage C/C++ fonctionnent correctement.",
"remove.extension": "Tentative de réparation",
"jason.files.missing": "Échec de l'installation de l'extension C/C++. Vous devez réinstaller l'extension pour que les fonctionnalités du langage C/C++ fonctionnent correctement.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "ERREUR : fs.rename a échoué avec \"{0}\". Supprimez {1} manuellement pour activer le débogage.",
"failed.at.stage": "Échec à l'étape {0}",
"failed.at.stage2": "Si vous travaillez dans un environnement hors connexion ou si vous voyez cette erreur à plusieurs reprises, essayez de télécharger une version de l'extension avec toutes les dépendances préalablement incluses à partir de {0}, puis utilisez la commande \"Installer depuis un VSIX\" dans VS Code pour effectuer l'installation.",
"finished.installing.dependencies": "Installation des dépendances terminée"
"finished.installing.dependencies": "Installation des dépendances terminée",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Erreur du fichier zip",
"create.directory.error": "Erreur de création du répertoire",
"zip.stream.error": "Erreur de lecture du flux zip",
"read.stream.error": "Erreur du flux de lecture",
"unlink.error": "Erreur de dissociation du fichier {0}",
"rename.error": "Erreur de renommage du fichier {0}",
"read.stream.error": "Erreur du flux de lecture",
"write.stream.error": "Erreur du flux d'écriture",
"file.already.exists": "Avertissement : Le fichier '{0}' existe déjà et n'a pas été mis à jour."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Seleziona una configurazione...",
"c_cpp.command.configurationProviderSelect.title": "Cambia provider di configurazione...",
"c_cpp.command.configurationEditJSON.title": "Modifica configurazioni (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Aggiunge percorsi di inclusione da nan e node-addon-api quando sono dipendenze.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Se è true, con 'Rinomina simbolo' sarà richiesto un identificatore C/C++ valido.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Se è true, il completamento automatico aggiungerà automaticamente \"(\" dopo le chiamate di funzione. In tal caso potrebbe essere aggiunto anche \")\", a seconda del valore dell'impostazione \"editor.autoClosingBrackets\".",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Configura i criteri GLOB per escludere le cartelle (e i file, se \"C_Cpp.exclusionPolicy\" è modificato). Questi sono specifici dell'estensione C/C++ e si aggiungono a \"files.exclude\", ma a differenza di \"files.exclude\" non vengono rimossi dalla visualizzazione Esplora. Altre informazioni sui criteri GLOB [qui](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "Criterio GLOB da usare per trovare percorsi file. Impostare su True o False per abilitare o disabilitare il criterio.",
"c_cpp.configuration.filesExcludeWhen.description": "Controllo aggiuntivo sugli elementi di pari livello di un file corrispondente. Usare $(basename) come variabile del nome file corrispondente.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Se è true, per la sostituzione del comando della shell del debugger verrà usato il carattere backtick obsoleto (`).",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: Risultati altri riferimenti",
"c_cpp.debuggers.pipeTransport.description": "Se presente, indica al debugger di connettersi a un computer remoto usando come pipe un altro eseguibile che inoltra l'input/output standard tra VS Code e l'eseguibile back-end del debugger abilitato per MI, ad esempio gdb.",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Comando pipe completo da eseguire.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Argomenti della riga di comando passati al programma pipe per configurare la connessione.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Variabili di ambiente passate al programma pipe.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Indica se i singoli argomenti di pipeProgram devono essere racchiusi tra virgolette quando contengono caratteri, ad esempio spazi o tabulazioni. Se è 'false', il comando del debugger non verrà più racchiuso automaticamente tra virgolette. \nL'impostazione predefinita è 'true'.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Flag facoltativi per determinare i tipi di messaggi da registrare nella Console di debug.",
"c_cpp.debuggers.logging.exceptions.description": "Flag facoltativo per determinare se i messaggi di eccezione devono essere registrati nella Console di debug. Il valore predefinito è true.",
"c_cpp.debuggers.logging.moduleLoad.description": "Flag facoltativo per determinare se gli eventi di caricamento del modulo devono essere registrati nella Console di debug. Il valore predefinito è true.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "File con estensione natvis da usare durante il debug di questo processo. Questa opzione non è compatibile con la riformattazione GDB. Se si usa questa impostazione, vedere anche \"showDisplayString\".",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "File con estensione natvis da usare durante il debug di questo processo.",
"c_cpp.debuggers.showDisplayString.description": "Quando si specifica un oggetto visualizerFile, showDisplayString abilita la stringa di visualizzazione. L'attivazione di questa opzione può comportare un rallentamento delle prestazioni durante il debug.",
"c_cpp.debuggers.environment.description": "Variabili di ambiente da aggiungere all'ambiente per il programma. Esempio: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Variabili di ambiente da aggiungere all'ambiente per il programma. Esempio: [ { \"name\": \"config\", \"value\": \"Debug\" } ], non [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Percorso assoluto di un file contenente le definizioni delle variabili di ambiente. Questo file contiene su ogni riga coppie chiave-valore separate da un segno di uguale, ad esempio CHIAVE=VALORE",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Elenco di directory delimitate da punto e virgola da usare per la ricerca di file con estensione so. Esempio: \"c:\\dir1;c:\\dir2\".",
"c_cpp.debuggers.MIMode.description": "Indica il debugger della console a cui si connetterà MIDebugEngine. I valori consentiti sono \"gdb\" e \"lldb\".",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Se è true, verranno caricati i simboli per tutte le librerie; in caso contrario, non verrà caricato alcun simbolo di solib. Il valore predefinito è true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Elenco di nomi di file (caratteri jolly consentiti) delimitati da punti e virgola ';'. Modifica il comportamento di LoadAll. Se LoadAll è true, non carica i simboli per le librerie corrispondenti a qualsiasi nome dell'elenco. In caso contrario, carica solo i simboli per le librerie corrispondenti. Esempio: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "Flag facoltativo per richiedere che il codice sorgente corrente corrisponda al PDB.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Nome dell'attività",
"c_cpp.taskDefinitions.command.description": "Percorso di un compilatore o di uno script che esegue la compilazione",
"c_cpp.taskDefinitions.args.description": "Argomenti aggiuntivi da passare al compilatore o allo script di compilazione",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "L'architettura {0} non è supportata. ",
"apline.containers.not.supported": "I contenitori Alpine non sono supportati.",
"download.button": "Vai alla pagina di download",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "La versione {0} {1} dell'estensione non è compatibile con il sistema operativo. Scaricare e installare la versione \"{2}\" dell'estensione.",
"extension.installation.failed": "Non è stato possibile installare l'estensione C/C++. Per funzionare correttamente, è necessario riparare o reinstallare l'estensione per le funzionalità del linguaggio C/C++.",
"remove.extension": "Tentativo di riparazione",
"jason.files.missing": "Non è stato possibile installare l'estensione C/C++. Per funzionare correttamente, sarà necessario reinstallare l'estensione per le funzionalità del linguaggio C/C++.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "ERRORE: fs.rename non riuscito con \"{0}\". Per abilitare il debug, eliminare manualmente {1}.",
"failed.at.stage": "Errore nella fase: {0}",
"failed.at.stage2": "Se si lavora in un ambiente offline o questo errore viene visualizzato ripetutamente, provare a scaricare una versione dell'estensione con tutte le dipendenze già incluse da {0}, quindi usare il comando \"Installa da VSIX\" in VS Code per installarla.",
"finished.installing.dependencies": "L'installazione delle dipendenze è stata completata"
"finished.installing.dependencies": "L'installazione delle dipendenze è stata completata",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Errore del file ZIP",
"create.directory.error": "Si è verificato un errore durante la creazione della directory",
"zip.stream.error": "Si è verificato un errore durante la lettura del flusso ZIP",
"read.stream.error": "Si è verificato un errore durante la lettura del flusso",
"unlink.error": "Si è verificato durante lo scollegamento del file {0}",
"rename.error": "Si è verificato durante la ridenominazione del file {0}",
"read.stream.error": "Si è verificato un errore durante la lettura del flusso",
"write.stream.error": "Si è verificato un errore durante la scrittura del flusso",
"file.already.exists": "Avviso: il file '{0}' esiste già e non è stato aggiornato."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "構成を選択する...",
"c_cpp.command.configurationProviderSelect.title": "構成プロバイダーを変更する...",
"c_cpp.command.configurationEditJSON.title": "構成の編集 (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "依存関係にある場合は、nan および node-addon-api からのインクルード パスを追加します。",
"c_cpp.configuration.renameRequiresIdentifier.description": "true の場合、'シンボルの名前変更' には有効な C/C++ 識別子が必要です。",
"c_cpp.configuration.autocompleteAddParentheses.description": "true の場合、関数呼び出しの後に \"(\" が自動的に追加されます。その場合は、\"editor.autoClosingBrackets\" 設定の値に応じて、\")\" も追加される場合があります。",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "フォルダー (\"C_Cpp.exclusionPolicy\" が変更された場合はファイルも) を除外するための glob パターンを構成します。これらは C/c + + の拡張機能に固有であり、\"files. exclude\" に加えて構成しますが、\"files. exclude\" とは異なり、[エクスプローラー] ビューからは削除されません。glob パターンの詳細については、[こちら] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) を参照してください。",
"c_cpp.configuration.filesExcludeBoolean.description": "ファイル パスの照合基準となる glob パターン。これを true または false に設定すると、パターンがそれぞれ有効/無効になります。",
"c_cpp.configuration.filesExcludeWhen.description": "一致するファイルの兄弟をさらにチェックします。一致するファイル名の変数として $(basename) を使用します。",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "True の場合、デバッガー シェルのコマンド置換では古いバックティック (') が使用されます。",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: その他の参照結果",
"c_cpp.debuggers.pipeTransport.description": "これを指定すると、デバッガーにより、別の実行可能ファイルをパイプとして使用してリモート コンピューターに接続され、VS Code と MI 対応のデバッガー バックエンド実行可能ファイル (gdb など) との間で標準入出力が中継されます。",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "実行するパイプ コマンドの完全修飾パス。",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "接続を構成するためにパイプ プログラムに渡すコマンド ライン引数。",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "パイプ プログラムに渡す環境変数。",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "pipeProgram の個々の引数に (スペースやタブなどの) 文字が含まれる場合に引用符で囲むかどうか。'false' に設定すると、デバッガー コマンドが自動的に引用符で囲まれることはなくなります。\n既定値は 'true' です。",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "どの種類のメッセージをデバッグ コンソールに記録する必要があるかを決定するオプションのフラグです。",
"c_cpp.debuggers.logging.exceptions.description": "例外メッセージをデバッグ コンソールに記録するかどうかを決定するオプションのフラグです。既定値は true です。",
"c_cpp.debuggers.logging.moduleLoad.description": "モジュール読み込みイベントをデバッグ コンソールに記録するかどうかを決定するオプションのフラグです。既定値は true です。",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "このプロセスをデバッグするときに使用する .natvis ファイルです。このオプションは GDB の再フォーマットと互換性がありません。この設定を使用する場合は、\"showDisplayString\" も参照してください。",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "このプロセスをデバッグするときに使用する .natvis ファイルです。",
"c_cpp.debuggers.showDisplayString.description": "visualizerFile を指定すると、showDisplayString により表示文字列が有効になります。このオプションをオンにすると、デバッグ中にパフォーマンスが低下する可能性があります。",
"c_cpp.debuggers.environment.description": "プログラムの環境に追加する環境変数。例: [ { \"name\": \"squid\", \"value\": \"clam\" } ]。",
"c_cpp.debuggers.environment.description": "プログラムの環境に追加する環境変数。例: [ { \"name\": \"config\", \"value\": \"Debug\" } ], not [ { \"config\": \"Debug\" } ]。",
"c_cpp.debuggers.envFile.description": "環境変数の定義を含むファイルへの絶対パスです。このファイルには、行ごとに等号で区切られたキーと値のペアがあります。例: キー=値",
"c_cpp.debuggers.additionalSOLibSearchPath.description": ".so ファイルの検索に使用する、セミコロンで区切られたディレクトリの一覧です。例: \"c:\\dir1;c:\\dir2\"。",
"c_cpp.debuggers.MIMode.description": "MIDebugEngine が接続するコンソール デバッガーを示します。許可されている値は \"gdb\" \"lldb\" です。",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "true の場合、すべてのライブラリのシンボルが読み込まれます。それ以外の場合、solib シンボルは読み込まれません。既定値は true です。",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "セミコロン '; ' で区切られたファイル名の一覧 (ワイルドカードも使用可能)。LoadAll の動作が変更されます。LoadAll が true の場合は、一覧内の名前に一致するライブラリのシンボルを読み込まないでください。それ以外の場合は、一致するライブラリのシンボルのみを読み込んでください。例: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "PDB に一致する現在のソース コードを必要とする省略可能なフラグです。",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "タスクの名前",
"c_cpp.taskDefinitions.command.description": "コンパイルを実行するコンパイラまたはスクリプトへのパス",
"c_cpp.taskDefinitions.args.description": "コンパイラまたはコンパイル スクリプトに渡す追加の引数",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "アーキテクチャ {0} はサポートされていません。",
"apline.containers.not.supported": "Alpine コンテナーはサポートされていません。",
"download.button": "ダウンロード ページへ移動",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "この {0} {1} バージョンの拡張機能は、お使いの OS と互換性がありません。拡張機能の \"{2}\" バージョンをダウンロードしてインストールしてください。",
"extension.installation.failed": "C/C++ の拡張機能を正常にインストールできませんでした。正常に機能させるには、C/C++ 言語機能の拡張機能を修復または再インストールする必要があります。",
"remove.extension": "修復の試行",
"jason.files.missing": "C/C++ の拡張機能を正常にインストールできませんでした。正常に機能させるには、C/C++ 言語機能の拡張機能を再インストールする必要があります。",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "エラー: fs.rename が、\"{0}\" により失敗しました。{1} を手動で削除し、デバッグを有効にしてください。",
"failed.at.stage": "以下のステージで失敗しました: {0}",
"failed.at.stage2": "オフライン環境で作業している場合、またはこのエラーが繰り返し表示される場合は、すべての依存関係が事前インクルードされている拡張機能のバージョンを {0} からダウンロードしてみてください。その後、VS Code で \"Install from VSIX\" コマンドを使用してインストールしてください。",
"finished.installing.dependencies": "依存関係のインストールが完了しました"
"finished.installing.dependencies": "依存関係のインストールが完了しました",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Zip ファイルのエラー",
"create.directory.error": "ディレクトリの作成中にエラーが発生しました",
"zip.stream.error": "zip ストリームの読み取りでエラーが発生しました",
"read.stream.error": "ストリームの読み取りでエラーが発生しました",
"unlink.error": "ファイル {0} のリンク解除中にエラーが発生しました",
"rename.error": "ファイル {0} の名前変更でエラーが発生しました",
"read.stream.error": "ストリームの読み取りでエラーが発生しました",
"write.stream.error": "ストリームの書き込みでエラーが発生しました",
"file.already.exists": "警告: ファイル '{0}' は既に存在するため、更新されませんでした。"
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "구성 선택...",
"c_cpp.command.configurationProviderSelect.title": "구성 공급자 변경...",
"c_cpp.command.configurationEditJSON.title": "구성 편집(JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "nan 및 node-addon-api가 종속성일 때 해당 포함 경로를 추가합니다.",
"c_cpp.configuration.renameRequiresIdentifier.description": "true이면 '기호 이름 바꾸기'에 유효한 C/C++ 식별자가 필요합니다.",
"c_cpp.configuration.autocompleteAddParentheses.description": "true이면 자동 완성에서 \"editor.autoClosingBrackets\" 설정 값에 따라 함수 호출 뒤에 \"(\"를 자동으로 추가하며, 이 경우 \")\"도 추가될 수 있습니다.",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "폴더(및 \"C_Cpp.exclusionPolicy\"가 변경된 경우 파일)를 제외하기 위한 GLOB 패턴을 구성하세요. 이는 C/C++ 확장에 고유하며 \"files.exclude\"에 추가되지만 \"files.exclude\"와 달리 탐색기 보기에서 제거되지 않습니다. [여기](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)에서 GLOB 패턴에 대해 자세히 알아보세요.",
"c_cpp.configuration.filesExcludeBoolean.description": "파일 경로를 일치시킬 GLOB 패턴입니다. 패턴을 사용하거나 사용하지 않도록 설정하려면 true 또는 false로 설정하세요.",
"c_cpp.configuration.filesExcludeWhen.description": "일치하는 파일의 형제에 대한 추가 검사입니다. $(basename)을 일치하는 파일 이름에 대한 변수로 사용하세요.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "true인 경우 디버거 셸 명령 대체가 사용되지 않는 백틱(`)을 사용합니다.",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: 기타 참조 결과",
"c_cpp.debuggers.pipeTransport.description": "있을 경우 VS Code와 MI 지원 디버거 백 엔드 실행 파일(예: gdb) 사이에 표준 입출력을 릴레이하는 파이프로 다른 실행 파일을 사용하여 원격 컴퓨터에 연결되도록 디버거를 지정합니다.",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "실행할 정규화된 파이프 명령입니다.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "연결을 구성하기 위해 파이프 프로그램에 전달되는 명령줄 인수입니다.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "파이프 프로그램에 전달되는 환경 변수입니다.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "pipeProgram의 개별 인수가 문자(예: 공백 또는 탭)를 포함하는 경우 따옴표를 붙여야 하나요? 'false'인 경우 디버거 명령은 더 이상 자동으로 따옴표를 붙이지 않습니다. \n기본값은 'true'입니다.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "메시지 유형을 디버그 콘솔에 기록할지 여부를 결정하는 선택적 플래그입니다.",
"c_cpp.debuggers.logging.exceptions.description": "예외 메시지를 디버그 콘솔에 기록할지 여부를 결정하는 선택적 플래그입니다. 기본값은 true입니다.",
"c_cpp.debuggers.logging.moduleLoad.description": "모듈 로드 이벤트를 디버그 콘솔에 기록할지 여부를 결정하는 선택적 플래그입니다. 기본값은 true입니다.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "이 프로세스를 디버그할 때 사용할 .natvis 파일입니다. 이 옵션은 GDB 자동 서식 지정과 호환되지 않습니다. 이 설정을 사용하는 경우 \"showDisplayString\"을 참조하세요.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "이 프로세스를 디버그할 때 사용할 .natvis 파일입니다.",
"c_cpp.debuggers.showDisplayString.description": "visualizerFile을 지정하면 showDisplayString은 표시 문자열을 사용하도록 설정합니다. 이 옵션을 켜면 디버그하는 동안 성능이 저하될 수 있습니다.",
"c_cpp.debuggers.environment.description": "프로그램의 환경에 추가할 환경 변수입니다. 예: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "프로그램의 환경에 추가할 환경 변수입니다. 예: [ { \"name\": \"config\", \"value\": \"Debug\" } ], not [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "환경 변수 정의를 포함하는 파일의 절대 경로입니다. 이 파일에는 줄마다 등호로 구분된 키 값 쌍이 있습니다(예: 키=값).",
"c_cpp.debuggers.additionalSOLibSearchPath.description": ".so 파일 검색에 사용할 디렉터리의 세미콜론으로 구분된 목록입니다(예: \"c:\\dir1;c:\\dir2\").",
"c_cpp.debuggers.MIMode.description": "MIDebugEngine이 연결할 콘솔 디버거를 나타냅니다. 허용되는 값은 \"gdb\" \"lldb\"입니다.",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "true이면 모든 라이브러리의 기호가 로드됩니다. true가 아니면 solib 기호가 로드되지 않습니다. 기본값은 true입니다.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "세미콜론 ';'으로 구분된 파일 이름(와일드카드 허용) 목록이며, LoadAll의 동작을 수정합니다. LoadAll이 true이면 목록에 있는 이름과 일치하는 라이브러리의 기호를 로드하지 않습니다. true가 아니면 일치하는 라이브러리의 기호만 로드합니다. 예: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "현재 소스 코드가 PDB와 일치하도록 하는 선택적 플래그입니다.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "작업의 이름",
"c_cpp.taskDefinitions.command.description": "컴파일을 수행하는 컴파일러 또는 스크립트의 경로",
"c_cpp.taskDefinitions.args.description": "컴파일러 또는 컴파일 스크립트에 전달할 추가 인수",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "{0} 아키텍처는 지원되지 않습니다. ",
"apline.containers.not.supported": "Alpine 컨테이너는 지원되지 않습니다.",
"download.button": "다운로드 페이지로 이동",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "이 확장의 {0} {1} 버전은 OS와 호환되지 않습니다. 확장의 \"{2}\" 버전을 다운로드하여 설치하세요.",
"extension.installation.failed": "C/C++ 확장을 설치하지 못했습니다. C/C++ 언어 기능이 제대로 작동하려면 확장을 복구하거나 다시 설치해야 합니다.",
"remove.extension": "복구 시도",
"jason.files.missing": "C/C++ 확장을 설치하지 못했습니다. C/C++ 언어 기능이 제대로 작동하려면 확장을 다시 설치해야 합니다.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "오류: fs.rename이 \"{0}\"과(와) 함께 실패했습니다. {1}을(를) 수동으로 삭제하여 디버깅을 사용하도록 설정합니다.",
"failed.at.stage": "{0} 단계에서 실패",
"failed.at.stage2": "오프라인 환경에서 작업하거나 이 오류가 반복적으로 표시되면 {0}에서 모든 종속성이 미리 포함된 확장 버전을 다운로드한 다음, VS Code에서 \"VSIX에서 설치\" 명령을 사용하여 확장을 설치합니다.",
"finished.installing.dependencies": "종속성 설치를 완료했습니다."
"finished.installing.dependencies": "종속성 설치를 완료했습니다.",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Zip 파일 오류",
"create.directory.error": "디렉터리를 만드는 동안 오류가 발생했습니다.",
"zip.stream.error": "zip 스트림을 읽는 동안 오류가 발생했습니다.",
"read.stream.error": "읽기 스트림의 오류",
"unlink.error": "{0} 파일의 연결을 해제하는 동안 오류가 발생했습니다.",
"rename.error": "{0} 파일의 이름을 바꾸는 동안 오류가 발생했습니다.",
"read.stream.error": "읽기 스트림의 오류",
"write.stream.error": "쓰기 스트림의 오류",
"file.already.exists": "경고: '{0}' 파일이 이미 있으므로 업데이트되지 않았습니다."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Wybierz konfigurację...",
"c_cpp.command.configurationProviderSelect.title": "Zmień dostawcę konfiguracji...",
"c_cpp.command.configurationEditJSON.title": "Edytowanie konfiguracji (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Dodaj ścieżki dołączania z bibliotek nan i node-addon-api, gdy są one zależnościami.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Jeśli ma wartość true, operacja „Zmień nazwę symbolu” będzie wymagać prawidłowego identyfikatora C/C++.",
"c_cpp.configuration.autocompleteAddParentheses.description": "W przypadku podania wartości true Autouzupełnianie będzie automatycznie dodawać znak „(” po wywołaniach funkcji, co może też powodować dodawanie znaku „)” w zależności od ustawienia „editor.autoClosingBrackets”.",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Skonfiguruj wzorce globalne do wykluczania folderów (i plików, jeśli zostanie zmienione ustawienie „C_Cpp.exclusionPolicy”). Są one charakterystyczne dla rozszerzenia C/C++ i występują poza ustawieniem „files. exclude”, ale w przeciwieństwie do tego ustawienia nie można ich usuwać z widoku Eksploratora. Przeczytaj więcej na temat wzorców globalnych [tutaj] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "Wzorzec globalny do dopasowywania ścieżek do plików. Aby włączyć lub wyłączyć wzorzec, ustaw wartość true lub false.",
"c_cpp.configuration.filesExcludeWhen.description": "Dodatkowe sprawdzenie elementów równorzędnych pasującego pliku. Użyj ciągu $(basename) jako zmiennej dla nazwy pasującego pliku.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Jeśli wartość będzie równa true, podstawianie poleceń powłoki debugera będzie używać przestarzałego grawisa (`).",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: inne wyniki odwołań",
"c_cpp.debuggers.pipeTransport.description": "Jeśli jest obecny, zawiera instrukcje dla debugera, aby połączył się z komputerem zdalnym przy użyciu innego pliku wykonywalnego jako potoku, który będzie przekazywał standardowe wejście/wyjście między programem VS Code a plikiem wykonywalnym zaplecza debugera z włączoną obsługą indeksu MI (takim jak gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Polecenie w pełni kwalifikowanego potoku do wykonania.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Argumenty wiersza polecenia przekazywane do programu potoku w celu skonfigurowania połączenia.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Zmienne środowiskowe przekazywane do programu potoku.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Jeśli poszczególne argumenty elementu pipeProgram zawierają znaki (takie jak spacje lub tabulatory), czy mają być umieszczane w cudzysłowach? W przypadku wartości „false” polecenie debugera nie będzie już automatycznie umieszczane w cudzysłowach. \nWartość domyślna to „true.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Opcjonalne flagi określające, które typy komunikatów powinny być rejestrowane w konsoli debugowania.",
"c_cpp.debuggers.logging.exceptions.description": "Opcjonalna flaga określająca, czy komunikaty o wyjątkach powinny być rejestrowane w konsoli debugowania. Wartość domyślna to false.",
"c_cpp.debuggers.logging.moduleLoad.description": "Opcjonalna flaga określająca, czy zdarzenia ładowania modułów powinny być rejestrowane w konsoli debugowania. Wartość domyślna to false.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Plik NATVIS, który ma być używany podczas debugowania tego procesu. Ta opcja jest niezgodna z formatowaniem kodu debugera GDB. W przypadku używania tego ustawienia zapoznaj się również z właściwością „showDisplayString”.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Plik NATVIS, który ma być używany podczas debugowania tego procesu.",
"c_cpp.debuggers.showDisplayString.description": "Gdy element visualizerFile jest określony, opcja showDisplayString spowoduje włączenie ciągu wyświetlanego. Włączenie tej opcji może spowodować zmniejszenie wydajności podczas debugowania.",
"c_cpp.debuggers.environment.description": "Zmienne środowiskowe do dodania do środowiska programu. Przykład: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Zmienne środowiskowe do dodania do środowiska dla programu. Przykład: [{\"name\": \"config\", \"value\": \"debug\"}], nie [{\"config\": \"debug\"}].",
"c_cpp.debuggers.envFile.description": "Ścieżka bezwzględna do pliku zawierającego definicje zmiennych środowiskowych. Ten plik w każdym wierszu zawiera parę klucz-wartość oddzieloną znakiem równości. Przykład: KLUCZ=WARTOŚĆ",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Rozdzielana średnikami lista katalogów, w których mają być wyszukiwanie pliki SO. Przykład: „c:\\dir1;c:\\dir2”.",
"c_cpp.debuggers.MIMode.description": "Wskazuje debuger konsoli, z którym połączy się aparat MIDebugEngine. Dozwolone wartości to „gdb” i „lldb”.",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Jeśli wartość jest równa true, zostaną załadowane symbole dla wszystkich bibliotek. W przeciwnym razie nie zostaną załadowane symbole solib. Wartość domyślna to true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Lista nazw plików (dozwolone symbole wieloznaczne) rozdzielonych średnikami „;”. Modyfikuje zachowanie elementu LoadAll. Jeśli element LoadAll ma wartość true, nie ładuj symboli dla bibliotek, które pasują do dowolnych nazw na liście. W przeciwnym razie załaduj tylko symbole dla bibliotek, które pasują. Przykład: „foo.so;bar.so;”",
"c_cpp.debuggers.requireExactSource.description": "Opcjonalna flaga, która wymaga bieżącego kodu źródłowego, aby pasowała do pliku PDB.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Nazwa zadania",
"c_cpp.taskDefinitions.command.description": "Ścieżka do kompilatora lub skryptu wykonującego kompilację",
"c_cpp.taskDefinitions.args.description": "Dodatkowe argumenty do przekazania do kompilatora lub skryptu kompilacji",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "Architektura {0} nie jest obsługiwana.",
"apline.containers.not.supported": "Kontenery Alpine nie są obsługiwane.",
"download.button": "Przejdź do strony pobierania",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Ta wersja rozszerzenia systemu {0} {1} jest niezgodna z Twoim systemem operacyjnym. Pobierz i zainstaluj wersję rozszerzenia „{2}”.",
"extension.installation.failed": "Nie można pomyślnie zainstalować rozszerzenia języka C/C++. Aby umożliwić poprawne działanie, należy naprawić lub zainstalować ponownie rozszerzenie dla funkcji języka C/C++.",
"remove.extension": "Spróbuj naprawić",
"jason.files.missing": "Nie można pomyślnie zainstalować rozszerzenia języka C/C++. Aby umożliwić poprawne działanie, należy zainstalować ponownie rozszerzenie dla funkcji języka C/C++.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "BŁĄD: wystąpił błąd funkcji fs.rename: „{0}”. Usuń element {1} ręcznie, aby włączyć debugowanie.",
"failed.at.stage": "Niepowodzenie na etapie: {0}",
"failed.at.stage2": "Jeśli pracujesz w środowisku offline lub często widzisz ten błąd, spróbuj pobrać wersję rozszerzenia ze wszystkimi zależnościami wstępnie uwzględnionymi ze strony {0}, a następnie użyj polecenia „Install from VSIX” (Zainstaluj z VSIX) w programie VS Code, aby ją zainstalować.",
"finished.installing.dependencies": "Zakończono instalowanie zależności"
"finished.installing.dependencies": "Zakończono instalowanie zależności",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Błąd pliku ZIP",
"create.directory.error": "Błąd tworzenia katalogu",
"zip.stream.error": "Błąd odczytu strumienia ZIP",
"read.stream.error": "Błąd w strumieniu odczytu",
"unlink.error": "Błąd podczas odłączania pliku {0}",
"rename.error": "Błąd podczas zmieniania nazwy pliku {0}",
"read.stream.error": "Błąd w strumieniu odczytu",
"write.stream.error": "Błąd w strumieniu zapisu",
"file.already.exists": "Ostrzeżenie: plik „{0}” już istnieje i nie został zaktualizowany."
}
@@ -47,7 +47,7 @@
"windows.sdk.version": "Wersja zestawu Windows SDK",
"windows.sdk.version.description": "Wersja ścieżki dyrektywy include zestawu Windows SDK, która ma być używana w systemie Windows, np. {0}.",
"mac.framework.path": "Ścieżka do platformy Mac",
"mac.framework.path.description": "Lista ścieżek do użycia przez aparat IntelliSense podczas wyszukiwania dołączonych nagłówków z platform Mac. Obsługiwane tylko w przypadku konfiguracji dla systemu MacOS.",
"mac.framework.path.description": "Lista ścieżek do użycia przez aparat IntelliSense podczas wyszukiwania dołączonych nagłówków z platform Mac. Obsługiwane tylko w przypadku konfiguracji dla systemu macOS.",
"one.path.per.line": "Jedna ścieżka na wiersz.",
"forced.include": "Wymuszone dołączanie",
"forced.include.description": "Lista plików, które powinny zostać uwzględnione przed przetworzeniem każdego innego znaku w pliku źródłowym. Pliki są uwzględniane w podanej kolejności.",
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Selecione uma Configuração...",
"c_cpp.command.configurationProviderSelect.title": "Alterar Provedor de Configuração...",
"c_cpp.command.configurationEditJSON.title": "Editar Configurações (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Adicionar caminhos de inclusão de nan e node-addon-api quando eles forem dependências.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Se for true, 'Renomear Símbolo' exigirá um identificador C/C++ válido.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Se esta opção for true, o recurso Preenchimento Automático adicionará automaticamente \"(\" após as chamadas de função e, nesse caso, \")\" também poderá ser adicionado, dependendo do valor da configuração \"editor.autoClosingBrackets\".",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Configure os padrões glob para excluir pastas (e arquivos se \"C_Cpp.exclusionPolicy\" for alterado). Eles são específicos para a extensão C/C++ e são adicionais a \"files.exclude\", mas ao contrário de \"files.exclude\", eles não são removidos da visualização do Explorer. Leia mais sobre padrões glob [aqui](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "O padrão glob ao qual corresponder os caminhos do arquivo. Defina como true ou false para habilitar ou desabilitar o padrão.",
"c_cpp.configuration.filesExcludeWhen.description": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Se esta configuração for true, a substituição do comando do shell do depurador usará o acento grave obsoleto (`).",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: outros resultados de referências",
"c_cpp.debuggers.pipeTransport.description": "Quando presente, isso instrui o depurador a conectar-se a um computador remoto usando outro executável como um pipe que retransmitirá a entrada/saída padrão entre o VS Code e o executável do back-end do depurador habilitado para MI (como gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "O comando do pipe totalmente qualificado para executar.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Argumentos da linha de comando passados para o programa do pipe para configurar a conexão.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Variáveis de ambiente passadas para o programa do pipe.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Se os argumentos individuais do pipeProgram contiverem caracteres (como espaços ou tabulações), eles deverão ser colocados entre aspas? Se 'false', o comando debugger não será mais colocado entre aspas automaticamente. \nO padrão é 'true'.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Sinalizadores opcionais para determinar quais tipos de mensagens devem ser registrados no Console de Depuração.",
"c_cpp.debuggers.logging.exceptions.description": "Sinalizador opcional para determinar se as mensagens de exceção devem ser registradas no Console de Depuração. Usa true como padrão.",
"c_cpp.debuggers.logging.moduleLoad.description": "Sinalizador opcional para determinar se os eventos de carregamento do módulo devem ser registrados no Console de Depuração. Usa true como padrão.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "arquivo .natvis a ser usado durante a depuração deste processo. Esta opção não é compatível com a reformatação automática GDB. Além disso, confira \"showDisplayString\" se estiver usando esta configuração.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "arquivo .natvis a ser usado durante a depuração deste processo.",
"c_cpp.debuggers.showDisplayString.description": "Quando um visualizerFile é especificado, showDisplayString habilita a cadeia de caracteres de exibição. Ativar essa opção pode causar um desempenho mais lento durante a depuração.",
"c_cpp.debuggers.environment.description": "Variáveis de ambiente para adicionar ao ambiente para o programa. Por exemplo: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Variáveis de ambiente para adicionar ao ambiente para o programa. Por exemplo: [ { \"name\": \"config\", \"value\": \"Debug\" } ], não [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Caminho absoluto para um arquivo que contém as definições de variável de ambiente. Este arquivo tem pares chave-valor separados por um sinal de igual por linha. Por exemplo, CHAVE=VALOR",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Lista separada por ponto e vírgula de diretórios a serem usados para pesquisar arquivos .so. Exemplo: \"c:\\dir1;c:\\dir2\".",
"c_cpp.debuggers.MIMode.description": "Indica o depurador de console ao qual o MIDebugEngine será conectado. Os valores permitidos são \"gdb\" \"lldb\".",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "Se for true, os símbolos de todas as bibliotecas serão carregados, caso contrário, não será carregado nenhum símbolo solib. O valor padrão é true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Lista de nomes de arquivo (curingas permitidos) separados por ponto e vírgula ';'. Modifica o comportamento de LoadAll. Se LoadAll for true, não carregue símbolos para bibliotecas que correspondam a um nome na lista. Caso contrário, carregue símbolos somente para bibliotecas que correspondam. Exemplo: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "Sinalizador opcional para exigir que o código-fonte atual corresponda ao PDB.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "O nome da tarefa",
"c_cpp.taskDefinitions.command.description": "O caminho para um compilador ou um script que executa a compilação",
"c_cpp.taskDefinitions.args.description": "Argumentos adicionais a serem passados para o compilador ou para o script de compilação",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "Não há suporte para a arquitetura {0}. ",
"apline.containers.not.supported": "Não há suporte para os contêineres do Alpine.",
"download.button": "Ir para a Página de Download",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Esta versão {0} {1} da extensão é incompatível com seu sistema operacional. Baixe e instale a versão \"{2}\" da extensão.",
"extension.installation.failed": "A extensão C/C++ não foi instalada com êxito. Será necessário reparar ou reinstalar a extensão dos recursos da linguagem C/C++ para que ela funcione corretamente.",
"remove.extension": "Tentar Reparar",
"jason.files.missing": "A extensão C/C++ não foi instalada com êxito. Será necessário reinstalar a extensão dos recursos da linguagem C/C++ para que ela funcione corretamente.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "ERRO: o fs.rename falhou com \"{0}\". Exclua {1} manualmente para habilitar a depuração.",
"failed.at.stage": "Falha na fase: {0}",
"failed.at.stage2": "Se você trabalha em um ambiente offline ou vê este erro repetidamente, tente baixar uma versão da extensão com todas as dependências pré-incluídas de {0} e, em seguida, use o comando \"Instalar do VSIX\" no VS Code para instalá-la.",
"finished.installing.dependencies": "Concluída a instalação de dependências"
"finished.installing.dependencies": "Concluída a instalação de dependências",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Erro no arquivo zip",
"create.directory.error": "Erro ao criar o diretório",
"zip.stream.error": "Erro ao ler o fluxo zip",
"read.stream.error": "Erro no fluxo de leitura",
"unlink.error": "Erro ao desvincular o arquivo {0}",
"rename.error": "Erro ao renomear o arquivo {0}",
"read.stream.error": "Erro no fluxo de leitura",
"write.stream.error": "Erro no fluxo de gravação",
"file.already.exists": "Aviso: o arquivo '{0}' já existe e não foi atualizado."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Выберите конфигурацию...",
"c_cpp.command.configurationProviderSelect.title": "Изменение поставщика конфигурации...",
"c_cpp.command.configurationEditJSON.title": "Изменить конфигурации (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "Добавить пути включения из nan и node-addon-api, если они являются зависимостями.",
"c_cpp.configuration.renameRequiresIdentifier.description": "Если этот параметр имеет значение true, для операции \"Переименование символов\" потребуется указать допустимый идентификатор C/C++.",
"c_cpp.configuration.autocompleteAddParentheses.description": "Если значение — true, автозаполнение автоматически добавит \"(\" после вызовов функции, и в этом случае также может добавить \")\" в зависимости от значения параметра \"editor.autoClosingBrackets\".",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Настройте стандартные маски для исключения папок (и файлов, если внесено изменение в \"C_Cpp.exclusionPolicy\"). Они специфичны для расширения C/C++ и дополняют \"files.exclude\", но в отличие от \"files.exclude\" они не удаляются из представления обозревателя. Дополнительные сведения о стандартных масках см. [здесь] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "Стандартная маска, соответствующая путям к файлам. Задайте значение true или false, чтобы включить или отключить маску.",
"c_cpp.configuration.filesExcludeWhen.description": "Дополнительная проверка элементов того же уровня соответствующего файла. Используйте $(basename) в качестве переменной для соответствующего имени файла.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "Если задано значение true, для подстановки команд оболочки отладчика будет использоваться устаревший обратный апостроф (`).",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: результаты по другим ссылкам",
"c_cpp.debuggers.pipeTransport.description": "При наличии сообщает отладчику о необходимости подключения к удаленному компьютеру с помощью другого исполняемого файла в качестве канала, который будет пересылать стандартный ввод и вывод между VS Code и исполняемым файлом отладчика с поддержкой MI в серверной части (например, gdb).",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Полная команда канала для выполнения.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Аргументы командной строки, переданные в программу канала для настройки подключения.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Переменные среды, переданные в программу канала.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "Определяет, должны ли быть заключены в кавычки отдельные аргументы pipeProgram, если эти аргументы содержат символы (такие как пробелы или символы табуляции). Если задано значение \"false\", команда отладчика больше не будет автоматически заключаться в кавычки. \nЗначение по умолчанию — \"true\".",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Необязательные флаги для определения типов сообщений, регистрируемых в консоли отладки.",
"c_cpp.debuggers.logging.exceptions.description": "Необязательный флаг, определяющий, следует ли регистрировать сообщения об исключениях в консоли отладки. По умолчанию принимает значение true.",
"c_cpp.debuggers.logging.moduleLoad.description": "Необязательный флаг, определяющий, следует ли регистрировать события загрузки модулей в консоли отладки. По умолчанию принимает значение true.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Файл NATVIS, используемый при отладке этого процесса. Этот параметр несовместим с автоматическим форматированием GDB. Если этот параметр используется, см. также описание \"showDisplayString\".",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Файл NATVIS, используемый при отладке этого процесса.",
"c_cpp.debuggers.showDisplayString.description": "Если указано значение visualizerFile, showDisplayString включит отображаемую строку. Включение этого параметра может привести к снижению производительности во время отладки.",
"c_cpp.debuggers.environment.description": "Переменные среды для добавления в среду для программы. Пример: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Переменные среды для добавления в среду для программы. Пример: [ { \"name\": \"config\", \"value\": \"Debug\" } ], not [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Абсолютный путь к файлу, содержащему определения переменных среды. Этот файл содержит пары \"ключ-значение\", разделенные знаком равенства и разнесенные по строкам. Например, \"ключ=значение\"",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Список каталогов, разделенных точкой с запятой, который следует использовать для поиска файлов SO. Пример: \"c:\\каталог_1;c:\\каталог_2\".",
"c_cpp.debuggers.MIMode.description": "Указывает отладчик консоли, к которому подключится MIDebugEngine. Допустимые значения: \"gdb\" \"lldb\".",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "При значении true (истина) будут загружаться символы для всех библиотек. В противном случае символы общих библиотек (solib) загружаться не будут. По умолчанию: true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Список имен файлов (допустимы подстановочные знаки), разделенных точкой с запятой (\";\") изменяет работу LoadAll. Если LoadAll имеет значение true (истина), то для библиотек, имя которых соответствует какому-либо имени в списке, символы загружаться не будут. В противном случае символы будут загружаться только для библиотек с именами из списка. Пример: \"foo.so;bar.so\".",
"c_cpp.debuggers.requireExactSource.description": "Необязательный флаг, требующий соответствия текущего исходного кода PDB-файлу.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Имя задачи",
"c_cpp.taskDefinitions.command.description": "Путь к компилятору или скрипту, выполняющему компиляцию",
"c_cpp.taskDefinitions.args.description": "Дополнительные аргументы для передачи компилятору или скрипту компиляции",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "Архитектура {0} не поддерживается. ",
"apline.containers.not.supported": "Контейнеры Alpine не поддерживаются.",
"download.button": "Перейти к странице скачивания",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Версия расширения для {0} {1} несовместима с вашей ОС. Скачайте и установите версию расширения \"{2}\".",
"extension.installation.failed": "Установить расширение C/C++ не удалось. Исправьте или переустановите расширение функций языка C/C++ для корректной работы.",
"remove.extension": "Попытка исправления",
"jason.files.missing": "Установить расширение C/C++ не удалось. Переустановите расширение функций языка C/C++ для корректной работы.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "Ошибка: сбой fs.rename с \"{0}\". Удалите {1} вручную, чтобы включить отладку.",
"failed.at.stage": "Сбой на этапе: {0}",
"failed.at.stage2": "Если вы работаете в автономной среде или постоянно видите эту ошибку, попробуйте скачать версию расширения, в которую уже включены все зависимости, перейдя на следующую страницу: {0}. Затем выберите \"Установить из VSIX\" в VS Code, чтобы установить расширение.",
"finished.installing.dependencies": "Завершена установка зависимостей"
"finished.installing.dependencies": "Завершена установка зависимостей",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Ошибка в ZIP-файле",
"create.directory.error": "Ошибка при создании каталога",
"zip.stream.error": "Ошибка при чтении потока zip",
"read.stream.error": "Ошибка в потоке чтения",
"unlink.error": "Ошибка при удалении связи файла {0}",
"rename.error": "Ошибка при переименовании файла {0}",
"read.stream.error": "Ошибка в потоке чтения",
"write.stream.error": "Ошибка в потоке записи",
"file.already.exists": "Предупреждение: файл \"{0}\" уже существует и не был обновлен."
}
+10 -5
View File
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
// Do not edit this file. It is machine generated.
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Yapılandırma Seçin...",
"c_cpp.command.configurationProviderSelect.title": "Yapılandırma Sağlayıcısını Değiştir...",
"c_cpp.command.configurationEditJSON.title": "Yapılandırmaları Düzenle (JSON)",
@@ -170,9 +171,9 @@
"c_cpp.configuration.addNodeAddonIncludePaths.description": "nan ve node-addon-api bağımlılık olduğunda bunlardan ekleme yolları ekleyin.",
"c_cpp.configuration.renameRequiresIdentifier.description": "True ise, 'Sembolü Yeniden Adlandır' işlemi için geçerli bir C/C++ tanımlayıcısı gerekir.",
"c_cpp.configuration.autocompleteAddParentheses.description": "True ise otomatik tamamla özelliği, işlev çağrılarından sonra otomatik olarak \"(\" ekler. Bazı durumlarda \"editor.autoClosingBrackets\" ayarının değerine bağlı olarak \")\" karakteri de eklenebilir.",
"c_cpp.configuration.filesExclude.description": "Configure glob patterns for excluding folders (and files if \"C_Cpp.exclusionPolicy\" is changed). These are specific to the C/C++ extension and are in addition to \"files.exclude\", but unlike \"files.exclude\" they are not removed from the Explorer view. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).",
"c_cpp.configuration.filesExcludeBoolean.description": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.",
"c_cpp.configuration.filesExcludeWhen.description": "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.",
"c_cpp.configuration.filesExclude.description": "Klasörleri (ve \"C_Cpp.exclusionPolicy\" değiştirilmişse dosyaları) dışlamak için glob desenlerini yapılandırın. Bunlar C/C++ uzantısına özgüdür ve \"files.exclude\" ayarına ektir ancak \"files.exclude\" ayarından farklı olarak Explorer görünümünden kaldırılmazlar. Glob desenleri hakkında [burada] (https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) daha fazlasını okuyun.",
"c_cpp.configuration.filesExcludeBoolean.description": "Dosya yollarıyla eşleşecek glob deseni. Deseni etkinleştirmek veya devre dışı bırakmak için true ya da false olarak ayarlayın.",
"c_cpp.configuration.filesExcludeWhen.description": "Eşleşen bir dosyanın eşdüzey öğeleri üzerinde ek denetim. Eşleşen dosya adı için değişken olarak $(basename) kullanın.",
"c_cpp.configuration.debugger.useBacktickCommandSubstitution.description": "True ise, hata ayıklayıcı kabuk komut değiştirme eski kesme işaretini (`) kullanır.",
"c_cpp.contributes.views.cppReferencesView.title": "C/C++: Diğer başvuru sonuçları",
"c_cpp.debuggers.pipeTransport.description": "Mevcut olduğunda, hata ayıklayıcısına, VS Code ile MI özellikli hata ayıklayıcısı arka uç yürütülebilir dosyası (gdb gibi) arasında standart giriş/çıkış geçişi sağlayan bir kanal olarak görev yapacak başka bir yürütülebilir dosya aracılığıyla uzak bilgisayara bağlanmasını söyler.",
@@ -183,7 +184,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "Çalıştırılacak tam kanal komutu.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Bağlantıyı yapılandırmak için kanal programına geçirilen komut satırı bağımsız değişkenleri.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Kanal programına geçirilen ortam değişkenleri.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "pipeProgram'a ait tek tek bağımsız değişkenler, boşluk veya sekme gibi karakterler içeriyorsa bunlar tırnak içine alınmalı mı? 'False' olarak ayarlanırsa, hata ayıklayıcısı komutu otomatik olarak tırnak içine alınmaz. \nVarsayılan değer: 'true'.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Hata Ayıklama Konsoluna ne tür iletilerin kaydedilmesi gerektiğini belirleyen isteğe bağlı bayraklar.",
"c_cpp.debuggers.logging.exceptions.description": "Özel durum iletilerinin Hata Ayıklama Konsoluna kaydedilmesi gerekip gerekmediğini belirleyen isteğe bağlı bayrak. Varsayılan olarak true değerini alır.",
"c_cpp.debuggers.logging.moduleLoad.description": "Modül yükleme olaylarının Hata Ayıklama Konsoluna kaydedilmesi gerekip gerekmediğini belirleyen isteğe bağlı bayrak. Varsayılan olarak true değerini alır.",
@@ -208,7 +209,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": "Bu işlemde hata ayıklanırken kullanılacak .natvis dosyası. Bu seçenek, GDB düzgün yazdırma ile uyumlu değil. Lütfen bu ayar kullanılıyorsa ayrıca bkz: \"showDisplayString\".",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": "Bu işlemde hata ayıklanırken kullanılacak .natvis dosyası.",
"c_cpp.debuggers.showDisplayString.description": "Bir visualizerFile belirtildiğinde showDisplayString, görünen dizeyi etkinleştirir. Bu seçeneğin etkinleştirilmesi hata ayıklama sırasında daha düşük performansa neden olabilir.",
"c_cpp.debuggers.environment.description": "Program ortamına eklenecek ortam değişkenleri. Örnek: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Program ortamına eklenecek ortam değişkenleri. Örnek: [ { \"name\": \"config\", \"value\": \"Debug\" } ], [ { \"config\": \"Debug\" } ] değil.",
"c_cpp.debuggers.envFile.description": "Ortam değişkeni tanımlarını içeren bir dosyanın mutlak yolu. Bu dosyada, satır başına eşittir işaretiyle ayrılmış anahtar değer çiftleri bulunur. Ör. ANAHTAR=DEĞER",
"c_cpp.debuggers.additionalSOLibSearchPath.description": ".so dosyalarını aramak için kullanılacak dizinlerin noktalı virgülle ayrılmış listesi. Örnek: \"c:\\dizin1;c:\\dizin2\".",
"c_cpp.debuggers.MIMode.description": "MIDebugEngine'in bağlanacağı konsol hata ayıklayıcısını belirtir. İzin verilen değerler: \"gdb\" \"lldb\".",
@@ -240,6 +241,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "True ise tüm kitaplıklar için semboller yüklenir, aksi halde hiçbir solib sembolü yüklenmez. Varsayılan değer: true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "Noktalı virgülle ';' ayrılmış dosya adları listesi (joker karakterlere izin verilir). LoadAll davranışını değiştirir. LoadAll değeri true ise, listedeki herhangi bir adla eşleşen kitaplıklar için sembolleri yüklemeyin. Aksi takdirde yalnızca eşleşen kitaplıklar için sembolleri yükleyin. Örnek: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "Geçerli kaynak kodunun pdb ile eşleşmesini gerektiren isteğe bağlı bayrak.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "Görevin adı",
"c_cpp.taskDefinitions.command.description": "Derlemeyi gerçekleştiren derleyici ya da betiğin yolu",
"c_cpp.taskDefinitions.args.description": "Derleyici veya derleme betiğine geçirilecek ek bağımsız değişkenler",
+3 -3
View File
@@ -7,8 +7,7 @@
"architecture.not.supported": "{0} mimarisi desteklemiyor.",
"apline.containers.not.supported": "Alpine kapsayıcıları desteklenmiyor.",
"download.button": "İndirmeler Sayfasına Git",
"native.binaries.mismatch.osx": "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.",
"native.binaries.not.supported": "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.",
"native.binaries.not.supported": "Uzantının bu {0} {1} sürümü, işletim sisteminizle uyumlu değil. Lütfen uzantının \"{2}\" sürümünü indirip yükleyin.",
"extension.installation.failed": "C/C++ uzantısı başarıyla yüklenemedi. C/C++ dil özelliklerinin düzgün çalışması için uzantıyı onarmanız veya yeniden yüklemeniz gerekir.",
"remove.extension": "Onarmayı Dene",
"jason.files.missing": "C/C++ uzantısı başarıyla yüklenemedi. C/C++ dil özelliklerinin düzgün çalışabilmesi için uzantıyı yeniden yüklemeniz gerekir.",
@@ -17,5 +16,6 @@
"rename.failed.delete.manually": "HATA: fs.rename, \"{0}\" ile başarısız oldu. Hata ayıklamayı etkinleştirmek için {1} dosyasını kendiniz silin.",
"failed.at.stage": "Şu aşamada başarısız oldu: {0}",
"failed.at.stage2": "Çevrimdışı bir ortamda çalışıyorsanız veya bu hatayı sürekli olarak görüyorsanız uzantının önceden eklenmiş tüm bağımlılıklara sahip bir sürümünü {0} adresinden indirmeyi deneyin ve sonra VS Code'da \"VSIX'ten yükle\" komutunu kullanarak uzantıyı yükleyin.",
"finished.installing.dependencies": "Bağımlılıkların yüklenmesi tamamlandı"
"finished.installing.dependencies": "Bağımlılıkların yüklenmesi tamamlandı",
"failed.installing.dependencies": "Failed installing dependencies"
}
@@ -26,9 +26,9 @@
"zip.file.error": "Zip dosyası hatası",
"create.directory.error": "Dizin oluşturulurken hata oluştu",
"zip.stream.error": "Zip akışı okuma hatası",
"read.stream.error": "Akış okunurken hata",
"unlink.error": "{0} dosyasının bağlantısı kaldırılırken hata oluştu",
"rename.error": "{0} dosyası yeniden adlandırılırken hata oluştu",
"read.stream.error": "Akış okunurken hata",
"write.stream.error": "Akışa yazılırken hata",
"file.already.exists": "Uyarı: '{0}' dosyası zaten var ve güncelleştirilmedi."
}
+208 -26
View File
@@ -2,7 +2,7 @@
"name": "cpptools",
"displayName": "C/C++",
"description": "C/C++ IntelliSense, debugging, and code browsing.",
"version": "1.3.0-main",
"version": "1.4.0-main",
"publisher": "ms-vscode",
"icon": "LanguageCCPP_color_128x.png",
"readme": "README.md",
@@ -37,11 +37,169 @@
"Linters",
"Snippets"
],
"capabilities": {
"untrustedWorkspaces": {
"supported": false,
"description": "%c_cpp.capabilities.untrustedWorkspaces.description%"
},
"virtualWorkspaces": false
},
"activationEvents": [
"*"
],
"main": "./dist/main",
"contributes": {
"walkthroughs": [
{
"id": "cppWelcome",
"title": "Get Started with C++ Development",
"description": "Dive into VS Code's rich C++ development experience.",
"steps": [
{
"id": "verify.compiler.mac",
"title": "Install a C++ compiler",
"description": "The C++ extension uses the C++ compiler on your system to configure IntelliSense for your project. \n[Check for C++ compilers](command:C_Cpp.CheckForCompiler)",
"when": "isMac",
"media": {
"altText": "A markdown file with instructions for installing Clang on macOS.",
"path": "walkthrough/installcompiler/install-clang-macos.md"
}
},
{
"id": "verify.compiler.linux",
"title": "Install a C++ compiler",
"description": "The C++ extension uses the C++ compiler on your system to configure IntelliSense for your project. \n[Check for C++ compilers](command:C_Cpp.CheckForCompiler)",
"when": "isLinux",
"media": {
"altText": "A markdown file with instructions for installing GCC on Linux.",
"path": "walkthrough/installcompiler/install-gcc-linux.md"
}
},
{
"id": "verify.compiler.windows",
"title": "Install a C++ compiler",
"description": "The C++ extension uses the C++ compiler on your system to configure IntelliSense for your project. \n[Check for C++ compilers](command:C_Cpp.CheckForCompiler)",
"when": "isWindows",
"media": {
"altText": "A markdown file with instructions for installing MSVC on Windows.",
"path": "walkthrough/installcompiler/install-compiler-windows.md"
}
},
{
"id": "open.project",
"title": "Open your project folder",
"description": "Open an existing folder that contains your C++ project, or create a new folder. \n[Pick a folder](command:workbench.action.files.openFolder)",
"when": "workspaceFolderCount == 0",
"media": {
"altText": "A screenshot that shows a C++ project opened in the file Explorer.",
"path": {
"light": "walkthrough/images/cpp-folder-explorer-light.png",
"dark": "walkthrough/images/cpp-folder-explorer-dark.png",
"hc": "walkthrough/images/cpp-folder-explorer-hc.png"
}
}
},
{
"id": "setup.intellisense",
"title": "Configure C++ IntelliSense",
"description": "Verify important IntelliSense settings like Compiler Path, Compiler Args, IntelliSense Mode, and Include Path. \n[Open IntelliSense Configuration](command:C_Cpp.ConfigurationEditUI?-2)",
"media": {
"altText": "A screenshot that shows the IntelliSense Configurations UI with important settings highlighted.",
"path": {
"light": "walkthrough/images/intellisense-config-light.png",
"dark": "walkthrough/images/intellisense-config-dark.png",
"hc": "walkthrough/images/intellisense-config-hc.png"
}
}
},
{
"id": "build.project.mac",
"title": "Build your C++ file",
"description": "Create a default build task for your project. \n[Learn more](https://code.visualstudio.com/docs/cpp/config-clang-mac#_build-helloworldcpp)",
"when": "isMac",
"media": {
"altText": "A markdown file with instructions for configuring the default build task on macOS with Clang.",
"path": "walkthrough/buildtask/build-project-mac.md"
}
},
{
"id": "build.project.linux",
"title": "Build your C++ file",
"description": "Create a default build task for your project. \n[Learn more](https://code.visualstudio.com/docs/cpp/config-linux#_build-helloworldcpp)",
"when": "isLinux",
"media": {
"altText": "A markdown file with instructions for configuring the default build task on Linux with GCC.",
"path": "walkthrough/buildtask/build-project-linux.md"
}
},
{
"id": "build.project.windows",
"title": "Build your C++ file",
"description": "Create a default build task for your project. \n[Learn more](https://code.visualstudio.com/docs/cpp/config-msvc#_build-helloworldcpp)",
"when": "isWindows",
"media": {
"altText": "A markdown file with instructions for configuring the default build task on Windows with MSVC.",
"path": "walkthrough/buildtask/build-project-windows.md"
}
},
{
"id": "run.project.mac",
"title": "Run and debug your C++ file",
"description": "Create a debug configuration for your project. \n[Learn more](https://code.visualstudio.com/docs/cpp/config-clang-mac#_debug-helloworldcpp)",
"when": "isMac",
"media": {
"altText": "A markdown file with instructions for starting a debugging session on macOS.",
"path": "walkthrough/debugconfig/run-and-debug-project-mac.md"
}
},
{
"id": "run.project.linux",
"title": "Run and debug your C++ file",
"description": "Create a debug configuration for your project. \n[Learn more](https://code.visualstudio.com/docs/cpp/config-linux#_debug-helloworldcpp)",
"when": "isLinux",
"media": {
"altText": "A markdown file with instructions for starting a debugging session on Linux.",
"path": "walkthrough/debugconfig/run-and-debug-project-linux.md"
}
},
{
"id": "run.project.windows",
"title": "Run and debug your C++ file",
"description": "Create a debug configuration for your project. \n[Learn more](https://code.visualstudio.com/docs/cpp/config-msvc#_debug-helloworldcpp)",
"when": "isWindows",
"media": {
"altText": "A markdown file with instructions for starting a debugging session on Windows.",
"path": "walkthrough/debugconfig/run-and-debug-project-windows.md"
}
},
{
"id": "install.cmake.tools",
"title": "Install CMake Tools",
"description": "Do you build your project with CMake? Install the CMake Tools extension to seamlessly build and debug your CMake project. \n[Install CMake Tools](command:workbench.extensions.installExtension?%22ms-vscode.cmake-tools%22)",
"completionEvents": [
"extensionInstalled:ms-vscode.cmake-tools"
],
"media": {
"altText": "A screenshot of the CMake Tools extension page in the Marketplace.",
"path": {
"light": "walkthrough/images/cmake-tools-light.png",
"dark": "walkthrough/images/cmake-tools-dark.png",
"hc": "walkthrough/images/cmake-tools-hc.png"
}
}
},
{
"id": "watch.tutorials",
"title": "Lean back and get started",
"description": "Watch this series of short and practical videos about setting up C++ IntelliSense and building and debugging C++ projects. \n[Watch Tutorials](https://code.visualstudio.com/docs/cpp/introvideos-cpp)",
"media": {
"altText": "A screenshot with a preview of the video tutorial and a play button.",
"path": "walkthrough/images/getting-started-video.png"
}
}
]
}
],
"taskDefinitions": [
{
"type": "cppbuild",
@@ -1680,6 +1838,28 @@
"default": ""
}
}
},
"stopAtConnect": {
"type": "boolean",
"description": "%c_cpp.debuggers.stopAtConnect.description%",
"default": false
},
"hardwareBreakpoints": {
"description": "%c_cpp.debuggers.hardwareBreakpoints.description%",
"default": {},
"type": "object",
"properties": {
"require": {
"type": "boolean",
"description": "%c_cpp.debuggers.hardwareBreakpoints.require.description%",
"default": false
},
"limit": {
"type": "integer",
"description": "%c_cpp.debuggers.hardwareBreakpoints.limit.description%",
"default": 0
}
}
}
}
},
@@ -2434,14 +2614,14 @@
"@types/vscode": "1.53.0",
"@types/which": "^1.3.2",
"@types/yauzl": "^2.9.1",
"@typescript-eslint/eslint-plugin": "^2.19.2",
"@typescript-eslint/eslint-plugin-tslint": "^2.19.2",
"@typescript-eslint/parser": "^2.19.2",
"@typescript-eslint/eslint-plugin": "^4.22.1",
"@typescript-eslint/eslint-plugin-tslint": "^4.22.1",
"@typescript-eslint/parser": "^4.22.1",
"async-child-process": "^1.1.1",
"await-notify": "^1.0.1",
"eslint": "^6.8.0",
"eslint-plugin-import": "^2.20.1",
"eslint-plugin-jsdoc": "^21.0.0",
"eslint": "^7.25.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsdoc": "^33.1.0",
"event-stream": "^4.0.1",
"fs-extra": "^8.1.0",
"glob": "^7.1.6",
@@ -2455,6 +2635,7 @@
"http-proxy-agent": "^2.1.0",
"minimist": "^1.2.5",
"mocha": "^8.3.2",
"parse-git-config": "^3.0.0",
"parse5": "^5.1.0",
"parse5-traverse": "^1.0.3",
"ts-loader": "^8.1.0",
@@ -2487,7 +2668,8 @@
"resolutions": {
"**/mkdirp/minimist": "^0.2.1",
"yargs-parser": "^15.0.1",
"y18n": "^5.0.5"
"y18n": "^5.0.5",
"hosted-git-info": "^3.0.8"
},
"runtimeDependencies": [
{
@@ -2598,7 +2780,7 @@
},
{
"description": "ClangFormat (Linux / x86_64)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152861",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162325",
"platforms": [
"linux"
],
@@ -2608,11 +2790,11 @@
"binaries": [
"./LLVM/bin/clang-format"
],
"integrity": "B29779E4FE3D03094655FD24CC17B55B41518EDDCCB1E3DF3F4665F9685152E0"
"integrity": "3F10BAD92274A07DB5DE0FD922C0CEDA034DECDB9E73DC477DD43CF30B500A7B"
},
{
"description": "ClangFormat (Linux / armhf)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152860",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162327",
"platforms": [
"linux"
],
@@ -2622,11 +2804,11 @@
"binaries": [
"./LLVM/bin/clang-format"
],
"integrity": "F1CD21F581715A2C2A3B10C8D33FF81E5CBCD58856AA73CA56A88B5F085EA0D7"
"integrity": "1098291D78FB3E9411C445218BE14D1A96E7242E0B70549DA499C6551D8CA538"
},
{
"description": "ClangFormat (Linux / aarch64)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152922",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162412",
"platforms": [
"linux"
],
@@ -2636,11 +2818,11 @@
"binaries": [
"./LLVM/bin/clang-format"
],
"integrity": "97B2A5A274F53FBB37485A383AD379CD556E85413BF843F0F0FD10536A0D705D"
"integrity": "CD5578A21C8D515D15C0611621E44C03DE4E667EFB4EE1A0DE18B08FD9B96794"
},
{
"description": "ClangFormat (OS X)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152859",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162416",
"platforms": [
"darwin"
],
@@ -2650,11 +2832,11 @@
"binaries": [
"./LLVM/bin/clang-format.darwin"
],
"integrity": "7AA436BA25E3404DC658A137188BEC65FF2532D1FEB314ABBBC5EBC9AAF5CCF7"
"integrity": "62A2ECB43511129F920D87BAE9230A803B54712038BCCB485F8F10B84B1A2000"
},
{
"description": "ClangFormat (OS X arm64)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2160917",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162413",
"platforms": [
"darwin"
],
@@ -2664,11 +2846,11 @@
"binaries": [
"./LLVM/bin/clang-format.darwin"
],
"integrity": "BF5357714856AC08A69FAD4231C9EFBE47E97497D8E227E1506FCAA1C89D11E0"
"integrity": "90AD3B05EC9C0A706C440B99AC39000F97EFE8BBAB9A000834E18F8112468147"
},
{
"description": "ClangFormat (Windows x86)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152921",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162326",
"platforms": [
"win32"
],
@@ -2678,11 +2860,11 @@
"binaries": [
"./LLVM/bin/clang-format.exe"
],
"integrity": "993A65F61F4BF6CA6FEF6F9C1B6EB4341CE63F30A72272CABA65392695764DA7"
"integrity": "928AF7C36F0E148537D8DF4D7AEEAD8A18DF9E4CA5C8BF23E49776EFBE078453"
},
{
"description": "ClangFormat (Windows x64)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152923",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162415",
"platforms": [
"win32"
],
@@ -2692,11 +2874,11 @@
"binaries": [
"./LLVM/bin/clang-format.exe"
],
"integrity": "5E271FD44792B3675136A34466F67A876174B7818533CF37486372E43E014E62"
"integrity": "7977B82D6BD88C1AEB5071146EDCB45976D1EA66E312EEF9156957CAD0702F35"
},
{
"description": "ClangFormat (Windows arm64)",
"url": "https://go.microsoft.com/fwlink/?LinkID=2152862",
"url": "https://go.microsoft.com/fwlink/?LinkID=2162414",
"platforms": [
"win32"
],
@@ -2706,7 +2888,7 @@
"binaries": [
"./LLVM/bin/clang-format.exe"
],
"integrity": "9944827F70A8C53127B1A7860401923DED2DB7FBAD75E7A8106636891C11F832"
"integrity": "6756365C82B5BD90C6A40C13CF8E3599E4A1DB50628111FFDB3A76FF85256BA4"
},
{
"description": "Mono Framework Assemblies",
@@ -2802,7 +2984,7 @@
},
{
"description": "Visual Studio Windows Debugger",
"url": "https://go.microsoft.com/fwlink/?linkid=2153010",
"url": "https://go.microsoft.com/fwlink/?linkid=2162486",
"platforms": [
"win32"
],
@@ -2813,7 +2995,7 @@
"binaries": [
"./debugAdapters/vsdbg/bin/vsdbg.exe"
],
"integrity": "52C4234976D527A7BF02EB2E8844F3C605DC4BD1D3847F83C8675CD23967BAB3"
"integrity": "E5046509D510086B99F171595114220AD8E9F820E7238B6A5199CD78B9AD2078"
}
]
}
+7 -2
View File
@@ -1,4 +1,5 @@
{
"c_cpp.capabilities.untrustedWorkspaces.description": "Multiple settings can cause processes local to the workspace to be executed, e.g. C_Cpp.clang_format_path, C_Cpp.addNodeAddonIncludePaths, C_Cpp.default.compilerPath, C_Cpp.default.configurationProvider, and C_Cpp.default.compileCommands, and the equivalent properties in c_cpp_properties.json.",
"c_cpp.command.configurationSelect.title": "Select a Configuration...",
"c_cpp.command.configurationProviderSelect.title": "Change Configuration Provider...",
"c_cpp.command.configurationEditJSON.title": "Edit Configurations (JSON)",
@@ -178,7 +179,7 @@
"c_cpp.debuggers.pipeTransport.pipeProgram.description": "The fully qualified pipe command to execute.",
"c_cpp.debuggers.pipeTransport.pipeArgs.description": "Command line arguments passed to the pipe program to configure the connection.",
"c_cpp.debuggers.pipeTransport.pipeEnv.description": "Environment variables passed to the pipe program.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. \nDefault is 'true'.",
"c_cpp.debuggers.pipeTransport.quoteArgs.description": "If the pipeProgram's individual arguments contain characters (such as spaces or tabs), should it be quoted? If 'false', the debugger command will no longer be automatically quoted. Default is 'true'.",
"c_cpp.debuggers.logging.description": "Optional flags to determine what types of messages should be logged to the Debug Console.",
"c_cpp.debuggers.logging.exceptions.description": "Optional flag to determine whether exception messages should be logged to the Debug Console. Defaults to true.",
"c_cpp.debuggers.logging.moduleLoad.description": "Optional flag to determine whether module load events should be logged to the Debug Console. Defaults to true.",
@@ -203,7 +204,7 @@
"c_cpp.debuggers.cppdbg.visualizerFile.description": ".natvis file to be used when debugging this process. This option is not compatible with GDB pretty printing. Please also see \"showDisplayString\" if using this setting.",
"c_cpp.debuggers.cppvsdbg.visualizerFile.description": ".natvis file to be used when debugging this process.",
"c_cpp.debuggers.showDisplayString.description": "When a visualizerFile is specified, showDisplayString will enable the display string. Turning this option on can cause slower performance during debugging.",
"c_cpp.debuggers.environment.description": "Environment variables to add to the environment for the program. Example: [ { \"name\": \"squid\", \"value\": \"clam\" } ].",
"c_cpp.debuggers.environment.description": "Environment variables to add to the environment for the program. Example: [ { \"name\": \"config\", \"value\": \"Debug\" } ], not [ { \"config\": \"Debug\" } ].",
"c_cpp.debuggers.envFile.description": "Absolute path to a file containing environment variable definitions. This file has key value pairs separated by an equals sign per line. E.g. KEY=VALUE",
"c_cpp.debuggers.additionalSOLibSearchPath.description": "Semicolon separated list of directories to use to search for .so files. Example: \"c:\\dir1;c:\\dir2\".",
"c_cpp.debuggers.MIMode.description": "Indicates the console debugger that the MIDebugEngine will connect to. Allowed values are \"gdb\" \"lldb\".",
@@ -235,6 +236,10 @@
"c_cpp.debuggers.symbolLoadInfo.loadAll.description": "If true, symbols for all libs will be loaded, otherwise no solib symbols will be loaded. Default value is true.",
"c_cpp.debuggers.symbolLoadInfo.exceptionList.description": "List of filenames (wildcards allowed) separated by semicolons ';'. Modifies behavior of LoadAll. If LoadAll is true then don't load symbols for libs that match any name in the list. Otherwise only load symbols for libs that match. Example: \"foo.so;bar.so\"",
"c_cpp.debuggers.requireExactSource.description": "Optional flag to require current source code to match the pdb.",
"c_cpp.debuggers.stopAtConnect.description": "If true, the debugger should stop after connecting to the target. If false, the debugger will continue after connecting. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.description": "Explicit control of hardware breakpoint behavior for remote targets.",
"c_cpp.debuggers.hardwareBreakpoints.require.description": "If true, always use hardware breakpoints. Defaults to false.",
"c_cpp.debuggers.hardwareBreakpoints.limit.description": "Optional limit on the number of available hardware breakpoints to use. Only enforced when \"require\" is true and \"limit\" is greater than 0. Defaults to 0.",
"c_cpp.taskDefinitions.name.description": "The name of the task",
"c_cpp.taskDefinitions.command.description": "The path to either a compiler or script that performs compilation",
"c_cpp.taskDefinitions.args.description": "Additional arguments to pass to the compiler or compilation script",
+34 -36
View File
@@ -30,44 +30,42 @@ export interface AttachItem extends vscode.QuickPickItem {
id?: string;
}
export function showQuickPick(getAttachItems: () => Promise<AttachItem[]>): Promise<string | undefined> {
return getAttachItems().then(processEntries =>
new Promise<string>((resolve, reject) => {
const quickPick: vscode.QuickPick<AttachItem> = vscode.window.createQuickPick<AttachItem>();
quickPick.title = localize("attach.to.process", "Attach to process");
quickPick.canSelectMany = false;
quickPick.matchOnDescription = true;
quickPick.matchOnDetail = true;
quickPick.placeholder = localize("select.process.attach", "Select the process to attach to");
quickPick.items = processEntries;
quickPick.buttons = [new RefreshButton()];
// We should not await on this function.
export async function showQuickPick(getAttachItems: () => Promise<AttachItem[]>): Promise<string | undefined> {
const processEntries: AttachItem[] = await getAttachItems();
return new Promise<string | undefined>((resolve, reject) => {
const quickPick: vscode.QuickPick<AttachItem> = vscode.window.createQuickPick<AttachItem>();
quickPick.title = localize("attach.to.process", "Attach to process");
quickPick.canSelectMany = false;
quickPick.matchOnDescription = true;
quickPick.matchOnDetail = true;
quickPick.placeholder = localize("select.process.attach", "Select the process to attach to");
quickPick.buttons = [new RefreshButton()];
quickPick.items = processEntries;
const disposables: vscode.Disposable[] = [];
const disposables: vscode.Disposable[] = [];
quickPick.onDidTriggerButton(button => {
getAttachItems().then(processEntries => quickPick.items = processEntries);
}, undefined, disposables);
quickPick.onDidAccept(() => {
if (quickPick.selectedItems.length !== 1) {
reject(new Error(localize("process.not.selected", "Process not selected.")));
}
const selectedId: string | undefined = quickPick.selectedItems[0].id;
disposables.forEach(item => item.dispose());
quickPick.dispose();
resolve(selectedId);
}, undefined, disposables);
quickPick.onDidHide(() => {
disposables.forEach(item => item.dispose());
quickPick.dispose();
quickPick.onDidTriggerButton(async () => { quickPick.items = await getAttachItems(); }, undefined, disposables);
quickPick.onDidAccept(() => {
if (quickPick.selectedItems.length !== 1) {
reject(new Error(localize("process.not.selected", "Process not selected.")));
}, undefined, disposables);
}
quickPick.show();
}));
const selectedId: string | undefined = quickPick.selectedItems[0].id;
disposables.forEach(item => item.dispose());
quickPick.dispose();
resolve(selectedId);
}, undefined, disposables);
quickPick.onDidHide(() => {
disposables.forEach(item => item.dispose());
quickPick.dispose();
reject(new Error(localize("process.not.selected", "Process not selected.")));
}, undefined, disposables);
quickPick.show();
});
}
+98 -102
View File
@@ -8,7 +8,6 @@ import { AttachItem, showQuickPick } from './attachQuickPick';
import { CppSettings } from '../LanguageServer/settings';
import * as debugUtils from './utils';
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import * as util from '../common';
@@ -25,14 +24,13 @@ export interface AttachItemsProvider {
export class AttachPicker {
constructor(private attachItemsProvider: AttachItemsProvider) { }
public ShowAttachEntries(): Promise<string | undefined> {
return util.isExtensionReady().then(ready => {
if (!ready) {
util.displayExtensionNotReadyPrompt();
} else {
return showQuickPick(() => this.attachItemsProvider.getAttachItems());
}
});
// We should not await on this function.
public async ShowAttachEntries(): Promise<string | undefined> {
if (!await util.isExtensionReady()) {
util.displayExtensionNotReadyPrompt();
} else {
return showQuickPick(() => this.attachItemsProvider.getAttachItems());
}
}
}
@@ -43,66 +41,66 @@ export class RemoteAttachPicker {
private _channel: vscode.OutputChannel;
public ShowAttachEntries(config: any): Promise<string | undefined> {
return util.isExtensionReady().then(ready => {
if (!ready) {
util.displayExtensionNotReadyPrompt();
} else {
this._channel.clear();
public async ShowAttachEntries(config: any): Promise<string | undefined> {
if (!await util.isExtensionReady()) {
util.displayExtensionNotReadyPrompt();
} else {
this._channel.clear();
const pipeTransport: any = config ? config.pipeTransport : undefined;
const pipeTransport: any = config ? config.pipeTransport : undefined;
if (!pipeTransport) {
return Promise.reject<string>(new Error(localize("no.pipetransport", "Chosen debug configuration does not contain {0}", "pipeTransport")));
}
let pipeProgram: string | undefined;
if (os.platform() === 'win32' &&
pipeTransport.pipeProgram &&
!fs.existsSync(pipeTransport.pipeProgram)) {
const pipeProgramStr: string = pipeTransport.pipeProgram.toLowerCase().trim();
const expectedArch: debugUtils.ArchType = debugUtils.ArchType[process.arch as keyof typeof debugUtils.ArchType];
// Check for pipeProgram
if (!fs.existsSync(config.pipeTransport.pipeProgram)) {
pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(pipeProgramStr, expectedArch);
}
// If pipeProgram does not get replaced and there is a pipeCwd, concatenate with pipeProgramStr and attempt to replace.
if (!pipeProgram && config.pipeTransport.pipeCwd) {
const pipeCwdStr: string = config.pipeTransport.pipeCwd.toLowerCase().trim();
const newPipeProgramStr: string = path.join(pipeCwdStr, pipeProgramStr);
if (!fs.existsSync(newPipeProgramStr)) {
pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(newPipeProgramStr, expectedArch);
}
}
}
if (!pipeProgram) {
pipeProgram = pipeTransport.pipeProgram;
}
const pipeArgs: string[] = pipeTransport.pipeArgs;
const argList: string = RemoteAttachPicker.createArgumentList(pipeArgs);
const pipeCmd: string = `"${pipeProgram}" ${argList}`;
return this.getRemoteOSAndProcesses(pipeCmd)
.then(processes => {
const attachPickOptions: vscode.QuickPickOptions = {
matchOnDetail: true,
matchOnDescription: true,
placeHolder: localize("select.process.attach", "Select the process to attach to")
};
return vscode.window.showQuickPick(processes, attachPickOptions)
.then(item => item ? item.id : Promise.reject<string>(new Error(localize("process.not.selected", "Process not selected."))));
});
if (!pipeTransport) {
throw new Error(localize("no.pipetransport", "Chosen debug configuration does not contain {0}", "pipeTransport"));
}
});
let pipeProgram: string | undefined;
if (os.platform() === 'win32' &&
pipeTransport.pipeProgram &&
!await util.checkFileExists(pipeTransport.pipeProgram)) {
const pipeProgramStr: string = pipeTransport.pipeProgram.toLowerCase().trim();
const expectedArch: debugUtils.ArchType = debugUtils.ArchType[process.arch as keyof typeof debugUtils.ArchType];
// Check for pipeProgram
if (!await util.checkFileExists(config.pipeTransport.pipeProgram)) {
pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(pipeProgramStr, expectedArch);
}
// If pipeProgram does not get replaced and there is a pipeCwd, concatenate with pipeProgramStr and attempt to replace.
if (!pipeProgram && config.pipeTransport.pipeCwd) {
const pipeCwdStr: string = config.pipeTransport.pipeCwd.toLowerCase().trim();
const newPipeProgramStr: string = path.join(pipeCwdStr, pipeProgramStr);
if (!await util.checkFileExists(newPipeProgramStr)) {
pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(newPipeProgramStr, expectedArch);
}
}
}
if (!pipeProgram) {
pipeProgram = pipeTransport.pipeProgram;
}
const pipeArgs: string[] = pipeTransport.pipeArgs;
const argList: string = RemoteAttachPicker.createArgumentList(pipeArgs);
const pipeCmd: string = `"${pipeProgram}" ${argList}`;
const processes: AttachItem[]= await this.getRemoteOSAndProcesses(pipeCmd);
const attachPickOptions: vscode.QuickPickOptions = {
matchOnDetail: true,
matchOnDescription: true,
placeHolder: localize("select.process.attach", "Select the process to attach to")
};
const item: AttachItem | undefined = await vscode.window.showQuickPick(processes, attachPickOptions);
if (item) {
return item.id;
} else {
throw new Error(localize("process.not.selected", "Process not selected."));
}
}
}
// Creates a string to run on the host machine which will execute a shell script on the remote machine to retrieve OS and processes
@@ -132,51 +130,49 @@ export class RemoteAttachPicker {
`then ${PsProcessParser.psDarwinCommand}; fi${innerQuote}${outerQuote}`;
}
private getRemoteOSAndProcesses(pipeCmd: string): Promise<AttachItem[]> {
private async getRemoteOSAndProcesses(pipeCmd: string): Promise<AttachItem[]> {
// Do not add any quoting in execCommand.
const execCommand: string = `${pipeCmd} ${this.getRemoteProcessCommand()}`;
return util.execChildProcess(execCommand, undefined, this._channel).then(output => {
// OS will be on first line
// Processes will follow if listed
const lines: string[] = output.split(/\r?\n/);
const output: string = await util.execChildProcess(execCommand, undefined, this._channel);
// OS will be on first line
// Processes will follow if listed
const lines: string[] = output.split(/\r?\n/);
if (lines.length === 0) {
throw new Error(localize("pipe.failed", "Pipe transport failed to get OS and processes."));
} else {
const remoteOS: string = lines[0].replace(/[\r\n]+/g, '');
if (lines.length === 0) {
return Promise.reject<AttachItem[]>(new Error(localize("pipe.failed", "Pipe transport failed to get OS and processes.")));
if (remoteOS !== "Linux" && remoteOS !== "Darwin") {
throw new Error(`Operating system "${remoteOS}" not supported.`);
}
// Only got OS from uname
if (lines.length === 1) {
throw new Error(localize("no.process.list", "Transport attach could not obtain processes list."));
} else {
const remoteOS: string = lines[0].replace(/[\r\n]+/g, '');
if (remoteOS !== "Linux" && remoteOS !== "Darwin") {
return Promise.reject<AttachItem[]>(new Error(`Operating system "${remoteOS}" not supported.`));
}
// Only got OS from uname
if (lines.length === 1) {
return Promise.reject<AttachItem[]>(new Error(localize("no.process.list", "Transport attach could not obtain processes list.")));
} else {
const processes: string[] = lines.slice(1);
return PsProcessParser.ParseProcessFromPsArray(processes)
.sort((a, b) => {
if (a.name === undefined) {
if (b.name === undefined) {
return 0;
}
return 1;
}
const processes: string[] = lines.slice(1);
return PsProcessParser.ParseProcessFromPsArray(processes)
.sort((a, b) => {
if (a.name === undefined) {
if (b.name === undefined) {
return -1;
}
const aLower: string = a.name.toLowerCase();
const bLower: string = b.name.toLowerCase();
if (aLower === bLower) {
return 0;
}
return aLower < bLower ? -1 : 1;
})
.map(p => p.toAttachItem());
}
return 1;
}
if (b.name === undefined) {
return -1;
}
const aLower: string = a.name.toLowerCase();
const bLower: string = b.name.toLowerCase();
if (aLower === bLower) {
return 0;
}
return aLower < bLower ? -1 : 1;
})
.map(p => p.toAttachItem());
}
});
}
}
private static createArgumentList(args: string[]): string {
@@ -83,7 +83,7 @@ export class QuickPickConfigurationProvider implements vscode.DebugConfiguration
try {
await cppBuildTaskProvider.ensureBuildTaskExists(selection.configuration.preLaunchTask);
if (selection.configuration.miDebuggerPath) {
if (!fs.existsSync(selection.configuration.miDebuggerPath)) {
if (!await util.checkFileExists(selection.configuration.miDebuggerPath)) {
vscode.window.showErrorMessage(localize("miDebuggerPath.not.available", "miDebuggerPath does not exist: {0}. Has a debugger been installed?", selection.configuration.miDebuggerPath));
throw new Error();
}
@@ -194,7 +194,7 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider {
// This property will be removed before writing the DebugConfiguration in launch.json.
newConfig.detail = task.detail ? task.detail : definition.command;
const isCl: boolean = compilerName === "cl.exe";
newConfig.cwd = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPath)) ? path.dirname(compilerPath) : "${workspaceFolder}";
newConfig.cwd = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPath)) ? path.dirname(compilerPath) : "${fileDirname}";
return new Promise<vscode.DebugConfiguration>(resolve => {
if (platform === "darwin") {
+1 -1
View File
@@ -42,7 +42,7 @@ function createLaunchString(name: string, type: string, executable: string): str
"program": "${localize("enter.program.name", "enter program name, for example {0}", "$\{workspaceFolder\}" + "/" + executable).replace(/\"/g, "\\\"")}",
"args": [],
"stopAtEntry": false,
"cwd": "$\{workspaceFolder\}",
"cwd": "$\{fileDirname\}",
"environment": [],
${ type === "cppdbg" ? `"externalConsole": false` : `"console": "externalTerminal"` }
`;
@@ -33,21 +33,19 @@ export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDes
super(context);
}
createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): vscode.ProviderResult<vscode.DebugAdapterDescriptor> {
return util.isExtensionReady().then(ready => {
if (ready) {
let command: string = path.join(this.context.extensionPath, './debugAdapters/OpenDebugAD7');
async createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): Promise<vscode.DebugAdapterDescriptor> {
if (await util.isExtensionReady()) {
let command: string = path.join(this.context.extensionPath, './debugAdapters/OpenDebugAD7');
// Windows has the exe in debugAdapters/bin.
if (os.platform() === 'win32') {
command = path.join(this.context.extensionPath, "./debugAdapters/bin/OpenDebugAD7.exe");
}
return new vscode.DebugAdapterExecutable(command, []);
} else {
throw new Error(util.extensionNotReadyString);
// Windows has the exe in debugAdapters/bin.
if (os.platform() === 'win32') {
command = path.join(this.context.extensionPath, "./debugAdapters/bin/OpenDebugAD7.exe");
}
});
return new vscode.DebugAdapterExecutable(command, []);
} else {
throw new Error(util.extensionNotReadyString);
}
}
}
@@ -58,21 +56,19 @@ export class CppvsdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterD
super(context);
}
createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): vscode.ProviderResult<vscode.DebugAdapterDescriptor> {
async createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): Promise<vscode.DebugAdapterDescriptor | null> {
if (os.platform() !== 'win32') {
vscode.window.showErrorMessage(localize("debugger.not.available", "Debugger type '{0}' is not avaliable for non-Windows machines.", "cppvsdbg"));
return null;
} else {
return util.isExtensionReady().then(ready => {
if (ready) {
return new vscode.DebugAdapterExecutable(
path.join(this.context.extensionPath, './debugAdapters/vsdbg/bin/vsdbg.exe'),
['--interpreter=vscode']
);
} else {
throw new Error(util.extensionNotReadyString);
}
});
if (await util.isExtensionReady()) {
return new vscode.DebugAdapterExecutable(
path.join(this.context.extensionPath, './debugAdapters/vsdbg/bin/vsdbg.exe'),
['--interpreter=vscode', '--extConfigDir=%USERPROFILE%\\.cppvsdbg\\extensions']
);
} else {
throw new Error(util.extensionNotReadyString);
}
}
}
}
+41 -41
View File
@@ -76,55 +76,55 @@ export function initialize(context: vscode.ExtensionContext): void {
const items: MenuItem[] = configs.map<MenuItem>(config => ({ label: config.name, configuration: config, description: config.detail }));
vscode.window.showQuickPick(items, { placeHolder: (items.length === 0 ? localize("no.compiler.found", "No compiler found") : localize("select.configuration", "Select a configuration")) }).then(async selection => {
if (!selection) {
return; // User canceled it.
const selection: MenuItem | undefined = await vscode.window.showQuickPick(items, {
placeHolder: (items.length === 0 ? localize("no.compiler.found", "No compiler found") : localize("select.configuration", "Select a configuration")) });
if (!selection) {
return; // User canceled it.
}
if (selection.label.startsWith("cl.exe")) {
if (!process.env.DevEnvDir || process.env.DevEnvDir.length === 0) {
vscode.window.showErrorMessage(localize("cl.exe.not.available", '{0} build and debug is only usable when VS Code is run from the Developer Command Prompt for VS.', "cl.exe"));
return;
}
if (selection.label.startsWith("cl.exe")) {
if (!process.env.DevEnvDir || process.env.DevEnvDir.length === 0) {
vscode.window.showErrorMessage(localize("cl.exe.not.available", '{0} build and debug is only usable when VS Code is run from the Developer Command Prompt for VS.', "cl.exe"));
}
if (selection.configuration.preLaunchTask) {
if (folder) {
try {
await cppBuildTaskProvider.ensureBuildTaskExists(selection.configuration.preLaunchTask);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
} catch (e) {
if (e && e.message === util.failedToParseJson) {
vscode.window.showErrorMessage(util.failedToParseJson);
}
return;
}
} else {
return;
// TODO uncomment this when single file mode works correctly.
// const buildTasks: vscode.Task[] = await getBuildTasks(true);
// const task: vscode.Task = buildTasks.find(task => task.name === selection.configuration.preLaunchTask);
// await vscode.tasks.executeTask(task);
// delete selection.configuration.preLaunchTask;
}
if (selection.configuration.preLaunchTask) {
if (folder) {
try {
await cppBuildTaskProvider.ensureBuildTaskExists(selection.configuration.preLaunchTask);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
} catch (e) {
if (e && e.message === util.failedToParseJson) {
vscode.window.showErrorMessage(util.failedToParseJson);
}
return Promise.resolve();
}
} else {
return Promise.resolve();
// TODO uncomment this when single file mode works correctly.
// const buildTasks: vscode.Task[] = await getBuildTasks(true);
// const task: vscode.Task = buildTasks.find(task => task.name === selection.configuration.preLaunchTask);
// await vscode.tasks.executeTask(task);
// delete selection.configuration.preLaunchTask;
}
}
}
// Attempt to use the user's (possibly) modified configuration before using the generated one.
// Attempt to use the user's (possibly) modified configuration before using the generated one.
try {
await cppBuildTaskProvider.ensureDebugConfigExists(selection.configuration.name);
try {
await cppBuildTaskProvider.ensureDebugConfigExists(selection.configuration.name);
try {
await vscode.debug.startDebugging(folder, selection.configuration.name);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" });
} catch (e) {
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
}
await vscode.debug.startDebugging(folder, selection.configuration.name);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" });
} catch (e) {
try {
vscode.debug.startDebugging(folder, selection.configuration);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" });
} catch (e) {
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
}
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
}
});
} catch (e) {
try {
await vscode.debug.startDebugging(folder, selection.configuration);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" });
} catch (e) {
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
}
}
}));
configurationProvider.getConfigurationSnippets();
+26 -25
View File
@@ -38,30 +38,29 @@ export class NativeAttachItemsProviderFactory {
abstract class NativeAttachItemsProvider implements AttachItemsProvider {
protected abstract getInternalProcessEntries(): Promise<Process[]>;
getAttachItems(): Promise<AttachItem[]> {
return this.getInternalProcessEntries().then(processEntries => {
// localeCompare is significantly slower than < and > (2000 ms vs 80 ms for 10,000 elements)
// We can change to localeCompare if this becomes an issue
processEntries.sort((a, b) => {
if (a.name === undefined) {
if (b.name === undefined) {
return 0;
}
return 1;
}
async getAttachItems(): Promise<AttachItem[]> {
const processEntries: Process[] = await this.getInternalProcessEntries();
// localeCompare is significantly slower than < and > (2000 ms vs 80 ms for 10,000 elements)
// We can change to localeCompare if this becomes an issue
processEntries.sort((a, b) => {
if (a.name === undefined) {
if (b.name === undefined) {
return -1;
}
const aLower: string = a.name.toLowerCase();
const bLower: string = b.name.toLowerCase();
if (aLower === bLower) {
return 0;
}
return aLower < bLower ? -1 : 1;
});
const attachItems: AttachItem[] = processEntries.map(p => p.toAttachItem());
return attachItems;
return 1;
}
if (b.name === undefined) {
return -1;
}
const aLower: string = a.name.toLowerCase();
const bLower: string = b.name.toLowerCase();
if (aLower === bLower) {
return 0;
}
return aLower < bLower ? -1 : 1;
});
const attachItems: AttachItem[] = processEntries.map(p => p.toAttachItem());
return attachItems;
}
}
@@ -90,7 +89,7 @@ export class PsAttachItemsProvider extends NativeAttachItemsProvider {
// characters. 50 was chosen because that's the maximum length of a "label" in the
// QuickPick UI in VSCode.
protected getInternalProcessEntries(): Promise<Process[]> {
protected async getInternalProcessEntries(): Promise<Process[]> {
let processCmd: string = '';
switch (os.platform()) {
case 'darwin':
@@ -100,9 +99,10 @@ export class PsAttachItemsProvider extends NativeAttachItemsProvider {
processCmd = PsProcessParser.psLinuxCommand;
break;
default:
return Promise.reject<Process[]>(new Error(localize("os.not.supported", 'Operating system "{0}" not supported.', os.platform())));
throw new Error(localize("os.not.supported", 'Operating system "{0}" not supported.', os.platform()));
}
return execChildProcess(processCmd, undefined).then(processes => PsProcessParser.ParseProcessFromPs(processes));
const processes: string = await execChildProcess(processCmd, undefined);
return PsProcessParser.ParseProcessFromPs(processes);
}
}
@@ -198,9 +198,10 @@ export class WmicAttachItemsProvider extends NativeAttachItemsProvider {
// | 887 | 746 |
// | 1308 | 1132 |
protected getInternalProcessEntries(): Promise<Process[]> {
protected async getInternalProcessEntries(): Promise<Process[]> {
const wmicCommand: string = 'wmic process get Name,ProcessId,CommandLine /FORMAT:list';
return execChildProcess(wmicCommand, undefined).then(processes => WmicProcessParser.ParseProcessFromWmic(processes));
const processes: string = await execChildProcess(wmicCommand, undefined);
return WmicProcessParser.ParseProcessFromWmic(processes);
}
}
@@ -13,53 +13,49 @@ export class DocumentFormattingEditProvider implements vscode.DocumentFormatting
this.client = client;
}
public provideDocumentFormattingEdits(document: vscode.TextDocument, options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise<vscode.TextEdit[]> {
return new Promise<vscode.TextEdit[]>((resolve, reject) => {
this.client.notifyWhenReady(() => {
const filePath: string = document.uri.fsPath;
const configCallBack = (editorConfigSettings: any | undefined) => {
const params: FormatParams = {
settings: { ...editorConfigSettings },
uri: document.uri.toString(),
insertSpaces: options.insertSpaces,
tabSize: options.tabSize,
character: "",
range: {
start: {
character: 0,
line: 0
},
end: {
character: 0,
line: 0
}
}
};
return this.client.languageClient.sendRequest(FormatDocumentRequest, params)
.then((textEdits) => {
const result: vscode.TextEdit[] = [];
textEdits.forEach((textEdit) => {
result.push({
range: new vscode.Range(textEdit.range.start.line, textEdit.range.start.character, textEdit.range.end.line, textEdit.range.end.character),
newText: textEdit.newText
});
});
resolve(result);
});
};
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "vcFormat") {
configCallBack(undefined);
} else {
const editorConfigSettings: any = cachedEditorConfigSettings.get(filePath);
if (!editorConfigSettings) {
editorConfig.parse(filePath).then(configCallBack);
} else {
cachedEditorConfigSettings.set(filePath, editorConfigSettings);
configCallBack(editorConfigSettings);
public async provideDocumentFormattingEdits(document: vscode.TextDocument, options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise<vscode.TextEdit[]> {
await this.client.awaitUntilLanguageClientReady();
const filePath: string = document.uri.fsPath;
const configCallBack = async (editorConfigSettings: any | undefined) => {
const params: FormatParams = {
settings: { ...editorConfigSettings },
uri: document.uri.toString(),
insertSpaces: options.insertSpaces,
tabSize: options.tabSize,
character: "",
range: {
start: {
character: 0,
line: 0
},
end: {
character: 0,
line: 0
}
}
};
const textEdits: any = await this.client.languageClient.sendRequest(FormatDocumentRequest, params);
const results: vscode.TextEdit[] = [];
textEdits.forEach((textEdit: any) => {
results.push({
range: new vscode.Range(textEdit.range.start.line, textEdit.range.start.character, textEdit.range.end.line, textEdit.range.end.character),
newText: textEdit.newText
});
});
});
return results;
};
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "vcFormat") {
return configCallBack(undefined);
} else {
const editorConfigSettings: any = cachedEditorConfigSettings.get(filePath);
if (!editorConfigSettings) {
await editorConfig.parse(filePath);
return configCallBack(undefined);
} else {
cachedEditorConfigSettings.set(filePath, editorConfigSettings);
return configCallBack(editorConfigSettings);
}
}
}
}
@@ -13,53 +13,49 @@ export class DocumentRangeFormattingEditProvider implements vscode.DocumentRange
this.client = client;
}
public provideDocumentRangeFormattingEdits(document: vscode.TextDocument, range: vscode.Range, options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise<vscode.TextEdit[]> {
return new Promise<vscode.TextEdit[]>((resolve, reject) => {
this.client.notifyWhenReady(() => {
const filePath: string = document.uri.fsPath;
const configCallBack = (editorConfigSettings: any | undefined) => {
const params: FormatParams = {
settings: { ...editorConfigSettings },
uri: document.uri.toString(),
insertSpaces: options.insertSpaces,
tabSize: options.tabSize,
character: "",
range: {
start: {
character: range.start.character,
line: range.start.line
},
end: {
character: range.end.character,
line: range.end.line
}
}
};
return this.client.languageClient.sendRequest(FormatRangeRequest, params)
.then((textEdits) => {
const result: vscode.TextEdit[] = [];
textEdits.forEach((textEdit) => {
result.push({
range: new vscode.Range(textEdit.range.start.line, textEdit.range.start.character, textEdit.range.end.line, textEdit.range.end.character),
newText: textEdit.newText
});
});
resolve(result);
});
};
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "vcFormat") {
configCallBack(undefined);
} else {
const editorConfigSettings: any = cachedEditorConfigSettings.get(filePath);
if (!editorConfigSettings) {
editorConfig.parse(filePath).then(configCallBack);
} else {
cachedEditorConfigSettings.set(filePath, editorConfigSettings);
configCallBack(editorConfigSettings);
public async provideDocumentRangeFormattingEdits(document: vscode.TextDocument, range: vscode.Range, options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise<vscode.TextEdit[]> {
await this.client.awaitUntilLanguageClientReady();
const filePath: string = document.uri.fsPath;
const configCallBack = async (editorConfigSettings: any | undefined) => {
const params: FormatParams = {
settings: { ...editorConfigSettings },
uri: document.uri.toString(),
insertSpaces: options.insertSpaces,
tabSize: options.tabSize,
character: "",
range: {
start: {
character: range.start.character,
line: range.start.line
},
end: {
character: range.end.character,
line: range.end.line
}
}
};
const textEdits: any = await this.client.languageClient.sendRequest(FormatRangeRequest, params);
const result: vscode.TextEdit[] = [];
textEdits.forEach((textEdit: any) => {
result.push({
range: new vscode.Range(textEdit.range.start.line, textEdit.range.start.character, textEdit.range.end.line, textEdit.range.end.character),
newText: textEdit.newText
});
});
});
return result;
};
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "vcFormat") {
return configCallBack(undefined);
} else {
const editorConfigSettings: any = cachedEditorConfigSettings.get(filePath);
if (!editorConfigSettings) {
await editorConfig.parse(filePath);
return configCallBack(undefined);
} else {
cachedEditorConfigSettings.set(filePath, editorConfigSettings);
return configCallBack(editorConfigSettings);
}
}
};
}
@@ -30,15 +30,13 @@ export class DocumentSymbolProvider implements vscode.DocumentSymbolProvider {
if (!this.client.TrackedDocuments.has(document)) {
processDelayedDidOpen(document);
}
return this.client.requestWhenReady(() => {
return this.client.requestWhenReady(async () => {
const params: GetDocumentSymbolRequestParams = {
uri: document.uri.toString()
};
return this.client.languageClient.sendRequest(GetDocumentSymbolRequest, params)
.then((symbols) => {
const resultSymbols: vscode.DocumentSymbol[] = this.getChildrenSymbols(symbols);
return resultSymbols;
});
const symbols: LocalizeDocumentSymbol[] = await this.client.languageClient.sendRequest(GetDocumentSymbolRequest, params);
const resultSymbols: vscode.DocumentSymbol[] = this.getChildrenSymbols(symbols);
return resultSymbols;
});
}
}
@@ -14,69 +14,68 @@ export class FindAllReferencesProvider implements vscode.ReferenceProvider {
}
public async provideReferences(document: vscode.TextDocument, position: vscode.Position, context: vscode.ReferenceContext, token: vscode.CancellationToken): Promise<vscode.Location[] | undefined> {
return new Promise<vscode.Location[]>((resolve, reject) => {
const callback: () => void = () => {
const callback: () => Promise<void> = async () => {
const params: FindAllReferencesParams = {
position: Position.create(position.line, position.character),
textDocument: this.client.languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document)
};
DefaultClient.referencesParams = params;
this.client.notifyWhenReady(() => {
// The current request is represented by referencesParams. If a request detects
// referencesParams does not match the object used when creating the request, abort it.
if (params !== DefaultClient.referencesParams) {
// Complete with nothing instead of rejecting, to avoid an error message from VS Code
const locations: vscode.Location[] = [];
resolve(locations);
return;
}
DefaultClient.referencesRequestPending = true;
// Register a single-fire handler for the reply.
const resultCallback: refs.ReferencesResultCallback = (result: refs.ReferencesResult | null, doResolve: boolean) => {
DefaultClient.referencesRequestPending = false;
const locations: vscode.Location[] = [];
if (result) {
result.referenceInfos.forEach((referenceInfo: refs.ReferenceInfo) => {
if (referenceInfo.type === refs.ReferenceType.Confirmed) {
const uri: vscode.Uri = vscode.Uri.file(referenceInfo.file);
const range: vscode.Range = new vscode.Range(referenceInfo.position.line, referenceInfo.position.character, referenceInfo.position.line, referenceInfo.position.character + result.text.length);
locations.push(new vscode.Location(uri, range));
}
});
}
// If references were canceled while in a preview state, there is not an outstanding promise.
if (doResolve) {
resolve(locations);
}
if (DefaultClient.referencesPendingCancellations.length > 0) {
while (DefaultClient.referencesPendingCancellations.length > 1) {
const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0];
DefaultClient.referencesPendingCancellations.pop();
pendingCancel.reject();
await this.client.awaitUntilLanguageClientReady();
// The current request is represented by referencesParams. If a request detects
// referencesParams does not match the object used when creating the request, abort it.
if (params !== DefaultClient.referencesParams) {
// Complete with nothing instead of rejecting, to avoid an error message from VS Code
const locations: vscode.Location[] = [];
resolve(locations);
return;
}
DefaultClient.referencesRequestPending = true;
// Register a single-fire handler for the reply.
const resultCallback: refs.ReferencesResultCallback = (result: refs.ReferencesResult | null, doResolve: boolean) => {
DefaultClient.referencesRequestPending = false;
const locations: vscode.Location[] = [];
if (result) {
result.referenceInfos.forEach((referenceInfo: refs.ReferenceInfo) => {
if (referenceInfo.type === refs.ReferenceType.Confirmed) {
const uri: vscode.Uri = vscode.Uri.file(referenceInfo.file);
const range: vscode.Range = new vscode.Range(referenceInfo.position.line, referenceInfo.position.character, referenceInfo.position.line, referenceInfo.position.character + result.text.length);
locations.push(new vscode.Location(uri, range));
}
});
}
// If references were canceled while in a preview state, there is not an outstanding promise.
if (doResolve) {
resolve(locations);
}
if (DefaultClient.referencesPendingCancellations.length > 0) {
while (DefaultClient.referencesPendingCancellations.length > 1) {
const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0];
DefaultClient.referencesPendingCancellations.pop();
pendingCancel.callback();
}
};
if (!workspaceReferences.referencesRefreshPending) {
workspaceReferences.setResultsCallback(resultCallback);
workspaceReferences.startFindAllReferences(params);
} else {
// We are responding to a refresh (preview or final result)
workspaceReferences.referencesRefreshPending = false;
if (workspaceReferences.lastResults) {
// This is a final result
const lastResults: refs.ReferencesResult = workspaceReferences.lastResults;
workspaceReferences.lastResults = null;
resultCallback(lastResults, true);
} else {
// This is a preview (2nd or later preview)
workspaceReferences.referencesRequestPending = true;
workspaceReferences.setResultsCallback(resultCallback);
this.client.languageClient.sendNotification(RequestReferencesNotification, false);
pendingCancel.reject();
}
const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0];
DefaultClient.referencesPendingCancellations.pop();
pendingCancel.callback();
}
});
};
if (!workspaceReferences.referencesRefreshPending) {
workspaceReferences.setResultsCallback(resultCallback);
workspaceReferences.startFindAllReferences(params);
} else {
// We are responding to a refresh (preview or final result)
workspaceReferences.referencesRefreshPending = false;
if (workspaceReferences.lastResults) {
// This is a final result
const lastResults: refs.ReferencesResult = workspaceReferences.lastResults;
workspaceReferences.lastResults = null;
resultCallback(lastResults, true);
} else {
// This is a preview (2nd or later preview)
workspaceReferences.referencesRequestPending = true;
workspaceReferences.setResultsCallback(resultCallback);
this.client.languageClient.sendNotification(RequestReferencesNotification, false);
}
}
token.onCancellationRequested(e => {
if (params === DefaultClient.referencesParams) {
this.client.cancelReferences();
@@ -3,7 +3,7 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import { DefaultClient, GetFoldingRangesParams, GetFoldingRangesRequest, FoldingRangeKind } from '../client';
import { DefaultClient, GetFoldingRangesParams, GetFoldingRangesRequest, FoldingRangeKind, GetFoldingRangesResult } from '../client';
export class FoldingRangeProvider implements vscode.FoldingRangeProvider {
private client: DefaultClient;
@@ -13,47 +13,42 @@ export class FoldingRangeProvider implements vscode.FoldingRangeProvider {
this.client = client;
this.onDidChangeFoldingRanges = this.onDidChangeFoldingRangesEvent.event;
}
provideFoldingRanges(document: vscode.TextDocument, context: vscode.FoldingContext,
async provideFoldingRanges(document: vscode.TextDocument, context: vscode.FoldingContext,
token: vscode.CancellationToken): Promise<vscode.FoldingRange[]> {
const id: number = ++DefaultClient.abortRequestId;
const params: GetFoldingRangesParams = {
id: id,
uri: document.uri.toString()
};
return new Promise<vscode.FoldingRange[]>((resolve, reject) => {
this.client.notifyWhenReady(() => {
this.client.languageClient.sendRequest(GetFoldingRangesRequest, params)
.then((ranges) => {
if (ranges.canceled) {
reject();
} else {
const result: vscode.FoldingRange[] = [];
ranges.ranges.forEach((r) => {
const foldingRange: vscode.FoldingRange = {
start: r.range.start.line,
end: r.range.end.line
};
switch (r.kind) {
case FoldingRangeKind.Comment:
foldingRange.kind = vscode.FoldingRangeKind.Comment;
break;
case FoldingRangeKind.Imports:
foldingRange.kind = vscode.FoldingRangeKind.Imports;
break;
case FoldingRangeKind.Region:
foldingRange.kind = vscode.FoldingRangeKind.Region;
break;
default:
break;
}
result.push(foldingRange);
});
resolve(result);
}
});
token.onCancellationRequested(e => this.client.abortRequest(id));
await this.client.awaitUntilLanguageClientReady();
token.onCancellationRequested(e => this.client.abortRequest(id));
const ranges: GetFoldingRangesResult = await this.client.languageClient.sendRequest(GetFoldingRangesRequest, params);
if (ranges.canceled) {
throw new vscode.CancellationError();
} else {
const result: vscode.FoldingRange[] = [];
ranges.ranges.forEach((r) => {
const foldingRange: vscode.FoldingRange = {
start: r.range.start.line,
end: r.range.end.line
};
switch (r.kind) {
case FoldingRangeKind.Comment:
foldingRange.kind = vscode.FoldingRangeKind.Comment;
break;
case FoldingRangeKind.Imports:
foldingRange.kind = vscode.FoldingRangeKind.Imports;
break;
case FoldingRangeKind.Region:
foldingRange.kind = vscode.FoldingRangeKind.Region;
break;
default:
break;
}
result.push(foldingRange);
});
});
return result;
}
}
public refresh(): void {
@@ -13,59 +13,55 @@ export class OnTypeFormattingEditProvider implements vscode.OnTypeFormattingEdit
this.client = client;
}
public provideOnTypeFormattingEdits(document: vscode.TextDocument, position: vscode.Position, ch: string, options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise<vscode.TextEdit[]> {
return new Promise<vscode.TextEdit[]>((resolve, reject) => {
this.client.notifyWhenReady(() => {
const filePath: string = document.uri.fsPath;
const configCallBack = (editorConfigSettings: any | undefined) => {
const params: FormatParams = {
settings: { ...editorConfigSettings },
uri: document.uri.toString(),
insertSpaces: options.insertSpaces,
tabSize: options.tabSize,
character: ch,
range: {
start: {
character: position.character,
line: position.line
},
end: {
character: 0,
line: 0
}
}
};
return this.client.languageClient.sendRequest(FormatOnTypeRequest, params)
.then((textEdits) => {
const result: vscode.TextEdit[] = [];
textEdits.forEach((textEdit) => {
result.push({
range: new vscode.Range(textEdit.range.start.line, textEdit.range.start.character, textEdit.range.end.line, textEdit.range.end.character),
newText: textEdit.newText
});
});
resolve(result);
});
};
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "vcFormat") {
// If not using vcFormat, only process on-type requests for ';'
if (ch !== ';') {
const result: vscode.TextEdit[] = [];
resolve(result);
} else {
configCallBack(undefined);
}
} else {
const editorConfigSettings: any = cachedEditorConfigSettings.get(filePath);
if (!editorConfigSettings) {
editorConfig.parse(filePath).then(configCallBack);
} else {
cachedEditorConfigSettings.set(filePath, editorConfigSettings);
configCallBack(editorConfigSettings);
public async provideOnTypeFormattingEdits(document: vscode.TextDocument, position: vscode.Position, ch: string, options: vscode.FormattingOptions, token: vscode.CancellationToken): Promise<vscode.TextEdit[]> {
await this.client.awaitUntilLanguageClientReady();
const filePath: string = document.uri.fsPath;
const configCallBack = async (editorConfigSettings: any | undefined) => {
const params: FormatParams = {
settings: { ...editorConfigSettings },
uri: document.uri.toString(),
insertSpaces: options.insertSpaces,
tabSize: options.tabSize,
character: ch,
range: {
start: {
character: position.character,
line: position.line
},
end: {
character: 0,
line: 0
}
}
};
const textEdits: any[] = await this.client.languageClient.sendRequest(FormatOnTypeRequest, params);
const result: vscode.TextEdit[] = [];
textEdits.forEach((textEdit) => {
result.push({
range: new vscode.Range(textEdit.range.start.line, textEdit.range.start.character, textEdit.range.end.line, textEdit.range.end.character),
newText: textEdit.newText
});
});
});
return result;
};
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "vcFormat") {
// If not using vcFormat, only process on-type requests for ';'
if (ch !== ';') {
const result: vscode.TextEdit[] = [];
return result;
} else {
return configCallBack(undefined);
}
} else {
const editorConfigSettings: any = cachedEditorConfigSettings.get(filePath);
if (!editorConfigSettings) {
await editorConfig.parse(filePath);
return configCallBack(undefined);
} else {
cachedEditorConfigSettings.set(filePath, editorConfigSettings);
return configCallBack(editorConfigSettings);
}
}
}
}
@@ -23,7 +23,7 @@ export class RenameProvider implements vscode.RenameProvider {
if (settings.renameRequiresIdentifier && !util.isValidIdentifier(newName)) {
vscode.window.showErrorMessage(localize("invalid.identifier.for.rename", "Invalid identifier provided for the Rename Symbol operation."));
const workspaceEdit: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
return Promise.resolve(workspaceEdit);
return workspaceEdit;
}
// Normally, VS Code considers rename to be an atomic operation.
// If the user clicks anywhere in the document, it attempts to cancel it.
@@ -33,67 +33,66 @@ export class RenameProvider implements vscode.RenameProvider {
DefaultClient.renamePending = true;
++DefaultClient.renameRequestsPending;
return new Promise<vscode.WorkspaceEdit>((resolve, reject) => {
const callback: () => void = () => {
const callback: () => Promise<void> = async () => {
const params: RenameParams = {
newName: newName,
position: Position.create(position.line, position.character),
textDocument: this.client.languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document)
};
DefaultClient.referencesParams = params;
this.client.notifyWhenReady(() => {
// The current request is represented by referencesParams. If a request detects
// referencesParams does not match the object used when creating the request, abort it.
if (params !== DefaultClient.referencesParams) {
if (--DefaultClient.renameRequestsPending === 0) {
DefaultClient.renamePending = false;
}
// Complete with nothing instead of rejecting, to avoid an error message from VS Code
const workspaceEdit: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
resolve(workspaceEdit);
return;
await this.client.awaitUntilLanguageClientReady();
// The current request is represented by referencesParams. If a request detects
// referencesParams does not match the object used when creating the request, abort it.
if (params !== DefaultClient.referencesParams) {
if (--DefaultClient.renameRequestsPending === 0) {
DefaultClient.renamePending = false;
}
DefaultClient.referencesRequestPending = true;
workspaceReferences.setResultsCallback((referencesResult: refs.ReferencesResult | null, doResolve: boolean) => {
DefaultClient.referencesRequestPending = false;
--DefaultClient.renameRequestsPending;
const workspaceEdit: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
const cancelling: boolean = DefaultClient.referencesPendingCancellations.length > 0;
if (cancelling) {
while (DefaultClient.referencesPendingCancellations.length > 1) {
const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0];
DefaultClient.referencesPendingCancellations.pop();
pendingCancel.reject();
}
// Complete with nothing instead of rejecting, to avoid an error message from VS Code
const workspaceEdit: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
resolve(workspaceEdit);
return;
}
DefaultClient.referencesRequestPending = true;
workspaceReferences.setResultsCallback((referencesResult: refs.ReferencesResult | null, doResolve: boolean) => {
DefaultClient.referencesRequestPending = false;
--DefaultClient.renameRequestsPending;
const workspaceEdit: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
const cancelling: boolean = DefaultClient.referencesPendingCancellations.length > 0;
if (cancelling) {
while (DefaultClient.referencesPendingCancellations.length > 1) {
const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0];
DefaultClient.referencesPendingCancellations.pop();
pendingCancel.callback();
} else {
if (DefaultClient.renameRequestsPending === 0) {
DefaultClient.renamePending = false;
}
// If rename UI was canceled, we will get a null result.
// If null, return an empty list to avoid Rename failure dialog.
if (referencesResult) {
for (const reference of referencesResult.referenceInfos) {
const uri: vscode.Uri = vscode.Uri.file(reference.file);
const range: vscode.Range = new vscode.Range(reference.position.line, reference.position.character, reference.position.line, reference.position.character + referencesResult.text.length);
const metadata: vscode.WorkspaceEditEntryMetadata = {
needsConfirmation: reference.type !== refs.ReferenceType.Confirmed,
label: refs.getReferenceTagString(reference.type, false, true),
iconPath: refs.getReferenceItemIconPath(reference.type, false)
};
workspaceEdit.replace(uri, range, newName, metadata);
}
pendingCancel.reject();
}
const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0];
DefaultClient.referencesPendingCancellations.pop();
pendingCancel.callback();
} else {
if (DefaultClient.renameRequestsPending === 0) {
DefaultClient.renamePending = false;
}
// If rename UI was canceled, we will get a null result.
// If null, return an empty list to avoid Rename failure dialog.
if (referencesResult) {
for (const reference of referencesResult.referenceInfos) {
const uri: vscode.Uri = vscode.Uri.file(reference.file);
const range: vscode.Range = new vscode.Range(reference.position.line, reference.position.character, reference.position.line, reference.position.character + referencesResult.text.length);
const metadata: vscode.WorkspaceEditEntryMetadata = {
needsConfirmation: reference.type !== refs.ReferenceType.Confirmed,
label: refs.getReferenceTagString(reference.type, false, true),
iconPath: refs.getReferenceItemIconPath(reference.type, false)
};
workspaceEdit.replace(uri, range, newName, metadata);
}
}
if (referencesResult && (referencesResult.referenceInfos === null || referencesResult.referenceInfos.length === 0)) {
vscode.window.showErrorMessage(localize("unable.to.locate.selected.symbol", "A definition for the selected symbol could not be located."));
}
resolve(workspaceEdit);
});
workspaceReferences.startRename(params);
}
if (referencesResult && (referencesResult.referenceInfos === null || referencesResult.referenceInfos.length === 0)) {
vscode.window.showErrorMessage(localize("unable.to.locate.selected.symbol", "A definition for the selected symbol could not be located."));
}
resolve(workspaceEdit);
});
workspaceReferences.startRename(params);
};
if (DefaultClient.referencesRequestPending || workspaceReferences.symbolSearchInProgress) {
@@ -3,7 +3,7 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import { DefaultClient, GetSemanticTokensParams, GetSemanticTokensRequest, openFileVersions } from '../client';
import { DefaultClient, GetSemanticTokensParams, GetSemanticTokensRequest, openFileVersions, GetSemanticTokensResult } from '../client';
export class SemanticTokensProvider implements vscode.DocumentSemanticTokensProvider {
private client: DefaultClient;
@@ -17,41 +17,36 @@ export class SemanticTokensProvider implements vscode.DocumentSemanticTokensProv
}
public async provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken): Promise<vscode.SemanticTokens> {
return new Promise<vscode.SemanticTokens>((resolve, reject) => {
this.client.notifyWhenReady(() => {
const uriString: string = document.uri.toString();
// First check the token cache to see if we already have results for that file and version
const cache: [number, vscode.SemanticTokens] | undefined = this.tokenCaches.get(uriString);
if (cache && cache[0] === document.version) {
resolve(cache[1]);
await this.client.awaitUntilLanguageClientReady();
const uriString: string = document.uri.toString();
// First check the token cache to see if we already have results for that file and version
const cache: [number, vscode.SemanticTokens] | undefined = this.tokenCaches.get(uriString);
if (cache && cache[0] === document.version) {
return cache[1];
} else {
token.onCancellationRequested(_e => this.client.abortRequest(id));
const id: number = ++DefaultClient.abortRequestId;
const params: GetSemanticTokensParams = {
id: id,
uri: uriString
};
const tokensResult: GetSemanticTokensResult = await this.client.languageClient.sendRequest(GetSemanticTokensRequest, params);
if (tokensResult.canceled) {
throw new vscode.CancellationError();
} else {
if (tokensResult.fileVersion !== openFileVersions.get(uriString)) {
throw new vscode.CancellationError();
} else {
const id: number = ++DefaultClient.abortRequestId;
const params: GetSemanticTokensParams = {
id: id,
uri: uriString
};
this.client.languageClient.sendRequest(GetSemanticTokensRequest, params)
.then((tokensResult) => {
if (tokensResult.canceled) {
reject();
} else {
if (tokensResult.fileVersion !== openFileVersions.get(uriString)) {
reject();
} else {
const builder: vscode.SemanticTokensBuilder = new vscode.SemanticTokensBuilder(this.client.semanticTokensLegend);
tokensResult.tokens.forEach((token) => {
builder.push(token.line, token.character, token.length, token.type, token.modifiers);
});
const tokens: vscode.SemanticTokens = builder.build();
this.tokenCaches.set(uriString, [tokensResult.fileVersion, tokens]);
resolve(tokens);
}
}
});
token.onCancellationRequested(e => this.client.abortRequest(id));
const builder: vscode.SemanticTokensBuilder = new vscode.SemanticTokensBuilder(this.client.semanticTokensLegend);
tokensResult.tokens.forEach((token) => {
builder.push(token.line, token.character, token.length, token.type, token.modifiers);
});
const tokens: vscode.SemanticTokens = builder.build();
this.tokenCaches.set(uriString, [tokensResult.fileVersion, tokens]);
return tokens;
}
});
});
}
}
}
public invalidateFile(uri: string): void {
@@ -3,7 +3,7 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import { DefaultClient, GetSymbolInfoRequest, WorkspaceSymbolParams } from '../client';
import { DefaultClient, GetSymbolInfoRequest, WorkspaceSymbolParams, LocalizeSymbolInformation } from '../client';
import * as util from '../../common';
export class WorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider {
@@ -17,28 +17,26 @@ export class WorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider {
query: query
};
return this.client.languageClient.sendRequest(GetSymbolInfoRequest, params)
.then((symbols) => {
const resultSymbols: vscode.SymbolInformation[] = [];
const symbols: LocalizeSymbolInformation[] = await this.client.languageClient.sendRequest(GetSymbolInfoRequest, params);
const resultSymbols: vscode.SymbolInformation[] = [];
// Convert to vscode.Command array
symbols.forEach((symbol) => {
const suffix: string = util.getLocalizedString(symbol.suffix);
let name: string = symbol.name;
if (suffix.length) {
name = name + ' (' + suffix + ')';
}
const range: vscode.Range = new vscode.Range(symbol.location.range.start.line, symbol.location.range.start.character, symbol.location.range.end.line, symbol.location.range.end.character);
const uri: vscode.Uri = vscode.Uri.parse(symbol.location.uri.toString());
const vscodeSymbol: vscode.SymbolInformation = new vscode.SymbolInformation(
name,
symbol.kind,
symbol.containerName,
new vscode.Location(uri, range)
);
resultSymbols.push(vscodeSymbol);
});
return resultSymbols;
});
// Convert to vscode.Command array
symbols.forEach((symbol) => {
const suffix: string = util.getLocalizedString(symbol.suffix);
let name: string = symbol.name;
if (suffix.length) {
name = name + ' (' + suffix + ')';
}
const range: vscode.Range = new vscode.Range(symbol.location.range.start.line, symbol.location.range.start.character, symbol.location.range.end.line, symbol.location.range.end.character);
const uri: vscode.Uri = vscode.Uri.parse(symbol.location.uri.toString());
const vscodeSymbol: vscode.SymbolInformation = new vscode.SymbolInformation(
name,
symbol.kind,
symbol.containerName,
new vscode.Location(uri, range)
);
resultSymbols.push(vscodeSymbol);
});
return resultSymbols;
}
}
+256 -236
View File
@@ -110,6 +110,10 @@ function logLocalized(params: LocalizeStringParams): void {
log(output);
}
/** Note: We should not await on the following functions,
* or any funstion that returns a promise acquired from them,
* vscode.window.showInformationMessage, vscode.window.showWarningMessage, vscode.window.showErrorMessage
*/
function showMessageWindow(params: ShowMessageWindowParams): void {
const message: string = util.getLocalizedString(params.localizeStringParams);
switch (params.type) {
@@ -308,7 +312,7 @@ interface Location {
range: Range;
}
interface LocalizeSymbolInformation {
export interface LocalizeSymbolInformation {
name: string;
kind: vscode.SymbolKind;
location: Location;
@@ -362,7 +366,7 @@ interface FoldingRange {
range: Range;
}
interface GetFoldingRangesResult {
export interface GetFoldingRangesResult {
canceled: boolean;
ranges: FoldingRange[];
}
@@ -384,7 +388,7 @@ interface SemanticToken {
modifiers?: number;
}
interface GetSemanticTokensResult {
export interface GetSemanticTokensResult {
fileVersion: number;
canceled: boolean;
tokens: SemanticToken[];
@@ -576,9 +580,10 @@ export interface Client {
getCurrentCompilerPathAndArgs(): Thenable<util.CompilerPathAndArgs | undefined>;
getKnownCompilers(): Thenable<configs.KnownCompiler[] | undefined>;
takeOwnership(document: vscode.TextDocument): void;
queueTask<T>(task: () => Thenable<T>): Thenable<T>;
queueTask<T>(task: () => Thenable<T>): Promise<T>;
requestWhenReady<T>(request: () => Thenable<T>): Thenable<T>;
notifyWhenReady(notify: () => void): void;
notifyWhenLanguageClientReady(notify: () => void): void;
awaitUntilLanguageClientReady(): void;
requestSwitchHeaderSource(rootPath: string, fileName: string): Thenable<string>;
activeDocumentChanged(document: vscode.TextDocument): void;
activate(): void;
@@ -587,15 +592,16 @@ export interface Client {
deactivate(): void;
pauseParsing(): void;
resumeParsing(): void;
handleConfigurationSelectCommand(): void;
handleConfigurationProviderSelectCommand(): void;
handleShowParsingCommands(): void;
handleConfigurationSelectCommand(): Promise<void>;
handleConfigurationProviderSelectCommand(): Promise<void>;
handleShowParsingCommands(): Promise<void>;
handleReferencesIcon(): void;
handleConfigurationEditCommand(): void;
handleConfigurationEditJSONCommand(): void;
handleConfigurationEditUICommand(): void;
handleConfigurationEditCommand(viewColumn?: vscode.ViewColumn): void;
handleConfigurationEditJSONCommand(viewColumn?: vscode.ViewColumn): void;
handleConfigurationEditUICommand(viewColumn?: vscode.ViewColumn): void;
handleAddToIncludePathCommand(path: string): void;
handleGoToDirectiveInGroup(next: boolean): void;
handleGoToDirectiveInGroup(next: boolean): Promise<void>;
handleCheckForCompiler(): Promise<void>;
onInterval(): void;
dispose(): void;
addFileAssociations(fileAssociations: string, languageId: string): void;
@@ -709,7 +715,8 @@ export class DefaultClient implements Client {
* All public methods on this class must be guarded by the "pendingTask" promise. Requests and notifications received before the task is
* complete are executed after this promise is resolved.
* @see requestWhenReady<T>(request)
* @see notifyWhenReady(notify)
* @see notifyWhenLanguageClientReady(notify)
* @see awaitUntilLanguageClientReady()
*/
constructor(allClients: ClientCollection, workspaceFolder?: vscode.WorkspaceFolder) {
@@ -749,8 +756,9 @@ export class DefaultClient implements Client {
ui.bind(this);
// requests/notifications are deferred until this.languageClient is set.
this.queueBlockingTask(() => languageClient.onReady().then(
() => {
this.queueBlockingTask(async () => {
await languageClient.onReady();
try {
const workspaceFolder: vscode.WorkspaceFolder | undefined = this.rootFolder;
this.innerConfiguration = new configs.CppProperties(rootUri, workspaceFolder);
this.innerConfiguration.ConfigurationsChanged((e) => this.onConfigurationsChanged(e));
@@ -769,7 +777,7 @@ export class DefaultClient implements Client {
}
public async provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, token: vscode.CancellationToken): Promise<(vscode.Command | vscode.CodeAction)[]> {
return this.client.requestWhenReady(() => {
return this.client.requestWhenReady(async () => {
let r: Range;
if (range instanceof vscode.Selection) {
if (range.active.isBefore(range.anchor)) {
@@ -786,26 +794,24 @@ export class DefaultClient implements Client {
uri: document.uri.toString()
};
return this.client.languageClient.sendRequest(GetCodeActionsRequest, params)
.then((commands) => {
const resultCodeActions: vscode.CodeAction[] = [];
const commands: CodeActionCommand[] = await this.client.languageClient.sendRequest(GetCodeActionsRequest, params);
const resultCodeActions: vscode.CodeAction[] = [];
// Convert to vscode.CodeAction array
commands.forEach((command) => {
const title: string = util.getLocalizedString(command.localizeStringParams);
const vscodeCodeAction: vscode.CodeAction = {
title: title,
command: {
title: title,
command: command.command,
arguments: command.arguments
}
};
resultCodeActions.push(vscodeCodeAction);
});
// Convert to vscode.CodeAction array
commands.forEach((command) => {
const title: string = util.getLocalizedString(command.localizeStringParams);
const vscodeCodeAction: vscode.CodeAction = {
title: title,
command: {
title: title,
command: command.command,
arguments: command.arguments
}
};
resultCodeActions.push(vscodeCodeAction);
});
return resultCodeActions;
});
return resultCodeActions;
});
}
}
@@ -833,50 +839,48 @@ export class DefaultClient implements Client {
// The configurations will not be sent to the language server until the default include paths and frameworks have been set.
// The event handlers must be set before this happens.
return languageClient.sendRequest(QueryCompilerDefaultsRequest, {}).then((inputCompilerDefaults: configs.CompilerDefaults) => {
compilerDefaults = inputCompilerDefaults;
this.configuration.CompilerDefaults = compilerDefaults;
const inputCompilerDefaults: configs.CompilerDefaults = await languageClient.sendRequest(QueryCompilerDefaultsRequest, {});
compilerDefaults = inputCompilerDefaults;
this.configuration.CompilerDefaults = compilerDefaults;
// Only register file watchers, providers, and the real commands after the extension has finished initializing,
// e.g. prevents empty c_cpp_properties.json from generation.
registerCommands();
// Only register file watchers, providers, and the real commands after the extension has finished initializing,
// e.g. prevents empty c_cpp_properties.json from generation.
registerCommands();
this.registerFileWatcher();
this.registerFileWatcher();
this.disposables.push(vscode.languages.registerRenameProvider(this.documentSelector, new RenameProvider(this)));
this.disposables.push(vscode.languages.registerReferenceProvider(this.documentSelector, new FindAllReferencesProvider(this)));
this.disposables.push(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(this)));
this.disposables.push(vscode.languages.registerDocumentSymbolProvider(this.documentSelector, new DocumentSymbolProvider(this), undefined));
this.disposables.push(vscode.languages.registerCodeActionsProvider(this.documentSelector, new CodeActionProvider(this), undefined));
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "Disabled") {
this.documentFormattingProviderDisposable = vscode.languages.registerDocumentFormattingEditProvider(this.documentSelector, new DocumentFormattingEditProvider(this));
this.formattingRangeProviderDisposable = vscode.languages.registerDocumentRangeFormattingEditProvider(this.documentSelector, new DocumentRangeFormattingEditProvider(this));
this.onTypeFormattingProviderDisposable = vscode.languages.registerOnTypeFormattingEditProvider(this.documentSelector, new OnTypeFormattingEditProvider(this), ";", "}", "\n");
}
if (settings.codeFolding) {
this.codeFoldingProvider = new FoldingRangeProvider(this);
this.codeFoldingProviderDisposable = vscode.languages.registerFoldingRangeProvider(this.documentSelector, this.codeFoldingProvider);
}
if (settings.enhancedColorization && this.semanticTokensLegend) {
this.semanticTokensProvider = new SemanticTokensProvider(this);
this.semanticTokensProviderDisposable = vscode.languages.registerDocumentSemanticTokensProvider(this.documentSelector, this.semanticTokensProvider, this.semanticTokensLegend);
}
// Listen for messages from the language server.
this.registerNotifications();
});
this.disposables.push(vscode.languages.registerRenameProvider(this.documentSelector, new RenameProvider(this)));
this.disposables.push(vscode.languages.registerReferenceProvider(this.documentSelector, new FindAllReferencesProvider(this)));
this.disposables.push(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(this)));
this.disposables.push(vscode.languages.registerDocumentSymbolProvider(this.documentSelector, new DocumentSymbolProvider(this), undefined));
this.disposables.push(vscode.languages.registerCodeActionsProvider(this.documentSelector, new CodeActionProvider(this), undefined));
const settings: CppSettings = new CppSettings();
if (settings.formattingEngine !== "Disabled") {
this.documentFormattingProviderDisposable = vscode.languages.registerDocumentFormattingEditProvider(this.documentSelector, new DocumentFormattingEditProvider(this));
this.formattingRangeProviderDisposable = vscode.languages.registerDocumentRangeFormattingEditProvider(this.documentSelector, new DocumentRangeFormattingEditProvider(this));
this.onTypeFormattingProviderDisposable = vscode.languages.registerOnTypeFormattingEditProvider(this.documentSelector, new OnTypeFormattingEditProvider(this), ";", "}", "\n");
}
if (settings.codeFolding) {
this.codeFoldingProvider = new FoldingRangeProvider(this);
this.codeFoldingProviderDisposable = vscode.languages.registerFoldingRangeProvider(this.documentSelector, this.codeFoldingProvider);
}
if (settings.enhancedColorization && this.semanticTokensLegend) {
this.semanticTokensProvider = new SemanticTokensProvider(this);
this.semanticTokensProviderDisposable = vscode.languages.registerDocumentSemanticTokensProvider(this.documentSelector, this.semanticTokensProvider, this.semanticTokensLegend);
}
// Listen for messages from the language server.
this.registerNotifications();
} else {
this.configuration.CompilerDefaults = compilerDefaults;
}
},
(err) => {
} catch (err) {
this.isSupported = false; // Running on an OS we don't support yet.
if (!failureMessageShown) {
failureMessageShown = true;
vscode.window.showErrorMessage(localize("unable.to.start", "Unable to start the C/C++ language server. IntelliSense features will be disabled. Error: {0}", String(err)));
}
}));
}
});
} catch (err) {
this.isSupported = false; // Running on an OS we don't support yet.
if (!failureMessageShown) {
@@ -1338,7 +1342,7 @@ export class DefaultClient implements Client {
public sendDidChangeSettings(settings: any): void {
// Send settings json to native side
this.notifyWhenReady(() => {
this.notifyWhenLanguageClientReady(() => {
this.languageClient.sendNotification(DidChangeSettingsNotification, {settings, workspaceFolderUri: this.RootPath});
});
}
@@ -1346,7 +1350,7 @@ export class DefaultClient implements Client {
public onDidChangeSettings(event: vscode.ConfigurationChangeEvent, isFirstClient: boolean): { [key: string]: string } {
this.sendAllSettings();
const changedSettings: { [key: string]: string } = this.settingsTracker.getChangedSettings();
this.notifyWhenReady(() => {
this.notifyWhenLanguageClientReady(() => {
if (Object.keys(changedSettings).length > 0) {
if (isFirstClient) {
if (changedSettings["commentContinuationPatterns"]) {
@@ -1468,7 +1472,7 @@ export class DefaultClient implements Client {
this.pauseParsing();
}
};
return this.notifyWhenReady(() => {
return this.notifyWhenLanguageClientReady(() => {
if (this.registeredProviders.includes(provider)) {
return; // Prevent duplicate processing.
}
@@ -1486,22 +1490,20 @@ export class DefaultClient implements Client {
ask.Value = true;
}
if (ask.Value) {
ui.showConfigureCustomProviderMessage(() => {
ui.showConfigureCustomProviderMessage(async () => {
const message: string = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 1)
? localize("provider.configure.folder", "{0} would like to configure IntelliSense for the '{1}' folder.", provider.name, this.Name)
: localize("provider.configure.this.folder", "{0} would like to configure IntelliSense for this folder.", provider.name);
const allow: string = localize("allow.button", "Allow");
const dontAllow: string = localize("dont.allow.button", "Don't Allow");
const askLater: string = localize("ask.me.later.button", "Ask Me Later");
return vscode.window.showInformationMessage(message, allow, dontAllow, askLater).then(result => {
return vscode.window.showInformationMessage(message, allow, dontAllow, askLater).then(async result => {
switch (result) {
case allow: {
this.configuration.updateCustomConfigurationProvider(provider.extensionId).then(() => {
onRegistered();
ask.Value = false;
telemetry.logLanguageServerEvent("customConfigurationProvider", { "providerId": provider.extensionId });
});
await this.configuration.updateCustomConfigurationProvider(provider.extensionId);
onRegistered();
ask.Value = false;
telemetry.logLanguageServerEvent("customConfigurationProvider", { "providerId": provider.extensionId });
return true;
}
case dontAllow: {
@@ -1514,8 +1516,7 @@ export class DefaultClient implements Client {
}
return false;
});
},
() => ask.Value = false);
}, () => ask.Value = false);
}
} else if (isSameProviderExtensionId(selectedProvider, provider.extensionId)) {
onRegistered();
@@ -1528,7 +1529,7 @@ export class DefaultClient implements Client {
}
public updateCustomConfigurations(requestingProvider?: CustomConfigurationProvider1): Thenable<void> {
return this.notifyWhenReady(() => {
return this.notifyWhenLanguageClientReady(() => {
if (!this.configurationProvider) {
this.clearCustomConfigurations();
return;
@@ -1550,8 +1551,8 @@ export class DefaultClient implements Client {
});
}
public updateCustomBrowseConfiguration(requestingProvider?: CustomConfigurationProvider1): Thenable<void> {
return this.notifyWhenReady(() => {
public updateCustomBrowseConfiguration(requestingProvider?: CustomConfigurationProvider1): Promise<void> {
return this.notifyWhenLanguageClientReady(() => {
if (!this.configurationProvider) {
return;
}
@@ -1671,7 +1672,7 @@ export class DefaultClient implements Client {
}
public async rescanFolder(): Promise<void> {
await this.notifyWhenReady(() => this.languageClient.sendNotification(RescanFolderNotification));
await this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(RescanFolderNotification));
}
public async provideCustomConfiguration(docUri: vscode.Uri, requestFile?: string): Promise<void> {
@@ -1683,16 +1684,16 @@ export class DefaultClient implements Client {
const providerId: string | undefined = this.configurationProvider;
if (!providerId) {
onFinished();
return Promise.resolve();
return;
}
const provider: CustomConfigurationProvider1 | undefined = getCustomConfigProviders().get(providerId);
if (!provider) {
onFinished();
return Promise.resolve();
return;
}
if (!provider.isReady) {
onFinished();
return Promise.reject(`${this.configurationProvider} is not ready`);
throw new Error(`${this.configurationProvider} is not ready`);
}
return this.queueBlockingTask(async () => {
const tokenSource: vscode.CancellationTokenSource = new vscode.CancellationTokenSource();
@@ -1708,7 +1709,7 @@ export class DefaultClient implements Client {
if (!response.candidates || response.candidates.length === 0) {
// If we didn't receive any candidates, no configuration is needed.
onFinished();
return Promise.resolve();
return;
}
// Need to loop through candidates, to see if we can get a custom configuration from any of them.
@@ -1734,43 +1735,42 @@ export class DefaultClient implements Client {
}
}
};
return this.callTaskWithTimeout(provideConfigurationAsync, configProviderTimeout, tokenSource).then(
(configs?: SourceFileConfigurationItem[] | null) => {
if (configs && configs.length > 0) {
this.sendCustomConfigurations(configs, provider.version);
}
const configs: SourceFileConfigurationItem[] | null | undefined = await this.callTaskWithTimeout(provideConfigurationAsync, configProviderTimeout, tokenSource);
try {
if (configs && configs.length > 0) {
this.sendCustomConfigurations(configs, provider.version);
}
onFinished();
} catch (err) {
if (requestFile) {
onFinished();
},
(err) => {
if (requestFile) {
onFinished();
return;
}
const settings: CppSettings = new CppSettings(this.RootUri);
if (settings.configurationWarnings === "Enabled" && !this.isExternalHeader(docUri) && !vscode.debug.activeDebugSession) {
const dismiss: string = localize("dismiss.button", "Dismiss");
const disable: string = localize("diable.warnings.button", "Disable Warnings");
const configName: string | undefined = this.configuration.CurrentConfiguration?.name;
if (!configName) {
return;
}
const settings: CppSettings = new CppSettings(this.RootUri);
if (settings.configurationWarnings === "Enabled" && !this.isExternalHeader(docUri) && !vscode.debug.activeDebugSession) {
const dismiss: string = localize("dismiss.button", "Dismiss");
const disable: string = localize("diable.warnings.button", "Disable Warnings");
const configName: string | undefined = this.configuration.CurrentConfiguration?.name;
if (!configName) {
return;
}
let message: string = localize("unable.to.provide.configuraiton",
"{0} is unable to provide IntelliSense configuration information for '{1}'. Settings from the '{2}' configuration will be used instead.",
providerName, docUri.fsPath, configName);
if (err) {
message += ` (${err})`;
}
vscode.window.showInformationMessage(message, dismiss, disable).then(response => {
switch (response) {
case disable: {
settings.toggleSetting("configurationWarnings", "Enabled", "Disabled");
break;
}
}
});
let message: string = localize("unable.to.provide.configuraiton",
"{0} is unable to provide IntelliSense configuration information for '{1}'. Settings from the '{2}' configuration will be used instead.",
providerName, docUri.fsPath, configName);
if (err) {
message += ` (${err})`;
}
});
vscode.window.showInformationMessage(message, dismiss, disable).then(response => {
switch (response) {
case disable: {
settings.toggleSetting("configurationWarnings", "Enabled", "Disabled");
break;
}
}
});
}
}
});
}
@@ -1841,7 +1841,7 @@ export class DefaultClient implements Client {
text: document.getText()
}
};
this.notifyWhenReady(() => this.languageClient.sendNotification(DidOpenNotification, params));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(DidOpenNotification, params));
this.trackedDocuments.add(document);
}
@@ -1850,9 +1850,9 @@ export class DefaultClient implements Client {
* before attempting to send messages or operate on the client.
*/
public queueTask<T>(task: () => Thenable<T>): Thenable<T> {
public async queueTask<T>(task: () => Thenable<T>): Promise<T> {
if (this.isSupported) {
const nextTask: () => Thenable<T> = async () => {
const nextTask: () => Promise<T> = async () => {
try {
return await task();
} catch (err) {
@@ -1860,16 +1860,17 @@ export class DefaultClient implements Client {
throw err;
}
};
if (pendingTask && !pendingTask.Done) {
// We don't want the queue to stall because of a rejected promise.
return pendingTask.getPromise().then(nextTask, nextTask);
try {
await pendingTask.getPromise();
} catch (e) { }
} else {
pendingTask = undefined;
return nextTask();
}
return nextTask();
} else {
return Promise.reject(localize("unsupported.client", "Unsupported client"));
throw new Error(localize("unsupported.client", "Unsupported client"));
}
}
@@ -1878,16 +1879,16 @@ export class DefaultClient implements Client {
* during language client startup and for custom configuration providers.
* @param task The task that blocks all future tasks
*/
private queueBlockingTask<T>(task: () => Thenable<T>): Thenable<T> {
private async queueBlockingTask<T>(task: () => Thenable<T>): Promise<T> {
if (this.isSupported) {
pendingTask = new util.BlockingTask<T>(task, pendingTask);
return pendingTask.getPromise();
} else {
return Promise.reject(localize("unsupported.client", "Unsupported client"));
throw new Error (localize("unsupported.client", "Unsupported client"));
}
}
private callTaskWithTimeout<T>(task: () => Thenable<T>, ms: number, cancelToken?: vscode.CancellationTokenSource): Thenable<T> {
private callTaskWithTimeout<T>(task: () => Thenable<T>, ms: number, cancelToken?: vscode.CancellationTokenSource): Promise<T> {
let timer: NodeJS.Timer;
// Create a promise that rejects in <ms> milliseconds
const timeout: () => Promise<T> = () => new Promise<T>((resolve, reject) => {
@@ -1916,13 +1917,20 @@ export class DefaultClient implements Client {
return this.queueTask(request);
}
public notifyWhenReady<T>(notify: () => T): Thenable<T> {
const task: () => Thenable<T> = () => new Promise<T>(resolve => {
public notifyWhenLanguageClientReady<T>(notify: () => T): Promise<T> {
const task: () => Promise<T> = () => new Promise<T>(resolve => {
resolve(notify());
});
return this.queueTask(task);
}
public awaitUntilLanguageClientReady(): Thenable<void> {
const task: () => Thenable<void> = () => new Promise<void>(resolve => {
resolve();
});
return this.queueTask(task);
}
/**
* listen for notifications from the language server.
*/
@@ -2116,30 +2124,29 @@ export class DefaultClient implements Client {
if (!client.configuration.CurrentConfiguration?.configurationProvider) {
const showIntelliSenseFallbackMessage: PersistentState<boolean> = new PersistentState<boolean>("CPP.showIntelliSenseFallbackMessage", true);
if (showIntelliSenseFallbackMessage.Value) {
ui.showConfigureIncludePathMessage(() => {
ui.showConfigureIncludePathMessage(async () => {
const configJSON: string = localize("configure.json.button", "Configure (JSON)");
const configUI: string = localize("configure.ui.button", "Configure (UI)");
const dontShowAgain: string = localize("dont.show.again", "Don't Show Again");
const fallbackMsg: string = client.configuration.VcpkgInstalled ?
localize("update.your.intellisense.settings", "Update your IntelliSense settings or use Vcpkg to install libraries to help find missing headers.") :
localize("configure.your.intellisense.settings", "Configure your IntelliSense settings to help find missing headers.");
return vscode.window.showInformationMessage(fallbackMsg, configJSON, configUI, dontShowAgain).then((value) => {
return vscode.window.showInformationMessage(fallbackMsg, configJSON, configUI, dontShowAgain).then(async (value) => {
let commands: string[];
switch (value) {
case configJSON:
vscode.commands.getCommands(true).then((commands: string[]) => {
if (commands.indexOf("workbench.action.problems.focus") >= 0) {
vscode.commands.executeCommand("workbench.action.problems.focus");
}
});
commands = await vscode.commands.getCommands(true);
if (commands.indexOf("workbench.action.problems.focus") >= 0) {
vscode.commands.executeCommand("workbench.action.problems.focus");
}
client.handleConfigurationEditJSONCommand();
telemetry.logLanguageServerEvent("SettingsCommand", { "toast": "json" }, undefined);
break;
case configUI:
vscode.commands.getCommands(true).then((commands: string[]) => {
if (commands.indexOf("workbench.action.problems.focus") >= 0) {
vscode.commands.executeCommand("workbench.action.problems.focus");
}
});
commands = await vscode.commands.getCommands(true);
if (commands.indexOf("workbench.action.problems.focus") >= 0) {
vscode.commands.executeCommand("workbench.action.problems.focus");
}
client.handleConfigurationEditUICommand();
telemetry.logLanguageServerEvent("SettingsCommand", { "toast": "ui" }, undefined);
break;
@@ -2149,8 +2156,7 @@ export class DefaultClient implements Client {
}
return true;
});
},
() => showIntelliSenseFallbackMessage.Value = false);
}, () => showIntelliSenseFallbackMessage.Value = false);
}
}
}
@@ -2241,7 +2247,7 @@ export class DefaultClient implements Client {
? localize("auto-configure.intellisense.folder", "Would you like to use {0} to auto-configure IntelliSense for the '{1}' folder?", compileCommandStr, client.Name)
: localize("auto-configure.intellisense.this.folder", "Would you like to use {0} to auto-configure IntelliSense for this folder?", compileCommandStr);
ui.showConfigureCompileCommandsMessage(() => {
ui.showConfigureCompileCommandsMessage(async () => {
const yes: string = localize("yes.button", "Yes");
const no: string = localize("no.button", "No");
const askLater: string = localize("ask.me.later.button", "Ask Me Later");
@@ -2285,7 +2291,7 @@ export class DefaultClient implements Client {
* notifications to the language server
*/
public activeDocumentChanged(document: vscode.TextDocument): void {
this.notifyWhenReady(() => {
this.notifyWhenLanguageClientReady(() => {
this.languageClient.sendNotification(ActiveDocumentChangeNotification, this.languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document));
});
}
@@ -2299,13 +2305,13 @@ export class DefaultClient implements Client {
}
public selectionChanged(selection: Range): void {
this.notifyWhenReady(() => {
this.notifyWhenLanguageClientReady(() => {
this.languageClient.sendNotification(TextEditorSelectionChangeNotification, selection);
});
}
public resetDatabase(): void {
this.notifyWhenReady(() => this.languageClient.sendNotification(ResetDatabaseNotification));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(ResetDatabaseNotification));
}
/**
@@ -2316,11 +2322,11 @@ export class DefaultClient implements Client {
}
public pauseParsing(): void {
this.notifyWhenReady(() => this.languageClient.sendNotification(PauseParsingNotification));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(PauseParsingNotification));
}
public resumeParsing(): void {
this.notifyWhenReady(() => this.languageClient.sendNotification(ResumeParsingNotification));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(ResumeParsingNotification));
}
private doneInitialCustomBrowseConfigurationCheck: Boolean = false;
@@ -2381,7 +2387,7 @@ export class DefaultClient implements Client {
currentConfiguration: index,
workspaceFolderUri: this.RootPath
};
this.notifyWhenReady(() => {
this.notifyWhenLanguageClientReady(() => {
this.languageClient.sendNotification(ChangeSelectedSettingNotification, params);
let configName: string = "";
if (this.configuration.ConfigurationNames) {
@@ -2397,7 +2403,7 @@ export class DefaultClient implements Client {
uri: vscode.Uri.file(path).toString(),
workspaceFolderUri: this.RootPath
};
this.notifyWhenReady(() => this.languageClient.sendNotification(ChangeCompileCommandsNotification, params));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(ChangeCompileCommandsNotification, params));
}
private isSourceFileConfigurationItem(input: any, providerVersion: Version): input is SourceFileConfigurationItem {
@@ -2454,7 +2460,7 @@ export class DefaultClient implements Client {
configuration: itemConfig
});
} else {
console.warn("discarding invalid SourceFileConfigurationItem: " + item);
console.warn("discarding invalid SourceFileConfigurationItem: " + JSON.stringify(item));
}
});
@@ -2511,7 +2517,7 @@ export class DefaultClient implements Client {
sanitized = {...<WorkspaceBrowseConfiguration>config};
if (!this.isWorkspaceBrowseConfiguration(sanitized)) {
console.log("Received an invalid browse configuration from configuration provider.");
console.log("Received an invalid browse configuration from configuration provider: " + JSON.stringify(sanitized));
const configValue: WorkspaceBrowseConfiguration | undefined = lastCustomBrowseConfiguration.Value;
if (configValue) {
sanitized = configValue;
@@ -2560,7 +2566,7 @@ export class DefaultClient implements Client {
const params: WorkspaceFolderParams = {
workspaceFolderUri: this.RootPath
};
this.notifyWhenReady(() => this.languageClient.sendNotification(ClearCustomConfigurationsNotification, params));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(ClearCustomConfigurationsNotification, params));
}
private clearCustomBrowseConfiguration(): void {
@@ -2568,81 +2574,70 @@ export class DefaultClient implements Client {
const params: WorkspaceFolderParams = {
workspaceFolderUri: this.RootPath
};
this.notifyWhenReady(() => this.languageClient.sendNotification(ClearCustomBrowseConfigurationNotification, params));
this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(ClearCustomBrowseConfigurationNotification, params));
}
/**
* command handlers
*/
public handleConfigurationSelectCommand(): void {
this.notifyWhenReady(() => {
const configNames: string[] | undefined = this.configuration.ConfigurationNames;
if (configNames) {
ui.showConfigurations(configNames)
.then((index: number) => {
if (index < 0) {
return;
}
this.configuration.select(index);
});
public async handleConfigurationSelectCommand(): Promise<void> {
await this.awaitUntilLanguageClientReady();
const configNames: string[] | undefined = this.configuration.ConfigurationNames;
if (configNames) {
const index: number = await ui.showConfigurations(configNames);
if (index < 0) {
return;
}
});
this.configuration.select(index);
}
}
public handleConfigurationProviderSelectCommand(): void {
this.notifyWhenReady(() => {
ui.showConfigurationProviders(this.configuration.CurrentConfigurationProvider)
.then(extensionId => {
if (extensionId === undefined) {
// operation was canceled.
return;
}
this.configuration.updateCustomConfigurationProvider(extensionId)
.then(() => {
if (extensionId) {
const provider: CustomConfigurationProvider1 | undefined = getCustomConfigProviders().get(extensionId);
this.updateCustomBrowseConfiguration(provider);
this.updateCustomConfigurations(provider);
telemetry.logLanguageServerEvent("customConfigurationProvider", { "providerId": extensionId });
} else {
this.clearCustomConfigurations();
this.clearCustomBrowseConfiguration();
}
});
});
});
public async handleConfigurationProviderSelectCommand(): Promise<void> {
await this.awaitUntilLanguageClientReady();
const extensionId: string | undefined = await ui.showConfigurationProviders(this.configuration.CurrentConfigurationProvider);
if (extensionId === undefined) {
// operation was canceled.
return;
}
await this.configuration.updateCustomConfigurationProvider(extensionId);
if (extensionId) {
const provider: CustomConfigurationProvider1 | undefined = getCustomConfigProviders().get(extensionId);
this.updateCustomBrowseConfiguration(provider);
this.updateCustomConfigurations(provider);
telemetry.logLanguageServerEvent("customConfigurationProvider", { "providerId": extensionId });
} else {
this.clearCustomConfigurations();
this.clearCustomBrowseConfiguration();
}
}
public handleShowParsingCommands(): void {
this.notifyWhenReady(() => {
ui.showParsingCommands()
.then((index: number) => {
if (index === 0) {
this.pauseParsing();
} else if (index === 1) {
this.resumeParsing();
}
});
});
public async handleShowParsingCommands(): Promise<void> {
await this.awaitUntilLanguageClientReady();
const index: number = await ui.showParsingCommands();
if (index === 0) {
this.pauseParsing();
} else if (index === 1) {
this.resumeParsing();
}
}
public handleConfigurationEditCommand(): void {
this.notifyWhenReady(() => this.configuration.handleConfigurationEditCommand(undefined, vscode.window.showTextDocument));
public handleConfigurationEditCommand(viewColumn: vscode.ViewColumn = vscode.ViewColumn.Active): void {
this.notifyWhenLanguageClientReady(() => this.configuration.handleConfigurationEditCommand(undefined, vscode.window.showTextDocument, viewColumn));
}
public handleConfigurationEditJSONCommand(): void {
this.notifyWhenReady(() => this.configuration.handleConfigurationEditJSONCommand(undefined, vscode.window.showTextDocument));
public handleConfigurationEditJSONCommand(viewColumn: vscode.ViewColumn = vscode.ViewColumn.Active): void {
this.notifyWhenLanguageClientReady(() => this.configuration.handleConfigurationEditJSONCommand(undefined, vscode.window.showTextDocument, viewColumn));
}
public handleConfigurationEditUICommand(): void {
this.notifyWhenReady(() => this.configuration.handleConfigurationEditUICommand(undefined, vscode.window.showTextDocument));
public handleConfigurationEditUICommand(viewColumn: vscode.ViewColumn = vscode.ViewColumn.Active): void {
this.notifyWhenLanguageClientReady(() => this.configuration.handleConfigurationEditUICommand(undefined, vscode.window.showTextDocument, viewColumn));
}
public handleAddToIncludePathCommand(path: string): void {
this.notifyWhenReady(() => this.configuration.addToIncludePathCommand(path));
this.notifyWhenLanguageClientReady(() => this.configuration.addToIncludePathCommand(path));
}
public handleGoToDirectiveInGroup(next: boolean): void {
public async handleGoToDirectiveInGroup(next: boolean): Promise<void> {
const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
if (editor) {
const params: GoToDirectiveInGroupParams = {
@@ -2651,26 +2646,49 @@ export class DefaultClient implements Client {
next: next
};
this.languageClient.sendRequest(GoToDirectiveInGroupRequest, params)
.then((response) => {
if (response) {
const p: vscode.Position = new vscode.Position(response.line, response.character);
const r: vscode.Range = new vscode.Range(p, p);
const response: Position | undefined = await this.languageClient.sendRequest(GoToDirectiveInGroupRequest, params);
if (response) {
const p: vscode.Position = new vscode.Position(response.line, response.character);
const r: vscode.Range = new vscode.Range(p, p);
// Check if still the active document.
const currentEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
if (currentEditor && editor.document.uri === currentEditor.document.uri) {
currentEditor.selection = new vscode.Selection(r.start, r.end);
currentEditor.revealRange(r);
}
}
});
// Check if still the active document.
const currentEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
if (currentEditor && editor.document.uri === currentEditor.document.uri) {
currentEditor.selection = new vscode.Selection(r.start, r.end);
currentEditor.revealRange(r);
}
}
}
}
public async handleCheckForCompiler(): Promise<void> {
await this.awaitUntilLanguageClientReady();
const compilers: configs.KnownCompiler[] | undefined = await this.getKnownCompilers();
if (!compilers || compilers.length === 0) {
const compilerName: string = process.platform === "win32" ? "MSVC" : (process.platform === "darwin" ? "Clang" : "GCC");
vscode.window.showInformationMessage(localize("no.compilers.found", "No C++ compilers were found on your system. For your platform, we recommend installing {0} using the instructions in the editor.", compilerName), { modal: true });
} else {
const header: string = localize("compilers.found", "We found the following C++ compiler(s) on your system:");
let message: string = header + "\n";
const settings: CppSettings = new CppSettings(this.RootUri);
const pathSeparator: string | undefined = settings.preferredPathSeparator;
compilers.forEach(compiler => {
if (pathSeparator !== "Forward Slash") {
message += "\n" + compiler.path.replace(/\//g, '\\');
} else {
message += "\n" + compiler.path.replace(/\\/g, '/');
}
});
if (compilers.length > 1) {
message += "\n\n" + localize("compilers.found.message", "You can specify which compiler to use in your project's IntelliSense Configuration.");
}
vscode.window.showInformationMessage(message, { modal: true });
}
}
public onInterval(): void {
// These events can be discarded until the language client is ready.
// Don't queue them up with this.notifyWhenReady calls.
// Don't queue them up with this.notifyWhenLanguageClientReady calls.
if (this.innerLanguageClient !== undefined && this.configuration !== undefined) {
this.languageClient.sendNotification(IntervalTimerNotification);
this.configuration.checkCppProperties();
@@ -2709,7 +2727,7 @@ export class DefaultClient implements Client {
}
public handleReferencesIcon(): void {
this.notifyWhenReady(() => {
this.notifyWhenLanguageClientReady(() => {
const cancelling: boolean = DefaultClient.referencesPendingCancellations.length > 0;
if (!cancelling) {
workspaceReferences.UpdateProgressUICounter(this.model.referencesCommandMode.Value);
@@ -2815,9 +2833,10 @@ class NullClient implements Client {
getCurrentCompilerPathAndArgs(): Thenable<util.CompilerPathAndArgs | undefined> { return Promise.resolve(undefined); }
getKnownCompilers(): Thenable<configs.KnownCompiler[] | undefined> { return Promise.resolve([]); }
takeOwnership(document: vscode.TextDocument): void {}
queueTask<T>(task: () => Thenable<T>): Thenable<T> { return task(); }
queueTask<T>(task: () => Thenable<T>): Promise<T> { return Promise.resolve(task()); }
requestWhenReady<T>(request: () => Thenable<T>): Thenable<T> { return request(); }
notifyWhenReady(notify: () => void): void {}
notifyWhenLanguageClientReady(notify: () => void): void {}
awaitUntilLanguageClientReady(): void {}
requestSwitchHeaderSource(rootPath: string, fileName: string): Thenable<string> { return Promise.resolve(""); }
activeDocumentChanged(document: vscode.TextDocument): void {}
activate(): void {}
@@ -2826,15 +2845,16 @@ class NullClient implements Client {
deactivate(): void {}
pauseParsing(): void {}
resumeParsing(): void {}
handleConfigurationSelectCommand(): void {}
handleConfigurationProviderSelectCommand(): void {}
handleShowParsingCommands(): void {}
handleConfigurationSelectCommand(): Promise<void> { return Promise.resolve(); }
handleConfigurationProviderSelectCommand(): Promise<void> { return Promise.resolve(); }
handleShowParsingCommands(): Promise<void> { return Promise.resolve(); }
handleReferencesIcon(): void {}
handleConfigurationEditCommand(): void {}
handleConfigurationEditJSONCommand(): void {}
handleConfigurationEditUICommand(): void {}
handleConfigurationEditCommand(viewColumn?: vscode.ViewColumn): void {}
handleConfigurationEditJSONCommand(viewColumn?: vscode.ViewColumn): void {}
handleConfigurationEditUICommand(viewColumn?: vscode.ViewColumn): void {}
handleAddToIncludePathCommand(path: string): void { }
handleGoToDirectiveInGroup(next: boolean): void {}
handleGoToDirectiveInGroup(next: boolean): Promise<void> { return Promise.resolve(); }
handleCheckForCompiler(): Promise<void> { return Promise.resolve(); }
onInterval(): void {}
dispose(): void {
this.booleanEvent.dispose();
+159 -152
View File
@@ -436,9 +436,13 @@ export class CppProperties {
private async readNodeAddonIncludeLocations(rootPath: string): Promise<void> {
let error: Error | undefined;
let pdjFound: boolean = false;
const package_json: any = await fs.promises.readFile(path.join(rootPath, "package.json"), "utf8")
.then(pdj => {pdjFound = true; return JSON.parse(pdj); })
.catch(e => (error = e));
let packageJson: any;
try {
packageJson = JSON.parse(await fs.promises.readFile(path.join(rootPath, "package.json"), "utf8"));
pdjFound = true;
} catch (err) {
error = err;
}
if (!error) {
try {
@@ -457,35 +461,37 @@ export class CppProperties {
}
for (const [dep, execCmd] of nodeAddonMap) {
if (dep in package_json.dependencies) {
let stdout: string | void = await util.execChildProcess(execCmd, rootPath)
.catch((error) => console.log('readNodeAddonIncludeLocations', error.message));
if (!stdout) {
continue;
}
// cleanup newlines
if (stdout[stdout.length - 1] === "\n") {
stdout = stdout.slice(0, -1);
}
// node-addon-api returns a quoted string, e.g., '"/home/user/dir/node_modules/node-addon-api"'.
if (stdout[0] === "\"" && stdout[stdout.length - 1] === "\"") {
stdout = stdout.slice(1, -1);
}
// at this time both node-addon-api and nan return their own directory so this test is not really
// needed. but it does future proof the code.
if (!await util.checkDirectoryExists(stdout)) {
// nan returns a path relative to rootPath causing the previous check to fail because this code
// is executing in vscode's working directory.
stdout = path.join(rootPath, stdout);
if (!await util.checkDirectoryExists(stdout)) {
error = new Error(`${dep} directory ${stdout} doesn't exist`);
stdout = '';
if (dep in packageJson.dependencies) {
try {
let stdout: string | void = await util.execChildProcess(execCmd, rootPath);
if (!stdout) {
continue;
}
}
if (stdout) {
this.nodeAddonIncludes.push(stdout);
// cleanup newlines
if (stdout[stdout.length - 1] === "\n") {
stdout = stdout.slice(0, -1);
}
// node-addon-api returns a quoted string, e.g., '"/home/user/dir/node_modules/node-addon-api"'.
if (stdout[0] === "\"" && stdout[stdout.length - 1] === "\"") {
stdout = stdout.slice(1, -1);
}
// at this time both node-addon-api and nan return their own directory so this test is not really
// needed. but it does future proof the code.
if (!await util.checkDirectoryExists(stdout)) {
// nan returns a path relative to rootPath causing the previous check to fail because this code
// is executing in vscode's working directory.
stdout = path.join(rootPath, stdout);
if (!await util.checkDirectoryExists(stdout)) {
error = new Error(`${dep} directory ${stdout} doesn't exist`);
stdout = '';
}
}
if (stdout) {
this.nodeAddonIncludes.push(stdout);
}
} catch (err) {
console.log('readNodeAddonIncludeLocations', err.message);
}
}
}
@@ -908,31 +914,29 @@ export class CppProperties {
}
// onBeforeOpen will be called after c_cpp_properties.json have been created (if it did not exist), but before the document is opened.
public handleConfigurationEditCommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument) => void): void {
public handleConfigurationEditCommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument, column?: vscode.ViewColumn) => void, viewColumn?: vscode.ViewColumn): void {
const otherSettings: OtherSettings = new OtherSettings(this.rootUri);
if (otherSettings.settingsEditor === "ui") {
this.handleConfigurationEditUICommand(onBeforeOpen, showDocument);
this.handleConfigurationEditUICommand(onBeforeOpen, showDocument, viewColumn);
} else {
this.handleConfigurationEditJSONCommand(onBeforeOpen, showDocument);
this.handleConfigurationEditJSONCommand(onBeforeOpen, showDocument, viewColumn);
}
}
// onBeforeOpen will be called after c_cpp_properties.json have been created (if it did not exist), but before the document is opened.
public handleConfigurationEditJSONCommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument) => void): void {
this.ensurePropertiesFile().then(() => {
console.assert(this.propertiesFile);
if (onBeforeOpen) {
onBeforeOpen();
public async handleConfigurationEditJSONCommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument, column?: vscode.ViewColumn) => void, viewColumn?: vscode.ViewColumn): Promise<void> {
await this.ensurePropertiesFile();
console.assert(this.propertiesFile);
if (onBeforeOpen) {
onBeforeOpen();
}
// Directly open the json file
if (this.propertiesFile) {
const document: vscode.TextDocument = await vscode.workspace.openTextDocument(this.propertiesFile);
if (showDocument) {
showDocument(document, viewColumn);
}
// Directly open the json file
if (this.propertiesFile) {
vscode.workspace.openTextDocument(this.propertiesFile).then((document: vscode.TextDocument) => {
if (showDocument) {
showDocument(document);
}
});
}
});
}
}
private ensureSettingsPanelInitlialized(): void {
@@ -949,58 +953,61 @@ export class CppProperties {
}
// onBeforeOpen will be called after c_cpp_properties.json have been created (if it did not exist), but before the document is opened.
public handleConfigurationEditUICommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument) => void): void {
this.ensurePropertiesFile().then(() => {
if (this.propertiesFile) {
if (onBeforeOpen) {
onBeforeOpen();
}
if (this.parsePropertiesFile()) {
this.ensureSettingsPanelInitlialized();
if (this.settingsPanel) {
const configNames: string[] | undefined = this.ConfigurationNames;
if (configNames && this.configurationJson) {
// Use the active configuration as the default selected configuration to load on UI editor
this.settingsPanel.selectedConfigIndex = this.CurrentConfigurationIndex;
this.settingsPanel.createOrShow(configNames,
this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex],
this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex));
}
public async handleConfigurationEditUICommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument, column?: vscode.ViewColumn) => void, viewColumn?: vscode.ViewColumn): Promise<void> {
await this.ensurePropertiesFile();
if (this.propertiesFile) {
if (onBeforeOpen) {
onBeforeOpen();
}
if (this.parsePropertiesFile()) {
this.ensureSettingsPanelInitlialized();
if (this.settingsPanel) {
const configNames: string[] | undefined = this.ConfigurationNames;
if (configNames && this.configurationJson) {
// Use the active configuration as the default selected configuration to load on UI editor
this.settingsPanel.selectedConfigIndex = this.CurrentConfigurationIndex;
this.settingsPanel.createOrShow(configNames,
this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex],
this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex),
viewColumn);
}
} else {
// Parse failed, open json file
vscode.workspace.openTextDocument(this.propertiesFile).then((document: vscode.TextDocument) => {
if (showDocument) {
showDocument(document);
}
});
}
} else {
// Parse failed, open json file
const document: vscode.TextDocument = await vscode.workspace.openTextDocument(this.propertiesFile);
if (showDocument) {
showDocument(document, viewColumn);
}
}
});
}
}
private onSettingsPanelActivated(): void {
private async onSettingsPanelActivated(): Promise<void> {
if (this.configurationJson) {
this.ensurePropertiesFile().then(() => {
if (this.propertiesFile) {
if (this.parsePropertiesFile()) {
const configNames: string[] | undefined = this.ConfigurationNames;
if (configNames && this.settingsPanel && this.configurationJson) {
// The settings UI became visible or active.
// Ensure settingsPanel has copy of latest current configuration
if (this.settingsPanel.selectedConfigIndex >= this.configurationJson.configurations.length) {
this.settingsPanel.selectedConfigIndex = this.CurrentConfigurationIndex;
}
this.settingsPanel.updateConfigUI(configNames,
this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex],
this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex));
} else {
// Parse failed, open json file
vscode.workspace.openTextDocument(this.propertiesFile);
await this.ensurePropertiesFile();
if (this.propertiesFile) {
if (this.parsePropertiesFile()) {
const configNames: string[] | undefined = this.ConfigurationNames;
if (configNames && this.settingsPanel && this.configurationJson) {
// The settings UI became visible or active.
// Ensure settingsPanel has copy of latest current configuration
if (this.settingsPanel.selectedConfigIndex >= this.configurationJson.configurations.length) {
this.settingsPanel.selectedConfigIndex = this.CurrentConfigurationIndex;
}
setTimeout(() => {
if (this.settingsPanel && this.configurationJson) {
this.settingsPanel.updateConfigUI(configNames,
this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex],
this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex));
}
},
500); // Need some delay or the UI can randomly be blank, particularly in the remote scenario.
} else {
// Parse failed, open json file
vscode.workspace.openTextDocument(this.propertiesFile);
}
}
});
}
}
}
@@ -1078,11 +1085,11 @@ export class CppProperties {
}
private async ensurePropertiesFile(): Promise<void> {
if (this.propertiesFile && fs.existsSync(this.propertiesFile.fsPath)) {
if (this.propertiesFile && await util.checkFileExists(this.propertiesFile.fsPath)) {
return;
} else {
try {
if (!fs.existsSync(this.configFolder)) {
if (!await util.checkDirectoryExists(this.configFolder)) {
fs.mkdirSync(this.configFolder);
}
@@ -1583,6 +1590,7 @@ export class CppProperties {
// Check for path-related squiggles.
let paths: string[] = [];
let compilerPath: string | undefined;
for (const pathArray of [ (currentConfiguration.browse ? currentConfiguration.browse.path : undefined),
currentConfiguration.includePath, currentConfiguration.macFrameworkPath, currentConfiguration.forcedInclude ]) {
if (pathArray) {
@@ -1597,11 +1605,12 @@ export class CppProperties {
if (currentConfiguration.compilerPath) {
// Unlike other cases, compilerPath may not start or end with " due to trimming of whitespace and the possibility of compiler args.
paths.push(`${currentConfiguration.compilerPath}`);
compilerPath = currentConfiguration.compilerPath;
}
// Resolve and split any environment variables
paths = this.resolveAndSplit(paths, undefined, this.ExtendedEnvironment);
compilerPath = util.resolveVariables(compilerPath, this.ExtendedEnvironment).trim();
// Get the start/end for properties that are file-only.
const forcedIncludeStart: number = curText.search(/\s*\"forcedInclude\"\s*:\s*\[/);
@@ -1609,10 +1618,51 @@ export class CppProperties {
const compileCommandsStart: number = curText.search(/\s*\"compileCommands\"\s*:\s*\"/);
const compileCommandsEnd: number = compileCommandsStart === -1 ? -1 : curText.indexOf('"', curText.indexOf('"', curText.indexOf(":", compileCommandsStart)) + 1);
const compilerPathStart: number = curText.search(/\s*\"compilerPath\"\s*:\s*\"/);
const compilerPathEnd: number = compilerPathStart === -1 ? -1 : curText.indexOf('"', curText.indexOf('"', curText.indexOf(":", compilerPathStart)) + 1) + 1;
const compilerPathValueStart: number = curText.indexOf('"', curText.indexOf(":", compilerPathStart));
const compilerPathEnd: number = compilerPathStart === -1 ? -1 : curText.indexOf('"', compilerPathValueStart + 1) + 1;
const processedPaths: Set<string> = new Set<string>();
// Validate compiler paths
let compilerPathNeedsQuotes: boolean = false;
let compilerMessage: string | undefined;
const compilerPathAndArgs: util.CompilerPathAndArgs = util.extractCompilerPathAndArgs(compilerPath);
// Don't squiggle invalid cl.exe paths because it could be for an older preview build.
if (compilerPathAndArgs.compilerName.toLowerCase() !== "cl.exe" && compilerPathAndArgs.compilerPath !== undefined) {
// Squiggle when the compiler's path has spaces without quotes but args are used.
compilerPathNeedsQuotes = (compilerPathAndArgs.additionalArgs && compilerPathAndArgs.additionalArgs.length > 0)
&& !compilerPath.startsWith('"')
&& compilerPathAndArgs.compilerPath.includes(" ");
compilerPath = compilerPathAndArgs.compilerPath;
// Don't squiggle if compiler path is resolving with environment path.
if (compilerPathNeedsQuotes || (compilerPath && !which.sync(compilerPath, { nothrow: true }))) {
if (compilerPathNeedsQuotes) {
compilerMessage = localize("path.with.spaces", 'Compiler path with spaces and arguments is missing double quotes " around the path.');
newSquiggleMetrics.CompilerPathMissingQuotes++;
} else if (!util.checkFileExistsSync(compilerPath)) {
compilerMessage = localize("path.is.not.a.file", "Path is not a file: {0}", compilerPath);
newSquiggleMetrics.PathNotAFile++;
}
}
}
const isWSL: boolean = isWindows && compilerPath.startsWith("/");
let compilerPathExists: boolean = true;
if (this.rootUri) {
const checkPathExists: any = util.checkPathExistsSync(compilerPath, this.rootUri.fsPath + path.sep, isWindows, isWSL, true);
compilerPathExists = checkPathExists.pathExists;
compilerPath = checkPathExists.path;
}
if (!compilerPathExists) {
compilerMessage = localize('cannot.find2', "Cannot find \"{0}\".", compilerPath);
newSquiggleMetrics.PathNonExistent++;
}
if (compilerMessage) {
const diagnostic: vscode.Diagnostic = new vscode.Diagnostic(
new vscode.Range(document.positionAt(curTextStartOffset + compilerPathValueStart),
document.positionAt(curTextStartOffset + compilerPathEnd)),
compilerMessage, vscode.DiagnosticSeverity.Warning);
diagnostics.push(diagnostic);
}
// Validate paths
for (const curPath of paths) {
if (processedPaths.has(curPath)) {
@@ -1621,7 +1671,6 @@ export class CppProperties {
continue;
}
processedPaths.add(curPath);
const isCompilerPath: boolean = curPath === currentConfiguration.compilerPath;
// Resolve special path cases.
if (curPath === "${default}") {
// TODO: Add squiggles for when the C_Cpp.default.* paths are invalid.
@@ -1632,51 +1681,12 @@ export class CppProperties {
if (!resolvedPath) {
continue;
}
let compilerPathNeedsQuotes: boolean = false;
if (isCompilerPath) {
resolvedPath = resolvedPath.trim();
const compilerPathAndArgs: util.CompilerPathAndArgs = util.extractCompilerPathAndArgs(resolvedPath);
if (compilerPathAndArgs.compilerName.toLowerCase() === "cl.exe") {
continue; // Don't squiggle invalid cl.exe paths because it could be for an older preview build.
}
if (compilerPathAndArgs.compilerPath === undefined) {
continue;
}
// Squiggle when the compiler's path has spaces without quotes but args are used.
compilerPathNeedsQuotes = (compilerPathAndArgs.additionalArgs && compilerPathAndArgs.additionalArgs.length > 0)
&& !resolvedPath.startsWith('"')
&& compilerPathAndArgs.compilerPath.includes(" ");
resolvedPath = compilerPathAndArgs.compilerPath;
if (!compilerPathNeedsQuotes && which.sync(resolvedPath, {nothrow: true})) {
continue; // Don't squiggle if compiler path is resolving with environment path.
}
}
const isWSL: boolean = isWindows && resolvedPath.startsWith("/");
let pathExists: boolean = true;
const existsWithExeAdded: (path: string) => boolean = (path: string) => isCompilerPath && isWindows && !isWSL && fs.existsSync(path + ".exe");
if (!fs.existsSync(resolvedPath)) {
if (existsWithExeAdded(resolvedPath)) {
resolvedPath += ".exe";
} else if (!this.rootUri) {
pathExists = false;
} else {
// Check again for a relative path.
const relativePath: string = this.rootUri.fsPath + path.sep + resolvedPath;
if (!fs.existsSync(relativePath)) {
if (existsWithExeAdded(resolvedPath)) {
resolvedPath += ".exe";
} else {
pathExists = false;
}
} else {
resolvedPath = relativePath;
}
}
if (this.rootUri) {
const checkPathExists: any = util.checkPathExistsSync(resolvedPath, this.rootUri.fsPath + path.sep, isWindows, isWSL, false);
pathExists = checkPathExists.pathExists;
resolvedPath = checkPathExists.path;
}
// Normalize path separators.
if (path.sep === "/") {
resolvedPath = resolvedPath.replace(/\\/g, path.sep);
@@ -1701,6 +1711,9 @@ export class CppProperties {
for (const curMatch of configMatches) {
curOffset = curText.substr(endOffset).search(pattern) + endOffset;
endOffset = curOffset + curMatch.length;
if (curOffset >= compilerPathStart && curOffset <= compilerPathEnd) {
continue;
}
let message: string;
if (!pathExists) {
message = localize('cannot.find2', "Cannot find \"{0}\".", resolvedPath);
@@ -1708,23 +1721,17 @@ export class CppProperties {
} else {
// Check for file versus path mismatches.
if ((curOffset >= forcedIncludeStart && curOffset <= forcedeIncludeEnd) ||
(curOffset >= compileCommandsStart && curOffset <= compileCommandsEnd) ||
(curOffset >= compilerPathStart && curOffset <= compilerPathEnd)) {
if (compilerPathNeedsQuotes) {
message = localize("path.with.spaces", 'Compiler path with spaces and arguments is missing double quotes " around the path.');
newSquiggleMetrics.CompilerPathMissingQuotes++;
} else {
if (util.checkFileExistsSync(resolvedPath)) {
continue;
}
message = localize("path.is.not.a.file", "Path is not a file: {0}", resolvedPath);
newSquiggleMetrics.PathNotAFile++;
(curOffset >= compileCommandsStart && curOffset <= compileCommandsEnd)) {
if (util.checkFileExistsSync(resolvedPath)) {
continue;
}
message = localize("path.is.not.a.file", "Path is not a file: {0}", resolvedPath);
newSquiggleMetrics.PathNotAFile++;
} else {
if (util.checkDirectoryExistsSync(resolvedPath)) {
continue;
}
message = localize("path.is.not.a.directory", "Path is not a directory: {0}", resolvedPath);
message = localize("path.is.not.a.directory", "Path is not a directory: {0}", resolvedPath);
newSquiggleMetrics.PathNotADirectory++;
}
}
@@ -169,7 +169,7 @@ export class CppBuildTaskProvider implements TaskProvider {
if (compilerArgs && compilerArgs.length > 0) {
args = args.concat(compilerArgs);
}
const cwd: string = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPath)) ? path.dirname(compilerPath) : "${workspaceFolder}";
const cwd: string = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPath)) ? path.dirname(compilerPath) : "${fileDirname}";
const options: cp.ExecOptions | undefined = { cwd: cwd };
definition = {
type: CppBuildTaskProvider.CppBuildScriptType,
+98 -95
View File
@@ -55,28 +55,31 @@ let taskProvider: vscode.Disposable;
let codeActionProvider: vscode.Disposable;
export const intelliSenseDisabledError: string = "Do not activate the extension when IntelliSense is disabled.";
type vcpkgDatabase = { [key: string]: string[] }; // Stored as <header file entry> -> [<port name>]
let vcpkgDbPromise: Promise<vcpkgDatabase>;
function initVcpkgDatabase(): Promise<vcpkgDatabase> {
type VcpkgDatabase = { [key: string]: string[] }; // Stored as <header file entry> -> [<port name>]
let vcpkgDbPromise: Promise<VcpkgDatabase>;
function initVcpkgDatabase(): Promise<VcpkgDatabase> {
return new Promise((resolve, reject) => {
yauzl.open(util.getExtensionFilePath('VCPkgHeadersDatabase.zip'), { lazyEntries: true }, (err? : Error, zipfile?: yauzl.ZipFile) => {
yauzl.open(util.getExtensionFilePath('VCPkgHeadersDatabase.zip'), { lazyEntries: true }, (err?: Error, zipfile?: yauzl.ZipFile) => {
// Resolves with an empty database instead of rejecting on failure.
const database: VcpkgDatabase = {};
if (err || !zipfile) {
resolve({});
resolve(database);
return;
}
zipfile.readEntry();
let dbFound: boolean = false;
// Waits until the input file is closed before resolving.
zipfile.on('close', () => {
resolve(database);
});
zipfile.on('entry', entry => {
if (entry.fileName !== 'VCPkgHeadersDatabase.txt') {
zipfile.readEntry();
return;
}
dbFound = true;
zipfile.openReadStream(entry, (err?: Error, stream?: Readable) => {
if (err || !stream) {
resolve({});
zipfile.close();
return;
}
const database: vcpkgDatabase = {};
const reader: rd.ReadLine = rd.createInterface(stream);
reader.on('line', (lineText: string) => {
const portFilePair: string[] = lineText.split(':');
@@ -94,15 +97,13 @@ function initVcpkgDatabase(): Promise<vcpkgDatabase> {
database[relativeHeader].push(portName);
});
reader.on('close', () => {
resolve(database);
// We found the one file we wanted.
// It's OK to close instead of progressing through more files in the zip.
zipfile.close();
});
});
});
zipfile.on('end', () => {
if (!dbFound) {
resolve({});
}
});
zipfile.readEntry();
});
});
}
@@ -132,7 +133,7 @@ async function lookupIncludeInVcpkg(document: vscode.TextDocument, line: number)
const missingHeader: string = matches.groups['includeFile'].replace(/\//g, '\\');
let portsWithHeader: string[] | undefined;
const vcpkgDb: vcpkgDatabase = await vcpkgDbPromise;
const vcpkgDb: VcpkgDatabase = await vcpkgDbPromise;
if (vcpkgDb) {
portsWithHeader = vcpkgDb[missingHeader];
}
@@ -150,7 +151,7 @@ function isMissingIncludeDiagnostic(diagnostic: vscode.Diagnostic): boolean {
/**
* activate: set up the extension for language services
*/
export function activate(activationEventOccurred: boolean): void {
export async function activate(activationEventOccurred: boolean): Promise<void> {
if (realActivationOccurred) {
return; // Occurs if multiple delayed commands occur before the real commands are registered.
}
@@ -172,11 +173,10 @@ export function activate(activationEventOccurred: boolean): void {
if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) {
for (let i: number = 0; i < vscode.workspace.workspaceFolders.length; ++i) {
const config: string = path.join(vscode.workspace.workspaceFolders[i].uri.fsPath, ".vscode/c_cpp_properties.json");
if (fs.existsSync(config)) {
vscode.workspace.openTextDocument(config).then((doc: vscode.TextDocument) => {
vscode.languages.setTextDocumentLanguage(doc, "jsonc");
cppPropertiesExists = true;
});
if (await util.checkFileExists(config)) {
cppPropertiesExists = true;
const doc: vscode.TextDocument = await vscode.workspace.openTextDocument(config);
vscode.languages.setTextDocumentLanguage(doc, "jsonc");
}
}
}
@@ -354,8 +354,7 @@ function realActivation(): void {
}
}
});
clients.ActiveClient.notifyWhenReady(() => {
clients.ActiveClient.notifyWhenLanguageClientReady(() => {
intervalTimer = global.setInterval(onInterval, 2500);
});
}
@@ -441,7 +440,7 @@ export function processDelayedDidOpen(document: vscode.TextDocument): void {
client.TrackedDocuments.add(document);
const finishDidOpen = (doc: vscode.TextDocument) => {
client.provideCustomConfiguration(doc.uri, undefined);
client.notifyWhenReady(() => {
client.notifyWhenLanguageClientReady(() => {
client.takeOwnership(doc);
client.onDidOpenTextDocument(doc);
});
@@ -487,7 +486,7 @@ function onInterval(): void {
* Install a VSIX package. This helper function will exist until VSCode offers a command to do so.
* @param updateChannel The user's updateChannel setting.
*/
function installVsix(vsixLocation: string): Thenable<void> {
async function installVsix(vsixLocation: string): Promise<void> {
const userVersion: PackageVersion = new PackageVersion(vscode.version);
// 1.33.0 introduces workbench.extensions.installExtension. 1.32.3 was immediately prior.
@@ -499,7 +498,7 @@ function installVsix(vsixLocation: string): Thenable<void> {
// Get the path to the VSCode command -- replace logic later when VSCode allows calling of
// workbench.extensions.action.installVSIX from TypeScript w/o instead popping up a file dialog
return PlatformInformation.GetPlatformInformation().then((platformInfo) => {
const vsCodeScriptPath: string | undefined = function(platformInfo): string | undefined {
const getVsCodeScriptPath = (platformInfo: any): string => {
if (platformInfo.platform === 'win32') {
const vsCodeBinName: string = path.basename(process.execPath);
let cmdFile: string; // Windows VS Code Insiders/Exploration breaks VS Code naming conventions
@@ -517,14 +516,13 @@ function installVsix(vsixLocation: string): Thenable<void> {
'Resources', 'app', 'bin', 'code');
} else {
const vsCodeBinName: string = path.basename(process.execPath);
try {
return which.sync(vsCodeBinName);
} catch (error) {
return undefined;
}
return which.sync(vsCodeBinName);
}
}(platformInfo);
if (!vsCodeScriptPath) {
};
let vsCodeScriptPath: string;
try {
vsCodeScriptPath = getVsCodeScriptPath(platformInfo);
} catch (err) {
return Promise.reject(new Error('Failed to find VS Code script'));
}
@@ -631,22 +629,24 @@ async function suggestInsidersChannel(): Promise<void> {
const yes: string = localize("yes.button", "Yes");
const askLater: string = localize("ask.me.later.button", "Ask Me Later");
const dontShowAgain: string = localize("dont.show.again.button", "Don't Show Again");
const selection: string | undefined = await vscode.window.showInformationMessage(message, yes, askLater, dontShowAgain);
switch (selection) {
case yes:
// Cache buildInfo.
buildInfoCache = buildInfo;
// It will call onDidChangeSettings.
vscode.workspace.getConfiguration("C_Cpp").update("updateChannel", "Insiders", vscode.ConfigurationTarget.Global);
break;
case dontShowAgain:
suggestInsiders.Value = false;
break;
case askLater:
break;
default:
break;
}
vscode.window.showInformationMessage(message, yes, askLater, dontShowAgain).then((selection) => {
switch (selection) {
case yes:
// Cache buildInfo.
buildInfoCache = buildInfo;
// It will call onDidChangeSettings.
vscode.workspace.getConfiguration("C_Cpp").update("updateChannel", "Insiders", vscode.ConfigurationTarget.Global);
break;
case dontShowAgain:
suggestInsiders.Value = false;
break;
case askLater:
break;
default:
break;
}
});
}
async function applyUpdate(buildInfo: BuildInfo): Promise<void> {
@@ -776,13 +776,14 @@ export function registerCommands(): void {
disposables.push(vscode.commands.registerCommand('C_Cpp.GenerateEditorConfig', onGenerateEditorConfig));
disposables.push(vscode.commands.registerCommand('C_Cpp.GoToNextDirectiveInGroup', onGoToNextDirectiveInGroup));
disposables.push(vscode.commands.registerCommand('C_Cpp.GoToPrevDirectiveInGroup', onGoToPrevDirectiveInGroup));
disposables.push(vscode.commands.registerCommand('C_Cpp.CheckForCompiler', onCheckForCompiler));
disposables.push(vscode.commands.registerCommand('cpptools.activeConfigName', onGetActiveConfigName));
disposables.push(vscode.commands.registerCommand('cpptools.activeConfigCustomVariable', onGetActiveConfigCustomVariable));
disposables.push(vscode.commands.registerCommand('cpptools.setActiveConfigName', onSetActiveConfigName));
getTemporaryCommandRegistrarInstance().executeDelayedCommands();
}
function onSwitchHeaderSource(): void {
async function onSwitchHeaderSource(): Promise<void> {
onActivationEvent();
const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
if (!activeEditor || !activeEditor.document) {
@@ -800,53 +801,49 @@ function onSwitchHeaderSource(): void {
rootPath = path.dirname(fileName); // When switching without a folder open.
}
clients.ActiveClient.requestSwitchHeaderSource(rootPath, fileName).then((targetFileName: string) => {
// If the targetFileName has a path that is a symlink target of a workspace folder,
// then replace the RootRealPath with the RootPath (the symlink path).
let targetFileNameReplaced: boolean = false;
clients.forEach(client => {
if (!targetFileNameReplaced && client.RootRealPath && client.RootPath !== client.RootRealPath
&& targetFileName.indexOf(client.RootRealPath) === 0) {
targetFileName = client.RootPath + targetFileName.substr(client.RootRealPath.length);
targetFileNameReplaced = true;
}
});
vscode.workspace.openTextDocument(targetFileName).then((document: vscode.TextDocument) => {
let foundEditor: boolean = false;
// If the document is already visible in another column, open it there.
vscode.window.visibleTextEditors.forEach((editor, index, array) => {
if (editor.document === document && !foundEditor) {
foundEditor = true;
vscode.window.showTextDocument(document, editor.viewColumn);
}
});
if (!foundEditor) {
vscode.window.showTextDocument(document);
}
});
let targetFileName: string = await clients.ActiveClient.requestSwitchHeaderSource(rootPath, fileName);
// If the targetFileName has a path that is a symlink target of a workspace folder,
// then replace the RootRealPath with the RootPath (the symlink path).
let targetFileNameReplaced: boolean = false;
clients.forEach(client => {
if (!targetFileNameReplaced && client.RootRealPath && client.RootPath !== client.RootRealPath
&& targetFileName.indexOf(client.RootRealPath) === 0) {
targetFileName = client.RootPath + targetFileName.substr(client.RootRealPath.length);
targetFileNameReplaced = true;
}
});
const document: vscode.TextDocument = await vscode.workspace.openTextDocument(targetFileName);
let foundEditor: boolean = false;
// If the document is already visible in another column, open it there.
vscode.window.visibleTextEditors.forEach((editor, index, array) => {
if (editor.document === document && !foundEditor) {
foundEditor = true;
vscode.window.showTextDocument(document, editor.viewColumn);
}
});
if (!foundEditor) {
vscode.window.showTextDocument(document);
}
}
/**
* Allow the user to select a workspace when multiple workspaces exist and get the corresponding Client back.
* The resulting client is used to handle some command that was previously invoked.
*/
function selectClient(): Thenable<Client> {
async function selectClient(): Promise<Client> {
if (clients.Count === 1) {
return Promise.resolve(clients.ActiveClient);
return clients.ActiveClient;
} else {
return ui.showWorkspaces(clients.Names).then(key => {
if (key !== "") {
const client: Client | undefined = clients.get(key);
if (client) {
return client;
} else {
console.assert("client not found");
}
const key: string = await ui.showWorkspaces(clients.Names);
if (key !== "") {
const client: Client | undefined = clients.get(key);
if (client) {
return client;
} else {
console.assert("client not found");
}
return Promise.reject<Client>(localize("client.not.found", "client not found"));
});
}
throw new Error(localize("client.not.found", "client not found"));
}
}
@@ -875,32 +872,32 @@ function onSelectConfigurationProvider(): void {
}
}
function onEditConfigurationJSON(): void {
function onEditConfigurationJSON(viewColumn: vscode.ViewColumn = vscode.ViewColumn.Active): void {
onActivationEvent();
telemetry.logLanguageServerEvent("SettingsCommand", { "palette": "json" }, undefined);
if (!isFolderOpen()) {
vscode.window.showInformationMessage(localize('edit.configurations.open.first', 'Open a folder first to edit configurations'));
} else {
selectClient().then(client => client.handleConfigurationEditJSONCommand(), rejected => {});
selectClient().then(client => client.handleConfigurationEditJSONCommand(viewColumn), rejected => {});
}
}
function onEditConfigurationUI(): void {
function onEditConfigurationUI(viewColumn: vscode.ViewColumn = vscode.ViewColumn.Active): void {
onActivationEvent();
telemetry.logLanguageServerEvent("SettingsCommand", { "palette": "ui" }, undefined);
if (!isFolderOpen()) {
vscode.window.showInformationMessage(localize('edit.configurations.open.first', 'Open a folder first to edit configurations'));
} else {
selectClient().then(client => client.handleConfigurationEditUICommand(), rejected => {});
selectClient().then(client => client.handleConfigurationEditUICommand(viewColumn), rejected => {});
}
}
function onEditConfiguration(): void {
function onEditConfiguration(viewColumn: vscode.ViewColumn = vscode.ViewColumn.Active): void {
onActivationEvent();
if (!isFolderOpen()) {
vscode.window.showInformationMessage(localize('edit.configurations.open.first', 'Open a folder first to edit configurations'));
} else {
selectClient().then(client => client.handleConfigurationEditCommand(), rejected => {});
selectClient().then(client => client.handleConfigurationEditCommand(viewColumn), rejected => {});
}
}
@@ -925,6 +922,12 @@ function onGoToPrevDirectiveInGroup(): void {
client.handleGoToDirectiveInGroup(false);
}
function onCheckForCompiler(): void {
onActivationEvent();
const client: Client = getActiveClient();
client.handleCheckForCompiler();
}
function onAddToIncludePath(path: string): void {
if (!isFolderOpen()) {
vscode.window.showInformationMessage(localize('add.includepath.open.first', 'Open a folder first to add to {0}', "includePath"));
@@ -14,7 +14,7 @@ import { onDidChangeActiveTextEditor, processDelayedDidOpen } from './extension'
export function createProtocolFilter(clients: ClientCollection): Middleware {
// Disabling lint for invoke handlers
const defaultHandler: (data: any, callback: (data: any) => void) => void = (data, callback: (data: any) => void) => { clients.ActiveClient.notifyWhenReady(() => callback(data)); };
const defaultHandler: (data: any, callback: (data: any) => void) => void = (data, callback: (data: any) => void) => { clients.ActiveClient.notifyWhenLanguageClientReady(() => callback(data)); };
// let invoke1 = (a, callback: (a) => any) => { if (clients.ActiveClient === me) { return me.requestWhenReady(() => callback(a)); } return null; };
const invoke2 = (a: any, b: any, callback: (a: any, b: any) => any) => clients.ActiveClient.requestWhenReady<any>(() => callback(a, b));
const invoke3 = (a: any, b: any, c: any, callback: (a: any, b: any, c: any) => any) => clients.ActiveClient.requestWhenReady<any>(() => callback(a, b, c));
@@ -37,7 +37,7 @@ export function createProtocolFilter(clients: ClientCollection): Middleware {
me.TrackedDocuments.add(document);
const finishDidOpen = (doc: vscode.TextDocument) => {
me.provideCustomConfiguration(doc.uri, undefined);
me.notifyWhenReady(() => {
me.notifyWhenLanguageClientReady(() => {
sendMessage(doc);
me.onDidOpenTextDocument(doc);
if (editor && editor === vscode.window.activeTextEditor) {
@@ -80,7 +80,7 @@ export function createProtocolFilter(clients: ClientCollection): Middleware {
processDelayedDidOpen(textDocumentChangeEvent.document);
}
me.onDidChangeTextDocument(textDocumentChangeEvent);
me.notifyWhenReady(() => sendMessage(textDocumentChangeEvent));
me.notifyWhenLanguageClientReady(() => sendMessage(textDocumentChangeEvent));
},
willSave: defaultHandler,
willSaveWaitUntil: (event, sendMessage) => {
@@ -96,7 +96,7 @@ export function createProtocolFilter(clients: ClientCollection): Middleware {
if (me.TrackedDocuments.has(document)) {
me.onDidCloseTextDocument(document);
me.TrackedDocuments.delete(document);
me.notifyWhenReady(() => sendMessage(document));
me.notifyWhenLanguageClientReady(() => sendMessage(document));
}
},
+11 -8
View File
@@ -691,18 +691,21 @@ function populateEditorConfig(rootUri: vscode.Uri | undefined, document: vscode.
vscode.workspace.applyEdit(edits).then(() => vscode.window.showTextDocument(document));
}
export function generateEditorConfig(rootUri?: vscode.Uri): void {
if (rootUri !== undefined) {
export async function generateEditorConfig(rootUri?: vscode.Uri): Promise<void> {
let document: vscode.TextDocument;
if (rootUri) {
// If a folder is open and '.editorconfig' exists at the root, use that.
const uri: vscode.Uri = vscode.Uri.joinPath(rootUri, ".editorconfig");
const edits: vscode.WorkspaceEdit = new vscode.WorkspaceEdit();
edits.createFile(uri, { ignoreIfExists: true, overwrite: false });
vscode.workspace.applyEdit(edits).then(() => {
vscode.workspace.openTextDocument(uri).then(
(document) => populateEditorConfig(rootUri, document),
() => vscode.workspace.openTextDocument().then((document) => populateEditorConfig(rootUri, document)));
}, () => vscode.workspace.openTextDocument().then((document) => populateEditorConfig(rootUri, document)));
try {
await vscode.workspace.applyEdit(edits);
document = await vscode.workspace.openTextDocument(uri);
} catch (e) {
document = await vscode.workspace.openTextDocument();
}
} else {
vscode.workspace.openTextDocument().then((document) => populateEditorConfig(rootUri, document));
document = await vscode.workspace.openTextDocument();
}
populateEditorConfig(rootUri, document);
}
@@ -82,10 +82,8 @@ export class SettingsPanel {
);
}
public createOrShow(configSelection: string[], activeConfiguration: config.Configuration, errors: config.ConfigurationErrors): void {
const column: vscode.ViewColumn | undefined = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
public createOrShow(configSelection: string[], activeConfiguration: config.Configuration, errors: config.ConfigurationErrors, viewColumn?: vscode.ViewColumn): void {
const column: vscode.ViewColumn | undefined = viewColumn ?? vscode.window.activeTextEditor?.viewColumn;
// Show existing panel
if (this.panel) {
+24 -25
View File
@@ -30,7 +30,7 @@ enum ConfigurationPriority {
CustomProvider = 3,
}
interface ConfigurationResult {
interface ConfigurationStatus {
configured: boolean;
priority: ConfigurationPriority;
}
@@ -40,7 +40,7 @@ export class UI {
private browseEngineStatusBarItem: vscode.StatusBarItem;
private intelliSenseStatusBarItem: vscode.StatusBarItem;
private referencesStatusBarItem: vscode.StatusBarItem;
private configurationUIPromise?: Thenable<ConfigurationResult>;
private curConfigurationStatus?: Promise<ConfigurationStatus>;
private readonly referencesPreviewTooltip: string = ` (${localize("click.to.preview", "click to preview results")})`;
constructor() {
@@ -191,7 +191,7 @@ export class UI {
client.ActiveConfigChanged(value => { this.ActiveConfig = value; });
}
public showConfigurations(configurationNames: string[]): Thenable<number> {
public async showConfigurations(configurationNames: string[]): Promise<number> {
const options: vscode.QuickPickOptions = {};
options.placeHolder = localize("select.a.configuration", "Select a Configuration...");
@@ -202,11 +202,11 @@ export class UI {
items.push({ label: localize("edit.configuration.ui", "Edit Configurations (UI)"), description: "", index: configurationNames.length });
items.push({ label: localize("edit.configuration.json", "Edit Configurations (JSON)"), description: "", index: configurationNames.length + 1 });
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.index : -1);
const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options);
return (selection) ? selection.index : -1;
}
public showConfigurationProviders(currentProvider?: string): Thenable<string | undefined> {
public async showConfigurationProviders(currentProvider?: string): Promise<string | undefined> {
const options: vscode.QuickPickOptions = {};
options.placeHolder = localize("select.configuration.provider", "Select a Configuration Provider...");
const providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
@@ -221,11 +221,11 @@ export class UI {
});
items.push({ label: `(${localize("none", "none")})`, description: localize("disable.configuration.provider", "Disable the active configuration provider, if applicable."), key: "" });
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.key : undefined);
const selection: KeyedQuickPickItem | undefined = await vscode.window.showQuickPick(items, options);
return (selection) ? selection.key : undefined;
}
public showCompileCommands(paths: string[]): Thenable<number> {
public async showCompileCommands(paths: string[]): Promise<number> {
const options: vscode.QuickPickOptions = {};
options.placeHolder = localize("select.compile.commands", "Select a compile_commands.json...");
@@ -234,22 +234,22 @@ export class UI {
items.push({label: paths[i], description: "", index: i});
}
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.index : -1);
const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options);
return (selection) ? selection.index : -1;
}
public showWorkspaces(workspaceNames: { name: string; key: string }[]): Thenable<string> {
public async showWorkspaces(workspaceNames: { name: string; key: string }[]): Promise<string> {
const options: vscode.QuickPickOptions = {};
options.placeHolder = localize("select.workspace", "Select a workspace folder...");
const items: KeyedQuickPickItem[] = [];
workspaceNames.forEach(name => items.push({ label: name.name, description: "", key: name.key }));
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.key : "");
const selection: KeyedQuickPickItem | undefined = await vscode.window.showQuickPick(items, options);
return (selection) ? selection.key : "";
}
public showParsingCommands(): Thenable<number> {
public async showParsingCommands(): Promise<number> {
const options: vscode.QuickPickOptions = {};
options.placeHolder = localize("select.parsing.command", "Select a parsing command...");
@@ -259,29 +259,28 @@ export class UI {
} else {
items.push({ label: localize("pause.parsing", "Pause Parsing"), description: "", index: 0 });
}
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.index : -1);
const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options);
return (selection) ? selection.index : -1;
}
public showConfigureIncludePathMessage(prompt: () => Thenable<boolean>, onSkip: () => void): void {
public showConfigureIncludePathMessage(prompt: () => Promise<boolean>, onSkip: () => void): void {
setTimeout(() => {
this.showConfigurationPrompt(ConfigurationPriority.IncludePath, prompt, onSkip);
}, 10000);
}
public showConfigureCompileCommandsMessage(prompt: () => Thenable<boolean>, onSkip: () => void): void {
public showConfigureCompileCommandsMessage(prompt: () => Promise<boolean>, onSkip: () => void): void {
setTimeout(() => {
this.showConfigurationPrompt(ConfigurationPriority.CompileCommands, prompt, onSkip);
}, 5000);
}
public showConfigureCustomProviderMessage(prompt: () => Thenable<boolean>, onSkip: () => void): void {
public showConfigureCustomProviderMessage(prompt: () => Promise<boolean>, onSkip: () => void): void {
this.showConfigurationPrompt(ConfigurationPriority.CustomProvider, prompt, onSkip);
}
private showConfigurationPrompt(priority: ConfigurationPriority, prompt: () => Thenable<boolean>, onSkip: () => void): void {
const showPrompt: () => Thenable<ConfigurationResult> = async () => {
const showPrompt: () => Promise<ConfigurationStatus> = async () => {
const configured: boolean = await prompt();
return Promise.resolve({
priority: priority,
@@ -289,8 +288,8 @@ export class UI {
});
};
if (this.configurationUIPromise) {
this.configurationUIPromise = this.configurationUIPromise.then(result => {
if (this.curConfigurationStatus) {
this.curConfigurationStatus = this.curConfigurationStatus.then(result => {
if (priority > result.priority) {
return showPrompt();
} else if (!result.configured) {
@@ -303,7 +302,7 @@ export class UI {
});
});
} else {
this.configurationUIPromise = showPrompt();
this.curConfigurationStatus = showPrompt();
}
}
+10 -11
View File
@@ -99,21 +99,20 @@ export class ABTestSettings {
}
}
private downloadCpptoolsJsonPkgAsync(): Promise<void> {
private async downloadCpptoolsJsonPkgAsync(): Promise<void> {
let hasError: boolean = false;
const telemetryProperties: { [key: string]: string } = {};
const localConfigPath: string = util.getExtensionFilePath(localConfigFile);
// Download the latest cpptools.json.
return util.downloadFileToDestination("https://go.microsoft.com/fwlink/?linkid=2097702", localConfigPath)
.catch((error) => {
// More specific error info is not likely to be helpful, and we get detailed download data from the initial install.
hasError = true;
})
.then(() => {
this.updateSettings();
telemetryProperties['success'] = (!hasError).toString();
Telemetry.logDebuggerEvent("cpptoolsJsonDownload", telemetryProperties);
});
try {
await util.downloadFileToDestination("https://go.microsoft.com/fwlink/?linkid=2097702", localConfigPath);
} catch (error) {
// More specific error info is not likely to be helpful, and we get detailed download data from the initial install.
hasError = true;
}
this.updateSettings();
telemetryProperties['success'] = (!hasError).toString();
Telemetry.logDebuggerEvent("cpptoolsJsonDownload", telemetryProperties);
}
}
+2 -1
View File
@@ -35,7 +35,8 @@ class TemporaryCommandRegistrar {
"C_Cpp.RescanWorkspace",
"C_Cpp.GenerateEditorConfig",
"C_Cpp.VcpkgClipboardInstallSuggested",
"C_Cpp.VcpkgOnlineHelpSuggested"
"C_Cpp.VcpkgOnlineHelpSuggested",
"C_Cpp.CheckForCompiler"
];
constructor() {
+55 -25
View File
@@ -486,6 +486,32 @@ export function checkDirectoryExistsSync(dirPath: string): boolean {
return false;
}
/** Test whether a relative path exists */
export function checkPathExistsSync(path: string, relativePath: string, isWindows: boolean, isWSL: boolean, isCompilerPath: boolean): { pathExists: boolean; path: string } {
let pathExists: boolean = true;
const existsWithExeAdded: (path: string) => boolean = (path: string) => isCompilerPath && isWindows && !isWSL && fs.existsSync(path + ".exe");
if (!fs.existsSync(path)) {
if (existsWithExeAdded(path)) {
path += ".exe";
} else if (!relativePath) {
pathExists = false;
} else {
// Check again for a relative path.
relativePath = relativePath + path;
if (!fs.existsSync(relativePath)) {
if (existsWithExeAdded(path)) {
path += ".exe";
} else {
pathExists = false;
}
} else {
path = relativePath;
}
}
}
return { pathExists, path };
}
/** Read the files in a directory */
export function readDir(dirPath: string): Promise<string[]> {
return new Promise((resolve) => {
@@ -727,33 +753,29 @@ export function isExecutable(file: string): Promise<boolean> {
});
}
export function allowExecution(file: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
if (process.platform !== 'win32') {
checkFileExists(file).then((exists: boolean) => {
if (exists) {
isExecutable(file).then((isExec: boolean) => {
if (isExec) {
resolve();
} else {
fs.chmod(file, '755', (err: NodeJS.ErrnoException | null) => {
if (err) {
reject(err);
return;
}
resolve();
});
}
});
} else {
getOutputChannelLogger().appendLine("");
getOutputChannelLogger().appendLine(localize("warning.file.missing", "Warning: Expected file {0} is missing.", file));
resolve();
}
});
export async function allowExecution(file: string): Promise<void> {
if (process.platform !== 'win32') {
const exists: boolean = await checkFileExists(file);
if (exists) {
const isExec: boolean = await isExecutable(file);
if (!isExec) {
await chmodAsync(file, '755');
}
} else {
resolve();
getOutputChannelLogger().appendLine("");
getOutputChannelLogger().appendLine(localize("warning.file.missing", "Warning: Expected file {0} is missing.", file));
}
}
}
export async function chmodAsync(path: fs.PathLike, mode: fs.Mode): Promise<void> {
return new Promise<void>((resolve, reject) => {
fs.chmod(path, mode, (err: NodeJS.ErrnoException | null) => {
if (err) {
return reject(err);
}
return resolve();
});
});
}
@@ -1266,3 +1288,11 @@ export async function checkCuda(): Promise<void> {
const langs: string[] = await vscode.languages.getLanguages();
supportCuda = langs.findIndex((s) => s === "cuda-cpp") !== -1;
}
// Sequentially Resolve Promises.
export function sequentialResolve<T>(items: T[], promiseBuilder: (item: T) => Promise<void>): Promise<void> {
return items.reduce(async (previousPromise, nextItem) => {
await previousPromise;
return promiseBuilder(nextItem);
}, Promise.resolve());
}
+73 -78
View File
@@ -159,42 +159,35 @@ export interface BuildInfo {
* does not need to update, resolves to undefined.
*/
export async function getTargetBuildInfo(updateChannel: string, isFromSettingsChange: boolean): Promise<BuildInfo | undefined> {
return getReleaseJson()
.then(builds => {
if (!builds || builds.length === 0) {
return undefined;
}
const builds: Build[] | undefined = await getReleaseJson();
if (!builds || builds.length === 0) {
return undefined;
}
const userVersion: PackageVersion = new PackageVersion(util.packageJson.version);
const targetBuild: Build | undefined = getTargetBuild(builds, userVersion, updateChannel, isFromSettingsChange);
if (targetBuild === undefined) {
// no action
telemetry.logLanguageServerEvent("UpgradeCheck", { "action": "none" });
} else if (userVersion.isExtensionVersionGreaterThan(new PackageVersion(targetBuild.name))) {
// downgrade
telemetry.logLanguageServerEvent("UpgradeCheck", { "action": "downgrade", "newVersion": targetBuild.name });
} else {
// upgrade
telemetry.logLanguageServerEvent("UpgradeCheck", { "action": "upgrade", "newVersion": targetBuild.name });
}
if (!targetBuild) {
return undefined;
}
const platformInfo: PlatformInformation = await PlatformInformation.GetPlatformInformation();
const vsixName: string = vsixNameForPlatform(platformInfo);
const downloadUrl: string = getVsixDownloadUrl(targetBuild, vsixName);
if (!downloadUrl) {
return undefined;
}
return { downloadUrl: downloadUrl, name: targetBuild.name };
const userVersion: PackageVersion = new PackageVersion(util.packageJson.version);
const targetBuild: Build | undefined = getTargetBuild(builds, userVersion, updateChannel, isFromSettingsChange);
if (targetBuild === undefined) {
// no action
telemetry.logLanguageServerEvent("UpgradeCheck", { "action": "none" });
} else if (userVersion.isExtensionVersionGreaterThan(new PackageVersion(targetBuild.name))) {
// downgrade
telemetry.logLanguageServerEvent("UpgradeCheck", { "action": "downgrade", "newVersion": targetBuild.name });
} else {
// upgrade
telemetry.logLanguageServerEvent("UpgradeCheck", { "action": "upgrade", "newVersion": targetBuild.name });
}
return targetBuild;
})
.then(async build => {
if (!build) {
return Promise.resolve(undefined);
}
try {
const platformInfo: PlatformInformation = await PlatformInformation.GetPlatformInformation();
const vsixName: string = vsixNameForPlatform(platformInfo);
const downloadUrl: string = getVsixDownloadUrl(build, vsixName);
if (!downloadUrl) {
return undefined;
}
return { downloadUrl: downloadUrl, name: build.name };
} catch (error) {
return Promise.reject(error);
}
});
}
/**
@@ -266,28 +259,29 @@ function isRateLimit(input: any): input is RateLimit {
async function getRateLimit(): Promise<RateLimit | undefined> {
const header: OutgoingHttpHeaders = { 'User-Agent': 'vscode-cpptools' };
const data: string = await util.downloadFileToStr('https://api.github.com/rate_limit', header)
.catch((error) => {
if (error && error.code && error.code !== "ENOENT") {
// Only throw if the user is connected to the Internet.
throw new Error('Failed to download rate limit JSON');
}
});
if (!data) {
return Promise.resolve(undefined);
}
let rateLimit: any;
try {
rateLimit = JSON.parse(data);
} catch (error) {
throw new Error('Failed to parse rate limit JSON');
}
const data: string = await util.downloadFileToStr('https://api.github.com/rate_limit', header);
if (!data) {
return undefined;
}
let rateLimit: any;
try {
rateLimit = JSON.parse(data);
} catch (error) {
throw new Error('Failed to parse rate limit JSON');
}
if (isRateLimit(rateLimit)) {
return Promise.resolve(rateLimit);
} else {
throw new Error('Rate limit JSON is not of type RateLimit');
if (isRateLimit(rateLimit)) {
return rateLimit;
} else {
throw new Error('Rate limit JSON is not of type RateLimit');
}
} catch (err) {
if (err && err.code && err.code !== "ENOENT") {
// Only throw if the user is connected to the Internet.
throw new Error('Failed to download rate limit JSON');
}
}
}
@@ -309,30 +303,31 @@ async function getReleaseJson(): Promise<Build[] | undefined> {
const releaseUrl: string = 'https://api.github.com/repos/Microsoft/vscode-cpptools/releases';
const header: OutgoingHttpHeaders = { 'User-Agent': 'vscode-cpptools' };
const data: string = await util.downloadFileToStr(releaseUrl, header)
.catch((error) => {
if (error && error.code && error.code !== "ENOENT") {
// Only throw if the user is connected to the Internet.
throw new Error('Failed to download release JSON');
}
});
if (!data) {
return Promise.resolve(undefined);
}
// Parse the file
let releaseJson: any;
try {
releaseJson = JSON.parse(data);
} catch (error) {
throw new Error('Failed to parse release JSON');
}
const data: string = await util.downloadFileToStr(releaseUrl, header);
if (!data) {
return undefined;
}
// Find the latest released builds.
const builds: Build[] = getArrayOfBuilds(releaseJson);
if (!builds || builds.length === 0) {
throw new Error('Release JSON is not of type Build[]');
} else {
return builds;
// Parse the file
let releaseJson: any;
try {
releaseJson = JSON.parse(data);
} catch (error) {
throw new Error('Failed to parse release JSON');
}
// Find the latest released builds.
const builds: Build[] = getArrayOfBuilds(releaseJson);
if (!builds || builds.length === 0) {
throw new Error('Release JSON is not of type Build[]');
} else {
return builds;
}
} catch (err) {
if (err && err.code && err.code !== "ENOENT") {
// Only throw if the user is connected to the Internet.
throw new Error('Failed to download release JSON');
}
}
}
+3
View File
@@ -34,6 +34,7 @@ export class Logger {
}
}
// We should not await on this function.
public showInformationMessage(message: string, items?: string[]): Thenable<string | undefined> {
this.appendLine(message);
@@ -43,6 +44,7 @@ export class Logger {
return vscode.window.showInformationMessage(message, ...items);
}
// We should not await on this function.
public showWarningMessage(message: string, items?: string[]): Thenable<string | undefined> {
this.appendLine(message);
@@ -52,6 +54,7 @@ export class Logger {
return vscode.window.showWarningMessage(message, ...items);
}
// We should not await on this function.
public showErrorMessage(message: string, items?: string[]): Thenable<string | undefined> {
this.appendLine(message);
+42 -54
View File
@@ -37,10 +37,10 @@ export async function activate(context: vscode.ExtensionContext): Promise<CppToo
await util.checkCuda();
let errMsg: string = "";
const arch: string = os.arch();
if (arch !== 'x64' && (process.platform !== 'win32' || (arch !== 'ia32' && arch !== 'arm64')) && (process.platform !== 'linux' || (arch !== 'x64' && arch !== 'arm' && arch !== 'arm64')) && (process.platform !== 'darwin' || arch !== 'arm64')) {
const arch: string = PlatformInformation.GetArchitecture();
if (arch !== 'x64' && (process.platform !== 'win32' || (arch !== 'x86' && arch !== 'arm64')) && (process.platform !== 'linux' || (arch !== 'x64' && arch !== 'arm' && arch !== 'arm64')) && (process.platform !== 'darwin' || arch !== 'arm64')) {
errMsg = localize("architecture.not.supported", "Architecture {0} is not supported. ", String(arch));
} else if (process.platform === 'linux' && fs.existsSync('/etc/alpine-release')) {
} else if (process.platform === 'linux' && await util.checkDirectoryExists('/etc/alpine-release')) {
errMsg = localize("apline.containers.not.supported", "Alpine containers are not supported.");
}
if (errMsg) {
@@ -75,8 +75,6 @@ export async function activate(context: vscode.ExtensionContext): Promise<CppToo
await processRuntimeDependencies();
const promptForMacArchictureMismatch: PersistentState<boolean> = new PersistentState<boolean>("CPP.promptForMacArchictureMismatch", true);
// Read archictures of binaries from install.lock
const fileContents: string = await util.readFileText(util.getInstallLockPath());
// Assume current platform if install.lock is empty.
@@ -94,54 +92,43 @@ export async function activate(context: vscode.ExtensionContext): Promise<CppToo
// Check the main binaries files to declare if the extension has been installed successfully.
if (process.platform !== installedPlatformAndArchitecture.platform
|| (arch !== installedPlatformAndArchitecture.architecture && (arch !== "x64" || installedPlatformAndArchitecture.architecture !== 'x86' || process.platform !== "win32"))) {
|| (arch !== installedPlatformAndArchitecture.architecture
&& !(process.platform === "win32"
// On x64 Windows, allow x86 binaries.
&& ((arch === "x64" && installedPlatformAndArchitecture.architecture === "x86")
// On arm64 Windows, allow x86 or x64 binaries.
|| (arch === "arm64" && ((installedPlatformAndArchitecture.architecture === "x86") || (installedPlatformAndArchitecture.architecture === "x64")))))
// On arm64 macOS, allow x64 binaries.
&& !(process.platform === "darwin" && arch === "arm64" && installedPlatformAndArchitecture.architecture === "x64"))) {
// Check if the correct offline/insiders vsix is installed on the correct platform.
const platformInfo: PlatformInformation = await PlatformInformation.GetPlatformInformation();
const vsixName: string = vsixNameForPlatform(platformInfo);
const downloadLink: string = localize("download.button", "Go to Download Page");
if (installedPlatformAndArchitecture.platform === 'darwin' && installedPlatformAndArchitecture.architecture === "x64" && arch === "arm64") {
if (promptForMacArchictureMismatch.Value) {
// Display a message specifically referring the user to the ARM64 Mac build on ARM64 Mac.
errMsg = localize("native.binaries.mismatch.osx", "The macOS Intel version of the extension has been installed. Since you are on an Apple Silicon Mac, we recommend installing the Apple Silicon version of the extension.");
promptForMacArchictureMismatch.Value = false;
vscode.window.showErrorMessage(errMsg, downloadLink).then(async (selection) => {
if (selection === downloadLink) {
vscode.env.openExternal(vscode.Uri.parse(releaseDownloadUrl));
}
});
errMsg = localize("native.binaries.not.supported", "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.", GetOSName(installedPlatformAndArchitecture.platform), installedPlatformAndArchitecture.architecture, vsixName);
vscode.window.showErrorMessage(errMsg, downloadLink).then(async (selection) => {
if (selection === downloadLink) {
vscode.env.openExternal(vscode.Uri.parse(releaseDownloadUrl));
}
} else {
// Reset the persistent boolean tracking whether to warn the user of architecture mismatch on OSX.
promptForMacArchictureMismatch.Value = true;
errMsg = localize("native.binaries.not.supported", "This {0} {1} version of the extension is incompatible with your OS. Please download and install the \"{2}\" version of the extension.", GetOSName(installedPlatformAndArchitecture.platform), installedPlatformAndArchitecture.architecture, vsixName);
vscode.window.showErrorMessage(errMsg, downloadLink).then(async (selection) => {
if (selection === downloadLink) {
vscode.env.openExternal(vscode.Uri.parse(releaseDownloadUrl));
}
});
}
} else {
// Reset the persistent boolean tracking whether to warn the user of architecture mismatch on OSX.
promptForMacArchictureMismatch.Value = true;
if (!(await util.checkInstallBinariesExist())) {
errMsg = localize("extension.installation.failed", "The C/C++ extension failed to install successfully. You will need to repair or reinstall the extension for C/C++ language features to function properly.");
const reload: string = localize("remove.extension", "Attempt to Repair");
vscode.window.showErrorMessage(errMsg, reload).then(async (value?: string) => {
if (value === reload) {
await util.removeInstallLockFile();
vscode.commands.executeCommand("workbench.action.reloadWindow");
}
});
} else if (!(await util.checkInstallJsonsExist())) {
// Check the Json files to declare if the extension has been installed successfully.
errMsg = localize("jason.files.missing", "The C/C++ extension failed to install successfully. You will need to reinstall the extension for C/C++ language features to function properly.");
const downloadLink: string = localize("download.button", "Go to Download Page");
vscode.window.showErrorMessage(errMsg, downloadLink).then(async (selection) => {
if (selection === downloadLink) {
vscode.env.openExternal(vscode.Uri.parse(releaseDownloadUrl));
}
});
}
});
} else if (!(await util.checkInstallBinariesExist())) {
errMsg = localize("extension.installation.failed", "The C/C++ extension failed to install successfully. You will need to repair or reinstall the extension for C/C++ language features to function properly.");
const reload: string = localize("remove.extension", "Attempt to Repair");
vscode.window.showErrorMessage(errMsg, reload).then(async (value?: string) => {
if (value === reload) {
await util.removeInstallLockFile();
vscode.commands.executeCommand("workbench.action.reloadWindow");
}
});
} else if (!(await util.checkInstallJsonsExist())) {
// Check the Json files to declare if the extension has been installed successfully.
errMsg = localize("jason.files.missing", "The C/C++ extension failed to install successfully. You will need to reinstall the extension for C/C++ language features to function properly.");
const downloadLink: string = localize("download.button", "Go to Download Page");
vscode.window.showErrorMessage(errMsg, downloadLink).then(async (selection) => {
if (selection === downloadLink) {
vscode.env.openExternal(vscode.Uri.parse(releaseDownloadUrl));
}
});
}
return cppTools;
@@ -176,7 +163,7 @@ async function processRuntimeDependencies(): Promise<void> {
// For macOS and if a user has upgraded their OS, check to see if we are on Mojave or later
// and that the debugAdapters/lldb-mi folder exists. This will force a online install to get the correct binaries.
if (!highSierraOrLowerRegex.test(info.version) &&
!fs.existsSync(lldbMiFolderPath)) {
!await util.checkDirectoryExists(lldbMiFolderPath)) {
forceOnlineInstall = true;
@@ -298,7 +285,7 @@ function invalidPackageVersion(pkg: IPackage, info: PlatformInformation): boolea
!VersionsMatch(pkg, info);
}
function makeOfflineBinariesExecutable(info: PlatformInformation): Promise<void> {
async function makeOfflineBinariesExecutable(info: PlatformInformation): Promise<void> {
const promises: Thenable<void>[] = [];
const packages: IPackage[] = util.packageJson["runtimeDependencies"];
packages.forEach(p => {
@@ -307,10 +294,10 @@ function makeOfflineBinariesExecutable(info: PlatformInformation): Promise<void>
p.binaries.forEach(binary => promises.push(util.allowExecution(util.getExtensionFilePath(binary))));
}
});
return Promise.all(promises).then(() => { });
await Promise.all(promises);
}
function cleanUpUnusedBinaries(info: PlatformInformation): Promise<void> {
async function cleanUpUnusedBinaries(info: PlatformInformation): Promise<void> {
const promises: Thenable<void>[] = [];
const packages: IPackage[] = util.packageJson["runtimeDependencies"];
const logger: Logger = getOutputChannelLogger();
@@ -327,7 +314,7 @@ function cleanUpUnusedBinaries(info: PlatformInformation): Promise<void> {
});
}
});
return Promise.all(promises).then(() => { });
await Promise.all(promises);
}
function removeUnnecessaryFile(): Promise<void> {
@@ -428,7 +415,7 @@ async function postInstall(info: PlatformInformation): Promise<void> {
// If there is a download failure, we shouldn't continue activating the extension in some broken state.
if (!installSuccess) {
return Promise.reject<void>("");
throw new Error(localize("failed.installing.dependencies", "Failed installing dependencies"));
} else {
// Notify users if debugging may not be supported on their OS.
util.checkDistro(info);
@@ -502,6 +489,7 @@ function rewriteManifest(): Promise<void> {
"onCommand:C_Cpp.GenerateEditorConfig",
"onCommand:C_Cpp.GoToNextDirectiveInGroup",
"onCommand:C_Cpp.GoToPrevDirectiveInGroup",
"onCommand:C_Cpp.CheckForCompiler",
"onDebugInitialConfigurations",
"onDebugResolve:cppdbg",
"onDebugResolve:cppvsdbg",
+92 -66
View File
@@ -104,30 +104,25 @@ export class PackageManager {
tmp.setGracefulCleanup();
}
public DownloadPackages(progress: vscode.Progress<{ message?: string; increment?: number }>): Promise<void | null> {
return this.GetPackages()
.then((packages) => {
let count: number = 1;
return this.BuildPromiseChain(packages, (pkg): Promise<void> => {
const p: Promise<void> = this.DownloadPackage(pkg);
progress.report({ message: localize("downloading.progress.description", "Downloading {0}", pkg.description), increment: this.GetIncrement(count, packages.length) });
count += 1;
return p;
});
});
public async DownloadPackages(progress: vscode.Progress<{ message?: string; increment?: number }>): Promise<void | null> {
const packages: IPackage[] = await this.GetPackages();
let count: number = 1;
return util.sequentialResolve(packages, async (pkg): Promise<void> => {
progress.report({ message: localize("downloading.progress.description", "Downloading {0}", pkg.description), increment: this.GetIncrement(count, packages.length) });
count += 1;
await this.DownloadPackage(pkg);
});
}
public InstallPackages(progress: vscode.Progress<{ message?: string; increment?: number }>): Promise<void | null> {
return this.GetPackages()
.then((packages) => {
let count: number = 1;
return this.BuildPromiseChain(packages, (pkg): Promise<void> => {
const p: Promise<void> = this.InstallPackage(pkg);
progress.report({ message: localize("installing.progress.description", "Installing {0}", pkg.description), increment: this.GetIncrement(count, packages.length) });
count += 1;
return p;
});
});
public async InstallPackages(progress: vscode.Progress<{ message?: string; increment?: number }>): Promise<void | null> {
const packages: IPackage[] = await this.GetPackages();
let count: number = 1;
return util.sequentialResolve(packages, async (pkg): Promise<void> => {
progress.report({ message: localize("installing.progress.description", "Installing {0}", pkg.description), increment: this.GetIncrement(count, packages.length) });
count += 1;
await this.InstallPackage(pkg);
});
}
private GetIncrement(curStep: number, totalSteps: number): number {
@@ -138,28 +133,12 @@ export class PackageManager {
return (curStep !== totalSteps) ? increment : maxIncrement - (totalSteps - 1) * increment;
}
public GetPackages(): Promise<IPackage[]> {
return this.GetPackageList()
.then((list) =>
list.filter((value, index, array) =>
ArchitecturesMatch(value, this.platformInfo) &&
PlatformsMatch(value, this.platformInfo) &&
VersionsMatch(value, this.platformInfo)
)
);
}
/** Builds a chain of promises by calling the promiseBuilder function once per item in the list.
* Like Promise.all, but runs the promises in sequence rather than simultaneously.
*/
private BuildPromiseChain<TItem, TPromise>(items: TItem[], promiseBuilder: (item: TItem) => Promise<TPromise>): Promise<TPromise | null> {
let promiseChain: Promise<TPromise | null> = Promise.resolve<TPromise | null>(null);
for (const item of items) {
promiseChain = promiseChain.then(() => promiseBuilder(item));
}
return promiseChain;
public async GetPackages(): Promise<IPackage[]> {
const list: IPackage[] = await this.GetPackageList();
return list.filter((value, index, array) => ArchitecturesMatch(value, this.platformInfo) &&
PlatformsMatch(value, this.platformInfo) &&
VersionsMatch(value, this.platformInfo)
);
}
private GetPackageList(): Promise<IPackage[]> {
@@ -364,17 +343,31 @@ export class PackageManager {
return reject(new PackageManagerError('Downloaded file unavailable', localize("downloaded.unavailable", 'Downloaded file unavailable'), 'InstallPackage', pkg));
}
yauzl.fromFd(pkg.tmpFile.fd, { lazyEntries: true }, (err, zipfile) => {
yauzl.fromFd(pkg.tmpFile.fd, { lazyEntries: true, autoClose: true }, (err, zipfile) => {
if (err || !zipfile) {
return reject(new PackageManagerError('Zip file error', localize("zip.file.error", 'Zip file error'), 'InstallPackage', pkg, err));
}
// setup zip file events
zipfile.on('end', resolve);
zipfile.on('error', err => reject(new PackageManagerError('Zip file error', localize("zip.file.error", 'Zip file error'), 'InstallPackage', pkg, err, err.code)));
// Keep track of any error that occurs, but don't resolve or reject the promise until the file is closed.
let pendingError: Error | undefined;
zipfile.on('close', () => {
if (!pendingError) {
resolve();
} else {
reject(pendingError);
}
});
zipfile.readEntry();
zipfile.on('error', err => {
// Don't call reject() a second time.
// Errors can also arise from readStream and writeStream.
if (!pendingError) {
pendingError = new PackageManagerError('Zip file error', localize("zip.file.error", 'Zip file error'), 'InstallPackage', pkg, err, err.code);
zipfile.close();
}
});
zipfile.on('entry', (entry: yauzl.Entry) => {
const absoluteEntryPath: string = util.getExtensionFilePath(entry.fileName);
@@ -383,7 +376,9 @@ export class PackageManager {
// Directory - create it
mkdirp(absoluteEntryPath, { mode: 0o775 }, (err) => {
if (err) {
return reject(new PackageManagerError('Error creating directory', localize("create.directory.error", 'Error creating directory'), 'InstallPackage', pkg, err, err.code));
pendingError = new PackageManagerError('Error creating directory', localize("create.directory.error", 'Error creating directory'), 'InstallPackage', pkg, err, err.code);
zipfile.close();
return;
}
zipfile.readEntry();
@@ -394,25 +389,28 @@ export class PackageManager {
// File - extract it
zipfile.openReadStream(entry, (err, readStream: Readable | undefined) => {
if (err || !readStream) {
return reject(new PackageManagerError('Error reading zip stream', localize("zip.stream.error", 'Error reading zip stream'), 'InstallPackage', pkg, err));
pendingError = new PackageManagerError('Error reading zip stream', localize("zip.stream.error", 'Error reading zip stream'), 'InstallPackage', pkg, err);
zipfile.close();
return;
}
readStream.on('error', (err) =>
reject(new PackageManagerError('Error in readStream', localize("read.stream.error", 'Error in read stream'), 'InstallPackage', pkg, err)));
mkdirp(path.dirname(absoluteEntryPath), { mode: 0o775 }, async (err) => {
if (err) {
return reject(new PackageManagerError('Error creating directory', localize("create.directory.error", 'Error creating directory'), 'InstallPackage', pkg, err, err.code));
pendingError = new PackageManagerError('Error creating directory', localize("create.directory.error", 'Error creating directory'), 'InstallPackage', pkg, err, err.code);
zipfile.close();
return;
}
// Create as a .tmp file to avoid partially unzipped files
// counting as completed files.
const absoluteEntryTempFile: string = absoluteEntryPath + ".tmp";
if (fs.existsSync(absoluteEntryTempFile)) {
if (await util.checkFileExists(absoluteEntryTempFile)) {
try {
await util.unlinkAsync(absoluteEntryTempFile);
} catch (err) {
return reject(new PackageManagerError(`Error unlinking file ${absoluteEntryTempFile}`, localize("unlink.error", "Error unlinking file {0}", absoluteEntryTempFile), 'InstallPackage', pkg, err));
pendingError = new PackageManagerError(`Error unlinking file ${absoluteEntryTempFile}`, localize("unlink.error", "Error unlinking file {0}", absoluteEntryTempFile), 'InstallPackage', pkg, err);
zipfile.close();
return;
}
}
@@ -421,19 +419,45 @@ export class PackageManager {
const writeStream: fs.WriteStream = fs.createWriteStream(absoluteEntryTempFile, { mode: fileMode });
writeStream.on('close', async () => {
try {
// Remove .tmp extension from the file.
await util.renameAsync(absoluteEntryTempFile, absoluteEntryPath);
} catch (err) {
return reject(new PackageManagerError(`Error renaming file ${absoluteEntryTempFile}`, localize("rename.error", "Error renaming file {0}", absoluteEntryTempFile), 'InstallPackage', pkg, err));
// Remove .tmp extension from the file, if there was no error.
// Otherwise, delete it.
// Don't move on to the next entry, if we've already called reject(), in
// which case zipfile.close() will already have been called.
if (!pendingError) {
try {
await util.renameAsync(absoluteEntryTempFile, absoluteEntryPath);
} catch (err) {
pendingError = new PackageManagerError(`Error renaming file ${absoluteEntryTempFile}`, localize("rename.error", "Error renaming file {0}", absoluteEntryTempFile), 'InstallPackage', pkg, err);
zipfile.close();
return;
}
// Wait until output is done writing before reading the next zip entry.
// Otherwise, it's possible to try to launch the .exe before it is done being created.
zipfile.readEntry();
} else {
try {
await util.unlinkAsync(absoluteEntryTempFile);
} catch (err) {
// Ignore failure to delete temp file. We already have an error to return.
}
}
// Wait till output is done writing before reading the next zip entry.
// Otherwise, it's possible to try to launch the .exe before it is done being created.
zipfile.readEntry();
});
writeStream.on('error', (err) =>
reject(new PackageManagerError('Error in writeStream', localize("write.stream.error", 'Error in write stream'), 'InstallPackage', pkg, err)));
readStream.on('error', (err) => {
// Don't call reject() a second time.
if (!pendingError) {
pendingError = new PackageManagerError('Error in readStream', localize("read.stream.error", 'Error in read stream'), 'InstallPackage', pkg, err);
zipfile.close();
}
});
writeStream.on('error', (err) => {
// Don't call reject() a second time.
if (!pendingError) {
pendingError = new PackageManagerError('Error in writeStream', localize("write.stream.error", 'Error in write stream'), 'InstallPackage', pkg, err);
zipfile.close();
}
});
readStream.pipe(writeStream);
});
@@ -448,6 +472,8 @@ export class PackageManager {
});
}
});
zipfile.readEntry();
});
}).then(() => {
// Clean up temp file
+6 -13
View File
@@ -25,32 +25,25 @@ export function GetOSName(processPlatform: string | undefined): string | undefin
export class PlatformInformation {
constructor(public platform: string, public architecture: string, public distribution?: LinuxDistribution, public version?: string) { }
public static GetPlatformInformation(): Promise<PlatformInformation> {
public static async GetPlatformInformation(): Promise<PlatformInformation> {
const platform: string = os.platform();
const architecture: string = PlatformInformation.GetArchitecture();
let distributionPromise: Promise<LinuxDistribution | undefined> = Promise.resolve<LinuxDistribution | undefined>(undefined);
let versionPromise: Promise<string | undefined> = Promise.resolve<string | undefined>(undefined);
let distribution: LinuxDistribution | undefined;
let version: string | undefined;
switch (platform) {
case "win32":
break;
case "linux":
distributionPromise = LinuxDistribution.GetDistroInformation();
distribution = await LinuxDistribution.GetDistroInformation();
break;
case "darwin":
versionPromise = PlatformInformation.GetDarwinVersion();
version = await PlatformInformation.GetDarwinVersion();
break;
default:
throw new Error(localize("unknown.os.platform", "Unknown OS platform"));
}
return Promise.all([distributionPromise, versionPromise])
.then(([distro, version]) =>
new PlatformInformation(platform, architecture, distro, version)
);
return new PlatformInformation(platform, architecture, distribution, version);
}
public static GetArchitecture(): string {
+27
View File
@@ -176,6 +176,23 @@
}
}
},
"HardwareBreakpoints": {
"type": "object",
"description": "%c_cpp.debuggers.hardwareBreakpoints.description%",
"default": {},
"properties": {
"require": {
"type": "boolean",
"description": "%c_cpp.debuggers.hardwareBreakpoints.require.description%",
"default": false
},
"limit": {
"type": "integer",
"description": "%c_cpp.debuggers.hardwareBreakpoints.limit.description%",
"default": 0
}
}
},
"CppdbgLaunchOptions": {
"type": "object",
"default": {},
@@ -360,6 +377,16 @@
"symbolLoadInfo": {
"$ref": "#/definitions/SymbolLoadInfo",
"description": "%c_cpp.debuggers.symbolLoadInfo.description%"
},
"stopAtConnect": {
"type": "boolean",
"description": "%c_cpp.debuggers.stopAtConnect.description%",
"default": false
},
"hardwareBreakpoints": {
"$ref": "#/definitions/HardwareBreakpoints",
"description": "%c_cpp.debuggers.hardwareBreakpoints.description%",
"default": {}
}
}
},

Some files were not shown because too many files have changed in this diff Show More