diff --git a/.github/ISSUE_TEMPLATE/debugger.md b/.github/ISSUE_TEMPLATE/debugger.md index 9c4c36f7df..4f2f8acf8c 100644 --- a/.github/ISSUE_TEMPLATE/debugger.md +++ b/.github/ISSUE_TEMPLATE/debugger.md @@ -1,6 +1,6 @@ --- -name: Debugger -about: Issues pertaining to debugging such as call stack, breakpoints, watch window, +name: Bug Report - Debugger +about: Create a bug report for debugging such as call stack, breakpoints, watch window, launching or attaching to a debuggee. title: '' labels: '' @@ -8,16 +8,15 @@ assignees: '' --- -Type: Debugger - +Bug type: Debugger - + **Describe the bug** - OS and Version: - VS Code Version: @@ -25,6 +24,7 @@ Type: Debugger - Other extensions you installed (and if the issue persists after disabling them): - A clear and concise description of what the bug is. + **To Reproduce** *Please include a code sample and `launch.json` configuration.* Steps to reproduce the behavior: @@ -33,6 +33,7 @@ Steps to reproduce the behavior: 3. Scroll down to '....' 4. See error + **Additional context** *If applicable, please include logging by adding "logging": { "engineLogging": true, "trace": true, "traceResponse": true } in your `launch.json`* Add any other context about the problem here including log or error messages in your Debug Console or Output windows. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000000..c8dde37698 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,17 @@ +--- +name: Feature Request +about: Suggest an idea for this extension. +title: '' +labels: '' +assignees: '' + +--- + +Type: Feature Request + + + + diff --git a/.github/ISSUE_TEMPLATE/general-extension.md b/.github/ISSUE_TEMPLATE/general-extension.md index 7726b24b25..d702495ce4 100644 --- a/.github/ISSUE_TEMPLATE/general-extension.md +++ b/.github/ISSUE_TEMPLATE/general-extension.md @@ -1,22 +1,21 @@ --- -name: General Extension -about: Issues pertaining to downloading, installing, or building the extension. +name: Bug Report - General Extension +about: Create a bug report for downloading, installing, or building the extension. title: '' labels: '' assignees: '' --- -Type: General - +Bug type: General - + **Describe the bug** - OS and Version: - VS Code Version: @@ -24,6 +23,7 @@ Type: General - Other extensions you installed (and if the issue persists after disabling them): - A clear and concise description of what the bug is. + **To Reproduce** *Please include code sample and `task.json` files.* Steps to reproduce the behavior: @@ -32,11 +32,14 @@ Steps to reproduce the behavior: 3. Scroll down to '....' 4. See error + **Expected behavior** -A clear and concise description of what you expected to happen. + + **Screenshots** -If applicable, add screenshots to help explain your problem. + + **Additional context** -Add any other context about the problem here including log messages from the Output window. + diff --git a/.github/ISSUE_TEMPLATE/language-service.md b/.github/ISSUE_TEMPLATE/language-service.md index 553c37eaf5..c7b80a6c85 100644 --- a/.github/ISSUE_TEMPLATE/language-service.md +++ b/.github/ISSUE_TEMPLATE/language-service.md @@ -1,58 +1,65 @@ --- -name: Language Service -about: 'Issues pertaining to IntelliSense, autocomplete, code editing, etc. ' +name: Bug Report - Language Service +about: 'Create a bug report for IntelliSense, autocomplete, code editing, code navigation, etc.' title: '' labels: '' assignees: '' --- -**Type: LanguageService** - +Bug type: Language Service - + **Describe the bug** - OS and Version: - VS Code Version: - C/C++ Extension Version: - Other extensions you installed (and if the issue persists after disabling them): -- Does this issue involve using SSH remote to run the extension on a remote machine?: +- If using SSH remote, specify OS of remote machine: - A clear and concise description of what the bug is, including information about the workspace (i.e. is the workspace a single project or multiple projects, size of the project, etc). + **Steps to reproduce** - - + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error + **Expected behavior** - -
- Logs - -``` -Insert logs here. -``` -
+**Code sample and logs** + +- Code sample + +- Configurations in `c_cpp_properties.json` + +- Logs from running `C/C++: Log Diagnostics` from the VS Code command palette + +- Logs from [the language server logging](https://code.visualstudio.com/docs/cpp/enable-logging-cpp#_enable-logging-for-the-language-server) + **Screenshots** + **Additional context** diff --git a/.github/actions/package-lock.json b/.github/actions/package-lock.json index 3f3639fd52..ce5f571039 100644 --- a/.github/actions/package-lock.json +++ b/.github/actions/package-lock.json @@ -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": { diff --git a/.github/workflows/ci_mac.yml b/.github/workflows/ci_mac.yml index 100123ccb9..a80f659a8a 100644 --- a/.github/workflows/ci_mac.yml +++ b/.github/workflows/ci_mac.yml @@ -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 diff --git a/.github/workflows/enhancement-closer-no-milestone.yml b/.github/workflows/enhancement-closer-no-milestone.yml new file mode 100644 index 0000000000..d60cdc05e0 --- /dev/null +++ b/.github/workflows/enhancement-closer-no-milestone.yml @@ -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: "*" diff --git a/.github/workflows/enhancement-closer-triage.yml b/.github/workflows/enhancement-closer-triage.yml new file mode 100644 index 0000000000..cda38dc32c --- /dev/null +++ b/.github/workflows/enhancement-closer-triage.yml @@ -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 diff --git a/.github/workflows/enhancement-reopener.yml b/.github/workflows/enhancement-reopener.yml new file mode 100644 index 0000000000..28fe260a2e --- /dev/null +++ b/.github/workflows/enhancement-reopener.yml @@ -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 diff --git a/Build/loc/LocProject.json b/Build/loc/LocProject.json new file mode 100644 index 0000000000..70fad52ac7 --- /dev/null +++ b/Build/loc/LocProject.json @@ -0,0 +1,13 @@ +{ + "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" + } + ] + } + ] +} \ No newline at end of file diff --git a/Build/loc/TranslationsExport.yml b/Build/loc/TranslationsExport.yml new file mode 100644 index 0000000000..b934637682 --- /dev/null +++ b/Build/loc/TranslationsExport.yml @@ -0,0 +1,37 @@ +# ================================================================================== +# Pipeline for VsCodeExtension-Localization build definition +# Runs OneLocBuild task to localize xlf file +# ================================================================================== + +resources: + repositories: + - repository: self + clean: true + +trigger: none +pr: none + +pool: + vmImage: 'windows-latest' + +steps: +- task: CmdLine@2 + inputs: + script: 'cd ./Extension && yarn run translations-export && cd ..' + +- task: OneLocBuild@1 + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + inputs: + locProj: 'Build/loc/LocProject.json' + outDir: '$(Build.ArtifactStagingDirectory)' + isCreatePrSelected: false + prSourceBranchPrefix: 'locfiles' + packageSourceAuth: 'patAuth' + patVariable: '$(OneLocBuildPat)' + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'drop' + publishLocation: 'Container' diff --git a/Build/loc/TranslationsImport.yml b/Build/loc/TranslationsImport.yml new file mode 100644 index 0000000000..6d917cbcf0 --- /dev/null +++ b/Build/loc/TranslationsImport.yml @@ -0,0 +1,37 @@ +# ================================================================================== +# Pipeline for VsCodeExtension-Localization build definition +# Gets translated files from VSCodeExt and creates a PR for vscode-cpptools +# +# Triggered only by daily schedule +# ================================================================================== + +trigger: none +pr: none +schedules: +- cron: "0 7 * * *" + displayName: Daily 7 AM + branches: + include: + - main + +pool: + vmImage: 'windows-latest' + +steps: +- checkout: self + path: s/vscode-cpptools + +- task: CmdLine@2 + inputs: + script: 'git clone $(LocRepoUri) ..\VSCodeExt' + workingDirectory: '$(Build.SourcesDirectory)' + +- task: CmdLine@2 + inputs: + script: 'cd Extension && yarn install' + workingDirectory: '$(Build.SourcesDirectory)' + +- task: CmdLine@2 + inputs: + script: 'cd Extension && node ./translations_auto_pr.js microsoft vscode-cpptools cpptools csigs $(csigsPat) csigs csigs@users.noreply.github.com $(Build.SourcesDirectory)/../VSCodeExt' + workingDirectory: '$(Build.SourcesDirectory)' diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 4d3efb86d4..6257f2e76f 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,9 @@ -## Microsoft Open Source Code of Conduct +# Microsoft Open Source Code of Conduct -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact opencode@microsoft.com with any additional questions or comments. +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +Resources: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns \ No newline at end of file diff --git a/Documentation/Debugger/ExceptionSettings.md b/Documentation/Debugger/ExceptionSettings.md new file mode 100644 index 0000000000..d5c75ee44c --- /dev/null +++ b/Documentation/Debugger/ExceptionSettings.md @@ -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 | diff --git a/Extension/.eslintrc.js b/Extension/.eslintrc.js index 7e93872456..7ea41d4543 100644 --- a/Extension/.eslintrc.js +++ b/Extension/.eslintrc.js @@ -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", diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 809b519dcf..087b02ed09 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,70 +1,80 @@ # C/C++ for Visual Studio Code Change Log -## Version 1.3.0-insiders5: April 8, 2021 -### Bug Fixes -* Display integer values for char and unsigned char on hover instead of character symbols. [#1552](https://github.com/microsoft/vscode-cpptools/issues/1552) -* Fix a crash (and other bugs) caused by resolving symlinks when processing recursive includes. [#7306](https://github.com/microsoft/vscode-cpptools/issues/7306) -* Fix bug preventing successful validation and receipt of browse configurations from custom configuration providers. [PR# 7131](https://github.com/microsoft/vscode-cpptools/pull/7313) -* Fix a potential crash on shutdown and when editing at the end of a document. - -## Version 1.3.0-insiders4: April 6, 2021 -### New Features -* Add native language service binaries for ARM64 Mac. [#6595](https://github.com/microsoft/vscode-cpptools/issues/6595) - +## Version 1.4.0-insiders: May 10, 2021 ### Enhancements -* Add auto-closing of include completion brackets. [#7054](https://github.com/microsoft/vscode-cpptools/issues/7054) -* Add a `C_Cpp.files.exclude` setting, which is identical to `files.exclude` except items aren't excluded from the Explorer view. [PR #7285](https://github.com/microsoft/vscode-cpptools/pull/7285) +* 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 directory iteration to check files.exclude and symlinks and use less memory. [#3123](https://github.com/microsoft/vscode-cpptools/issues/3123), [#4206](https://github.com/microsoft/vscode-cpptools/issues/4206), [#6864](https://github.com/microsoft/vscode-cpptools/issues/6864) -* Fix bug with placement new on Windows with gcc mode. [#6246](https://github.com/microsoft/vscode-cpptools/issues/6246) -* Fix `GoToNextDirectiveInGroup` command for multiroot. [#7283](https://github.com/microsoft/vscode-cpptools/issues/7283) -* Fix field requirements for custom configurations. [PR #7295](https://github.com/microsoft/vscode-cpptools/pull/7295) -* Fix integrity hash checking of downloaded packages for the extension. [PR #7300](https://github.com/microsoft/vscode-cpptools/pull/7300) - -## Version 1.3.0-insiders3: April 1, 2021 -### New Features -* Add commands for navigating to matching preprocessor directives in conditional groups. [#7256](https://github.com/microsoft/vscode-cpptools/pull/7256) - +* 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 a crash on Linux with a `/**` includePath. +* 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) + +## Version 1.3.1: April 19, 2021 ### Bug Fixes -* Fix detection of bitness for compilers targeting esp32. [#7034](https://github.com/microsoft/vscode-cpptools/issues/7034) -* Fix comment continuations. [PR #7238](https://github.com/microsoft/vscode-cpptools/pull/7238) -* Fix bug when `${workspaceFolder}` is used in `compileCommands`. [#7241](https://github.com/microsoft/vscode-cpptools/issues/7241) - * Aleksa Pavlovic (@aleksa2808) [PR #7242](https://github.com/microsoft/vscode-cpptools/pull/7242) +* 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-insiders2: March 25, 2021 +## Version 1.3.0: April 13, 2021 ### New Features +* Add language service support for CUDA. * Add highlighting of matching conditional preprocessor statements. [#2565](https://github.com/microsoft/vscode-cpptools/issues/2565) +* Add commands for navigating to matching preprocessor directives in conditional groups. [#4779](https://github.com/microsoft/vscode-cpptools/issues/4779) +* Add native language service binaries for ARM64 Mac. [#6595](https://github.com/microsoft/vscode-cpptools/issues/6595) -### Bug Fixes -* Fix a spurious asterisk being inserted on a new line if the previous line starts with an asterisk. [#5733](https://github.com/microsoft/vscode-cpptools/issues/5733) -* Fix random crashes of cpptools-srv during shutdown. [#7161](https://github.com/microsoft/vscode-cpptools/issues/7161) -* Change `C_Cpp.autocompleteAddParentheses` to be false by default. [#7199](https://github.com/microsoft/vscode-cpptools/issues/7199) -* Fix auto add parentheses incorrectly occurring with template methods. [#7203](https://github.com/microsoft/vscode-cpptools/issues/7203) -* Fix auto adding parentheses incorrectly occurring with type names. [#7209](https://github.com/microsoft/vscode-cpptools/issues/7209) -* Fix a bug with relative "." paths in compile commands. [#7221](https://github.com/microsoft/vscode-cpptools/issues/7221) -* Fix configuration issues with Unreal Engine projects. [#7222](https://github.com/microsoft/vscode-cpptools/issues/7222) - -## Version 1.3.0-insiders: March 18, 2021 ### Enhancements -* Add parentheses to function calls with autocomplete. [#882](https://github.com/microsoft/vscode-cpptools/issues/882) +* Add parentheses to function calls when `C_Cpp.autocompleteAddParentheses` is `true`. [#882](https://github.com/microsoft/vscode-cpptools/issues/882) +* Add @retval support to the simplified view of doc comments. [#6816](https://github.com/microsoft/vscode-cpptools/issues/6816) +* Add auto-closing of include completion brackets. [#7054](https://github.com/microsoft/vscode-cpptools/issues/7054) * Add support for nodeAddonIncludes with Yarn PnP. * Mestery (@Mesterry) [PR #7123](https://github.com/microsoft/vscode-cpptools/pull/7123) +* Add a `C_Cpp.files.exclude` setting, which is identical to `files.exclude` except items aren't excluded from the Explorer view. [PR #7285](https://github.com/microsoft/vscode-cpptools/pull/7285) ### Bug Fixes +* Display integer values for char and unsigned char on hover instead of character symbols. [#1552](https://github.com/microsoft/vscode-cpptools/issues/1552) +* Fix directory iteration to check files.exclude and symlinks and use less memory. [#3123](https://github.com/microsoft/vscode-cpptools/issues/3123), [#4206](https://github.com/microsoft/vscode-cpptools/issues/4206), [#6864](https://github.com/microsoft/vscode-cpptools/issues/6864) * Fix an issue with stale IntelliSense due to moving or renaming header files. [#3849](https://github.com/microsoft/vscode-cpptools/issues/3849) * Fix go to definition on large macros. [#4306](https://github.com/microsoft/vscode-cpptools/issues/4306) +* Fix a spurious asterisk being inserted on a new line if the previous line starts with an asterisk. [#5733](https://github.com/microsoft/vscode-cpptools/issues/5733) +* Fix bug with placement new on Windows with gcc mode. [#6246](https://github.com/microsoft/vscode-cpptools/issues/6246) * Fix size_t and placement new squiggles with clang on Windows. [#6573](https://github.com/microsoft/vscode-cpptools/issues/6573), [#7106](https://github.com/microsoft/vscode-cpptools/issues/7016) * Fix an incorrect IntelliSense error squiggle when assigning to std::variant in clang mode. [#6623](https://github.com/microsoft/vscode-cpptools/issues/6623) * Fix incorrect squiggle with range-v3 library. [#6639](https://github.com/microsoft/vscode-cpptools/issues/6639) * Fix incorrect squiggle with auto parameters. [#6714](https://github.com/microsoft/vscode-cpptools/issues/6714) -* Add @retval support to the simplified view of doc comments. [#6816](https://github.com/microsoft/vscode-cpptools/issues/6816) * Fix (reimplement) nested document symbols. [#6830](https://github.com/microsoft/vscode-cpptools/issues/6830), [#7023](https://github.com/microsoft/vscode-cpptools/issues/7023), [#7024](https://github.com/microsoft/vscode-cpptools/issues/7024) +* Fix detection of bitness for compilers targeting esp32. [#7034](https://github.com/microsoft/vscode-cpptools/issues/7034) * Fix include completion not working after creating a new header with a non-standard extension until a reload is done. [#6987](https://github.com/microsoft/vscode-cpptools/issues/6987), [#7061](https://github.com/microsoft/vscode-cpptools/issues/7061) * Fix endless CPU/memory usage in cpptools-srv when certain templated type aliases are used. [#7085](https://github.com/microsoft/vscode-cpptools/issues/7085) * Fix "No symbols found" sometimes occurring when a document first opens. [#7103](https://github.com/microsoft/vscode-cpptools/issues/7103) * Fix vcFormat formatting after typing brackets and a newline. [#7125](https://github.com/microsoft/vscode-cpptools/issues/7125) * Fix a performance bug after formatting a document. [#7159](https://github.com/microsoft/vscode-cpptools/issues/7159) +* Fix random crashes of cpptools-srv during shutdown. [#7161](https://github.com/microsoft/vscode-cpptools/issues/7161) +* Fix a bug with relative "." paths in compile commands. [#7221](https://github.com/microsoft/vscode-cpptools/issues/7221) +* Fix configuration issues with Unreal Engine projects. [#7222](https://github.com/microsoft/vscode-cpptools/issues/7222) +* Fix bug when `${workspaceFolder}` is used in `compileCommands`. [#7241](https://github.com/microsoft/vscode-cpptools/issues/7241) + * Aleksa Pavlovic (@aleksa2808) [PR #7242](https://github.com/microsoft/vscode-cpptools/pull/7242) +* Fix field requirements for custom configurations. [PR #7295](https://github.com/microsoft/vscode-cpptools/pull/7295) +* Fix integrity hash checking of downloaded packages for the extension. [PR #7300](https://github.com/microsoft/vscode-cpptools/pull/7300) +* Fix a bug preventing successful validation and receipt of browse configurations from custom configuration providers. [PR# 7131](https://github.com/microsoft/vscode-cpptools/pull/7313) +* Fix a potential crash when editing at the end of a document. +* Fix "Configure Task" selection to show root folder names for multiroot workspace [PR #7315](https://github.com/microsoft/vscode-cpptools/pull/7315) ## Version 1.2.2: February 25, 2021 ### Bug Fixes @@ -479,7 +489,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`. @@ -510,7 +520,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) @@ -527,7 +537,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 @@ -933,7 +943,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 @@ -1201,8 +1211,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) diff --git a/Extension/bin/common.json b/Extension/bin/common.json index bf6e470e33..ae5b8b3ebf 100644 --- a/Extension/bin/common.json +++ b/Extension/bin/common.json @@ -26,8 +26,8 @@ "replace": "--using_directory\n$1" }, { - "match": "^/dE--header_only_fallback", - "replace": "--header_only_fallback" + "match": "^/dE--(.*)", + "replace": "--$1" } ] } \ No newline at end of file diff --git a/Extension/i18n/chs/package.i18n.json b/Extension/i18n/chs/package.i18n.json index 5f7f4dac79..87735c4145 100644 --- a/Extension/i18n/chs/package.i18n.json +++ b/Extension/i18n/chs/package.i18n.json @@ -170,9 +170,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 +183,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": "如果 pipeProgram 的单个参数包含字符(如空格或制表符),是否应引用它? 如果为 “false”,则将不再自动引用调试程序命令。\r\n 默认为 “true”。", "c_cpp.debuggers.logging.description": "用于确定应将哪些类型的消息记录到调试控制台的可选标志。", "c_cpp.debuggers.logging.exceptions.description": "用于确定是否应将异常消息记录到调试控制台的可选标志。默认为 true。", "c_cpp.debuggers.logging.moduleLoad.description": "用于确定是否应将模块加载事件记录到调试控制台的可选标志。默认为 true。", @@ -208,7 +208,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\"。", diff --git a/Extension/i18n/chs/src/main.i18n.json b/Extension/i18n/chs/src/main.i18n.json index 011d31f440..d78fec48d7 100644 --- a/Extension/i18n/chs/src/main.i18n.json +++ b/Extension/i18n/chs/src/main.i18n.json @@ -7,8 +7,7 @@ "architecture.not.supported": "体系结构 {0} 不受支持。", "apline.containers.not.supported": "Alpine 容器不受支持。", "download.button": "转到下载页", - "native.binaries.mismatch.osx": "This 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": "扩展的此 {0} 版本与你的 OS 不兼容。请下载并安装扩展的“{1}”版本。", + "native.binaries.not.supported": "此 {0} {1} 版本的扩展与你的 OS 不兼容,请下载并安装 \"{2}\" 版本的扩展。", "extension.installation.failed": "C/C++ 扩展安装失败。为使函数正常工作,需要修复或重新安装 C/C++ 语言功能的扩展。", "remove.extension": "尝试修复", "jason.files.missing": "C/C++ 扩展安装失败。为使函数正常工作,需要重新安装 C/C++ 语言功能的扩展。", diff --git a/Extension/i18n/chs/src/packageManager.i18n.json b/Extension/i18n/chs/src/packageManager.i18n.json index 685b0851e6..6e7afe59d4 100644 --- a/Extension/i18n/chs/src/packageManager.i18n.json +++ b/Extension/i18n/chs/src/packageManager.i18n.json @@ -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}”已存在,但未更新。" } \ No newline at end of file diff --git a/Extension/i18n/cht/package.i18n.json b/Extension/i18n/cht/package.i18n.json index 67c35cfb36..3fdbb62dca 100644 --- a/Extension/i18n/cht/package.i18n.json +++ b/Extension/i18n/cht/package.i18n.json @@ -170,9 +170,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 +183,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": "若 pipeProgram 的個別引數包含字元 (例如空格或定位字元),是否應該加上引號? 若設定為 'false',不會再自動為偵錯工具命令加上引號。\r\n預設為 'true'。", "c_cpp.debuggers.logging.description": "選擇性旗標,用以判斷應記錄到偵錯主控台的訊息類型。", "c_cpp.debuggers.logging.exceptions.description": "選擇性旗標,用以判斷是否應將例外狀況訊息記錄到偵錯主控台。預設為 true。", "c_cpp.debuggers.logging.moduleLoad.description": "選擇性旗標,用以判斷是否應將模組載入事件記錄到偵錯主控台。預設為 true。", @@ -208,7 +208,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\"。", diff --git a/Extension/i18n/cht/src/main.i18n.json b/Extension/i18n/cht/src/main.i18n.json index 62850038cd..8f8102bc32 100644 --- a/Extension/i18n/cht/src/main.i18n.json +++ b/Extension/i18n/cht/src/main.i18n.json @@ -7,8 +7,7 @@ "architecture.not.supported": "不支援架構 {0}。 ", "apline.containers.not.supported": "不支援 Alpine 容器。", "download.button": "前往 [下載\ 頁面", - "native.binaries.mismatch.osx": "This 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": "此 {0} 版延伸模組與您的 OS 不相容。請下載並安裝 \"{1}\" 版本的延伸模組。", + "native.binaries.not.supported": "此 {0} {1} 版延伸模組與您的作業系統不相容。請下載並安裝 \"{2}\" 版延伸模組。", "extension.installation.failed": "無法成功安裝 C/C++ 延伸模組。您必須修復或重新安裝 C/C++ 語言功能的延伸模組,才可正常運作。", "remove.extension": "嘗試修復", "jason.files.missing": "無法成功安裝 C/C++ 延伸模組。您必須重新安裝 C/C++ 語言功能的延伸模組,才可正常運作。", diff --git a/Extension/i18n/cht/src/packageManager.i18n.json b/Extension/i18n/cht/src/packageManager.i18n.json index 9c015845c7..0d01797b4c 100644 --- a/Extension/i18n/cht/src/packageManager.i18n.json +++ b/Extension/i18n/cht/src/packageManager.i18n.json @@ -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}' 已經存在但未更新。" } \ No newline at end of file diff --git a/Extension/i18n/csy/package.i18n.json b/Extension/i18n/csy/package.i18n.json index 8bf303fcd7..e67d72f9ad 100644 --- a/Extension/i18n/csy/package.i18n.json +++ b/Extension/i18n/csy/package.i18n.json @@ -170,9 +170,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 +183,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": "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. \r\nVýchozí hodnota je 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 +208,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.", diff --git a/Extension/i18n/csy/src/main.i18n.json b/Extension/i18n/csy/src/main.i18n.json index 8067153719..452d30b243 100644 --- a/Extension/i18n/csy/src/main.i18n.json +++ b/Extension/i18n/csy/src/main.i18n.json @@ -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": "This 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": "Tato verze rozšíření pro {0} není kompatibilní s vaším operačním systémem. Stáhněte a nainstalujte si prosím verzi rozšíření {1}.", + "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.", diff --git a/Extension/i18n/csy/src/packageManager.i18n.json b/Extension/i18n/csy/src/packageManager.i18n.json index 4078230ed1..5a9815dfdd 100644 --- a/Extension/i18n/csy/src/packageManager.i18n.json +++ b/Extension/i18n/csy/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/deu/package.i18n.json b/Extension/i18n/deu/package.i18n.json index 3bdd52987f..9c1a535b78 100644 --- a/Extension/i18n/deu/package.i18n.json +++ b/Extension/i18n/deu/package.i18n.json @@ -23,8 +23,8 @@ "c_cpp.command.vcpkgClipboardInstallSuggested.title": "vcpkg-Installationsbefehl in Zwischenablage kopieren", "c_cpp.command.vcpkgOnlineHelpSuggested.title": "vcpkg-Hilfeseite aufrufen", "c_cpp.command.generateEditorConfig.title": "EditorConfig-Inhalte aus VC-Formateinstellungen generieren", - "c_cpp.command.GoToNextDirectiveInGroup.title": "Go to next preprocessor directive in conditional group", - "c_cpp.command.GoToPrevDirectiveInGroup.title": "Go to previous preprocessor directive in conditional group", + "c_cpp.command.GoToNextDirectiveInGroup.title": "Zur nächsten Präprozessoranweisung in bedingter Gruppe wechseln", + "c_cpp.command.GoToPrevDirectiveInGroup.title": "Zur vorherigen Präprozessoranweisung in bedingter Gruppe wechseln", "c_cpp.configuration.formatting.description": "Konfiguriert das Formatierungsmodul.", "c_cpp.configuration.formatting.clangFormat.description": "Zum Formatieren von Code wird \"clang-format\" verwendet.", "c_cpp.configuration.formatting.vcFormat.description": "Das Visual C++-Formatierungsmodul wird zum Formatieren von Code verwendet.", @@ -170,9 +170,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 +183,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": "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. \r\nDer Standardwert ist \"true\".", "c_cpp.debuggers.logging.description": "Optionale Flags zum Festlegen, welche Nachrichtentypen in der Debugging-Konsole protokolliert werden sollen.", "c_cpp.debuggers.logging.exceptions.description": "Optionales Flag zum Festlegen, ob Ausnahmemeldungen in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist TRUE.", "c_cpp.debuggers.logging.moduleLoad.description": "Optionales Flag zum Festlegen, ob Modulladeereignisse in der Debugging-Konsole protokolliert werden sollen. Der Standardwert ist TRUE.", @@ -208,7 +208,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\".", diff --git a/Extension/i18n/deu/src/main.i18n.json b/Extension/i18n/deu/src/main.i18n.json index 55a8d05e3a..e0a2fe50fd 100644 --- a/Extension/i18n/deu/src/main.i18n.json +++ b/Extension/i18n/deu/src/main.i18n.json @@ -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": "This 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": "Diese Version für {0} der Erweiterung ist nicht mit Ihrem Betriebssystem kompatibel. Laden Sie Version {1} der Erweiterung herunter, und installieren Sie sie.", + "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.", diff --git a/Extension/i18n/deu/src/nativeStrings.i18n.json b/Extension/i18n/deu/src/nativeStrings.i18n.json index 1865a19949..0e95c8c460 100644 --- a/Extension/i18n/deu/src/nativeStrings.i18n.json +++ b/Extension/i18n/deu/src/nativeStrings.i18n.json @@ -208,9 +208,9 @@ "unrecognized_language_standard_version": "Die Compilerabfrage hat eine unbekannte Sprachstandardversion zurückgegeben. Stattdessen wird die neueste unterstützte Version verwendet.", "intellisense_process_crash_detected": "IntelliSense-Prozessabsturz erkannt.", "return_values_label": "Rückgabewerte:", - "nvcc_compiler_not_found": "Unable to locate nvcc compiler: {0}", - "nvcc_host_compiler_not_found": "Unable to locate nvcc host compiler: {0}", - "invoking_nvcc": "Invoking nvcc with command line: {0}", - "nvcc_host_compile_command_not_found": "Unable to find host compile command in output of nvcc.", - "unable_to_locate_forced_include": "Unable to locate forced include: {0}" + "nvcc_compiler_not_found": "Der nvcc-Compiler wurde nicht gefunden: {0}", + "nvcc_host_compiler_not_found": "Der nvcc-Hostcompiler wurde nicht gefunden: {0}", + "invoking_nvcc": "nvcc wird über Befehlszeile aufgerufen: {0}", + "nvcc_host_compile_command_not_found": "Der Hostkompilierbefehl wurde in der Ausgabe von nvcc nicht gefunden.", + "unable_to_locate_forced_include": "Erzwungene Includedatei wurde nicht gefunden: {0}" } \ No newline at end of file diff --git a/Extension/i18n/deu/src/packageManager.i18n.json b/Extension/i18n/deu/src/packageManager.i18n.json index cae6caf18f..2cf3c8daee 100644 --- a/Extension/i18n/deu/src/packageManager.i18n.json +++ b/Extension/i18n/deu/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/esn/package.i18n.json b/Extension/i18n/esn/package.i18n.json index 013c97537d..a3e59c1d6d 100644 --- a/Extension/i18n/esn/package.i18n.json +++ b/Extension/i18n/esn/package.i18n.json @@ -23,8 +23,8 @@ "c_cpp.command.vcpkgClipboardInstallSuggested.title": "Copiar el comando vcpkg install en el Portapapeles", "c_cpp.command.vcpkgOnlineHelpSuggested.title": "Visitar la página de ayuda de vcpkg", "c_cpp.command.generateEditorConfig.title": "Generar contenido de EditorConfig a partir de la configuración de formato de VC", - "c_cpp.command.GoToNextDirectiveInGroup.title": "Go to next preprocessor directive in conditional group", - "c_cpp.command.GoToPrevDirectiveInGroup.title": "Go to previous preprocessor directive in conditional group", + "c_cpp.command.GoToNextDirectiveInGroup.title": "Ir a la directiva del preprocesador siguiente en el grupo condicional", + "c_cpp.command.GoToPrevDirectiveInGroup.title": "Ir a la directiva del preprocesador anterior en el grupo condicional", "c_cpp.configuration.formatting.description": "Configura el motor de formato", "c_cpp.configuration.formatting.clangFormat.description": "El archivo clang-format se usará para formatear el código.", "c_cpp.configuration.formatting.vcFormat.description": "El motor de formato de Visual C++ se usará para formatear el código.", @@ -170,9 +170,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 +183,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": "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. \r\nEl valor predeterminado es \"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 +208,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\".", diff --git a/Extension/i18n/esn/src/main.i18n.json b/Extension/i18n/esn/src/main.i18n.json index 92d07db42c..fda6383160 100644 --- a/Extension/i18n/esn/src/main.i18n.json +++ b/Extension/i18n/esn/src/main.i18n.json @@ -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": "This 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": "La versión para {0} de la extensión no es compatible con el sistema operativo. Descargue la versión \"{1}\" de la extensión e instálela.", + "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.", diff --git a/Extension/i18n/esn/src/nativeStrings.i18n.json b/Extension/i18n/esn/src/nativeStrings.i18n.json index 035e3d7172..9fb9b2461c 100644 --- a/Extension/i18n/esn/src/nativeStrings.i18n.json +++ b/Extension/i18n/esn/src/nativeStrings.i18n.json @@ -208,9 +208,9 @@ "unrecognized_language_standard_version": "La consulta del compilador devolvió una versión estándar del lenguaje no reconocida. En su lugar se usará la última versión admitida.", "intellisense_process_crash_detected": "Se ha detectado un bloqueo del proceso de IntelliSense.", "return_values_label": "Valores devueltos:", - "nvcc_compiler_not_found": "Unable to locate nvcc compiler: {0}", - "nvcc_host_compiler_not_found": "Unable to locate nvcc host compiler: {0}", - "invoking_nvcc": "Invoking nvcc with command line: {0}", - "nvcc_host_compile_command_not_found": "Unable to find host compile command in output of nvcc.", - "unable_to_locate_forced_include": "Unable to locate forced include: {0}" + "nvcc_compiler_not_found": "No se encuentra el compilador de nvcc: {0}", + "nvcc_host_compiler_not_found": "No se encuentra el compilador host nvcc: {0}", + "invoking_nvcc": "Invocando nvcc con la línea de comandos: {0}", + "nvcc_host_compile_command_not_found": "No se encuentra el comando de compilación del host en la salida de nvcc.", + "unable_to_locate_forced_include": "No se encuentra la inclusión forzada: {0}" } \ No newline at end of file diff --git a/Extension/i18n/esn/src/packageManager.i18n.json b/Extension/i18n/esn/src/packageManager.i18n.json index 9184c5d3c6..7e677ff259 100644 --- a/Extension/i18n/esn/src/packageManager.i18n.json +++ b/Extension/i18n/esn/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/fra/package.i18n.json b/Extension/i18n/fra/package.i18n.json index 14a6fe9855..520d2ddb5b 100644 --- a/Extension/i18n/fra/package.i18n.json +++ b/Extension/i18n/fra/package.i18n.json @@ -23,8 +23,8 @@ "c_cpp.command.vcpkgClipboardInstallSuggested.title": "Copier la commande vcpkg install dans le Presse-papiers", "c_cpp.command.vcpkgOnlineHelpSuggested.title": "Visiter la page d'aide de vcpkg", "c_cpp.command.generateEditorConfig.title": "Générer le contenu d'EditorConfig à partir des paramètres de format VC", - "c_cpp.command.GoToNextDirectiveInGroup.title": "Go to next preprocessor directive in conditional group", - "c_cpp.command.GoToPrevDirectiveInGroup.title": "Go to previous preprocessor directive in conditional group", + "c_cpp.command.GoToNextDirectiveInGroup.title": "Accéder à la directive de préprocesseur suivante dans le groupe conditionnel", + "c_cpp.command.GoToPrevDirectiveInGroup.title": "Accéder à la directive de préprocesseur précédente dans le groupe conditionnel", "c_cpp.configuration.formatting.description": "Configure le moteur de mise en forme", "c_cpp.configuration.formatting.clangFormat.description": "clang-format est utilisé pour la mise en forme du code.", "c_cpp.configuration.formatting.vcFormat.description": "Le moteur de mise en forme de Visual C++ est utilisé pour la mise en forme du code.", @@ -170,9 +170,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 l’exclusion des dossiers (et des fichiers si « C_Cpp.exclusionPolicy » est modifié). Ceux-ci sont spécifiques à l’extension C/C++ et s’ajoutent à « files.exclude », mais contrairement à « files.exclude », ils ne sont pas supprimés de l’affichage de l’Explorateur. 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 +183,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": "Si des arguments individuels de pipeProgram contiennent des caractères tels que 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. \r\nLa valeur par défaut est « 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 +208,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 d’environnement à ajouter à l’environnement 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\".", diff --git a/Extension/i18n/fra/src/main.i18n.json b/Extension/i18n/fra/src/main.i18n.json index 18dee948fb..7b3e9588b8 100644 --- a/Extension/i18n/fra/src/main.i18n.json +++ b/Extension/i18n/fra/src/main.i18n.json @@ -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": "This 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": "Cette version {0} de l'extension est incompatible avec votre système d'exploitation. Téléchargez et installez la version \"{1}\" de l'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.", diff --git a/Extension/i18n/fra/src/nativeStrings.i18n.json b/Extension/i18n/fra/src/nativeStrings.i18n.json index 3a0720ce07..bd343b15b2 100644 --- a/Extension/i18n/fra/src/nativeStrings.i18n.json +++ b/Extension/i18n/fra/src/nativeStrings.i18n.json @@ -208,9 +208,9 @@ "unrecognized_language_standard_version": "L'interrogation du compilateur a retourné une version de norme de langage non reconnue. La toute dernière version prise en charge va être utilisée à la place.", "intellisense_process_crash_detected": "Détection d'un plantage du processus IntelliSense.", "return_values_label": "Valeurs de retour :", - "nvcc_compiler_not_found": "Unable to locate nvcc compiler: {0}", - "nvcc_host_compiler_not_found": "Unable to locate nvcc host compiler: {0}", - "invoking_nvcc": "Invoking nvcc with command line: {0}", - "nvcc_host_compile_command_not_found": "Unable to find host compile command in output of nvcc.", - "unable_to_locate_forced_include": "Unable to locate forced include: {0}" + "nvcc_compiler_not_found": "Impossible de localiser le compilateur nvcc : {0}", + "nvcc_host_compiler_not_found": "Impossible de localiser le compilateur hôte pour nvcc : {0}", + "invoking_nvcc": "Appel de nvcc avec la ligne de commande : {0}", + "nvcc_host_compile_command_not_found": "La commande de compilation hôte est introuvable dans la sortie de nvcc.", + "unable_to_locate_forced_include": "Impossible de localiser le fichier include forcé : {0}" } \ No newline at end of file diff --git a/Extension/i18n/fra/src/packageManager.i18n.json b/Extension/i18n/fra/src/packageManager.i18n.json index 78871bde37..2741c81f2c 100644 --- a/Extension/i18n/fra/src/packageManager.i18n.json +++ b/Extension/i18n/fra/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/ita/package.i18n.json b/Extension/i18n/ita/package.i18n.json index b8d316b813..83ae103dbb 100644 --- a/Extension/i18n/ita/package.i18n.json +++ b/Extension/i18n/ita/package.i18n.json @@ -170,9 +170,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 +183,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": "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. \r\nL'impostazione predefinita è '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 +208,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\".", diff --git a/Extension/i18n/ita/src/main.i18n.json b/Extension/i18n/ita/src/main.i18n.json index eb45e53655..87a2e6fc85 100644 --- a/Extension/i18n/ita/src/main.i18n.json +++ b/Extension/i18n/ita/src/main.i18n.json @@ -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": "This 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": "La versione {0} dell'estensione non è compatibile con il sistema operativo. Scaricare e installare la versione \"{1}\" dell'estensione.", + "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++.", diff --git a/Extension/i18n/ita/src/packageManager.i18n.json b/Extension/i18n/ita/src/packageManager.i18n.json index 8bdcc6a33a..a614d351a8 100644 --- a/Extension/i18n/ita/src/packageManager.i18n.json +++ b/Extension/i18n/ita/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/jpn/package.i18n.json b/Extension/i18n/jpn/package.i18n.json index 87bf75247d..178ee3062d 100644 --- a/Extension/i18n/jpn/package.i18n.json +++ b/Extension/i18n/jpn/package.i18n.json @@ -170,9 +170,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 +183,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": "pipeProgram の個々の引数に (スペースやタブなどの) 文字が含まれる場合に引用符で囲むかどうか。'false' に設定すると、デバッガー コマンドが自動的に引用符で囲まれることはなくなります。\r\n既定値は 'true' です。", "c_cpp.debuggers.logging.description": "どの種類のメッセージをデバッグ コンソールに記録する必要があるかを決定するオプションのフラグです。", "c_cpp.debuggers.logging.exceptions.description": "例外メッセージをデバッグ コンソールに記録するかどうかを決定するオプションのフラグです。既定値は true です。", "c_cpp.debuggers.logging.moduleLoad.description": "モジュール読み込みイベントをデバッグ コンソールに記録するかどうかを決定するオプションのフラグです。既定値は true です。", @@ -208,7 +208,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\" です。", diff --git a/Extension/i18n/jpn/src/main.i18n.json b/Extension/i18n/jpn/src/main.i18n.json index 54862c9410..b3abf9eba2 100644 --- a/Extension/i18n/jpn/src/main.i18n.json +++ b/Extension/i18n/jpn/src/main.i18n.json @@ -7,8 +7,7 @@ "architecture.not.supported": "アーキテクチャ {0} はサポートされていません。", "apline.containers.not.supported": "Alpine コンテナーはサポートされていません。", "download.button": "ダウンロード ページへ移動", - "native.binaries.mismatch.osx": "This 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": "この {0} バージョンの拡張機能は、お使いの OS と互換性がありません。拡張機能の \"{1}\" バージョンをダウンロードしてインストールしてください。", + "native.binaries.not.supported": "この {0} {1} バージョンの拡張機能は、お使いの OS と互換性がありません。拡張機能の \"{2}\" バージョンをダウンロードしてインストールしてください。", "extension.installation.failed": "C/C++ の拡張機能を正常にインストールできませんでした。正常に機能させるには、C/C++ 言語機能の拡張機能を修復または再インストールする必要があります。", "remove.extension": "修復の試行", "jason.files.missing": "C/C++ の拡張機能を正常にインストールできませんでした。正常に機能させるには、C/C++ 言語機能の拡張機能を再インストールする必要があります。", diff --git a/Extension/i18n/jpn/src/packageManager.i18n.json b/Extension/i18n/jpn/src/packageManager.i18n.json index a36dd5fc57..35703074f2 100644 --- a/Extension/i18n/jpn/src/packageManager.i18n.json +++ b/Extension/i18n/jpn/src/packageManager.i18n.json @@ -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}' は既に存在するため、更新されませんでした。" } \ No newline at end of file diff --git a/Extension/i18n/kor/package.i18n.json b/Extension/i18n/kor/package.i18n.json index 0d263ace4c..8375ae47ce 100644 --- a/Extension/i18n/kor/package.i18n.json +++ b/Extension/i18n/kor/package.i18n.json @@ -170,9 +170,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 +183,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": "pipeProgram의 개별 인수가 문자(예: 공백 또는 탭)를 포함하는 경우 따옴표를 붙여야 하나요? 'false'인 경우 디버거 명령은 더 이상 자동으로 따옴표를 붙이지 않습니다. \r\n기본값은 'true'입니다.", "c_cpp.debuggers.logging.description": "메시지 유형을 디버그 콘솔에 기록할지 여부를 결정하는 선택적 플래그입니다.", "c_cpp.debuggers.logging.exceptions.description": "예외 메시지를 디버그 콘솔에 기록할지 여부를 결정하는 선택적 플래그입니다. 기본값은 true입니다.", "c_cpp.debuggers.logging.moduleLoad.description": "모듈 로드 이벤트를 디버그 콘솔에 기록할지 여부를 결정하는 선택적 플래그입니다. 기본값은 true입니다.", @@ -208,7 +208,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\"입니다.", diff --git a/Extension/i18n/kor/src/main.i18n.json b/Extension/i18n/kor/src/main.i18n.json index d85ab923fc..72a4f84bae 100644 --- a/Extension/i18n/kor/src/main.i18n.json +++ b/Extension/i18n/kor/src/main.i18n.json @@ -7,8 +7,7 @@ "architecture.not.supported": "{0} 아키텍처는 지원되지 않습니다. ", "apline.containers.not.supported": "Alpine 컨테이너는 지원되지 않습니다.", "download.button": "다운로드 페이지로 이동", - "native.binaries.mismatch.osx": "This 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": "이 확장의 {0} 버전은 OS와 호환되지 않습니다. 확장의 \"{1}\" 버전을 다운로드하여 설치하세요.", + "native.binaries.not.supported": "이 확장의 {0} {1} 버전은 OS와 호환되지 않습니다. 확장의 \"{2}\" 버전을 다운로드하여 설치하세요.", "extension.installation.failed": "C/C++ 확장을 설치하지 못했습니다. C/C++ 언어 기능이 제대로 작동하려면 확장을 복구하거나 다시 설치해야 합니다.", "remove.extension": "복구 시도", "jason.files.missing": "C/C++ 확장을 설치하지 못했습니다. C/C++ 언어 기능이 제대로 작동하려면 확장을 다시 설치해야 합니다.", diff --git a/Extension/i18n/kor/src/packageManager.i18n.json b/Extension/i18n/kor/src/packageManager.i18n.json index bfe6806e67..b349515504 100644 --- a/Extension/i18n/kor/src/packageManager.i18n.json +++ b/Extension/i18n/kor/src/packageManager.i18n.json @@ -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}' 파일이 이미 있으므로 업데이트되지 않았습니다." } \ No newline at end of file diff --git a/Extension/i18n/plk/package.i18n.json b/Extension/i18n/plk/package.i18n.json index 44aa0eebf9..ff0326deb5 100644 --- a/Extension/i18n/plk/package.i18n.json +++ b/Extension/i18n/plk/package.i18n.json @@ -170,9 +170,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 +183,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": "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. \r\nWartość domyślna to „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 +208,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”.", diff --git a/Extension/i18n/plk/src/main.i18n.json b/Extension/i18n/plk/src/main.i18n.json index bb6e05e49f..5899c8bf45 100644 --- a/Extension/i18n/plk/src/main.i18n.json +++ b/Extension/i18n/plk/src/main.i18n.json @@ -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": "This 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": "Ta wersja {0} rozszerzenia jest niezgodna z systemem operacyjnym. Pobierz i zainstaluj wersję rozszerzenia „{1}”.", + "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++.", diff --git a/Extension/i18n/plk/src/packageManager.i18n.json b/Extension/i18n/plk/src/packageManager.i18n.json index 3808617da0..5382bf56b1 100644 --- a/Extension/i18n/plk/src/packageManager.i18n.json +++ b/Extension/i18n/plk/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/ptb/package.i18n.json b/Extension/i18n/ptb/package.i18n.json index f01e3976e3..32bffd8596 100644 --- a/Extension/i18n/ptb/package.i18n.json +++ b/Extension/i18n/ptb/package.i18n.json @@ -23,8 +23,8 @@ "c_cpp.command.vcpkgClipboardInstallSuggested.title": "Copiar o comando de instalação vcpkg para a área de transferência", "c_cpp.command.vcpkgOnlineHelpSuggested.title": "Visite a página de ajuda do vcpkg", "c_cpp.command.generateEditorConfig.title": "Gerar o conteúdo do EditorConfig por meio das configurações de Formato do VC", - "c_cpp.command.GoToNextDirectiveInGroup.title": "Go to next preprocessor directive in conditional group", - "c_cpp.command.GoToPrevDirectiveInGroup.title": "Go to previous preprocessor directive in conditional group", + "c_cpp.command.GoToNextDirectiveInGroup.title": "Ir para a próxima diretiva de pré-processador no grupo condicional", + "c_cpp.command.GoToPrevDirectiveInGroup.title": "Ir para a diretiva de pré-processador anterior no grupo condicional", "c_cpp.configuration.formatting.description": "Configura o mecanismo de formatação", "c_cpp.configuration.formatting.clangFormat.description": "O clang-format será usado para formatar o código.", "c_cpp.configuration.formatting.vcFormat.description": "O mecanismo de formatação Visual C++ será usado para formatar o código.", @@ -170,9 +170,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 +183,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": "Se os argumentos individuais do pipeProgram contiverem caracteres (como espaços ou tabulações), ele deverão ser colocado entre aspas? Se for 'Falso', o comando debugger não será mais colocado automaticamente entre aspas. \r\nO padrão é 'Verdadeiro'.", "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 +208,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\".", diff --git a/Extension/i18n/ptb/src/main.i18n.json b/Extension/i18n/ptb/src/main.i18n.json index 2e14d58945..b8e6885761 100644 --- a/Extension/i18n/ptb/src/main.i18n.json +++ b/Extension/i18n/ptb/src/main.i18n.json @@ -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": "This 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": "Esta versão de {0} da extensão é incompatível com seu sistema operacional. Baixe e instale a versão \"{1}\" da extensão.", + "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.", diff --git a/Extension/i18n/ptb/src/nativeStrings.i18n.json b/Extension/i18n/ptb/src/nativeStrings.i18n.json index a92b2dd763..3590ded6dd 100644 --- a/Extension/i18n/ptb/src/nativeStrings.i18n.json +++ b/Extension/i18n/ptb/src/nativeStrings.i18n.json @@ -208,9 +208,9 @@ "unrecognized_language_standard_version": "A consulta do compilador retornou uma versão do padrão de linguagem não reconhecida. Nesse caso, será usada a última versão com suporte.", "intellisense_process_crash_detected": "Falha detectada no processo do IntelliSense.", "return_values_label": "Valores retornados:", - "nvcc_compiler_not_found": "Unable to locate nvcc compiler: {0}", - "nvcc_host_compiler_not_found": "Unable to locate nvcc host compiler: {0}", - "invoking_nvcc": "Invoking nvcc with command line: {0}", - "nvcc_host_compile_command_not_found": "Unable to find host compile command in output of nvcc.", - "unable_to_locate_forced_include": "Unable to locate forced include: {0}" + "nvcc_compiler_not_found": "Não é possível localizar o compilador NVCC: {0}", + "nvcc_host_compiler_not_found": "Não é possível localizar o compilador de host NVCC: {0}", + "invoking_nvcc": "Invocando NVCC com a linha de comando: {0}", + "nvcc_host_compile_command_not_found": "Não é possível localizar o comando de compilação de host na saída de NVCC.", + "unable_to_locate_forced_include": "Não é possível localizar a inclusão forçada: {0}" } \ No newline at end of file diff --git a/Extension/i18n/ptb/src/packageManager.i18n.json b/Extension/i18n/ptb/src/packageManager.i18n.json index 3eb6afc35d..dc04f746e1 100644 --- a/Extension/i18n/ptb/src/packageManager.i18n.json +++ b/Extension/i18n/ptb/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/i18n/rus/package.i18n.json b/Extension/i18n/rus/package.i18n.json index 858c71d307..02b1b39d8f 100644 --- a/Extension/i18n/rus/package.i18n.json +++ b/Extension/i18n/rus/package.i18n.json @@ -23,8 +23,8 @@ "c_cpp.command.vcpkgClipboardInstallSuggested.title": "Копировать команду vcpkg install в буфер обмена", "c_cpp.command.vcpkgOnlineHelpSuggested.title": "Посетите страницу справки по vcpkg", "c_cpp.command.generateEditorConfig.title": "Создание содержимого EditorConfig из параметров формата VC", - "c_cpp.command.GoToNextDirectiveInGroup.title": "Go to next preprocessor directive in conditional group", - "c_cpp.command.GoToPrevDirectiveInGroup.title": "Go to previous preprocessor directive in conditional group", + "c_cpp.command.GoToNextDirectiveInGroup.title": "Перейти к следующей директиве препроцессора в условной группе", + "c_cpp.command.GoToPrevDirectiveInGroup.title": "Перейти к предыдущей директиве препроцессора в условной группе", "c_cpp.configuration.formatting.description": "Настраивает подсистему форматирования.", "c_cpp.configuration.formatting.clangFormat.description": "Для форматирования кода будет использоваться clang-format.", "c_cpp.configuration.formatting.vcFormat.description": "Для форматирования кода будет использоваться подсистема форматирования Visual C++.", @@ -170,9 +170,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 +183,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": "Определяет, должны ли быть заключены в кавычки отдельные аргументы pipeProgram, если эти аргументы содержат символы (такие как пробелы или символы табуляции). Если задано значение \"false\", команда отладчика больше не будет автоматически заключаться в кавычки. \r\nЗначение по умолчанию — \"true\".", "c_cpp.debuggers.logging.description": "Необязательные флаги для определения типов сообщений, регистрируемых в консоли отладки.", "c_cpp.debuggers.logging.exceptions.description": "Необязательный флаг, определяющий, следует ли регистрировать сообщения об исключениях в консоли отладки. По умолчанию принимает значение true.", "c_cpp.debuggers.logging.moduleLoad.description": "Необязательный флаг, определяющий, следует ли регистрировать события загрузки модулей в консоли отладки. По умолчанию принимает значение true.", @@ -208,7 +208,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\".", diff --git a/Extension/i18n/rus/src/main.i18n.json b/Extension/i18n/rus/src/main.i18n.json index bbf80f969d..f082258183 100644 --- a/Extension/i18n/rus/src/main.i18n.json +++ b/Extension/i18n/rus/src/main.i18n.json @@ -7,8 +7,7 @@ "architecture.not.supported": "Архитектура {0} не поддерживается. ", "apline.containers.not.supported": "Контейнеры Alpine не поддерживаются.", "download.button": "Перейти к странице скачивания", - "native.binaries.mismatch.osx": "This 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": "Версия расширения для {0} не совместима с вашей ОС. Скачайте и установите версию расширения \"{1}\".", + "native.binaries.not.supported": "Версия расширения для {0} {1} несовместима с вашей ОС. Скачайте и установите версию расширения \"{2}\".", "extension.installation.failed": "Установить расширение C/C++ не удалось. Исправьте или переустановите расширение функций языка C/C++ для корректной работы.", "remove.extension": "Попытка исправления", "jason.files.missing": "Установить расширение C/C++ не удалось. Переустановите расширение функций языка C/C++ для корректной работы.", diff --git a/Extension/i18n/rus/src/nativeStrings.i18n.json b/Extension/i18n/rus/src/nativeStrings.i18n.json index 0169be5ef2..ebe23a6848 100644 --- a/Extension/i18n/rus/src/nativeStrings.i18n.json +++ b/Extension/i18n/rus/src/nativeStrings.i18n.json @@ -208,9 +208,9 @@ "unrecognized_language_standard_version": "Проба компилятора возвратила нераспознанную версию стандарта языка. Вместо этого будет использоваться последняя поддерживаемая версия.", "intellisense_process_crash_detected": "Обнаружен сбой процесса IntelliSense.", "return_values_label": "Возвращаемые значения:", - "nvcc_compiler_not_found": "Unable to locate nvcc compiler: {0}", - "nvcc_host_compiler_not_found": "Unable to locate nvcc host compiler: {0}", - "invoking_nvcc": "Invoking nvcc with command line: {0}", - "nvcc_host_compile_command_not_found": "Unable to find host compile command in output of nvcc.", - "unable_to_locate_forced_include": "Unable to locate forced include: {0}" + "nvcc_compiler_not_found": "Не удалось найти компилятор nvcc: {0}", + "nvcc_host_compiler_not_found": "Не удалось найти компилятор узла nvcc: {0}", + "invoking_nvcc": "Идет вызов nvcc с помощью командной строки: {0}", + "nvcc_host_compile_command_not_found": "Не удалось найти команду компиляции узла в выходных данных nvcc.", + "unable_to_locate_forced_include": "Не удалось найти принудительное включение: {0}" } \ No newline at end of file diff --git a/Extension/i18n/rus/src/packageManager.i18n.json b/Extension/i18n/rus/src/packageManager.i18n.json index 6bb6fed11c..29f40c7c4c 100644 --- a/Extension/i18n/rus/src/packageManager.i18n.json +++ b/Extension/i18n/rus/src/packageManager.i18n.json @@ -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}\" уже существует и не был обновлен." } \ No newline at end of file diff --git a/Extension/i18n/trk/package.i18n.json b/Extension/i18n/trk/package.i18n.json index e5fb9db885..ea4ab6b163 100644 --- a/Extension/i18n/trk/package.i18n.json +++ b/Extension/i18n/trk/package.i18n.json @@ -23,8 +23,8 @@ "c_cpp.command.vcpkgClipboardInstallSuggested.title": "vcpkg yükleme komutunu panoya kopyalayın", "c_cpp.command.vcpkgOnlineHelpSuggested.title": "vcpkg yardım sayfasını ziyaret edin", "c_cpp.command.generateEditorConfig.title": "VC Biçimi ayarlarından EditorConfig içerikleri oluştur", - "c_cpp.command.GoToNextDirectiveInGroup.title": "Go to next preprocessor directive in conditional group", - "c_cpp.command.GoToPrevDirectiveInGroup.title": "Go to previous preprocessor directive in conditional group", + "c_cpp.command.GoToNextDirectiveInGroup.title": "Koşullu grupta sonraki ön işlemci yönergesine git", + "c_cpp.command.GoToPrevDirectiveInGroup.title": "Koşullu grupta önceki ön işlemci yönergesine git", "c_cpp.configuration.formatting.description": "Biçimlendirme altyapısını yapılandırır", "c_cpp.configuration.formatting.clangFormat.description": "Kodu biçimlendirmek için clang-format kullanılacak.", "c_cpp.configuration.formatting.vcFormat.description": "Kodu biçimlendirmek için Visual C++ biçimlendirme altyapısı kullanılacak.", @@ -170,9 +170,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 +183,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": "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 artık otomatik olarak tırnak içine alınmaz. \r\nVarsayılan değer: '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 +208,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\".", diff --git a/Extension/i18n/trk/src/main.i18n.json b/Extension/i18n/trk/src/main.i18n.json index 3ad5324ca2..1e78f2d9ec 100644 --- a/Extension/i18n/trk/src/main.i18n.json +++ b/Extension/i18n/trk/src/main.i18n.json @@ -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": "This 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": "Uzantının bu {0} sürümü, işletim sisteminizle uyumsuz. Lütfen uzantının \"{1}\" sürümünü indirip yükleyin.", + "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.", diff --git a/Extension/i18n/trk/src/nativeStrings.i18n.json b/Extension/i18n/trk/src/nativeStrings.i18n.json index cbc3447326..ceb59046ca 100644 --- a/Extension/i18n/trk/src/nativeStrings.i18n.json +++ b/Extension/i18n/trk/src/nativeStrings.i18n.json @@ -208,9 +208,9 @@ "unrecognized_language_standard_version": "Derleyici sorgusu, tanınmayan bir dil standardı sürümü döndürdü. Bunun yerine desteklenen en güncel sürüm kullanılacak.", "intellisense_process_crash_detected": "IntelliSense işlem kilitlenmesi saptandı.", "return_values_label": "Dönüş değerleri:", - "nvcc_compiler_not_found": "Unable to locate nvcc compiler: {0}", - "nvcc_host_compiler_not_found": "Unable to locate nvcc host compiler: {0}", - "invoking_nvcc": "Invoking nvcc with command line: {0}", - "nvcc_host_compile_command_not_found": "Unable to find host compile command in output of nvcc.", - "unable_to_locate_forced_include": "Unable to locate forced include: {0}" + "nvcc_compiler_not_found": "Nvcc derleyicisi bulunamıyor: {0}", + "nvcc_host_compiler_not_found": "Nvcc konak derleyicisi bulunamıyor: {0}", + "invoking_nvcc": "Komut satırı ile nvcc çağrılıyor: {0}", + "nvcc_host_compile_command_not_found": "Nvcc çıkışındaki konak derleme komutu bulunamıyor.", + "unable_to_locate_forced_include": "Zorlamalı ekleme bulunamıyor: {0}" } \ No newline at end of file diff --git a/Extension/i18n/trk/src/packageManager.i18n.json b/Extension/i18n/trk/src/packageManager.i18n.json index 5e61061548..0a15fe3f47 100644 --- a/Extension/i18n/trk/src/packageManager.i18n.json +++ b/Extension/i18n/trk/src/packageManager.i18n.json @@ -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." } \ No newline at end of file diff --git a/Extension/package.json b/Extension/package.json index e2bc358872..d9208d90aa 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2,7 +2,7 @@ "name": "cpptools", "displayName": "C/C++", "description": "C/C++ IntelliSense, debugging, and code browsing.", - "version": "1.2.2-main", + "version": "1.4.0-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", @@ -1680,6 +1680,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 +2456,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 +2477,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,12 +2510,13 @@ "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": [ { "description": "C/C++ language components (Linux / x86_64)", - "url": "https://go.microsoft.com/fwlink/?linkid=2156408", + "url": "https://go.microsoft.com/fwlink/?linkid=2161011", "platforms": [ "linux" ], @@ -2503,11 +2527,11 @@ "./bin/cpptools", "./bin/cpptools-srv" ], - "integrity": "81740FC42FDFBEC9AF72EE69B6FC985841E8879DE7197D1859B339BE0418E2C2" + "integrity": "7C43AA78021C5DB8F6DE9751EC8435D2BE1137CAC861801CDFADAA4B48A42AC3" }, { "description": "C/C++ language components (Linux / armhf)", - "url": "https://go.microsoft.com/fwlink/?linkid=2156409", + "url": "https://go.microsoft.com/fwlink/?linkid=2160914", "platforms": [ "linux" ], @@ -2518,11 +2542,11 @@ "./bin/cpptools", "./bin/cpptools-srv" ], - "integrity": "E12B49A74D9E6D7D43BE7ED88E470B8871E1750392D48B0FCFEED4C7E5C523FB" + "integrity": "ED83E6E0F5784323CDF42BA1EF57CDFFBF2A81D468B08C8ECF126A2D042343F2" }, { "description": "C/C++ language components (Linux / aarch64)", - "url": "https://go.microsoft.com/fwlink/?linkid=2156407", + "url": "https://go.microsoft.com/fwlink/?linkid=2160915", "platforms": [ "linux" ], @@ -2533,23 +2557,41 @@ "./bin/cpptools", "./bin/cpptools-srv" ], - "integrity": "F84424B48790EAE110F0B4ED35D8DEE2347754C79C9A1879BCE5A93038A249A3" + "integrity": "52DD114FF466FA3542D7F98F12716E4296712986CA4908B18DCC039209B8D2CC" }, { "description": "C/C++ language components (OS X)", - "url": "https://go.microsoft.com/fwlink/?linkid=2156301", + "url": "https://go.microsoft.com/fwlink/?linkid=2161012", "platforms": [ "darwin" ], + "architectures": [ + "x64" + ], "binaries": [ "./bin/cpptools", "./bin/cpptools-srv" ], - "integrity": "448A17E1D7C639C99F0AE47A88705956BA03F8CFA401C0C00CD074945275B513" + "integrity": "53654F3D21C5D470D3C05EA48CFB7AB3CB197344049DC55AEB07374AFECD1587" + }, + { + "description": "C/C++ language components (OS X ARM64)", + "url": "https://go.microsoft.com/fwlink/?linkid=2160918", + "platforms": [ + "darwin" + ], + "architectures": [ + "arm64" + ], + "binaries": [ + "./bin/cpptools", + "./bin/cpptools-srv" + ], + "integrity": "E00370987D321E5AB58894B95F1545B52F59ED8E548BE1CBC8393F8B63562BDE" }, { "description": "C/C++ language components (Windows)", - "url": "https://go.microsoft.com/fwlink/?linkid=2156410", + "url": "https://go.microsoft.com/fwlink/?linkid=2160913", "platforms": [ "win32" ], @@ -2561,11 +2603,11 @@ "./bin/cpptools.exe", "./bin/cpptools-srv.exe" ], - "integrity": "39B7EA69F9CDC1B2B98DBFD189617640029E6C9CBDFE9BF6789B4E013D6550F4" + "integrity": "970504DB40E0B54E48075C1FBCE0F34AB674DE3F1CCAD51FFA04689513CC8013" }, { "description": "C/C++ language components (Windows ARM64)", - "url": "https://go.microsoft.com/fwlink/?linkid=2156502", + "url": "https://go.microsoft.com/fwlink/?linkid=2160916", "platforms": [ "win32" ], @@ -2576,11 +2618,11 @@ "./bin/cpptools.exe", "./bin/cpptools-srv.exe" ], - "integrity": "30B836279F948CDFD751546E679F459FE2CFD7BD578952AF1A1D8943D5C4A0F6" + "integrity": "E85CF0C80B64F940F73E158966749C0A95D122907170CACECDCBB118986D0E57" }, { "description": "ClangFormat (Linux / x86_64)", - "url": "https://go.microsoft.com/fwlink/?LinkID=2152861", + "url": "https://go.microsoft.com/fwlink/?LinkID=2162325", "platforms": [ "linux" ], @@ -2590,11 +2632,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" ], @@ -2604,11 +2646,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" ], @@ -2618,22 +2660,39 @@ "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" ], + "architectures": [ + "x64" + ], + "binaries": [ + "./LLVM/bin/clang-format.darwin" + ], + "integrity": "62A2ECB43511129F920D87BAE9230A803B54712038BCCB485F8F10B84B1A2000" + }, + { + "description": "ClangFormat (OS X arm64)", + "url": "https://go.microsoft.com/fwlink/?LinkID=2162413", + "platforms": [ + "darwin" + ], + "architectures": [ + "arm64" + ], "binaries": [ "./LLVM/bin/clang-format.darwin" ], - "integrity": "7AA436BA25E3404DC658A137188BEC65FF2532D1FEB314ABBBC5EBC9AAF5CCF7" + "integrity": "90AD3B05EC9C0A706C440B99AC39000F97EFE8BBAB9A000834E18F8112468147" }, { "description": "ClangFormat (Windows x86)", - "url": "https://go.microsoft.com/fwlink/?LinkID=2152921", + "url": "https://go.microsoft.com/fwlink/?LinkID=2162326", "platforms": [ "win32" ], @@ -2643,11 +2702,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" ], @@ -2657,11 +2716,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" ], @@ -2671,7 +2730,7 @@ "binaries": [ "./LLVM/bin/clang-format.exe" ], - "integrity": "9944827F70A8C53127B1A7860401923DED2DB7FBAD75E7A8106636891C11F832" + "integrity": "6756365C82B5BD90C6A40C13CF8E3599E4A1DB50628111FFDB3A76FF85256BA4" }, { "description": "Mono Framework Assemblies", @@ -2767,7 +2826,7 @@ }, { "description": "Visual Studio Windows Debugger", - "url": "https://go.microsoft.com/fwlink/?linkid=2153010", + "url": "https://go.microsoft.com/fwlink/?linkid=2162486", "platforms": [ "win32" ], @@ -2778,7 +2837,7 @@ "binaries": [ "./debugAdapters/vsdbg/bin/vsdbg.exe" ], - "integrity": "52C4234976D527A7BF02EB2E8844F3C605DC4BD1D3847F83C8675CD23967BAB3" + "integrity": "E5046509D510086B99F171595114220AD8E9F820E7238B6A5199CD78B9AD2078" } ] -} \ No newline at end of file +} diff --git a/Extension/package.nls.json b/Extension/package.nls.json index e65c5588bc..24ea39dd14 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -178,7 +178,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 +203,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 +235,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", diff --git a/Extension/src/Debugger/attachQuickPick.ts b/Extension/src/Debugger/attachQuickPick.ts index ba966b7ace..677e87bb9a 100644 --- a/Extension/src/Debugger/attachQuickPick.ts +++ b/Extension/src/Debugger/attachQuickPick.ts @@ -30,44 +30,42 @@ export interface AttachItem extends vscode.QuickPickItem { id?: string; } -export function showQuickPick(getAttachItems: () => Promise): Promise { - return getAttachItems().then(processEntries => - new Promise((resolve, reject) => { - const quickPick: vscode.QuickPick = vscode.window.createQuickPick(); - 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()]; - - 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."))); - } +// We should not await on this function. +export async function showQuickPick(getAttachItems: () => Promise): Promise { + const processEntries: AttachItem[] = await getAttachItems(); + return new Promise((resolve, reject) => { + const quickPick: vscode.QuickPick = vscode.window.createQuickPick(); + 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[] = []; + + 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."))); + } - const selectedId: string | undefined = quickPick.selectedItems[0].id; + const selectedId: string | undefined = quickPick.selectedItems[0].id; - disposables.forEach(item => item.dispose()); - quickPick.dispose(); + disposables.forEach(item => item.dispose()); + quickPick.dispose(); - resolve(selectedId); - }, undefined, disposables); + resolve(selectedId); + }, undefined, disposables); - quickPick.onDidHide(() => { - disposables.forEach(item => item.dispose()); - quickPick.dispose(); + quickPick.onDidHide(() => { + disposables.forEach(item => item.dispose()); + quickPick.dispose(); - reject(new Error(localize("process.not.selected", "Process not selected."))); - }, undefined, disposables); + reject(new Error(localize("process.not.selected", "Process not selected."))); + }, undefined, disposables); - quickPick.show(); - })); + quickPick.show(); + }); } diff --git a/Extension/src/Debugger/attachToProcess.ts b/Extension/src/Debugger/attachToProcess.ts index aaca23a63c..0d827c049e 100644 --- a/Extension/src/Debugger/attachToProcess.ts +++ b/Extension/src/Debugger/attachToProcess.ts @@ -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 { - 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 { + 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 { - return util.isExtensionReady().then(ready => { - if (!ready) { - util.displayExtensionNotReadyPrompt(); - } else { - this._channel.clear(); + public async ShowAttachEntries(config: any): Promise { + 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(new Error(localize("no.pipetransport", "Chosen debug configuration does not contain {0}", "pipeTransport"))); - } + if (!pipeTransport) { + throw new Error(localize("no.pipetransport", "Chosen debug configuration does not contain {0}", "pipeTransport")); + } - let pipeProgram: string | undefined; + 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]; + 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 (!fs.existsSync(config.pipeTransport.pipeProgram)) { - pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(pipeProgramStr, expectedArch); - } + // 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 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 (!await util.checkFileExists(newPipeProgramStr)) { + pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(newPipeProgramStr, expectedArch); } } + } - if (!pipeProgram) { - pipeProgram = pipeTransport.pipeProgram; - } + if (!pipeProgram) { + pipeProgram = pipeTransport.pipeProgram; + } - const pipeArgs: string[] = pipeTransport.pipeArgs; + const pipeArgs: string[] = pipeTransport.pipeArgs; - const argList: string = RemoteAttachPicker.createArgumentList(pipeArgs); + const argList: string = RemoteAttachPicker.createArgumentList(pipeArgs); - const pipeCmd: string = `"${pipeProgram}" ${argList}`; + 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") - }; + 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") + }; - return vscode.window.showQuickPick(processes, attachPickOptions) - .then(item => item ? item.id : Promise.reject(new Error(localize("process.not.selected", "Process not selected.")))); - }); + 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 { + private async getRemoteOSAndProcesses(pipeCmd: string): Promise { // 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 (remoteOS !== "Linux" && remoteOS !== "Darwin") { + throw new Error(`Operating system "${remoteOS}" not supported.`); + } - if (lines.length === 0) { - return Promise.reject(new Error(localize("pipe.failed", "Pipe transport failed to get OS and processes."))); + // 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(new Error(`Operating system "${remoteOS}" not supported.`)); - } - - // Only got OS from uname - if (lines.length === 1) { - return Promise.reject(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 { diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 08a34c8ef5..90b70ff6df 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -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(resolve => { if (platform === "darwin") { diff --git a/Extension/src/Debugger/configurations.ts b/Extension/src/Debugger/configurations.ts index 5f809cb446..38fde7e595 100644 --- a/Extension/src/Debugger/configurations.ts +++ b/Extension/src/Debugger/configurations.ts @@ -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"` } `; diff --git a/Extension/src/Debugger/debugAdapterDescriptorFactory.ts b/Extension/src/Debugger/debugAdapterDescriptorFactory.ts index f0a0dff3ea..e40b0a64c1 100644 --- a/Extension/src/Debugger/debugAdapterDescriptorFactory.ts +++ b/Extension/src/Debugger/debugAdapterDescriptorFactory.ts @@ -33,21 +33,19 @@ export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDes super(context); } - createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): vscode.ProviderResult { - 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 { + 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 { + async createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): Promise { 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); + } } } } diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index 012c1d2563..02f00416e9 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -76,55 +76,55 @@ export function initialize(context: vscode.ExtensionContext): void { const items: MenuItem[] = configs.map(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. - } - 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; - } + 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.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(); + } + 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); } - } 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; + 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; } + } - // 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(); diff --git a/Extension/src/Debugger/nativeAttach.ts b/Extension/src/Debugger/nativeAttach.ts index 0180dbbd11..b4ee1aec1d 100644 --- a/Extension/src/Debugger/nativeAttach.ts +++ b/Extension/src/Debugger/nativeAttach.ts @@ -38,30 +38,29 @@ export class NativeAttachItemsProviderFactory { abstract class NativeAttachItemsProvider implements AttachItemsProvider { protected abstract getInternalProcessEntries(): Promise; - getAttachItems(): Promise { - 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 { + 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 { + protected async getInternalProcessEntries(): Promise { 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(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 { + protected async getInternalProcessEntries(): Promise { 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); } } diff --git a/Extension/src/LanguageServer/Providers/documentFormattingEditProvider.ts b/Extension/src/LanguageServer/Providers/documentFormattingEditProvider.ts index 077b7f1a6f..d17c3c0268 100644 --- a/Extension/src/LanguageServer/Providers/documentFormattingEditProvider.ts +++ b/Extension/src/LanguageServer/Providers/documentFormattingEditProvider.ts @@ -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 { - return new Promise((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 { + 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); + } + } } } diff --git a/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts b/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts index 786db25817..3e034732f5 100644 --- a/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts +++ b/Extension/src/LanguageServer/Providers/documentRangeFormattingEditProvider.ts @@ -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 { - return new Promise((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 { + 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); + } + } }; } diff --git a/Extension/src/LanguageServer/Providers/documentSymbolProvider.ts b/Extension/src/LanguageServer/Providers/documentSymbolProvider.ts index df70afd923..7fd2488cab 100644 --- a/Extension/src/LanguageServer/Providers/documentSymbolProvider.ts +++ b/Extension/src/LanguageServer/Providers/documentSymbolProvider.ts @@ -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; }); } } diff --git a/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts b/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts index 019faffb40..e4dc81ab21 100644 --- a/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts +++ b/Extension/src/LanguageServer/Providers/findAllReferencesProvider.ts @@ -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 { return new Promise((resolve, reject) => { - const callback: () => void = () => { + const callback: () => Promise = 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[] = []; + 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); - 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(); - } + if (DefaultClient.referencesPendingCancellations.length > 0) { + while (DefaultClient.referencesPendingCancellations.length > 1) { const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0]; DefaultClient.referencesPendingCancellations.pop(); - pendingCancel.callback(); + pendingCancel.reject(); } - }; - if (!workspaceReferences.referencesRefreshPending) { - workspaceReferences.setResultsCallback(resultCallback); - workspaceReferences.startFindAllReferences(params); + 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 { - // 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); - } + // 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(); diff --git a/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts b/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts index e79a996644..49d0286bc8 100644 --- a/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts +++ b/Extension/src/LanguageServer/Providers/foldingRangeProvider.ts @@ -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 { const id: number = ++DefaultClient.abortRequestId; const params: GetFoldingRangesParams = { id: id, uri: document.uri.toString() }; - return new Promise((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 { diff --git a/Extension/src/LanguageServer/Providers/onTypeFormattingEditProvider.ts b/Extension/src/LanguageServer/Providers/onTypeFormattingEditProvider.ts index 381796c34c..3466b07c1b 100644 --- a/Extension/src/LanguageServer/Providers/onTypeFormattingEditProvider.ts +++ b/Extension/src/LanguageServer/Providers/onTypeFormattingEditProvider.ts @@ -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 { - return new Promise((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 { + 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); + } + } } } diff --git a/Extension/src/LanguageServer/Providers/renameProvider.ts b/Extension/src/LanguageServer/Providers/renameProvider.ts index 6a62ce6ddd..661531b10b 100644 --- a/Extension/src/LanguageServer/Providers/renameProvider.ts +++ b/Extension/src/LanguageServer/Providers/renameProvider.ts @@ -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((resolve, reject) => { - const callback: () => void = () => { + const callback: () => Promise = 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(); } - 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.")); + const pendingCancel: ReferencesCancellationState = DefaultClient.referencesPendingCancellations[0]; + DefaultClient.referencesPendingCancellations.pop(); + pendingCancel.callback(); + } else { + if (DefaultClient.renameRequestsPending === 0) { + DefaultClient.renamePending = false; } - resolve(workspaceEdit); - }); - workspaceReferences.startRename(params); + // 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 (DefaultClient.referencesRequestPending || workspaceReferences.symbolSearchInProgress) { diff --git a/Extension/src/LanguageServer/Providers/semanticTokensProvider.ts b/Extension/src/LanguageServer/Providers/semanticTokensProvider.ts index 0f142f811c..b964078003 100644 --- a/Extension/src/LanguageServer/Providers/semanticTokensProvider.ts +++ b/Extension/src/LanguageServer/Providers/semanticTokensProvider.ts @@ -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 { - return new Promise((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 { diff --git a/Extension/src/LanguageServer/Providers/workspaceSymbolProvider.ts b/Extension/src/LanguageServer/Providers/workspaceSymbolProvider.ts index 31fa30680a..b2b8666946 100644 --- a/Extension/src/LanguageServer/Providers/workspaceSymbolProvider.ts +++ b/Extension/src/LanguageServer/Providers/workspaceSymbolProvider.ts @@ -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; } } diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 2a952df3c7..9146c827e3 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -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; getKnownCompilers(): Thenable; takeOwnership(document: vscode.TextDocument): void; - queueTask(task: () => Thenable): Thenable; + queueTask(task: () => Thenable): Promise; requestWhenReady(request: () => Thenable): Thenable; - notifyWhenReady(notify: () => void): void; + notifyWhenLanguageClientReady(notify: () => void): void; + awaitUntilLanguageClientReady(): void; requestSwitchHeaderSource(rootPath: string, fileName: string): Thenable; activeDocumentChanged(document: vscode.TextDocument): void; activate(): void; @@ -587,15 +592,15 @@ export interface Client { deactivate(): void; pauseParsing(): void; resumeParsing(): void; - handleConfigurationSelectCommand(): void; - handleConfigurationProviderSelectCommand(): void; - handleShowParsingCommands(): void; + handleConfigurationSelectCommand(): Promise; + handleConfigurationProviderSelectCommand(): Promise; + handleShowParsingCommands(): Promise; handleReferencesIcon(): void; handleConfigurationEditCommand(): void; handleConfigurationEditJSONCommand(): void; handleConfigurationEditUICommand(): void; handleAddToIncludePathCommand(path: string): void; - handleGoToDirectiveInGroup(next: boolean): void; + handleGoToDirectiveInGroup(next: boolean): Promise; onInterval(): void; dispose(): void; addFileAssociations(fileAssociations: string, languageId: string): void; @@ -709,7 +714,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(request) - * @see notifyWhenReady(notify) + * @see notifyWhenLanguageClientReady(notify) + * @see awaitUntilLanguageClientReady() */ constructor(allClients: ClientCollection, workspaceFolder?: vscode.WorkspaceFolder) { @@ -749,8 +755,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 +776,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 +793,24 @@ export class DefaultClient implements Client { uri: document.uri.toString() }; - return this.client.languageClient.sendRequest(GetCodeActionsRequest, params) - .then((commands) => { - 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); - }); - - return resultCodeActions; - }); + 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); + }); + + return resultCodeActions; }); } } @@ -833,50 +838,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; - - // 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.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); - } + const inputCompilerDefaults: configs.CompilerDefaults = await languageClient.sendRequest(QueryCompilerDefaultsRequest, {}); + compilerDefaults = inputCompilerDefaults; + this.configuration.CompilerDefaults = compilerDefaults; - // Listen for messages from the language server. - this.registerNotifications(); - }); + // 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.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 +1341,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 +1349,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 +1471,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 +1489,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 +1515,7 @@ export class DefaultClient implements Client { } return false; }); - }, - () => ask.Value = false); + }, () => ask.Value = false); } } else if (isSameProviderExtensionId(selectedProvider, provider.extensionId)) { onRegistered(); @@ -1528,7 +1528,7 @@ export class DefaultClient implements Client { } public updateCustomConfigurations(requestingProvider?: CustomConfigurationProvider1): Thenable { - return this.notifyWhenReady(() => { + return this.notifyWhenLanguageClientReady(() => { if (!this.configurationProvider) { this.clearCustomConfigurations(); return; @@ -1550,8 +1550,8 @@ export class DefaultClient implements Client { }); } - public updateCustomBrowseConfiguration(requestingProvider?: CustomConfigurationProvider1): Thenable { - return this.notifyWhenReady(() => { + public updateCustomBrowseConfiguration(requestingProvider?: CustomConfigurationProvider1): Promise { + return this.notifyWhenLanguageClientReady(() => { if (!this.configurationProvider) { return; } @@ -1671,7 +1671,7 @@ export class DefaultClient implements Client { } public async rescanFolder(): Promise { - await this.notifyWhenReady(() => this.languageClient.sendNotification(RescanFolderNotification)); + await this.notifyWhenLanguageClientReady(() => this.languageClient.sendNotification(RescanFolderNotification)); } public async provideCustomConfiguration(docUri: vscode.Uri, requestFile?: string): Promise { @@ -1683,16 +1683,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 +1708,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 +1734,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})`; - } + 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; - } + vscode.window.showInformationMessage(message, dismiss, disable).then(response => { + switch (response) { + case disable: { + settings.toggleSetting("configurationWarnings", "Enabled", "Disabled"); + break; } - }); - } - }); + } + }); + } + } }); } @@ -1841,7 +1840,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 +1849,9 @@ export class DefaultClient implements Client { * before attempting to send messages or operate on the client. */ - public queueTask(task: () => Thenable): Thenable { + public async queueTask(task: () => Thenable): Promise { if (this.isSupported) { - const nextTask: () => Thenable = async () => { + const nextTask: () => Promise = async () => { try { return await task(); } catch (err) { @@ -1860,16 +1859,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 +1878,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(task: () => Thenable): Thenable { + private async queueBlockingTask(task: () => Thenable): Promise { if (this.isSupported) { pendingTask = new util.BlockingTask(task, pendingTask); return pendingTask.getPromise(); } else { - return Promise.reject(localize("unsupported.client", "Unsupported client")); + throw new Error (localize("unsupported.client", "Unsupported client")); } } - private callTaskWithTimeout(task: () => Thenable, ms: number, cancelToken?: vscode.CancellationTokenSource): Thenable { + private callTaskWithTimeout(task: () => Thenable, ms: number, cancelToken?: vscode.CancellationTokenSource): Promise { let timer: NodeJS.Timer; // Create a promise that rejects in milliseconds const timeout: () => Promise = () => new Promise((resolve, reject) => { @@ -1916,13 +1916,20 @@ export class DefaultClient implements Client { return this.queueTask(request); } - public notifyWhenReady(notify: () => T): Thenable { - const task: () => Thenable = () => new Promise(resolve => { + public notifyWhenLanguageClientReady(notify: () => T): Promise { + const task: () => Promise = () => new Promise(resolve => { resolve(notify()); }); return this.queueTask(task); } + public awaitUntilLanguageClientReady(): Thenable { + const task: () => Thenable = () => new Promise(resolve => { + resolve(); + }); + return this.queueTask(task); + } + /** * listen for notifications from the language server. */ @@ -2116,30 +2123,29 @@ export class DefaultClient implements Client { if (!client.configuration.CurrentConfiguration?.configurationProvider) { const showIntelliSenseFallbackMessage: PersistentState = new PersistentState("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 +2155,7 @@ export class DefaultClient implements Client { } return true; }); - }, - () => showIntelliSenseFallbackMessage.Value = false); + }, () => showIntelliSenseFallbackMessage.Value = false); } } } @@ -2241,7 +2246,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 +2290,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 +2304,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 +2321,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 +2386,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 +2402,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 +2459,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 +2516,7 @@ export class DefaultClient implements Client { sanitized = {...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 +2565,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 +2573,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 { + 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 { + 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 { + 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)); + this.notifyWhenLanguageClientReady(() => this.configuration.handleConfigurationEditCommand(undefined, vscode.window.showTextDocument)); } public handleConfigurationEditJSONCommand(): void { - this.notifyWhenReady(() => this.configuration.handleConfigurationEditJSONCommand(undefined, vscode.window.showTextDocument)); + this.notifyWhenLanguageClientReady(() => this.configuration.handleConfigurationEditJSONCommand(undefined, vscode.window.showTextDocument)); } public handleConfigurationEditUICommand(): void { - this.notifyWhenReady(() => this.configuration.handleConfigurationEditUICommand(undefined, vscode.window.showTextDocument)); + this.notifyWhenLanguageClientReady(() => this.configuration.handleConfigurationEditUICommand(undefined, vscode.window.showTextDocument)); } 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 { const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; if (editor) { const params: GoToDirectiveInGroupParams = { @@ -2651,26 +2645,24 @@ 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); - - // 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); - } - } - }); + 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); + } + } } } 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 +2701,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 +2807,10 @@ class NullClient implements Client { getCurrentCompilerPathAndArgs(): Thenable { return Promise.resolve(undefined); } getKnownCompilers(): Thenable { return Promise.resolve([]); } takeOwnership(document: vscode.TextDocument): void {} - queueTask(task: () => Thenable): Thenable { return task(); } + queueTask(task: () => Thenable): Promise { return Promise.resolve(task()); } requestWhenReady(request: () => Thenable): Thenable { return request(); } - notifyWhenReady(notify: () => void): void {} + notifyWhenLanguageClientReady(notify: () => void): void {} + awaitUntilLanguageClientReady(): void {} requestSwitchHeaderSource(rootPath: string, fileName: string): Thenable { return Promise.resolve(""); } activeDocumentChanged(document: vscode.TextDocument): void {} activate(): void {} @@ -2826,15 +2819,15 @@ class NullClient implements Client { deactivate(): void {} pauseParsing(): void {} resumeParsing(): void {} - handleConfigurationSelectCommand(): void {} - handleConfigurationProviderSelectCommand(): void {} - handleShowParsingCommands(): void {} + handleConfigurationSelectCommand(): Promise { return Promise.resolve(); } + handleConfigurationProviderSelectCommand(): Promise { return Promise.resolve(); } + handleShowParsingCommands(): Promise { return Promise.resolve(); } handleReferencesIcon(): void {} handleConfigurationEditCommand(): void {} handleConfigurationEditJSONCommand(): void {} handleConfigurationEditUICommand(): void {} handleAddToIncludePathCommand(path: string): void { } - handleGoToDirectiveInGroup(next: boolean): void {} + handleGoToDirectiveInGroup(next: boolean): Promise { return Promise.resolve(); } onInterval(): void {} dispose(): void { this.booleanEvent.dispose(); diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index 83ac2578a1..2323946bc6 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -436,9 +436,13 @@ export class CppProperties { private async readNodeAddonIncludeLocations(rootPath: string): Promise { 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); - } + if (dep in packageJson.dependencies) { + try { + let stdout: string | void = await util.execChildProcess(execCmd, rootPath); + 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); + // 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)) { - error = new Error(`${dep} directory ${stdout} doesn't exist`); - 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); + if (stdout) { + this.nodeAddonIncludes.push(stdout); + } + } catch (err) { + console.log('readNodeAddonIncludeLocations', err.message); } } } @@ -918,21 +924,19 @@ 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 handleConfigurationEditJSONCommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument) => void): void { - this.ensurePropertiesFile().then(() => { - console.assert(this.propertiesFile); - if (onBeforeOpen) { - onBeforeOpen(); - } - // Directly open the json file - if (this.propertiesFile) { - vscode.workspace.openTextDocument(this.propertiesFile).then((document: vscode.TextDocument) => { - if (showDocument) { - showDocument(document); - } - }); + public async handleConfigurationEditJSONCommand(onBeforeOpen: (() => void) | undefined, showDocument: (document: vscode.TextDocument) => void): Promise { + 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); } - }); + } } private ensureSettingsPanelInitlialized(): void { @@ -949,58 +953,55 @@ 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) => void): Promise { + 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)); } - } 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); } } - }); + } } - private onSettingsPanelActivated(): void { + private async onSettingsPanelActivated(): Promise { 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; } + 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); } } - }); + } } } @@ -1078,11 +1079,11 @@ export class CppProperties { } private async ensurePropertiesFile(): Promise { - 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.checkFileExists(this.configFolder)) { fs.mkdirSync(this.configFolder); } @@ -1583,6 +1584,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 +1599,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 +1612,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 = new Set(); + // 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 +1665,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 +1675,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 +1705,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 +1715,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++; } } diff --git a/Extension/src/LanguageServer/cppBuildTaskProvider.ts b/Extension/src/LanguageServer/cppBuildTaskProvider.ts index ff50d8089d..64532a4364 100644 --- a/Extension/src/LanguageServer/cppBuildTaskProvider.ts +++ b/Extension/src/LanguageServer/cppBuildTaskProvider.ts @@ -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, @@ -194,7 +194,7 @@ export class CppBuildTaskProvider implements TaskProvider { } } - const scope: TaskScope = TaskScope.Workspace; + const scope: WorkspaceFolder | TaskScope = folder ? folder : TaskScope.Workspace; const task: CppBuildTask = new Task(definition, scope, definition.label, CppBuildTaskProvider.CppBuildSourceStr, new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise => // When the task is executed, this callback will run. Here, we setup for running the task. diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 52a597f055..a1c05fe381 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -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
-> [] -let vcpkgDbPromise: Promise; -function initVcpkgDatabase(): Promise { +type VcpkgDatabase = { [key: string]: string[] }; // Stored as
-> [] +let vcpkgDbPromise: Promise; +function initVcpkgDatabase(): Promise { 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 { 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 { 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 { +async function installVsix(vsixLocation: string): Promise { 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 { // 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 { '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 { 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 { @@ -782,7 +782,7 @@ export function registerCommands(): void { getTemporaryCommandRegistrarInstance().executeDelayedCommands(); } -function onSwitchHeaderSource(): void { +async function onSwitchHeaderSource(): Promise { onActivationEvent(); const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; if (!activeEditor || !activeEditor.document) { @@ -800,53 +800,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 { +async function selectClient(): Promise { 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(localize("client.not.found", "client not found")); - }); + } + throw new Error(localize("client.not.found", "client not found")); } } diff --git a/Extension/src/LanguageServer/protocolFilter.ts b/Extension/src/LanguageServer/protocolFilter.ts index eee0cb54ec..687733e61d 100644 --- a/Extension/src/LanguageServer/protocolFilter.ts +++ b/Extension/src/LanguageServer/protocolFilter.ts @@ -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(() => callback(a, b)); const invoke3 = (a: any, b: any, c: any, callback: (a: any, b: any, c: any) => any) => clients.ActiveClient.requestWhenReady(() => 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)); } }, diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index e3fd42451f..89f2cd5f03 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -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 { + 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); } diff --git a/Extension/src/LanguageServer/ui.ts b/Extension/src/LanguageServer/ui.ts index 9aa16af1d8..383040370d 100644 --- a/Extension/src/LanguageServer/ui.ts +++ b/Extension/src/LanguageServer/ui.ts @@ -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; + private curConfigurationStatus?: Promise; 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 { + public async showConfigurations(configurationNames: string[]): Promise { 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 { + public async showConfigurationProviders(currentProvider?: string): Promise { 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 { + public async showCompileCommands(paths: string[]): Promise { 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 { + public async showWorkspaces(workspaceNames: { name: string; key: string }[]): Promise { 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 { + public async showParsingCommands(): Promise { 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, onSkip: () => void): void { + public showConfigureIncludePathMessage(prompt: () => Promise, onSkip: () => void): void { setTimeout(() => { this.showConfigurationPrompt(ConfigurationPriority.IncludePath, prompt, onSkip); }, 10000); } - public showConfigureCompileCommandsMessage(prompt: () => Thenable, onSkip: () => void): void { + public showConfigureCompileCommandsMessage(prompt: () => Promise, onSkip: () => void): void { setTimeout(() => { this.showConfigurationPrompt(ConfigurationPriority.CompileCommands, prompt, onSkip); }, 5000); } - public showConfigureCustomProviderMessage(prompt: () => Thenable, onSkip: () => void): void { + public showConfigureCustomProviderMessage(prompt: () => Promise, onSkip: () => void): void { this.showConfigurationPrompt(ConfigurationPriority.CustomProvider, prompt, onSkip); } private showConfigurationPrompt(priority: ConfigurationPriority, prompt: () => Thenable, onSkip: () => void): void { - const showPrompt: () => Thenable = async () => { + const showPrompt: () => Promise = 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(); } } diff --git a/Extension/src/abTesting.ts b/Extension/src/abTesting.ts index 95052c8dc8..74a2d202c9 100644 --- a/Extension/src/abTesting.ts +++ b/Extension/src/abTesting.ts @@ -99,21 +99,20 @@ export class ABTestSettings { } } - private downloadCpptoolsJsonPkgAsync(): Promise { + private async downloadCpptoolsJsonPkgAsync(): Promise { 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); } } diff --git a/Extension/src/common.ts b/Extension/src/common.ts index f906154dcc..6cd186eff6 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -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 { return new Promise((resolve) => { @@ -727,33 +753,29 @@ export function isExecutable(file: string): Promise { }); } -export function allowExecution(file: string): Promise { - return new Promise((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 { + 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 { + return new Promise((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 { const langs: string[] = await vscode.languages.getLanguages(); supportCuda = langs.findIndex((s) => s === "cuda-cpp") !== -1; } + +// Sequentially Resolve Promises. +export function sequentialResolve(items: T[], promiseBuilder: (item: T) => Promise): Promise { + return items.reduce(async (previousPromise, nextItem) => { + await previousPromise; + return promiseBuilder(nextItem); + }, Promise.resolve()); +} diff --git a/Extension/src/githubAPI.ts b/Extension/src/githubAPI.ts index 0ae6cd1a9a..321c0262e4 100644 --- a/Extension/src/githubAPI.ts +++ b/Extension/src/githubAPI.ts @@ -159,42 +159,35 @@ export interface BuildInfo { * does not need to update, resolves to undefined. */ export async function getTargetBuildInfo(updateChannel: string, isFromSettingsChange: boolean): Promise { - 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 { 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 { 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'); + } } } diff --git a/Extension/src/logger.ts b/Extension/src/logger.ts index 7ca31552c7..a6a2f1dffd 100644 --- a/Extension/src/logger.ts +++ b/Extension/src/logger.ts @@ -34,6 +34,7 @@ export class Logger { } } + // We should not await on this function. public showInformationMessage(message: string, items?: string[]): Thenable { 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 { 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 { this.appendLine(message); diff --git a/Extension/src/main.ts b/Extension/src/main.ts index ee47ecec3f..fb7cf91cbd 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -37,10 +37,10 @@ export async function activate(context: vscode.ExtensionContext): Promise = new PersistentState("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 { - 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 { // 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.checkFileExists(lldbMiFolderPath)) { forceOnlineInstall = true; @@ -298,7 +285,7 @@ function invalidPackageVersion(pkg: IPackage, info: PlatformInformation): boolea !VersionsMatch(pkg, info); } -function makeOfflineBinariesExecutable(info: PlatformInformation): Promise { +async function makeOfflineBinariesExecutable(info: PlatformInformation): Promise { const promises: Thenable[] = []; const packages: IPackage[] = util.packageJson["runtimeDependencies"]; packages.forEach(p => { @@ -307,10 +294,10 @@ function makeOfflineBinariesExecutable(info: PlatformInformation): Promise 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 { +async function cleanUpUnusedBinaries(info: PlatformInformation): Promise { const promises: Thenable[] = []; const packages: IPackage[] = util.packageJson["runtimeDependencies"]; const logger: Logger = getOutputChannelLogger(); @@ -327,7 +314,7 @@ function cleanUpUnusedBinaries(info: PlatformInformation): Promise { }); } }); - return Promise.all(promises).then(() => { }); + await Promise.all(promises); } function removeUnnecessaryFile(): Promise { @@ -428,7 +415,7 @@ async function postInstall(info: PlatformInformation): Promise { // If there is a download failure, we shouldn't continue activating the extension in some broken state. if (!installSuccess) { - return Promise.reject(""); + 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); diff --git a/Extension/src/packageManager.ts b/Extension/src/packageManager.ts index 5657e29377..f94370bb1c 100644 --- a/Extension/src/packageManager.ts +++ b/Extension/src/packageManager.ts @@ -104,30 +104,25 @@ export class PackageManager { tmp.setGracefulCleanup(); } - public DownloadPackages(progress: vscode.Progress<{ message?: string; increment?: number }>): Promise { - return this.GetPackages() - .then((packages) => { - let count: number = 1; - return this.BuildPromiseChain(packages, (pkg): Promise => { - const p: Promise = 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 { + const packages: IPackage[] = await this.GetPackages(); + let count: number = 1; + return util.sequentialResolve(packages, async (pkg): Promise => { + 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 { - return this.GetPackages() - .then((packages) => { - let count: number = 1; - return this.BuildPromiseChain(packages, (pkg): Promise => { - const p: Promise = 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 { + const packages: IPackage[] = await this.GetPackages(); + let count: number = 1; + return util.sequentialResolve(packages, async (pkg): Promise => { + 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 { - 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(items: TItem[], promiseBuilder: (item: TItem) => Promise): Promise { - let promiseChain: Promise = Promise.resolve(null); - - for (const item of items) { - promiseChain = promiseChain.then(() => promiseBuilder(item)); - } - - return promiseChain; + public async GetPackages(): Promise { + 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 { @@ -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 diff --git a/Extension/src/platform.ts b/Extension/src/platform.ts index a97d683236..48915c0ca1 100644 --- a/Extension/src/platform.ts +++ b/Extension/src/platform.ts @@ -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 { + public static async GetPlatformInformation(): Promise { const platform: string = os.platform(); const architecture: string = PlatformInformation.GetArchitecture(); - let distributionPromise: Promise = Promise.resolve(undefined); - let versionPromise: Promise = Promise.resolve(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 { diff --git a/Extension/tools/OptionsSchema.json b/Extension/tools/OptionsSchema.json index 8b4290e74f..b2926f19a0 100644 --- a/Extension/tools/OptionsSchema.json +++ b/Extension/tools/OptionsSchema.json @@ -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": {} } } }, diff --git a/Extension/translations_auto_pr.js b/Extension/translations_auto_pr.js index 3dc53ca466..11b78438da 100644 --- a/Extension/translations_auto_pr.js +++ b/Extension/translations_auto_pr.js @@ -4,6 +4,7 @@ const fs = require("fs-extra"); const cp = require("child_process"); const Octokit = require('@octokit/rest') const path = require('path'); +const parseGitConfig = require('parse-git-config'); const branchName = 'localization'; const mergeTo = 'main'; @@ -15,9 +16,12 @@ let repoName = process.argv[3]; let locProjectName = process.argv[4]; let authUser = process.argv[5]; let authToken = process.argv[6]; +let userFullName = process.argv[7]; +let userEmail = process.argv[8]; +let locRepoPath = process.argv[9]; -if (!repoOwner || !repoName || !locProjectName || !authUser || !authToken) { - console.error(`ERROR: Usage: ${path.parse(process.argv[0]).base} ${path.parse(process.argv[1]).base} repo_owner repo_name loc_project_name auth_user auth_token`); +if (!repoOwner || !repoName || !locProjectName || !authUser || !authToken || !userFullName || !userEmail || !locRepoPath) { + console.error(`ERROR: Usage: ${path.parse(process.argv[0]).base} ${path.parse(process.argv[1]).base} repo_owner repo_name loc_project_name auth_user auth_token user_full_name user_email loc_repo_path`); return; } @@ -26,6 +30,7 @@ console.log(`repoName=${repoName}`); console.log(`locProjectName=${locProjectName}`); console.log(`authUser=${authUser}`); console.log(`authToken=${authToken}`); +console.log(`locRepoPath=${locRepoPath}`); function hasBranch(branchName) { console.log(`Checking for existance of branch "${branchName}" (git branch --list ${branchName})`); @@ -66,19 +71,12 @@ function sleep(ms) { console.log("This script is potentially DESTRUCTIVE! Cancel now, or it will proceed in 10 seconds."); sleep(10000); -console.log("Looking for latest localization drop"); -let latestTxt = fs.readFileSync("\\\\simpleloc\\drops\\Drops\\vscode-extensions_2432\\Latest.txt") -let exp = /Build No:\s*(.*)(?!=\n)/gm; -let match = exp.exec(latestTxt.toString()); -let versionString = match[1]; - -console.log("Copying XLF files to vscode-translations-import directory"); -let rootSourcePath = `\\\\simpleloc\\drops\\Drops\\vscode-extensions_2432\\${versionString}\\Localization\\locdrop\\bin`; -let directories = fs.readdirSync(rootSourcePath); +let rootSourcePath = `${locRepoPath}\\Src\\VSCodeExt`; +let directories = fs.readdirSync(rootSourcePath, { withFileTypes: true }).filter(dirent => dirent.isDirectory()).map(dirent => dirent.name); directories.forEach(folderName => { - let sourcePath = `${rootSourcePath}\\${folderName}\\Projects\\Src\\vscode-extensions\\vscode-${locProjectName}.${folderName}.xlf`; + let sourcePath = `${rootSourcePath}\\${folderName}\\vscode-cpptools.xlf`; let destinationPath = `../vscode-translations-import/${folderName}/vscode-extensions/vscode-${locProjectName}.xlf`; - console.log(`Copying "${sourcePath}$" to "${destinationPath}"`); + console.log(`Copying "${sourcePath}" to "${destinationPath}"`); fs.copySync(sourcePath, destinationPath); }); @@ -115,14 +113,61 @@ if (!hasAnyChanges()) { return; } -// Commit changes files. -console.log(`Commiting changes (git commit -m "${commitComment}")`); -cp.execSync(`git commit -m "${commitComment}"`); +// Set up user and permissions + +// Save existing user name and email, in case already set. +var existingUserName; +var existingUserEmail; +var gitConfigPath = path.resolve(process.cwd(), '../.git/config'); +var config = parseGitConfig.sync({ path: gitConfigPath }); + +if (typeof config === 'object' && config.hasOwnProperty('user')) { + existingUserName = config.user.name; + existingUserEmail = config.user.email; +} +if (existingUserName === undefined) { + console.log(`Existing user name: undefined`); +} else { + console.log(`Existing user name: "${existingUserName}"`); + cp.execSync(`git config --local --unset user.name`); +} +if (existingUserEmail === undefined) { + console.log(`Existing user email: undefined`); +} else { + console.log(`Existing user email: "${existingUserEmail}"`); + cp.execSync(`git config --local --unset user.email`); +} + +console.log(`Setting local user name to: "${userFullName}"`); +cp.execSync(`git config --local user.name "${userFullName}"`); + +console.log(`Setting local user email to: "${userEmail}"`); +cp.execSync(`git config --local user.email "${userEmail}"`); console.log(`Configuring git with permission to push and to create pull requests (git remote remove origin && git remote add origin https://${authUser}:${authToken}@github.com/${repoOwner}/${repoName}.git`); cp.execSync('git remote remove origin'); cp.execSync(`git remote add origin https://${authUser}:${authToken}@github.com/${repoOwner}/${repoName}.git`); +// Commit changed files. +console.log(`Commiting changes (git commit -m "${commitComment}")`); +cp.execSync(`git commit -m "${commitComment}"`); + +if (existingUserName === undefined) { + console.log(`Restoring original user name: undefined`); + cp.execSync(`git config --local --unset user.name`); +} else { + console.log(`Restoring original user name: "${existingUserName}"`); + cp.execSync(`git config --local user.name "${existingUserName}"`); +} + +if (existingUserEmail === undefined) { + console.log(`Restoring original user email: undefined`); + cp.execSync(`git config --local --unset user.email`); +} else { + console.log(`Restoring original user email: "${existingUserEmail}"`); + cp.execSync(`git config --local user.email "${existingUserEmail}"`); +} + console.log(`pushing to remove branch (git push -f origin ${branchName})`); cp.execSync(`git push -f origin ${branchName}`); diff --git a/Extension/yarn.lock b/Extension/yarn.lock index 8fb03be2ca..1786a177d2 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" @@ -9,6 +16,20 @@ dependencies: "@babel/highlight" "^7.8.3" +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/highlight@^7.10.4": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" @@ -23,6 +44,30 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== +"@es-joy/jsdoccomment@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.4.3.tgz#c66b42aa66d2e0718f77fccc8d9061cf0b1092ac" + integrity sha512-t0JWZfQiG+Qkr6+tl05dlGcgE/MMPqs7QfNlFkTsbpcCu2Zfukcan/fIiHKTc0iOs4Yh3cnfklMayJnlmKaOwQ== + dependencies: + comment-parser "^1.1.5" + esquery "^1.4.0" + jsdoctypeparser "^9.0.0" + +"@eslint/eslintrc@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" + integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@gulp-sourcemaps/identity-map@1.X": version "1.0.2" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" @@ -42,6 +87,27 @@ normalize-path "^2.0.1" through2 "^2.0.3" +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + "@octokit/auth-token@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f" @@ -138,11 +204,6 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/eslint@*": version "7.2.7" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.7.tgz#f7ef1cf0dceab0ae6f9a976a0a9af14ab1baca26" @@ -171,6 +232,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -235,57 +301,84 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin-tslint@^2.19.2": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.20.0.tgz#5e0a2cabec226081b615067be5d4a1477ba1b4c8" - integrity sha512-nvQqHXNtTg56eeLgl8BbTqw0+PILjgtthB2MEJ279NqfSMjTzUr7dkt/JIuGbxi9netT7u3iQaTE4nuGbGTTpQ== +"@typescript-eslint/eslint-plugin-tslint@^4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.22.1.tgz#5b66c35047f9c395a6d56d49a5666af588f6c270" + integrity sha512-pfidpEzYYvZpcbQDzC55yfwihEREk831rFC50i5f+4GMMvpFvwA5BmGjJL2+djCFHfowD9Y1MRD0hC26oU72Ew== dependencies: - "@typescript-eslint/experimental-utils" "2.20.0" + "@typescript-eslint/experimental-utils" "4.22.1" lodash "^4.17.15" -"@typescript-eslint/eslint-plugin@^2.19.2": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.20.0.tgz#a522d0e1e4898f7c9c6a8e1ed3579b60867693fa" - integrity sha512-cimIdVDV3MakiGJqMXw51Xci6oEDEoPkvh8ggJe2IIzcc0fYqAxOXN6Vbeanahz6dLZq64W+40iUEc9g32FLDQ== +"@typescript-eslint/eslint-plugin@^4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.1.tgz#6bcdbaa4548553ab861b4e5f34936ead1349a543" + integrity sha512-kVTAghWDDhsvQ602tHBc6WmQkdaYbkcTwZu+7l24jtJiYvm9l+/y/b2BZANEezxPDiX5MK2ZecE+9BFi/YJryw== dependencies: - "@typescript-eslint/experimental-utils" "2.20.0" - eslint-utils "^1.4.3" + "@typescript-eslint/experimental-utils" "4.22.1" + "@typescript-eslint/scope-manager" "4.22.1" + debug "^4.1.1" functional-red-black-tree "^1.0.1" + lodash "^4.17.15" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.20.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.20.0.tgz#3b6fa5a6b8885f126d5a4280e0d44f0f41e73e32" - integrity sha512-fEBy9xYrwG9hfBLFEwGW2lKwDRTmYzH3DwTmYbT+SMycmxAoPl0eGretnBFj/s+NfYBG63w/5c3lsvqqz5mYag== +"@typescript-eslint/experimental-utils@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.1.tgz#3938a5c89b27dc9a39b5de63a62ab1623ab27497" + integrity sha512-svYlHecSMCQGDO2qN1v477ax/IDQwWhc7PRBiwAdAMJE7GXk5stF4Z9R/8wbRkuX/5e9dHqbIWxjeOjckK3wLQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.20.0" + "@typescript-eslint/scope-manager" "4.22.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/typescript-estree" "4.22.1" eslint-scope "^5.0.0" + eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.19.2": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.20.0.tgz#608e5bb06ba98a415b64ace994c79ab20f9772a9" - integrity sha512-o8qsKaosLh2qhMZiHNtaHKTHyCHc3Triq6aMnwnWj7budm3xAY9owSZzV1uon5T9cWmJRJGzTFa90aex4m77Lw== +"@typescript-eslint/parser@^4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.1.tgz#a95bda0fd01d994a15fc3e99dc984294f25c19cc" + integrity sha512-l+sUJFInWhuMxA6rtirzjooh8cM/AATAe3amvIkqKFeMzkn85V+eLzb1RyuXkHak4dLfYzOmF6DXPyflJvjQnw== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.20.0" - "@typescript-eslint/typescript-estree" "2.20.0" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/scope-manager" "4.22.1" + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/typescript-estree" "4.22.1" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.22.1.tgz#5bb357f94f9cd8b94e6be43dd637eb73b8f355b4" + integrity sha512-d5bAiPBiessSmNi8Amq/RuLslvcumxLmyhf1/Xa9IuaoFJ0YtshlJKxhlbY7l2JdEk3wS0EnmnfeJWSvADOe0g== + dependencies: + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/visitor-keys" "4.22.1" + +"@typescript-eslint/types@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.1.tgz#bf99c6cec0b4a23d53a61894816927f2adad856a" + integrity sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw== -"@typescript-eslint/typescript-estree@2.20.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.20.0.tgz#90a0f5598826b35b966ca83483b1a621b1a4d0c9" - integrity sha512-WlFk8QtI8pPaE7JGQGxU7nGcnk1ccKAJkhbVookv94ZcAef3m6oCE/jEDL6dGte3JcD7reKrA0o55XhBRiVT3A== +"@typescript-eslint/typescript-estree@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz#dca379eead8cdfd4edc04805e83af6d148c164f9" + integrity sha512-p3We0pAPacT+onSGM+sPR+M9CblVqdA9F1JEdIqRVlxK5Qth4ochXQgIyb9daBomyQKAXbygxp1aXQRV0GC79A== dependencies: + "@typescript-eslint/types" "4.22.1" + "@typescript-eslint/visitor-keys" "4.22.1" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + globby "^11.0.1" is-glob "^4.0.1" - lodash "^4.17.15" - semver "^6.3.0" + semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/visitor-keys@4.22.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz#6045ae25a11662c671f90b3a403d682dfca0b7a6" + integrity sha512-WPkOrIRm+WCLZxXQHCi+WG8T2MMTUFR70rWjdWYddLT7cEfb2P4a3O/J2U1FBVsSFTocXLCoXWY6MZGejeStvQ== + dependencies: + "@typescript-eslint/types" "4.22.1" + eslint-visitor-keys "^2.0.0" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -444,6 +537,11 @@ acorn-jsx@^5.1.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + acorn@5.X, acorn@^5.0.3: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" @@ -454,6 +552,11 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + acorn@^8.0.4: version "8.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" @@ -481,7 +584,7 @@ ajv@^6.10.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.5: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -491,6 +594,16 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602" + integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -650,13 +763,15 @@ array-each@^1.0.0, array-each@^1.0.1: resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= -array-includes@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== +array-includes@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" is-string "^1.0.5" array-initial@^1.0.0: @@ -698,13 +813,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" arrify@^2.0.1: version "2.0.1" @@ -721,6 +837,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-child-process@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/async-child-process/-/async-child-process-1.1.1.tgz#27d0a598b5738707f9898c048bd231340583747b" @@ -940,6 +1061,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1195,10 +1324,10 @@ comment-json@^3.0.3: has-own-prop "^2.0.0" repeat-string "^1.6.1" -comment-parser@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.2.tgz#baf6d99b42038678b81096f15b630d18142f4b8a" - integrity sha512-4Rjb1FnxtOcv9qsfuaNuVsmmVn4ooVoBHzYfyKteiXwIU84PClyGA5jASoFMwPV93+FPh9spwueXauxFJZkGAg== +comment-parser@1.1.5, comment-parser@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.5.tgz#453627ef8f67dbcec44e79a9bd5baa37f0bce9b2" + integrity sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA== component-emitter@^1.2.1: version "1.3.0" @@ -1274,7 +1403,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1329,7 +1458,7 @@ debug@3.X, debug@^3.1.0: dependencies: ms "^2.1.1" -debug@4.3.1: +debug@4.3.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -1365,7 +1494,7 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -1448,6 +1577,13 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -1547,7 +1683,7 @@ enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -1573,22 +1709,27 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" es-module-lexer@^0.4.0: version "0.4.1" @@ -1672,52 +1813,55 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-import-resolver-node@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" - integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== dependencies: debug "^2.6.9" resolve "^1.13.1" -eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-import@^2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" - integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== +eslint-plugin-import@^2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" - object.values "^1.1.0" + object.values "^1.1.1" read-pkg-up "^2.0.0" - resolve "^1.12.0" - -eslint-plugin-jsdoc@^21.0.0: - version "21.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-21.0.0.tgz#36bc215c5d22b320312a633dda6dfe81c34393af" - integrity sha512-CdLGe2oyw5YAX9rxq9bVz7H2PK+r8PVwdGuvYGMBstpbVD/66yUAgRFQRsJwAsRKLmReo58Lw1jFdNcxdOc4eg== - dependencies: - comment-parser "^0.7.2" - debug "^4.1.1" - jsdoctypeparser "^6.1.0" - lodash "^4.17.15" - regextras "^0.7.0" - semver "^6.3.0" - spdx-expression-parse "^3.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-jsdoc@^33.1.0: + version "33.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-33.1.0.tgz#9aa52d0eb0126ea42528aa352265007dce320565" + integrity sha512-nyH1qAj5f4uDnDpg4aiAS65wJSfxfBDf0lIgNfxtew31z3VRaM8WsVmpe4UhI2u27oOD/ChRuye6KAzzuHn6Jw== + dependencies: + "@es-joy/jsdoccomment" "^0.4.3" + comment-parser "1.1.5" + debug "^4.3.1" + esquery "^1.4.0" + jsdoctypeparser "^9.0.0" + lodash "^4.17.21" + regextras "^0.7.1" + semver "^7.3.5" + spdx-expression-parse "^3.0.1" eslint-scope@^5.0.0: version "5.0.0" @@ -1742,12 +1886,29 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^6.0.0, eslint@^6.8.0: +eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^6.0.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== @@ -1790,6 +1951,49 @@ eslint@^6.0.0, eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^7.25.0: + version "7.25.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" + integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.21" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -1799,6 +2003,15 @@ espree@^6.1.2: acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -1811,6 +2024,13 @@ esquery@^1.0.1: dependencies: estraverse "^4.0.0" +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -1830,7 +2050,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -1992,12 +2212,24 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-glob@^3.1.1: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -2007,6 +2239,13 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -2028,6 +2267,13 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -2133,6 +2379,14 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -2143,6 +2397,11 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -2230,6 +2489,15 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -2247,6 +2515,11 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +git-config-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" + integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -2262,7 +2535,7 @@ glob-parent@^5.0.0: dependencies: is-glob "^4.0.1" -glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2341,6 +2614,25 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.1: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + glogg@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" @@ -2471,6 +2763,11 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2491,6 +2788,11 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -2541,10 +2843,12 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== +hosted-git-info@^2.1.4, hosted-git-info@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" http-proxy-agent@^2.1.0: version "2.1.0" @@ -2579,6 +2883,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + import-fresh@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -2587,6 +2896,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -2618,6 +2935,11 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@^7.0.0: version "7.0.4" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" @@ -2679,6 +3001,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -2693,16 +3020,28 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: +is-callable@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -2800,6 +3139,16 @@ is-negated-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2846,12 +3195,13 @@ is-promise@^2.1, is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-symbols "^1.0.1" is-relative@^1.0.0: version "1.0.0" @@ -2875,7 +3225,7 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-symbol@^1.0.2: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== @@ -2965,10 +3315,10 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsdoctypeparser@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz#acfb936c26300d98f1405cb03e20b06748e512a8" - integrity sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA== +jsdoctypeparser@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26" + integrity sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw== json-parse-better-errors@^1.0.2: version "1.0.2" @@ -2980,11 +3330,23 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" @@ -3065,6 +3427,14 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + liftoff@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" @@ -3144,6 +3514,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -3154,12 +3534,17 @@ lodash.set@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3259,6 +3644,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3286,6 +3676,14 @@ micromatch@^4.0.0: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.46.0: version "1.46.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" @@ -3315,7 +3713,7 @@ minimist@0.0.8, minimist@^0.2.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455" integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg== -minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -3526,10 +3924,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.9.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" + integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -3543,7 +3941,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.0: +object.assign@^4.0.4: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -3553,6 +3951,16 @@ object.assign@^4.0.4, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" @@ -3586,14 +3994,14 @@ object.reduce@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" octokit-pagination-methods@^1.1.0: @@ -3634,6 +4042,18 @@ optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ordered-read-streams@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" @@ -3748,6 +4168,14 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" +parse-git-config@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-git-config/-/parse-git-config-3.0.0.tgz#4a2de08c7b74a2555efa5ae94d40cd44302a6132" + integrity sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA== + dependencies: + git-config-path "^2.0.0" + ini "^1.3.5" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -3850,6 +4278,11 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pause-stream@^0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -3872,6 +4305,11 @@ picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +picomatch@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" + integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3927,6 +4365,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3987,6 +4430,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4103,10 +4551,15 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== -regextras@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.0.tgz#2298bef8cfb92b1b7e3b9b12aa8f69547b7d71e4" - integrity sha512-ds+fL+Vhl918gbAUb0k2gVKbTZLsg84Re3DI6p85Et0U0tYME3hyW4nMK8Px4dtDaBA2qNjvG5uWyW7eK5gfmw== +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +regextras@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2" + integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w== remove-bom-buffer@^3.0.0: version "3.0.0" @@ -4159,6 +4612,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -4206,14 +4664,14 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.4.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.4.0: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" -resolve@^1.9.0: +resolve@^1.17.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -4234,6 +4692,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -4248,6 +4711,13 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -4255,6 +4725,13 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" @@ -4310,12 +4787,12 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.1.2, semver@^6.3.0: +semver@^6.1.2: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -4395,6 +4872,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -4404,6 +4886,15 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4504,6 +4995,14 @@ spdx-expression-parse@^3.0.0: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" +spdx-expression-parse@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-license-ids@^3.0.0: version "3.0.5" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" @@ -4615,21 +5114,21 @@ string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" string_decoder@^1.1.1: version "1.3.0" @@ -4700,7 +5199,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -4756,6 +5255,19 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.0.4: + version "6.6.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.6.0.tgz#905654b79df98d9e9a973de1dd58682532c40e8e" + integrity sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.flatten "^4.4.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -4912,6 +5424,16 @@ ts-loader@^8.1.0: micromatch "^4.0.0" semver "^7.3.4" +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" @@ -4950,6 +5472,13 @@ tsutils@^3.17.1: dependencies: tslib "^1.8.1" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -4957,6 +5486,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -4987,6 +5521,16 @@ typescript@^3.5.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -5311,6 +5855,17 @@ webpack@^5.28.0: watchpack "^2.0.0" webpack-sources "^2.1.1" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -5354,7 +5909,7 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==