diff --git a/.github/actions/package-lock.json b/.github/actions/package-lock.json index 52978aa24..700d915c5 100644 --- a/.github/actions/package-lock.json +++ b/.github/actions/package-lock.json @@ -13,7 +13,7 @@ "@octokit/rest": "^21.1.1", "@slack/web-api": "^6.9.1", "applicationinsights": "^2.5.1", - "axios": "^1.8.2", + "axios": "^1.12.1", "uuid": "^8.3.2" }, "devDependencies": { @@ -2960,13 +2960,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.2", - "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/axios/-/axios-1.8.2.tgz", - "integrity": "sha1-+r4G4kHf6DBx1O37yqexw6QPeXk=", + "version": "1.12.1", + "resolved": "https://pkgs.dev.azure.com/azure-public/VisualCpp/_packaging/cpp_PublicPackages/npm/registry/axios/-/axios-1.12.1.tgz", + "integrity": "sha1-B0eznFthX4H5PywTjm2CpxQmk38=", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, diff --git a/.github/actions/package.json b/.github/actions/package.json index 6ada8fda4..ce3813439 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -15,7 +15,7 @@ "@octokit/rest": "^21.1.1", "@slack/web-api": "^6.9.1", "applicationinsights": "^2.5.1", - "axios": "^1.8.2", + "axios": "^1.12.1", "uuid": "^8.3.2" }, "devDependencies": { diff --git a/Documentation/LanguageServer/c_cpp_properties.json.md b/Documentation/LanguageServer/c_cpp_properties.json.md index e4dd1e58e..d9bd52a0c 100644 --- a/Documentation/LanguageServer/c_cpp_properties.json.md +++ b/Documentation/LanguageServer/c_cpp_properties.json.md @@ -1 +1 @@ -The documentation for c_cpp_properties.json has moved to https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference. \ No newline at end of file +The documentation for c_cpp_properties.json has moved to https://code.visualstudio.com/docs/cpp/customize-cpp-settings. \ No newline at end of file diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 399904f93..f9c0df2a7 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,9 +1,17 @@ # C/C++ for Visual Studio Code Changelog -## Version 1.27.0: August 4, 2025 +## Version 1.27.7: September 18, 2025 +### Enhancements +* Show a warning when too many files are processed in a workspace. [#10828](https://github.com/microsoft/vscode-cpptools/issues/10828) +* Improvements to GitHub Copilot activation. [PR #13924](https://github.com/microsoft/vscode-cpptools/pull/13924) + * Thank you for the contribution. [@dbaeumer (Dirk Bäumer)](https://github.com/dbaeumer) +* Add a `C_Cpp.windowsErrorReportingMode` setting and default to only enabling WER for the first crash in a session. [#13928](https://github.com/microsoft/vscode-cpptools/issues/13928) + ### Bug Fixes +* Fix the `__FILE_NAME__` macro being undefined with IntelliSense when using GCC/Clang. [#11164](https://github.com/microsoft/vscode-cpptools/issues/11164) * Fix an IntelliSense crash in `add_cached_tokens_to_string`. [#11900](https://github.com/microsoft/vscode-cpptools/issues/11900) * Fix an IntelliSense crash in `find_subobject_for_interpreter_address`. [#12464](https://github.com/microsoft/vscode-cpptools/issues/12464) +* Fix input delays when editing `c_cpp_properties.json`. [#13591](https://github.com/microsoft/vscode-cpptools/issues/13591) * Fix changes to the active field being lost in the configuration UI when navigating away. [#13636](https://github.com/microsoft/vscode-cpptools/issues/13636) * Fix compiler query failing on Windows if optional job-related API calls fail. [#13679](https://github.com/microsoft/vscode-cpptools/issues/13679) * Fix bugs with Doxygen comments. [#13725](https://github.com/microsoft/vscode-cpptools/issues/13725), [#13726](https://github.com/microsoft/vscode-cpptools/issues/13726), [#13745](https://github.com/microsoft/vscode-cpptools/issues/13745) @@ -15,7 +23,33 @@ * Fix `-imacro` not configuring IntelliSense correctly. [#13785](https://github.com/microsoft/vscode-cpptools/issues/13785) * Fix `pipeTransport.quoteArgs` not being handled correctly. [#13791](https://github.com/microsoft/vscode-cpptools/issues/13791) * Thank you for the contribution. [@mrjist (Matt)](https://github.com/mrjist) [PR #13794](https://github.com/microsoft/vscode-cpptools/pull/13794) +* Fix `.txx` and `.tpp` not being handled as C++ header files. [#13808](https://github.com/microsoft/vscode-cpptools/issues/13808) +* Fix an error when using GitHub Copilot with VS Code older than 1.90.0. [#13818](https://github.com/microsoft/vscode-cpptools/issues/13818) +* Fix activation failing if the `c_cpp_properties.json` exists but fails to be opened. [#13829](https://github.com/microsoft/vscode-cpptools/issues/13829) +* Fix crash recovery. [#13838](https://github.com/microsoft/vscode-cpptools/issues/13838) +* Fix Doxygen generation overwriting a function signature. [#13839](https://github.com/microsoft/vscode-cpptools/issues/13839) +* Fix a crash on Windows 7, 8, and 10 (Server 2008, 2012, and 2016). [#13851](https://github.com/microsoft/vscode-cpptools/issues/13851) +* Fix "CMake Tools" translations. [PR #13854](https://github.com/microsoft/vscode-cpptools/pull/13854) +* Fix the language server getting stuck by a notification message box after a configuration provider times out. [#13862](https://github.com/microsoft/vscode-cpptools/issues/13862) +* Fix a crash regression with `__BASE_FILE__`. [#13866](https://github.com/microsoft/vscode-cpptools/issues/13866) +* Fix non-recursive browse paths from configuration providers. [#13886](https://github.com/microsoft/vscode-cpptools/issues/13886) +* Fix an infinite recursion IntelliSense crash. [#13908](https://github.com/microsoft/vscode-cpptools/issues/13908) +* Fix an IntelliSense crash during completion when using GCC ARM compilers. [#13925](https://github.com/microsoft/vscode-cpptools/issues/13925) * Fix an IntelliSense bug that could cause incorrect string lengths to be reported for string literals in files that use certain file encodings. +* Fix an IntelliSense process crash involving `requires` expressions and templates. +* Fix an IntelliSense process crash from deleting memory that is still in use. +* Fix an IntelliSense process crash with `class_has_mutable_member`. +* Fix a case of uninitialized memory in `cpptools-srv`. + +## Version 1.26.5: September 10, 2025 +### Bug Fix +* Fix extension activation getting stuck by GitHub Copilot activation. [#13914](https://github.com/microsoft/vscode-cpptools/issues/13914) + * Thank you for the contribution. [@dbaeumer (Dirk Bäumer)](https://github.com/dbaeumer) [PR #13918](https://github.com/microsoft/vscode-cpptools/pull/13918) + +## Version 1.26.4: September 9, 2025 +### Enhancement +* Update GitHub Copilot APIs. [PR #13877](https://github.com/microsoft/vscode-cpptools/pull/13877) + * Thank you for the contribution. [@dbaeumer (Dirk Bäumer)](https://github.com/dbaeumer) ## Version 1.26.3: June 24, 2025 ### New Feature @@ -52,7 +86,7 @@ ### Bug Fixes * Fix no error appearing in the configuration UI when an invalid `compilerPath` is used. [#12661](https://github.com/microsoft/vscode-cpptools/issues/12661) * Fix the 'Debug C/C++ File' button sometimes disappearing. [#13400](https://github.com/microsoft/vscode-cpptools/issues/13400) -* Fix a crash in `read_double`. [#13435](https://github.com/Microsoft/vscode-cpptools/issues/13435) +* Fix a crash in `read_double`. [#13435](https://github.com/microsoft/vscode-cpptools/issues/13435) * Fix the handling of default file associations for certain file extensions. [PR #13455](https://github.com/microsoft/vscode-cpptools/pull/13455) * Fix shell parsing of the arguments of a full command line in `compilerPath`. [PR #13468](https://github.com/microsoft/vscode-cpptools/pull/13468) * Fix C and CUDA files being interpreted as C++ in `compile_commands.json`. [#13471](https://github.com/microsoft/vscode-cpptools/issues/13471) @@ -98,7 +132,7 @@ * Fix a potential deadlock after using 'Reset IntelliSense Database'. [#13337](https://github.com/microsoft/vscode-cpptools/issues/13337) * Fix some localization bugs. [PR #13373](https://github.com/microsoft/vscode-cpptools/pull/13373) * Fix IntelliSense showing the wrong size of objects. [#13375](https://github.com/microsoft/vscode-cpptools/issues/13375) -* Fix the `get_mangled_function_name` IntelliSense process crash. [#13358](https://github.com/Microsoft/vscode-cpptools/issues/13358) +* Fix the `get_mangled_function_name` IntelliSense process crash. [#13358](https://github.com/microsoft/vscode-cpptools/issues/13358) * Fix an issue with duplicate forced includes being removed. Multiple forced includes of the same file should now properly be included multiple times. * Fix an issue in which the base configuration browse paths may not get populated when using a custom configuration provider. * Fix an issue with forced includes not being resolved against the same include path search order as a compiler would. @@ -157,7 +191,7 @@ * Fix a compile commands fallback logic issue. [#12947](https://github.com/microsoft/vscode-cpptools/issues/12947) * Thank you for the contribution. [@yiftahw](https://github.com/yiftahw) [PR #12948](https://github.com/microsoft/vscode-cpptools/pull/12948) * Fix an issue in which a `didOpen` event was processed before the language client was fully started. [#12954](https://github.com/microsoft/vscode-cpptools/issues/12954) -* Fix the IntelliSense mode being `macos` instead of `windows` when `_WIN32` is defined on macOS. [#13016](https://github.com/Microsoft/vscode-cpptools/issues/13016) +* Fix the IntelliSense mode being `macos` instead of `windows` when `_WIN32` is defined on macOS. [#13016](https://github.com/microsoft/vscode-cpptools/issues/13016) * Fix IntelliSense bugs when using non-UTF8 file encodings. [#13028](https://github.com/microsoft/vscode-cpptools/issues/13028), [#13044](https://github.com/microsoft/vscode-cpptools/issues/13044) * Fix an incorrect translation for "binary operator". [#13048](https://github.com/microsoft/vscode-cpptools/issues/13048) * Fix the "references may be missing" logging pane being shown when the `C_Cpp.loggingLevel` is `Error` or `None`. [#13066](https://github.com/microsoft/vscode-cpptools/issues/13066) diff --git a/Extension/ThirdPartyNotices.txt b/Extension/ThirdPartyNotices.txt index ff3ce1c01..a8b0f75bf 100644 --- a/Extension/ThirdPartyNotices.txt +++ b/Extension/ThirdPartyNotices.txt @@ -1063,6 +1063,29 @@ the licensed code: DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +vscode-cpptools 7.1.1 - LicenseRef-scancode-generic-cla AND MIT +https://github.com/Microsoft/vscode-cpptools-api#readme + +Copyright (c) Microsoft Corporation + +vscode-cpptools-api + +Copyright (c) Microsoft Corporation +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- @@ -2658,7 +2681,7 @@ SOFTWARE. --------------------------------------------------------- -tmp 0.2.3 - MIT +tmp 0.2.4 - MIT http://github.com/raszi/node-tmp Copyright (c) 2014 KARASZI Istvan @@ -2738,29 +2761,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -vscode-cpptools 7.1.1 - MIT -https://github.com/Microsoft/vscode-cpptools-api#readme - -Copyright (c) Microsoft Corporation - -vscode-cpptools-api - -Copyright (c) Microsoft Corporation -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- @@ -2952,7 +2952,6 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA whatwg-url 5.0.0 - MIT https://github.com/jsdom/whatwg-url#readme -(c) extraPathPercentEncodeSet.has Copyright (c) 2015-2016 Sebastian Mayr The MIT License (MIT) diff --git a/Extension/i18n/chs/package.i18n.json b/Extension/i18n/chs/package.i18n.json index 234a9f89a..447697a4b 100644 --- a/Extension/i18n/chs/package.i18n.json +++ b/Extension/i18n/chs/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "为 [vcpkg 依存关系管理器](https://aka.ms/vcpkg/) 启用集成服务。", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "当来自 `nan` 和 `node-addon-api` 的包含路径为依赖项时,请将其添加。", "c_cpp.configuration.copilotHover.markdownDescription": "如果为 `disabled`,则悬停时不会显示“生成 Copilot 摘要”选项。", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "如果设置为 `disabled`,将禁用 Windows 错误报告。如果设置为 `default`,将启用 Windows 错误报告,但在当前会话中第一次崩溃后会被禁用。更改此设置不会影响当前正在运行的 IntelliSense 进程。", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "如果为 `true`,则“重命名符号”将需要有效的 C/C++ 标识符。", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "如果为 `true`,则自动完成将在函数调用后自动添加 `(` ,在这种情况下,也可以添加 `)` ,具体取决于 `#editor.autoClosingBrackets#` 设置的值。", "c_cpp.configuration.filesExclude.markdownDescription": "为排除文件夹(以及文件 - 如果更改了 `#C_Cpp.exclusionPolicy#`)配置 glob 模式。这些特定于 C/C++ 扩展,并且是 `#files.exclude#` 的补充,但与 `#files.exclude#` 不同,它们也适用于当前工作区文件夹之外的路径,并且不会从资源管理器视图中删除。详细了解 [glob 模式](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)。", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "要连接到的 MI 调试程序服务器的网络地址(示例: localhost:1234)。", "c_cpp.debuggers.useExtendedRemote.description": "使用目标扩展远程模式连接到 MI 调试器服务器。", "c_cpp.debuggers.stopAtEntry.markdownDescription": "可选参数。如果为 `true`,则调试程序应在目标的入口点处停止。如果传递了 `processId`,则不起任何作用。", - "c_cpp.debuggers.debugServerPath.description": "到要启动的调试服务器的可选完整路径。默认值为 null。该路径与 “miDebuggerServerAddress” 或带有运行 “-target-select remote ” 的 “customSetupCommand” 的自有服务器配合使用。", + "c_cpp.debuggers.debugServerPath.description": "要启动的调试服务器的可选完整路径。默认值为 null。该路径与 \"miDebuggerServerAddress\" 或带有运行 \"-target-select remote \" 的 \"customSetupCommand\" 的自有服务器配合使用。", "c_cpp.debuggers.debugServerArgs.description": "可选调试服务器参数。默认为 null。", "c_cpp.debuggers.serverStarted.description": "要在调试服务器输出中查找的可选服务器启动模式。默认为 null。", "c_cpp.debuggers.filterStdout.description": "在 stdout 流中搜索服务器启动模式,并将 stdout 记录到默认输出。默认为 true。", diff --git a/Extension/i18n/chs/src/LanguageServer/client.i18n.json b/Extension/i18n/chs/src/LanguageServer/client.i18n.json index 423cc33b6..f9bdcdcb4 100644 --- a/Extension/i18n/chs/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/chs/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "找不到请求的配置名称: {0}", "unsupported.client": "不支持的客户端", "timed.out": "将在 {0} 毫秒后超时。", + "parsing.stats.large.project": "已枚举 {0} 个文件,检测到 {1} 个 C/C++ 源文件。你可能需要考虑排除某些文件以获得更好的性能。", + "learn.more": "了解详细信息", + "dont.show.again": "不再显示", "update.intellisense.time": "更新 IntelliSense 时间(秒): {0}", "configurations.received": "已收到自定义配置:", "browse.configuration.received": "已收到自定义浏览配置: {0}", diff --git a/Extension/i18n/chs/src/LanguageServer/configurations.i18n.json b/Extension/i18n/chs/src/LanguageServer/configurations.i18n.json index 5ec7ff2f4..4980e45c7 100644 --- a/Extension/i18n/chs/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/chs/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "IntelliSense 模式 {0} 与编译器路径不兼容。", + "resolve.configuration.processed": "已在 {0} 秒内中处理 c_cpp_properties.json", "failed.to.create.config.folder": "未能创建“{0}”", "invalid.configuration.file": "配置文件无效。数组中须至少存在一个配置。", "unknown.properties.version": "c_cpp_properties.json 中发现未知的版本号。某些功能可能无法按预期工作。", @@ -13,9 +14,13 @@ "path.with.spaces": "找不到带有空格的编译器路径。如果这是为了包含编译器参数,请用双引号({0})括住编译器路径。", "cannot.find": "无法找到: {0}", "path.is.not.a.file": "路径不是文件: {0}", + "resolve.includePath.took.too.long": "包含路径验证计算耗时 {0} 秒", + "resolve.includePath.failed": "未能解析包含路径。错误: {0}", "wrapped.with.quotes": "不要在路径周围添加额外的引号。", "path.is.not.a.directory": "路径不是目录: {0}", "duplicate.name": "{0} 重复。配置名称应是唯一的。", + "resolve.path.took.too.long": "路径计算耗时 {0} 秒", + "resolve.path.failed": "未能解析路径 {0}。错误: {1}", "multiple.paths.not.allowed": "不允许使用多个路径。", "multiple.paths.should.be.separate.entries": "多个路径应是数组中的单独条目。", "paths.are.not.directories": "路径不是目录: {0}" diff --git a/Extension/i18n/cht/package.i18n.json b/Extension/i18n/cht/package.i18n.json index 74cdb393e..3c5913d32 100644 --- a/Extension/i18n/cht/package.i18n.json +++ b/Extension/i18n/cht/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "啟用 [vcpkg 相依性管理員](https://aka.ms/vcpkg/) 的整合服務。", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "當 `nan` 和 `node-addon-api` 為相依性時,從中新增 include 路徑。", "c_cpp.configuration.copilotHover.markdownDescription": "如果 `disabled`,暫留時將不會顯示 [產生 Copilot 摘要] 選項。", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "如果為 `disabled`,將會停用 Windows 錯誤報告。如果為 `default`,將會啟用 Windows 錯誤報告,但在目前工作階段中第一次當機之後,就會停用。變更設定不會影響目前執行中的 IntelliSense 程序。", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "若為 `true`,則「重新命名符號」需要有效的 C/C++ 識別碼。", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "若為 `true`,自動完成將會在函式呼叫之後自動新增 `(`,在這種情況下也可能會新增 `)`,取決於 `editor.autoClosingBrackets` 設定的值。", "c_cpp.configuration.filesExclude.markdownDescription": "設定 Glob 模式以排除資料夾 (若變更 `#C_Cpp.exclusionPolicy#`,則也會排除檔案)。這些模式為 C/C++ 延伸模組所特有,且是對 `#files.exclude#` 的外加,但與 `#files.exclude#` 不同的是,它們也適用於目前工作區資料夾以外的路徑,並且不會將其從總管檢視中移除。深入了解 [Glob 模式](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)。", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "MI 偵錯工具伺服器要連線至的網路位址 (範例: localhost:1234)。", "c_cpp.debuggers.useExtendedRemote.description": "使用目標延伸的遠端模式連線到 MI 偵錯工具伺服器。", "c_cpp.debuggers.stopAtEntry.markdownDescription": "選擇性參數。若為 `true`,則偵錯工具應該在目標的進入點停止。如果已傳遞 `processId`,則這就無效。", - "c_cpp.debuggers.debugServerPath.description": "要啟動的偵錯伺服器選用完整路徑。預設為 Null。使用時,會將 \"miDebuggerServerAddress\" 或您自己的伺服器與 \"customSetupCommand\" 連接,以執行 \"-target-select remote <伺服器:連接埠>\"。", + "c_cpp.debuggers.debugServerPath.description": "要啟動的偵錯伺服器的選用完整路徑。預設為 Null。使用時,會將其結合 \"miDebuggerServerAddress\" 或您自己的伺服器與 \"customSetupCommand\",以執行 \"-target-select remote \"。", "c_cpp.debuggers.debugServerArgs.description": "選擇性偵錯伺服器引數。預設為 null。", "c_cpp.debuggers.serverStarted.description": "要在偵錯伺服器輸出中尋找的選擇性伺服器啟動模式。預設為 null。", "c_cpp.debuggers.filterStdout.description": "搜尋 stdout 資料流以取得伺服器啟動的模式,並將 stdout 記錄到偵錯輸出。預設為 true。", diff --git a/Extension/i18n/cht/src/LanguageServer/client.i18n.json b/Extension/i18n/cht/src/LanguageServer/client.i18n.json index a10354fcc..e2d39493e 100644 --- a/Extension/i18n/cht/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/cht/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "找不到要求的組態名稱: {0}", "unsupported.client": "不支援的用戶端", "timed.out": "逾時 ({0} 毫秒內)。", + "parsing.stats.large.project": "已列舉 {0} 個檔案,並偵測到 {1} 個 C/C++ 來源檔案。您可能需要考慮排除某些檔案,以提升效能。", + "learn.more": "深入了解", + "dont.show.again": "不要再顯示", "update.intellisense.time": "更新 IntelliSense 時間 (秒): {0}", "configurations.received": "收到的自訂組態:", "browse.configuration.received": "收到的自訂瀏覽組態: {0}", diff --git a/Extension/i18n/cht/src/LanguageServer/configurations.i18n.json b/Extension/i18n/cht/src/LanguageServer/configurations.i18n.json index 81e50f638..d06b47b21 100644 --- a/Extension/i18n/cht/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/cht/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "IntelliSense 模式 {0} 與編譯器路徑不相容。", + "resolve.configuration.processed": "已於 {0} 秒內處理 c_cpp_properties.json", "failed.to.create.config.folder": "無法建立 \"{0}\"", "invalid.configuration.file": "組態檔。陣列中至少必須有一個組態。", "unknown.properties.version": "在 c_cpp_properties.json 中找到未知的版本號碼。某些功能可能無法如期運作。", @@ -13,9 +14,13 @@ "path.with.spaces": "找不到具有空格的編譯器路徑。如果這是為了要包含編譯器引數,請以雙引號 ({0}) 括住編譯器路徑。", "cannot.find": "找不到: {0}", "path.is.not.a.file": "路徑不是檔案: {0}", + "resolve.includePath.took.too.long": "包含路徑驗證耗費 {0} 秒來評估", + "resolve.includePath.failed": "無法解析包含路徑。錯誤: {0}", "wrapped.with.quotes": "請勿在路徑周圍新增額外的引號。", "path.is.not.a.directory": "路徑不是目錄: {0}", "duplicate.name": "{0} 重複。組態名稱應該是唯一的。", + "resolve.path.took.too.long": "路徑耗費 {0} 秒來評估", + "resolve.path.failed": "無法解析路徑 {0}。錯誤: {1}", "multiple.paths.not.allowed": "不允許使用多個路徑。", "multiple.paths.should.be.separate.entries": "數位列中的多個路徑應為個別專案。", "paths.are.not.directories": "路徑不是目錄: {0}" diff --git a/Extension/i18n/cht/ui/settings.html.i18n.json b/Extension/i18n/cht/ui/settings.html.i18n.json index ee201d47c..5838c7f7b 100644 --- a/Extension/i18n/cht/ui/settings.html.i18n.json +++ b/Extension/i18n/cht/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "用於 IntelliSense 的 C++ 語言標準版本。注意: GNU 標準僅會用於查詢設定編譯器以取得 GNU 定義,而 IntelliSense 將會模擬相同的 C++ 標準版本。", "advanced.settings": "進階設定", "configuration.provider": "組態提供者", - "configuration.provider.description": "可為來源檔案提供 IntelliSense 設定資訊 VS Code 延伸模組的識別碼。例如,使用 VS Code 延伸模組識別碼 {0} 從 CMake 工具延伸模組提供組態資訊。", + "configuration.provider.description": "可為來源檔案提供 IntelliSense 設定資訊 VS Code 延伸模組的識別碼。例如,使用 VS Code 延伸模組識別碼 {0} 從 CMake Tools 延伸模組提供組態資訊。", "windows.sdk.version": "Windows SDK 版本", "windows.sdk.version.description": "要在 Windows 上使用的 Windows SDK 包含路徑版本,例如 {0}。", "mac.framework.path": "Mac 架構路徑", diff --git a/Extension/i18n/csy/package.i18n.json b/Extension/i18n/csy/package.i18n.json index c4cf3c40c..5e204875e 100644 --- a/Extension/i18n/csy/package.i18n.json +++ b/Extension/i18n/csy/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Povolte integrační služby pro [správce závislostí vcpkg](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Pokud existují závislosti, přidejte cesty pro zahrnuté soubory z `nan` a `node-addon-api`.", "c_cpp.configuration.copilotHover.markdownDescription": "Pokud je zakázáno (`disabled`), při najetí myší se nezobrazí možnost Vygenerovat souhrn Copilotu.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Pokud je to nastavené na `disabled`, Zasílání zpráv o chybách systému Windows se zakáže. Pokud je to nastavené na `default`, Zasílání zpráv o chybách systému Windows se povolí, ale po prvním chybovém ukončení v aktuální relaci se zakáže. Změna nastavení nemá vliv na aktuálně spuštěné procesy IntelliSense.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Když se tato hodnota nastaví na `true`, operace Přejmenovat symbol bude vyžadovat platný identifikátor C/C++.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "Pokud je hodnota `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 `)`, což záleží na hodnotě nastavení `#editor.autoClosingBrackets#`.", "c_cpp.configuration.filesExclude.markdownDescription": "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#` platí také pro cesty mimo aktuální složku pracovního prostoru a neodebírají se ze zobrazení Průzkumníka. Přečtěte si další informace o [vzorech glob](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "Síťová adresa MI Debugger Serveru, ke kterému se má připojit (příklad: localhost:1234)", "c_cpp.debuggers.useExtendedRemote.description": "Připojení k serveru ladicího programu MI přes cílový rozšířený vzdálený režim.", "c_cpp.debuggers.stopAtEntry.markdownDescription": "Nepovinný parametr. Pokud je `true`, ladicí program by se měl zastavit na vstupním bodu cíle. Pokud je předán parametr `processId`, nemá to žádný vliv.", - "c_cpp.debuggers.debugServerPath.description": "Volitelná úplná cesta k ladicímu serveru, který se má spustit. Výchozí hodnota je null. Používá se ve spojení buď s miDebuggerServerAddress, nebo s vlastním serverem s customSetupCommand, na kterém běží \"-target-select remote \".", + "c_cpp.debuggers.debugServerPath.description": "Volitelná úplná cesta k ladicímu serveru, který se má spustit. Výchozí hodnota je null. Používá se ve spojení s parametrem „miDebuggerServerAddressL nebo s vlastním serverem s příkazem „customSetupCommand“, který spouští „-target-select remote “.", "c_cpp.debuggers.debugServerArgs.description": "Volitelné argumenty ladicího serveru. Výchozí hodnota je null.", "c_cpp.debuggers.serverStarted.description": "Volitelný vzorek spuštěný na serveru, který se má vyhledat ve výstupu ladicího serveru. Výchozí hodnota je null.", "c_cpp.debuggers.filterStdout.description": "Vyhledá ve vzorku spuštěném na serveru stream stdout a zaznamená stdout do výstupu ladění. Výchozí hodnota je true.", diff --git a/Extension/i18n/csy/src/LanguageServer/client.i18n.json b/Extension/i18n/csy/src/LanguageServer/client.i18n.json index 760ee4d82..a16663c4c 100644 --- a/Extension/i18n/csy/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/csy/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "Požadovaný název konfigurace se nenašel: {0}", "unsupported.client": "Nepodporovaný klient", "timed.out": "Po {0} ms vypršel časový limit.", + "parsing.stats.large.project": "Byl zjištěn výčet {0} souborů s {1} zdrojovými soubory C/C++. Možná budete chtít zvážit vyloučení některých souborů pro zlepšení výkonu.", + "learn.more": "Další informace", + "dont.show.again": "Příště už nezobrazovat", "update.intellisense.time": "Čas aktualizace IntelliSense (sek.): {0}", "configurations.received": "Přijaly se vlastní konfigurace:", "browse.configuration.received": "Přijala se vlastní konfigurace procházení: {0}", diff --git a/Extension/i18n/csy/src/LanguageServer/configurations.i18n.json b/Extension/i18n/csy/src/LanguageServer/configurations.i18n.json index fd53ef62f..92e67a623 100644 --- a/Extension/i18n/csy/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/csy/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "Režim IntelliSense {0} není kompatibilní s cestou ke kompilátoru.", + "resolve.configuration.processed": "Soubor c_cpp_properties.json zpracován za {0} s", "failed.to.create.config.folder": "Nepovedlo se vytvořit {0}.", "invalid.configuration.file": "Neplatný konfigurační soubor. V poli se musí nacházet alespoň jedna konfigurace.", "unknown.properties.version": "V souboru c_cpp_properties.json se našlo neplatné číslo verze. Některé funkce nemusí fungovat podle očekávání.", @@ -13,9 +14,13 @@ "path.with.spaces": "Cestu ke kompilátoru s mezerami se nepovedlo najít. Pokud měly být zahrnuty argumenty kompilátoru, uzavřete cestu ke kompilátoru do dvojitých uvozovek ({0}).", "cannot.find": "Nepovedlo se najít: {0}", "path.is.not.a.file": "Cesta není soubor: {0}", + "resolve.includePath.took.too.long": "Vyhodnocení ověření cesty k zahrnutí trvalo {0} s", + "resolve.includePath.failed": "Nepovedlo se přeložit cestu k zahrnutí. Chyba: {0}", "wrapped.with.quotes": "Nepřidávejte nadbytečné uvozovky kolem cest.", "path.is.not.a.directory": "Cesta není adresář: {0}", "duplicate.name": "{0} je duplicitní. Název konfigurace by měl být jedinečný.", + "resolve.path.took.too.long": "Vyhodnocení cesty trvalo {0} s", + "resolve.path.failed": "Nepodařilo se přeložit cestu {0}. Chyba: {1}", "multiple.paths.not.allowed": "Více cest není povoleno.", "multiple.paths.should.be.separate.entries": "Více cest by mělo být samostatné položky v poli.", "paths.are.not.directories": "Cesty nejsou adresáře: {0}" diff --git a/Extension/i18n/deu/package.i18n.json b/Extension/i18n/deu/package.i18n.json index d6667dad1..e1598361c 100644 --- a/Extension/i18n/deu/package.i18n.json +++ b/Extension/i18n/deu/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Hiermit aktivieren Sie Integrationsdienste für den [vcpkg-Abhängigkeitsmanager](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Fügen Sie Includepfade aus `nan` und `node-addon-api` hinzu, wenn es sich um Abhängigkeiten handelt.", "c_cpp.configuration.copilotHover.markdownDescription": "Wenn `disabled`, wird beim darauf zeigen keine Option „Copilot-Zusammenfassung generieren“ angezeigt.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Wenn `disabled`, wird die Windows-Fehlerberichterstattung deaktiviert. Wenn `default`, wird die Windows-Fehlerberichterstattung aktiviert, aber nach dem ersten Absturz in der aktuellen Sitzung deaktiviert. Das Ändern der Einstellung wirkt sich nicht auf aktuell ausgeführte IntelliSense-Prozesse aus.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Wenn `true` festgelegt ist, erfordert 'Symbol umbenennen' einen gültigen C/C++-Bezeichner.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "Wenn `true` festgelegt ist, fügt AutoVervollständigen automatisch `(` nach Funktionsaufrufen hinzu. In diesem Fall kann auch `)` in Abhängigkeit vom Wert der Einstellung `#editor.autoClosingBrackets#` hinzugefügt werden.", "c_cpp.configuration.filesExclude.markdownDescription": "Konfigurieren Sie Globmuster zum Ausschließen von Ordnern (und Dateien, wenn `#C_Cpp.exclusionPolicy#` geändert wird). Diese sind spezifisch für die C/C++-Erweiterung und gelten zusätzlich zu `#files.exclude#`, aber im Gegensatz zu `#files.exclude#` gelten sie auch für Pfade außerhalb des aktuellen Arbeitsbereichsordners und werden nicht aus der Explorer-Ansicht entfernt. Weitere Informationen zu [Globmustern](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "Netzwerkadresse des MI-Debugger-Servers, mit dem eine Verbindung hergestellt werden soll (Beispiel: localhost:1234).", "c_cpp.debuggers.useExtendedRemote.description": "Stellen Sie eine Verbindung mit dem MI-Debuggerserver mit dem erweiterten Remotemodus des Ziels her.", "c_cpp.debuggers.stopAtEntry.markdownDescription": "Optionaler Parameter. Wenn dieser Wert auf `true` festgelegt ist, sollte der Debugger am Einstiegspunkt des Ziels anhalten. Wenn die `processId` übergeben wird, hat dies keine Auswirkungen.", - "c_cpp.debuggers.debugServerPath.description": "Optionaler vollständiger Pfad zum Debugserver, der gestartet werden soll. Der Standardwert ist NULL. Dies wird in Verbindung mit \"miDebuggerServerAddress\" oder Ihrem eigenen Server mit \"customSetupCommand\" verwendet, auf dem \"-target-select remote \" ausgeführt wird.", + "c_cpp.debuggers.debugServerPath.description": "Optionaler vollständiger Pfad zum Debugserver, der gestartet werden soll. Der Standardwert ist NULL. Dies wird in Verbindung mit „miDebugServerAddress“ oder Ihrem eigenen Server mit „customSetupCommand“ verwendet, auf dem „-target-select remote “ ausgeführt wird.", "c_cpp.debuggers.debugServerArgs.description": "Optionale Debugserverargumente. Der Standardwert ist \"null\".", "c_cpp.debuggers.serverStarted.description": "Optionales vom Server gestartetes Muster, nach dem in der Ausgabe des Debugservers gesucht wird. Der Standardwert ist \"null\".", "c_cpp.debuggers.filterStdout.description": "stdout-Stream für ein vom Server gestartetes Muster suchen und stdout in der Debugausgabe protokollieren. Der Standardwert ist \"true\".", diff --git a/Extension/i18n/deu/src/LanguageServer/client.i18n.json b/Extension/i18n/deu/src/LanguageServer/client.i18n.json index 1002cf57c..87d6a53a8 100644 --- a/Extension/i18n/deu/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/deu/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "Der angeforderte Konfigurationsname wurde nicht gefunden: {0}", "unsupported.client": "Nicht unterstützter Client", "timed.out": "Timeout nach {0} ms.", + "parsing.stats.large.project": "Aufgezählte {0}-Dateien mit {1} C/C++-Quelldateien erkannt. Sie sollten in Betracht ziehen, einige Dateien auszuschließen, um die Leistung zu optimieren.", + "learn.more": "Weitere Informationen", + "dont.show.again": "Nicht mehr anzeigen", "update.intellisense.time": "IntelliSense-Zeit aktualisieren (Sek.): {0}", "configurations.received": "Benutzerdefinierte Konfigurationen empfangen:", "browse.configuration.received": "Benutzerdefinierte Suchkonfiguration empfangen: {0}", diff --git a/Extension/i18n/deu/src/LanguageServer/configurations.i18n.json b/Extension/i18n/deu/src/LanguageServer/configurations.i18n.json index ec30b8b78..701591863 100644 --- a/Extension/i18n/deu/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/deu/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "Der IntelliSense-Modus \"{0}\" ist inkompatibel mit dem Compilerpfad.", + "resolve.configuration.processed": "Verarbeitete c_cpp_properties.json-Datei in {0} s", "failed.to.create.config.folder": "\"{0}\" konnte nicht erstellt werden.", "invalid.configuration.file": "Ungültige Konfigurationsdatei. Im Array muss mindestens eine Konfiguration vorhanden sein.", "unknown.properties.version": "In \"c_cpp_properties.json\" wurde eine unbekannte Versionsnummer gefunden. Einige Features funktionieren möglicherweise nicht wie erwartet.", @@ -13,9 +14,13 @@ "path.with.spaces": "Der Compilerpfad mit Leerzeichen konnte nicht gefunden werden. Wenn dies auch Compilerargumente einschließen soll, setzen Sie den Compilerpfad in doppelte Anführungszeichen ({0}).", "cannot.find": "Nicht gefunden: {0}", "path.is.not.a.file": "Der Pfad ist keine Datei: {0}", + "resolve.includePath.took.too.long": "Der Validierung des Inlcude-Pfads hat {0} s für die Auswertung benötigt", + "resolve.includePath.failed": "Fehler beim Auflösen des Include-Pfads. Fehler: {0}", "wrapped.with.quotes": "Fügen Sie keine zusätzlichen Anführungszeichen um Pfade hinzu.", "path.is.not.a.directory": "Der Pfad ist kein Verzeichnis: {0}", "duplicate.name": "\"{0}\" ist ein Duplikat. Der Konfigurationsname muss eindeutig sein.", + "resolve.path.took.too.long": "Der Pfad hat {0} s für die Auswertung benötigt", + "resolve.path.failed": "Fehler beim Auflösen des Pfads {0}. Fehler: {1}", "multiple.paths.not.allowed": "Mehrere Pfade sind nicht zulässig.", "multiple.paths.should.be.separate.entries": "Mehrere Pfade müssen separate Einträge in einem Array sein.", "paths.are.not.directories": "Pfade sind keine Verzeichnisse: {0}" diff --git a/Extension/i18n/deu/ui/settings.html.i18n.json b/Extension/i18n/deu/ui/settings.html.i18n.json index aadcd4ecf..94bd6a1f6 100644 --- a/Extension/i18n/deu/ui/settings.html.i18n.json +++ b/Extension/i18n/deu/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "Die Version des C++-Sprachstandards, die für IntelliSense verwendet werden soll. Hinweis: GNU-Standards werden nur zum Abfragen des festgelegten Compilers zum Abrufen von GNU-Definitionen verwendet, und IntelliSense emuliert die äquivalente Version des C++-Standards.", "advanced.settings": "Erweiterte Einstellungen", "configuration.provider": "Konfigurationsanbieter", - "configuration.provider.description": "Die ID einer VS Code-Erweiterung, die IntelliSense-Konfigurationsinformationen für Quelldateien bereitstellen kann. Verwenden Sie zum Beispiel die VS Code-Erweiterungs-ID \"{0}\", um Konfigurationsinformationen aus der CMake Tools-Erweiterung bereitzustellen.", + "configuration.provider.description": "Die ID einer VS Code-Erweiterung, die IntelliSense-Konfigurationsinformationen für Quelldateien bereitstellen kann. Verwenden Sie zum Beispiel die VS Code-Erweiterungs-ID \"{0}\", um Konfigurationsinformationen aus der Erweiterung CMake Tools bereitzustellen.", "windows.sdk.version": "Windows SDK-Version", "windows.sdk.version.description": "Die Version des Windows SDK-Includepfads zur Verwendung unter Windows, z. B. \"{0}\".", "mac.framework.path": "Pfad für Mac-Framework", diff --git a/Extension/i18n/esn/package.i18n.json b/Extension/i18n/esn/package.i18n.json index aa3d233d3..b89f063fb 100644 --- a/Extension/i18n/esn/package.i18n.json +++ b/Extension/i18n/esn/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Habilita los servicios de integración para el [administrador de dependencias de vcpkgs](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Agrega rutas de acceso de inclusión de `nan` y `node-addon-api` cuando sean dependencias.", "c_cpp.configuration.copilotHover.markdownDescription": "Si se establece en `disabled`, no aparecerá la opción 'Generar resumen de Copilot' al mantener el puntero por encima.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Si está `disabled`, se deshabilitará el Informe de errores de Windows. Si está `default`, se habilitará el Informe de errores de Windows, pero se deshabilitará tras el primer bloqueo en la sesión actual. Cambiar esta configuración no afecta a los procesos de IntelliSense que se estén ejecutando.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Si es `true`, 'Cambiar nombre de símbolo' requerirá un identificador de C/C++ válido.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "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.markdownDescription": "Configure patrones globales para excluir carpetas (y archivos si se cambia `#C_Cpp.exclusionPolicy#`). Son específicos de la extensión de C/C++ y se agregan a `#files.exclude#`, pero a diferencia de `#files.exclude#`, también se aplican a las rutas de acceso fuera de la carpeta del área de trabajo actual y no se quitan de la vista del Explorador. Obtenga información sobre [patrones globales](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", diff --git a/Extension/i18n/esn/src/LanguageServer/client.i18n.json b/Extension/i18n/esn/src/LanguageServer/client.i18n.json index 78af790dc..f70efaa44 100644 --- a/Extension/i18n/esn/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/esn/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "No se encuentra el nombre de la configuración que se ha solicitado: {0}", "unsupported.client": "Cliente no admitido", "timed.out": "Se agotó el tiempo de espera a los {0} ms.", + "parsing.stats.large.project": "{0} archivos enumerados con {1} archivos de origen de C/C++ detectados. Puede que desee considerar la exclusión de algunos archivos para mejorar el rendimiento.", + "learn.more": "Obtener más información", + "dont.show.again": "No volver a mostrar", "update.intellisense.time": "Tiempo de actualización de IntelliSense (s): {0}", "configurations.received": "Configuraciones personalizadas recibidas:", "browse.configuration.received": "Configuración de exploración personalizada recibida: {0}", diff --git a/Extension/i18n/esn/src/LanguageServer/configurations.i18n.json b/Extension/i18n/esn/src/LanguageServer/configurations.i18n.json index bdf0c3e4a..7e03959b7 100644 --- a/Extension/i18n/esn/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/esn/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "El modo {0} de IntelliSense no es compatible con la ruta de acceso del compilador.", + "resolve.configuration.processed": "c_cpp_properties.json procesado en {0}s", "failed.to.create.config.folder": "No se pudo crear \"{0}\"", "invalid.configuration.file": "Archivo de configuración no válido. Debe haber al menos una configuración en la matriz.", "unknown.properties.version": "Se encontró un número de versión desconocido en el archivo c_cpp_properties.json. Es posible que algunas características no funcionen correctamente.", @@ -13,9 +14,13 @@ "path.with.spaces": "No se encontró la ruta de acceso del compilador con espacios. Si la intención era incluir argumentos del compilador, escriba la ruta del compilador entre comillas dobles ({0}).", "cannot.find": "No se encuentra {0}", "path.is.not.a.file": "La ruta de acceso no es un archivo: {0}", + "resolve.includePath.took.too.long": "La validación de la ruta de acceso de inclusión tardó {0} s en evaluarse", + "resolve.includePath.failed": "No se pudo resolver la ruta de acceso de inclusión. Error: {0}", "wrapped.with.quotes": "No agregue comillas adicionales alrededor de las rutas de acceso.", "path.is.not.a.directory": "La ruta de acceso no es un directorio: {0}", "duplicate.name": "{0} es un duplicado. El nombre de la configuración debe ser único.", + "resolve.path.took.too.long": "La ruta de acceso tardó {0}s en evaluarse", + "resolve.path.failed": "No se pudo resolver la ruta de acceso {0}. Error: {1}", "multiple.paths.not.allowed": "No se permiten varias rutas de acceso.", "multiple.paths.should.be.separate.entries": "Varias rutas de acceso deben ser entradas separadas en una matriz.", "paths.are.not.directories": "Las rutas de acceso no son directorios: {0}" diff --git a/Extension/i18n/esn/ui/settings.html.i18n.json b/Extension/i18n/esn/ui/settings.html.i18n.json index 5c38d7c01..00be3468c 100644 --- a/Extension/i18n/esn/ui/settings.html.i18n.json +++ b/Extension/i18n/esn/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "Versión del estándar del lenguaje C++ que se va a usar para IntelliSense. Nota: Los estándares GNU solo se usan para consultar el compilador de conjuntos a fin de obtener definiciones GNU e IntelliSense emulará la versión del estándar C++ equivalente.", "advanced.settings": "Configuración avanzada", "configuration.provider": "Proveedor de configuración", - "configuration.provider.description": "Id. de una extensión de VS Code que puede proporcionar información de configuración de IntelliSense para los archivos de código fuente. Por ejemplo, use el id. de extensión de VS Code {0} para proporcionar información de configuración de la extensión Herramientas de CMake.", + "configuration.provider.description": "Id. de una extensión de VS Code que puede proporcionar información de configuración de IntelliSense para los archivos de código fuente. Por ejemplo, use el id. de extensión de VS Code {0} para proporcionar información de configuración de la extensión CMake Tools.", "windows.sdk.version": "Versión del SDK de Windows", "windows.sdk.version.description": "Versión de la ruta de acceso de inclusión del SDK de Windows SDK que debe usarse en Windows; por ejemplo, {0}.", "mac.framework.path": "Ruta de acceso de la plataforma Mac", diff --git a/Extension/i18n/fra/package.i18n.json b/Extension/i18n/fra/package.i18n.json index 882df138f..bdbf842e0 100644 --- a/Extension/i18n/fra/package.i18n.json +++ b/Extension/i18n/fra/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Activez les services d'intégration pour le [gestionnaire de dépendances vcpkg](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Ajouter les chemins d'inclusion de `nan` et `node-addon-api` quand ils sont des dépendances.", "c_cpp.configuration.copilotHover.markdownDescription": "Si `disabled`, aucune option « Générer un résumé Copilot » n’apparaît lors du pointage.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Si la valeur est `disabled`, le rapport d’erreurs Windows sera désactivé. Si la valeur est `default`, le rapport d’erreurs Windows sera activé, mais il sera désactivé après le premier plantage de la session en cours. La modification de ce paramètre n’affecte pas les processus IntelliSense en cours d’exécution.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Si `true`, 'Renommer le symbole' exigera un identifiant C/C++ valide.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "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.markdownDescription": "Configurer les modèles globaux pour exclure les dossiers (et les fichiers si `#C_Cpp.exclusionPolicy#` est modifié). Ils sont spécifiques à l’extension C/C++ et s’ajoutent à `#files.exclude#`, mais contrairement à `#files.exclude#`, ils s’appliquent également aux chemins en dehors du dossier de l’espace de travail actuel et ne sont pas supprimés de la vue de l’explorateur. En savoir plus sur les [motifs globaux](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "Adresse réseau du serveur du débogueur MI auquel se connecter (par exemple : localhost:1234).", "c_cpp.debuggers.useExtendedRemote.description": "Connectez-vous au serveur débogueur MI avec le mode étendu-distant cible.", "c_cpp.debuggers.stopAtEntry.markdownDescription": "Paramètre facultatif. Si la valeur est `true`, le débogueur doit s'arrêter au point d'entrée de la cible. Si `processId` est passé, cela n'a aucun effet.", - "c_cpp.debuggers.debugServerPath.description": "Chemin complet facultatif au serveur de débogage à lancer (valeur par défaut : null). Utilisé conjointement avec \"miDebuggerServerAddress\" ou votre propre serveur avec \"customSetupCommand\" qui exécute \"-target-select remote \".", + "c_cpp.debuggers.debugServerPath.description": "Chemin complet facultatif au serveur de débogage à lancer. Valeur par défaut : null. Utilisé conjointement avec \"miDebuggerServerAddress\" ou votre propre serveur avec \"customSetupCommand\" qui exécute \"-target-select remote \".", "c_cpp.debuggers.debugServerArgs.description": "Arguments facultatifs du serveur de débogage. La valeur par défaut est null.", "c_cpp.debuggers.serverStarted.description": "Modèle facultatif de démarrage du serveur à rechercher dans la sortie du serveur de débogage. La valeur par défaut est null.", "c_cpp.debuggers.filterStdout.description": "Permet de rechercher dans le flux stdout le modèle correspondant au démarrage du serveur, et de journaliser stdout dans la sortie de débogage. La valeur par défaut est true.", diff --git a/Extension/i18n/fra/src/LanguageServer/client.i18n.json b/Extension/i18n/fra/src/LanguageServer/client.i18n.json index fc530cb81..6ccb0ae37 100644 --- a/Extension/i18n/fra/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/fra/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "Le nom de configuration demandé est introuvable : {0}", "unsupported.client": "Client non pris en charge", "timed.out": "Expiration du délai d'attente dans {0} ms.", + "parsing.stats.large.project": "{0} fichiers listés avec {1} fichiers sources C/C++ détectés. Vous pourriez envisager d’exclure certains fichiers pour un meilleur niveau de performance.", + "learn.more": "En savoir plus", + "dont.show.again": "Ne plus afficher", "update.intellisense.time": "Durée de mise à jour d'IntelliSense (s) : {0}", "configurations.received": "Configurations personnalisées reçues :", "browse.configuration.received": "Configuration de navigation personnalisée reçue : {0}", diff --git a/Extension/i18n/fra/src/LanguageServer/configurations.i18n.json b/Extension/i18n/fra/src/LanguageServer/configurations.i18n.json index 214fdd52d..4f51b54bc 100644 --- a/Extension/i18n/fra/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/fra/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "Le mode IntelliSense {0} est incompatible avec le chemin du compilateur.", + "resolve.configuration.processed": "Fichier c_cpp_properties.json traité en {0} s", "failed.to.create.config.folder": "La création de \"{0}\" a échoué", "invalid.configuration.file": "Fichier de configuration non valide. Au moins une configuration doit être présente dans le tableau.", "unknown.properties.version": "Numéro de version inconnu dans c_cpp_properties.json. Certaines fonctionnalités peuvent ne pas fonctionner comme prévu.", @@ -13,9 +14,13 @@ "path.with.spaces": "Le chemin d’accès du compilateur contenant des espaces est introuvable. S’il devait inclure des arguments du compilateur, entourez le chemin d’accès du compilateur de guillemets doubles ({0}).", "cannot.find": "{0} introuvable", "path.is.not.a.file": "Le chemin n'est pas un fichier : {0}", + "resolve.includePath.took.too.long": "L’évaluation de la validation du chemin d’accès d’inclusion a pris {0} s", + "resolve.includePath.failed": "Échec de la résolution du chemin d’accès d’inclusion. Erreur : {0}", "wrapped.with.quotes": "N’ajoutez pas de guillemets supplémentaires autour des chemins.", "path.is.not.a.directory": "Le chemin n'est pas un répertoire : {0}", "duplicate.name": "{0} est dupliqué. Le nom de configuration doit être unique.", + "resolve.path.took.too.long": "L’évaluation du chemin a pris {0} s", + "resolve.path.failed": "Échec de la résolution du chemin d’accès {0}. Erreur : {1}", "multiple.paths.not.allowed": "Il est interdit d’utiliser plusieurs chemin d’accès.", "multiple.paths.should.be.separate.entries": "Plusieurs chemins d’accès doivent être des entrées distinctes dans un tableau.", "paths.are.not.directories": "Les chemins d’accès ne sont pas des répertoires : {0}" diff --git a/Extension/i18n/ita/package.i18n.json b/Extension/i18n/ita/package.i18n.json index 21b7d8bd5..18648bb8f 100644 --- a/Extension/i18n/ita/package.i18n.json +++ b/Extension/i18n/ita/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Abilita i servizi di integrazione per l'[utilità di gestione dipendenze di vcpkg](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Aggiungere percorsi di inclusione da `nan` e `node-addon-api` quando sono dipendenze.", "c_cpp.configuration.copilotHover.markdownDescription": "Se `disabled`, al passaggio del puntatore non verrà visualizzata l’opzione 'Genera riepilogo Copilot'.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Se l’impostazione è `disabled`, Segnalazione errori Windows verrà disabilitata. Se l’impostazione è `default`, Segnalazione errori Windows verrà abilitato ma verrà disabilitato dopo il primo arresto anomalo della sessione corrente. La modifica dell’impostazione non influisce sui processi IntelliSense attualmente in esecuzione.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Se è `true`, con 'Rinomina simbolo' sarà richiesto un identificatore C/C++ valido.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "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.markdownDescription": "Configurare i criteri GLOB per escludere le cartelle (e i file se `#C_Cpp.exclusionPolicy#` viene modificato). Sono specifici dell'estensione C/C++ e si aggiungono a `#files.exclude#`, ma diversamente da `#files.exclude#` si applicano anche ai percorsi esterni alla cartella dell'area di lavoro corrente e non vengono rimossi dalla visualizzazione Esplora risorse. Altre informazioni su [criteri GLOB](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", diff --git a/Extension/i18n/ita/src/LanguageServer/client.i18n.json b/Extension/i18n/ita/src/LanguageServer/client.i18n.json index 3fcdf1e97..1c15246b0 100644 --- a/Extension/i18n/ita/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/ita/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "Il nome di configurazione richiesto non è stato trovato: {0}", "unsupported.client": "Client non supportato", "timed.out": "Timeout raggiunto in {0} ms.", + "parsing.stats.large.project": "Sono stati enumerati {0} file con {1} file di origine C/C++ rilevati. Per ottenere prestazioni migliori, è possibile scegliere di escludere alcuni file.", + "learn.more": "Altre informazioni", + "dont.show.again": "Non visualizzare più questo messaggio", "update.intellisense.time": "Aggiorna ora di IntelliSense (sec): {0}", "configurations.received": "Configurazioni personalizzate ricevute:", "browse.configuration.received": "La configurazione di esplorazione personalizzata è stata ricevuta: {0}", diff --git a/Extension/i18n/ita/src/LanguageServer/configurations.i18n.json b/Extension/i18n/ita/src/LanguageServer/configurations.i18n.json index 9d2440059..0516e82ba 100644 --- a/Extension/i18n/ita/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/ita/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "La modalità IntelliSense {0} non è compatibile con il percorso del compilatore.", + "resolve.configuration.processed": "C_cpp_properties.json elaborato in {0} s", "failed.to.create.config.folder": "Non è stato possibile creare \"{0}\"", "invalid.configuration.file": "File di configurazione non valido. Nella matrice deve essere presente almeno una configurazione.", "unknown.properties.version": "È stato trovato un numero di versione sconosciuto in c_cpp_properties.json. Alcune funzionalità potrebbero non funzionare come previsto.", @@ -13,9 +14,13 @@ "path.with.spaces": "Non è possibile trovare il percorso del compilatore contenente spazi. Se l'intenzione era includere argomenti del compilatore, racchiudi il percorso del compilatore tra doppie virgolette ({0}).", "cannot.find": "Non è possibile trovare: {0}", "path.is.not.a.file": "Il percorso non è un file: {0}", + "resolve.includePath.took.too.long": "La valutazione della convalida del percorso di inclusione ha richiesto {0} s", + "resolve.includePath.failed": "Non è possibile risolvere il percorso di inclusione. Errore: {0}", "wrapped.with.quotes": "Non aggiungere virgolette aggiuntive intorno ai percorsi.", "path.is.not.a.directory": "Il percorso non è una directory: {0}", "duplicate.name": "{0} è duplicato. Il nome della configurazione deve essere univoco.", + "resolve.path.took.too.long": "La valutazione del percorso ha richiesto {0} s", + "resolve.path.failed": "Non è possibile risolvere il percorso {0}. Errore: {1}", "multiple.paths.not.allowed": "Più percorsi non sono consentiti.", "multiple.paths.should.be.separate.entries": "Più percorsi devono essere voci separate in una matrice.", "paths.are.not.directories": "I percorsi non sono directory: {0}" diff --git a/Extension/i18n/jpn/package.i18n.json b/Extension/i18n/jpn/package.i18n.json index 79ce9deb9..818179744 100644 --- a/Extension/i18n/jpn/package.i18n.json +++ b/Extension/i18n/jpn/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "[vcpkg 依存関係マネージャー](https://aka.ms/vcpkg/) の統合サービスを有効にします。", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "依存関係である場合は、`nan` および `node-addon-api` のインクルード パスを追加してください。", "c_cpp.configuration.copilotHover.markdownDescription": "`disabled` にすると、ホバー時に [Copilot 要約を生成] オプションは表示されません。", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "`disabled` の場合、Windows エラー報告は無効になります。`default` の場合、Windows エラー報告は有効になりますが、現在のセッションで最初にクラッシュした後に無効になります。設定を変更しても、現在実行中の IntelliSense プロセスには影響しません。", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "`true` の場合、'シンボルの名前変更' には有効な C/C++ 識別子が必要です。", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "`true` の場合、関数呼び出しの後に `(` が自動的に追加されます。その場合は、`#editor.autoClosingBrackets#` 設定の値に応じて、`)` も追加される場合があります。", "c_cpp.configuration.filesExclude.markdownDescription": "フォルダー (および `#C_Cpp.exclusionPolicy#` が変更されている場合はファイル) を除外するための glob パターンを構成します。これらは C/C++ 拡張機能に固有であり、`#files.exclude#` に加えてありますが、`#files.exclude#` とは異なり、現在のワークスペース フォルダーの外部のパスにも適用され、エクスプローラー ビューからは削除されません。[glob パターン](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) についての詳細をご確認ください。", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "接続先の MI デバッガー サーバーのネットワークアドレスです (例: localhost: 1234)。", "c_cpp.debuggers.useExtendedRemote.description": "ターゲットの拡張リモート モードで MI デバッガー サーバーに接続します。", "c_cpp.debuggers.stopAtEntry.markdownDescription": "オプションのパラメーターです。`true` の場合、デバッガーはターゲットのエントリポイントで停止します。`processId` が渡された場合、この効果はありません。", - "c_cpp.debuggers.debugServerPath.description": "起動するデバッグ サーバーの完全なパス (省略可能)。既定値は null です。これは、\"miDebuggerServerAddress\"、または \"-target-select remote \" を実行する \"customSetupCommand\" を含む独自のサーバーのいずれかと接合して使用されます。", + "c_cpp.debuggers.debugServerPath.description": "起動するデバッグ サーバーの完全なパス (オプション)。既定値は null です。これは、\"miDebuggerServerAddress\" か、\"-target-select remote \" を実行する \"customSetupCommand\" を持つ独自のサーバーの、どちらかと組み合わせて使用されます。", "c_cpp.debuggers.debugServerArgs.description": "デバッグ サーバー引数 (省略可能)。既定値は null です。", "c_cpp.debuggers.serverStarted.description": "デバッグ サーバー出力から検索する、サーバー開始のパターン (省略可能)。既定値は null です。", "c_cpp.debuggers.filterStdout.description": "サーバー開始のパターンを stdout ストリームから検索し、stdout をデバッグ出力にログ記録します。既定値は true です。", diff --git a/Extension/i18n/jpn/src/LanguageServer/client.i18n.json b/Extension/i18n/jpn/src/LanguageServer/client.i18n.json index 615a07e29..62cc0cb54 100644 --- a/Extension/i18n/jpn/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/jpn/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "要求された構成名が見つかりません: {0}", "unsupported.client": "サポートされていないクライアント", "timed.out": "{0} ミリ秒でタイムアウトしました。", + "parsing.stats.large.project": "{1} C/C++ ソース ファイルが検出された {0} ファイルを列挙しました。パフォーマンスを向上させるために、一部のファイルを除外することを検討してください。", + "learn.more": "詳細情報", + "dont.show.again": "今後は表示しない", "update.intellisense.time": "IntelliSense 時間 (秒) の更新: {0}", "configurations.received": "カスタム構成を受信しました:", "browse.configuration.received": "カスタムの参照構成を受信しました: {0}", diff --git a/Extension/i18n/jpn/src/LanguageServer/configurations.i18n.json b/Extension/i18n/jpn/src/LanguageServer/configurations.i18n.json index dffe1e85e..47091854e 100644 --- a/Extension/i18n/jpn/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/jpn/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "IntelliSense モード {0} は、コンパイラ パスと互換性がありません。", + "resolve.configuration.processed": "c_cpp_properties.json を {0} 秒で処理しました", "failed.to.create.config.folder": "\"{0}\" を作成できませんでした", "invalid.configuration.file": "構成ファイルが無効です。配列には少なくとも 1 つの構成が必要です。", "unknown.properties.version": "c_cpp_properties.json に不明なバージョン番号が見つかりました。一部の機能が予期したとおりに動作しない可能性があります。", @@ -13,9 +14,13 @@ "path.with.spaces": "スペースを含むコンパイラ パスが見つかりませんでした。コンパイラ引数を含める場合は、コンパイラ パスを二重引用符 ({0}) で囲みます。", "cannot.find": "{0} が見つかりません。", "path.is.not.a.file": "パスがファイルではありません: {0}", + "resolve.includePath.took.too.long": "インクルード パスの検証で評価に {0} 秒かかりました", + "resolve.includePath.failed": "インクルード パスを解決できません。エラー: {0}", "wrapped.with.quotes": "パスの前後に余分な引用符を追加しないでください。", "path.is.not.a.directory": "パスがディレクトリではありません: {0}", "duplicate.name": "{0} が重複しています。構成名は一意である必要があります。", + "resolve.path.took.too.long": "パスは評価するのに {0} 秒かかりました", + "resolve.path.failed": "パス {0} を解決できませんでした。エラー: {1}", "multiple.paths.not.allowed": "複数のパスは使用できません。", "multiple.paths.should.be.separate.entries": "複数のパスは、配列内の個別のエントリである必要があります。", "paths.are.not.directories": "パスはディレクトリではありません: {0}" diff --git a/Extension/i18n/kor/package.i18n.json b/Extension/i18n/kor/package.i18n.json index f8ef1ded0..7c2009ef0 100644 --- a/Extension/i18n/kor/package.i18n.json +++ b/Extension/i18n/kor/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "[vcpkg 종속성 관리자](https://aka.ms/vcpkg/)에 대해 통합 서비스를 사용하도록 설정합니다.", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "`nan` 및 `node-addon-api`가 종속성일 때 해당 포함 경로를 추가합니다.", "c_cpp.configuration.copilotHover.markdownDescription": "(`disabled`)' 비활성화'된 경우 마우스로 가리키면 'Copilot 요약 생성' 옵션이 표시되지 않습니다.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "`disabled`로 설정하면 Windows 오류 보고가 사용하지 않도록 설정됩니다. `default`로 설정하면 Windows 오류 보고가 사용하도록 설정되지만, 현재 세션에서 첫 번째 충돌이 발생한 이후에는 사용하지 않도록 설정됩니다. 설정을 변경해도 현재 실행 중인 IntelliSense 프로세스에는 영향을 주지 않습니다.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "`true`이면 '기호 이름 바꾸기'에 유효한 C/C++ 식별자가 필요합니다.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "`true`이면 자동 완성에서 `#editor.autoClosingBrackets#` 설정 값에 따라 함수 호출 뒤에 `(`를 자동으로 추가하며, 이 경우 `)`도 추가될 수 있습니다.", "c_cpp.configuration.filesExclude.markdownDescription": "폴더를 제외하기 위한 glob 패턴을 구성합니다(`#C_Cpp.exclusionPolicy#`가 변경된 경우 파일도). 이는 C/C++ 확장에만 해당하며 `#files.exclude#`와 더불어 사용되지만 `#files.exclude#`와 달리 현재 작업 영역 폴더 외부의 경로에도 적용되며 탐색기 보기에서 제거되지 않습니다. [glob 패턴](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)에 대해 자세히 알아보세요.", diff --git a/Extension/i18n/kor/src/LanguageServer/client.i18n.json b/Extension/i18n/kor/src/LanguageServer/client.i18n.json index 6959b3a1e..f3650f4ad 100644 --- a/Extension/i18n/kor/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/kor/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "요청된 구성 이름을 찾을 수 없음: {0}", "unsupported.client": "지원되지 않는 클라이언트", "timed.out": "{0}ms 후 시간이 초과되었습니다.", + "parsing.stats.large.project": "{1} C/C++ 소스 파일이 검색된 {0} 파일이 열거되었습니다. 성능 향상을 위해 일부 파일을 제외하는 것이 좋습니다.", + "learn.more": "자세히 알아보기", + "dont.show.again": "다시 표시 안 함", "update.intellisense.time": "IntelliSense 시간(초) 업데이트: {0}", "configurations.received": "사용자 지정 구성이 수신됨:", "browse.configuration.received": "사용자 지정 찾아보기 구성이 수신됨: {0}", diff --git a/Extension/i18n/kor/src/LanguageServer/configurations.i18n.json b/Extension/i18n/kor/src/LanguageServer/configurations.i18n.json index 4eee2192a..4d843fe41 100644 --- a/Extension/i18n/kor/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/kor/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "IntelliSense 모드 {0}은(는) 컴파일러 경로와 호환되지 않습니다.", + "resolve.configuration.processed": "{0}에서 처리된 c_cpp_properties.json", "failed.to.create.config.folder": "{0}을(를) 만들지 못했습니다.", "invalid.configuration.file": "구성 파일이 잘못되었습니다. 배열에 구성이 하나 이상 있어야 합니다.", "unknown.properties.version": "c_cpp_properties.json에 알 수 없는 버전 번호가 있습니다. 일부 기능이 예상대로 작동하지 않을 수 있습니다.", @@ -13,9 +14,13 @@ "path.with.spaces": "공백이 있는 컴파일러 경로를 찾을 수 없습니다. 만약 컴파일러 인수를 포함하려는 의도였다면, 컴파일러 경로를 큰따옴표({0})로 감싸세요.", "cannot.find": "찾을 수 없음: {0}", "path.is.not.a.file": "경로가 파일이 아님: {0}", + "resolve.includePath.took.too.long": "포함 경로 유효성 검사에서 평가하는 데 {0}이(가) 걸림", + "resolve.includePath.failed": "포함 경로를 확인하지 못했습니다. 오류: {0}", "wrapped.with.quotes": "경로 주위에 따옴표를 추가하지 마세요.", "path.is.not.a.directory": "경로가 디렉터리가 아님: {0}", "duplicate.name": "{0}은(는) 중복됩니다. 구성 이름은 고유해야 합니다.", + "resolve.path.took.too.long": "경로에서 평가하는 데 {0}이(가) 걸림", + "resolve.path.failed": "{0} 경로를 확인하지 못했습니다. 오류: {1}", "multiple.paths.not.allowed": "여러 경로는 허용되지 않습니다.", "multiple.paths.should.be.separate.entries": "여러 경로는 배열에서 별도의 항목이어야 합니다.", "paths.are.not.directories": "경로는 디렉터리가 아님: {0}" diff --git a/Extension/i18n/kor/ui/settings.html.i18n.json b/Extension/i18n/kor/ui/settings.html.i18n.json index 13eabc839..1f1180efd 100644 --- a/Extension/i18n/kor/ui/settings.html.i18n.json +++ b/Extension/i18n/kor/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "IntelliSense에 사용할 C++ 언어 표준의 버전입니다. 참고: GNU 표준은 GNU 정의를 가져오기 위해 설정된 컴파일러를 쿼리하는 데만 사용되며, IntelliSense는 해당 C++ 표준 버전을 에뮬레이트합니다.", "advanced.settings": "고급 설정", "configuration.provider": "구성 공급자", - "configuration.provider.description": "소스 파일에 대한 IntelliSense 구성 정보를 제공할 수 있는 VS Code 확장의 ID입니다. 예를 들어 VS Code 확장 ID {0} 을(를) 사용하여 CMake 도구 확장의 구성 정보를 제공합니다.", + "configuration.provider.description": "소스 파일에 대한 IntelliSense 구성 정보를 제공할 수 있는 VS Code 확장의 ID입니다. 예를 들어 VS Code 확장 ID {0}을(를) 사용하여 CMake Tools 확장의 구성 정보를 제공합니다.", "windows.sdk.version": "Windows SDK 버전", "windows.sdk.version.description": "Windows에서 사용할 Windows SDK 포함 경로의 버전입니다(예: {0}).", "mac.framework.path": "Mac 프레임워크 경로", diff --git a/Extension/i18n/plk/package.i18n.json b/Extension/i18n/plk/package.i18n.json index 2041b7db1..58d4ee803 100644 --- a/Extension/i18n/plk/package.i18n.json +++ b/Extension/i18n/plk/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Włącz usługi integracji dla elementu [vcpkg dependency manager](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Dodaj ścieżki dołączania z plików `nan` i `node-addon-api`, jeśli są one zależnościami.", "c_cpp.configuration.copilotHover.markdownDescription": "W przypadku opcji `disabled` po zatrzymaniu wskaźnika myszy nie będzie wyświetlana opcja „Generuj podsumowanie funkcji Copilot”.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Jeśli ustawiono wartość `disabled`, funkcja raportowanie błędów systemu Windows zostanie wyłączona. Jeśli ustawiono wartość `default`, funkcja raportowanie błędów systemu Windows zostanie włączona, ale zostanie wyłączona po pierwszym awarii w bieżącej sesji. Zmiana ustawienia nie ma wpływu na aktualnie uruchomione procesy IntelliSense.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Jeśli ma wartość `true`, element „Symbol zmiany nazwy” będzie wymagać prawidłowego identyfikatora C/C++.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "Jeśli ma wartość `true`, autouzupełnianie będzie automatycznie dodawać znak `(` po wywołaniach funkcji, a w niektórych przypadkach może również dodawać znak `)`, zależnie od ustawienia `#editor.autoClosingBrackets#`.", "c_cpp.configuration.filesExclude.markdownDescription": "Skonfiguruj wzorce globalne na potrzeby wykluczania folderów (i plików w przypadku zmiany zasad `#C_Cpp.exclusionPolicy#`). Są one specyficzne dla rozszerzenia języka C/C++ i są dodatkiem do elementu `#files.exclude#`, ale w przeciwieństwie do elementu `#files.exclude#` mają również zastosowanie do ścieżek spoza bieżącego folderu obszaru roboczego i nie są usuwane z widoku Eksploratora. Przeczytaj więcej o [wzorcach globalnych](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "Adres sieciowy serwera debugera MI, z którym ma zostać nawiązane połączenie (przykład: localhost:1234).", "c_cpp.debuggers.useExtendedRemote.description": "Połącz się z wystąpieniem zarządzanym serwera debugera za pomocą docelowego rozszerzonego trybu zdalnego.", "c_cpp.debuggers.stopAtEntry.markdownDescription": "Parametr opcjonalny. Jeśli wartość to `true`, debuger powinien zostać zatrzymany w punkcie wejścia miejsca docelowego. W przypadku przekazania `processId` nie ma to żadnego efektu.", - "c_cpp.debuggers.debugServerPath.description": "Opcjonalna pełna ścieżka do serwera debugowania, który ma zostać uruchomiony. Wartość domyślna to null. Jest ona używana w połączeniu z właściwością \"miDebuggerServerAddress\" lub Twoim własnym serwerem wraz z poleceniem \"customSetupCommand\", które uruchamia polecenie \"-target-select remote \".", + "c_cpp.debuggers.debugServerPath.description": "Opcjonalna pełna ścieżka do serwera debugowania, który ma zostać uruchomiony. Wartość domyślna to null. Jest on używany w połączeniu z właściwością „miDebuggerServerAddress” lub Twoim własnym serwerem wraz z poleceniem „customSetupCommand”, które uruchamia polecenie „-target-select remote ”.", "c_cpp.debuggers.debugServerArgs.description": "Opcjonalne argumenty serwera debugowania. Wartość domyślna to null.", "c_cpp.debuggers.serverStarted.description": "Opcjonalny wzorzec uruchomiony przez serwer do wyszukania w danych wyjściowych serwera debugowania. Wartością domyślną jest null.", "c_cpp.debuggers.filterStdout.description": "Wyszukiwanie strumienia stdout dla wzorca uruchomionego przez serwer i rejestrowanie strumienia stdout w danych wyjściowych debugowania. Wartością domyślną jest true.", diff --git a/Extension/i18n/plk/src/LanguageServer/client.i18n.json b/Extension/i18n/plk/src/LanguageServer/client.i18n.json index ae660202b..e58f87ecb 100644 --- a/Extension/i18n/plk/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/plk/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "Nie znaleziono żądanej nazwy konfiguracji: {0}", "unsupported.client": "Nieobsługiwany klient", "timed.out": "Przekroczono limit czasu: {0} ms.", + "parsing.stats.large.project": "Wyliczono pliki ({0}) z wykrytymi plikami źródłowymi języka C/C++ ({1}). Warto rozważyć wykluczenie niektórych plików w celu zwiększenia wydajności.", + "learn.more": "Dowiedz się więcej", + "dont.show.again": "Nie pokazuj ponownie", "update.intellisense.time": "Aktualizuj czas funkcji IntelliSense (s): {0}", "configurations.received": "Odebrano konfiguracje niestandardowe:", "browse.configuration.received": "Odebrano niestandardową konfigurację przeglądania: {0}", diff --git a/Extension/i18n/plk/src/LanguageServer/configurations.i18n.json b/Extension/i18n/plk/src/LanguageServer/configurations.i18n.json index 0fcca8b0a..327d1e6be 100644 --- a/Extension/i18n/plk/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/plk/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "Tryb funkcji IntelliSense {0} jest niezgodny z ścieżką kompilatora.", + "resolve.configuration.processed": "Przetworzono plik c_cpp_properties.json w {0} sek.", "failed.to.create.config.folder": "Nie można utworzyć elementu „{0}”", "invalid.configuration.file": "Nieprawidłowy plik konfiguracji. W tablicy musi być obecna co najmniej jedna konfiguracja.", "unknown.properties.version": "W pliku c_cpp_properties.json znaleziono nieznany numer wersji. Niektóre funkcje mogą nie działać w oczekiwany sposób.", @@ -13,9 +14,13 @@ "path.with.spaces": "Nie można odnaleźć ścieżki kompilatora ze spacjami. Jeśli było to przeznaczone do uwzględnienia argumentów kompilatora, otocz ścieżkę kompilatora podwójnym cudzysłowem ({0}).", "cannot.find": "Nie można znaleźć: {0}", "path.is.not.a.file": "Ścieżka nie jest plikiem: {0}", + "resolve.includePath.took.too.long": "Ocena walidacji ścieżki dołączania trwała {0} sek.", + "resolve.includePath.failed": "Nie można rozpoznać ścieżki dołączania. Błąd: {0}", "wrapped.with.quotes": "Nie dodawaj dodatkowych cudzysłowów wokół ścieżek.", "path.is.not.a.directory": "Ścieżka nie jest katalogiem: {0}", "duplicate.name": "Element {0} jest duplikatem. Nazwa konfiguracji musi być unikatowa.", + "resolve.path.took.too.long": "Ocena ścieżki trwała {0} sek.", + "resolve.path.failed": "Nie można rozpoznać ścieżki {0}. Błąd: {1}", "multiple.paths.not.allowed": "Wiele ścieżek jest niedozwolonych.", "multiple.paths.should.be.separate.entries": "Wiele ścieżek powinno być osobnymi wpisami w tablicy.", "paths.are.not.directories": "Ścieżki nie są katalogami: {0}" diff --git a/Extension/i18n/ptb/package.i18n.json b/Extension/i18n/ptb/package.i18n.json index ed44185c0..149251e6e 100644 --- a/Extension/i18n/ptb/package.i18n.json +++ b/Extension/i18n/ptb/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Habilitar os serviços de integração para o [gerenciador de dependências vcpkg](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Adicione caminhos de inclusão de `nan` e `node-addon-api` quando forem dependências.", "c_cpp.configuration.copilotHover.markdownDescription": "Se `disabled`, a opção \"Gerar resumo do Copilot\" não aparecerá ao passar o cursor.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Se `disabled`, o Relatório de Erros do Windows será desabilitado. Se `default`, o Relatório de Erros do Windows será habilitado, mas ele será desabilitado após a primeira falha na sessão atual. Alterar a configuração não afeta os processos do IntelliSense em execução.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Se `true`, 'Renomear Símbolo' exigirá um identificador C/C++ válido.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "Se `true`, autocomplete adicionará automaticamente `(` após chamadas de função, neste caso `)` também pode ser adicionado, dependendo do valor da configuração `#editor.autoClosingBrackets#`.", "c_cpp.configuration.filesExclude.markdownDescription": "Configure padrões glob para excluir pastas (e arquivos se `#C_Cpp.exclusionPolicy#` for alterado). Esses 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 também se aplicam a caminhos fora do espaço de trabalho atual e não são removidos da visualização do Explorer. Saiba mais sobre [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "Endereço de rede do Servidor de Depurador MI ao qual se conectar (exemplo: localhost:1234).", "c_cpp.debuggers.useExtendedRemote.description": "Conecte-se ao MI Debugger Server com o modo remoto estendido de destino.", "c_cpp.debuggers.stopAtEntry.markdownDescription": "Parâmetro opcional. Se for `true`, o depurador deverá parar no ponto de entrada do destino. Se `processId` for passado, isso não terá efeito.", - "c_cpp.debuggers.debugServerPath.description": "Caminho completo opcional para o servidor de depuração a ser lançado. O padrão é nulo. É usado em conjunto com \"miDebuggerServerAddress\" ou seu próprio servidor com um \"customSetupCommand\" que executa \"-target-select remote \".", + "c_cpp.debuggers.debugServerPath.description": "Caminho completo opcional para o servidor de depuração a ser lançado. O padrão é nulo. Ele é usado em conjunto com \"miDebuggerServerAddress\" ou o seu próprio servidor com um \"customSetupCommand\" que executa \"-target-select remote \".", "c_cpp.debuggers.debugServerArgs.description": "Args opcionais do servidor de depuração. O padrão é null.", "c_cpp.debuggers.serverStarted.description": "Padrão iniciado pelo servidor opcional para procurar na saída do servidor de depuração. O padrão é null.", "c_cpp.debuggers.filterStdout.description": "Pesquise o fluxo stdout para o padrão iniciado pelo servidor e log stdout para depurar a saída. O padrão é true.", diff --git a/Extension/i18n/ptb/src/LanguageServer/client.i18n.json b/Extension/i18n/ptb/src/LanguageServer/client.i18n.json index f73f3b681..4fb0487f8 100644 --- a/Extension/i18n/ptb/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/ptb/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "O nome de configuração solicitado não foi encontrado: {0}", "unsupported.client": "Cliente sem suporte", "timed.out": "Tempo limite atingido em {0} ms.", + "parsing.stats.large.project": "{0} arquivos enumerados com {1} arquivos de origem C/C++ detectados. Talvez você queira considerar a exclusão de alguns arquivos para melhorar o desempenho.", + "learn.more": "Saiba Mais", + "dont.show.again": "Não Mostrar Novamente", "update.intellisense.time": "Atualize o tempo do IntelliSense (s): {0}", "configurations.received": "Configurações personalizadas recebidas:", "browse.configuration.received": "Configuração de pesquisa personalizada recebida: {0}", diff --git a/Extension/i18n/ptb/src/LanguageServer/configurations.i18n.json b/Extension/i18n/ptb/src/LanguageServer/configurations.i18n.json index c7d53cfe6..d0b84e280 100644 --- a/Extension/i18n/ptb/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/ptb/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "O modo do IntelliSense {0} é incompatível com o caminho do compilador.", + "resolve.configuration.processed": "Arquivos c_cpp_properties.json processados em {0}s", "failed.to.create.config.folder": "Falha ao criar \"{0}\"", "invalid.configuration.file": "Arquivo de configuração inválido. Precisa haver pelo menos uma configuração presente na matriz.", "unknown.properties.version": "Número de versão desconhecido encontrado em c_cpp_properties.json. Alguns recursos podem não funcionar como esperado.", @@ -13,9 +14,13 @@ "path.with.spaces": "Não foi possível encontrar o caminho do compilador com espaços. Se a intenção era incluir argumentos do compilador, coloque o caminho do compilador entre aspas duplas ({0}).", "cannot.find": "Não é possível localizar: {0}", "path.is.not.a.file": "O caminho não é um arquivo: {0}", + "resolve.includePath.took.too.long": "A validação do caminho de inclusão {0}s para avaliar", + "resolve.includePath.failed": "Falha ao resolver o caminho de inclusão. Erro: {0}", "wrapped.with.quotes": "Não adicione aspas extras ao redor de caminhos.", "path.is.not.a.directory": "O caminho não é um diretório: {0}", "duplicate.name": "{0} é uma duplicata. O nome da configuração deve ser exclusivo.", + "resolve.path.took.too.long": "O caminho levou {0}s para ser avaliado", + "resolve.path.failed": "Falha ao resolver o caminho {0}. Erro: {1}", "multiple.paths.not.allowed": "Vários caminhos não são permitidos.", "multiple.paths.should.be.separate.entries": "Vários caminhos devem ser entradas separadas em uma matriz.", "paths.are.not.directories": "Os caminhos não são diretórios: {0}" diff --git a/Extension/i18n/ptb/ui/settings.html.i18n.json b/Extension/i18n/ptb/ui/settings.html.i18n.json index d15403398..27f33807b 100644 --- a/Extension/i18n/ptb/ui/settings.html.i18n.json +++ b/Extension/i18n/ptb/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "A versão do padrão de linguagem C++ a ser usada para o IntelliSense. Observação: os padrões GNU são usados apenas para consultar o compilador de conjunto para obter definições de GNU e o IntelliSense emulará a versão do C++ padrão equivalente.", "advanced.settings": "Configurações Avançadas", "configuration.provider": "Provedor de configuração", - "configuration.provider.description": "A ID de uma extensão do VS Code que pode fornecer informações de configuração de IntelliSense para arquivos de origem. Por exemplo, use a ID de extensão do VS Code {0} para fornecer informações de configuração da extensão de Ferramentas CMake.", + "configuration.provider.description": "A ID de uma extensão do VS Code que pode fornecer informações de configuração de IntelliSense para arquivos de origem. Por exemplo, use a ID de extensão do VS Code {0} para fornecer informações de configuração da extensão de CMake Tools.", "windows.sdk.version": "Versão do SDK do Windows", "windows.sdk.version.description": "A versão do caminho de inclusão SDK do Windows a ser usada no Windows, por exemplo, {0}.", "mac.framework.path": "Caminho da estrutura do Mac", diff --git a/Extension/i18n/rus/package.i18n.json b/Extension/i18n/rus/package.i18n.json index 7e62935b9..30e743659 100644 --- a/Extension/i18n/rus/package.i18n.json +++ b/Extension/i18n/rus/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "Включите службы интеграции для [диспетчера зависимостей vcpkg](https://aka.ms/vcpkg/).", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "Добавьте пути включения из `nan` и `node-addon-api`, если они являются зависимостями.", "c_cpp.configuration.copilotHover.markdownDescription": "Если `disabled`, при наведении курсора не будет отображаться параметр \"Создать сводку Copilot\".", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Если присвоено значение `disabled`, отчеты об ошибках Windows будут отключены. Если присвоено значение `default`, отчеты об ошибках Windows будут включены, но отключатся после первого сбоя в текущем сеансе. Изменение этого параметра не влияет на уже запущенные процессы IntelliSense.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "Если этот параметр имеет значение `true`, для операции 'Переименование символа' потребуется указать допустимый идентификатор C/C++.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "Если присвоено значение `true`, автозаполнение автоматически добавит `(` после вызовов функции, при этом также может добавляться `)` в зависимости от значения параметра `#editor.autoClosingBrackets#`.", "c_cpp.configuration.filesExclude.markdownDescription": "Настройка стандартных масок для исключения папок (и файлов, если внесено изменение в `#C_Cpp.exclusionPolicy#`). Они специфичны для расширения C/C++ и дополняют `#files.exclude#`, но в отличие от `#files.exclude#` они применяются также к путям вне папки используемой рабочей области и не удаляются из представления обозревателя. Дополнительные сведения о [шаблонах глобусов](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", @@ -310,7 +311,7 @@ "c_cpp.debuggers.miDebuggerServerAddress.description": "Сетевой адрес сервера отладчика MI, к которому требуется подключиться (пример: localhost:1234).", "c_cpp.debuggers.useExtendedRemote.description": "Подключение к серверу отладчика MI в целевом расширенном удаленном режиме.", "c_cpp.debuggers.stopAtEntry.markdownDescription": "Необязательный параметр. Если задано значение `true`, отладчик должен остановиться в точке входа целевого объекта.. Если передается идентификатор процесса `processId`, этот параметр не действует.", - "c_cpp.debuggers.debugServerPath.description": "Необязательный полный путь к запускаемому серверу отладки. Значение по умолчанию — NULL. Применяется с параметром miDebuggerServerAddress или с вашим собственным сервером через команду customSetupCommand, использующую -target-select remote .", + "c_cpp.debuggers.debugServerPath.description": "Необязательный полный путь к запускаемому серверу отладки. Значение по умолчанию — null. Применяется с параметром miDebuggerServerAddress или с вашим собственным сервером через команду customSetupCommand, использующую -target-select remote .", "c_cpp.debuggers.debugServerArgs.description": "Необязательные аргументы сервера отладки. Значение по умолчанию: null.", "c_cpp.debuggers.serverStarted.description": "Дополнительный запускаемый сервером шаблон для поиска в выходных данных сервера отладки. Значение по умолчанию: null.", "c_cpp.debuggers.filterStdout.description": "Поиск запущенного сервером шаблона в потоке stdout и регистрация stdout в выходных данных отладки. Значение по умолчанию: true.", diff --git a/Extension/i18n/rus/src/LanguageServer/client.i18n.json b/Extension/i18n/rus/src/LanguageServer/client.i18n.json index 1cdad83df..d43373cfb 100644 --- a/Extension/i18n/rus/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/rus/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "Запрошенное имя конфигурации не найдено: {0}", "unsupported.client": "Неподдерживаемый клиент", "timed.out": "Время ожидания истекло через {0} мс.", + "parsing.stats.large.project": "Обнаружены перечисленные файлы ({0}) с исходными файлами C/C++ ({1}). Следует рассмотреть возможность исключения некоторых файлов для повышения производительности.", + "learn.more": "Подробнее", + "dont.show.again": "Больше не показывать", "update.intellisense.time": "Время обновления IntelliSense (в секундах): {0}", "configurations.received": "Получены пользовательские конфигурации:", "browse.configuration.received": "Получена настраиваемая конфигурация просмотра: {0}", diff --git a/Extension/i18n/rus/src/LanguageServer/configurations.i18n.json b/Extension/i18n/rus/src/LanguageServer/configurations.i18n.json index adcfa9960..ee716e148 100644 --- a/Extension/i18n/rus/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/rus/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "Режим IntelliSense {0} несовместим с путем компилятора.", + "resolve.configuration.processed": "Обработан файл c_cpp_properties.json за {0} с", "failed.to.create.config.folder": "Не удалось создать \"{0}\"", "invalid.configuration.file": "Недопустимый файл конфигурации. В массиве должна присутствовать по меньшей мере одна конфигурация.", "unknown.properties.version": "В c_cpp_properties.json найден неизвестный номер версии. Некоторые функции могут работать не так, как ожидалось.", @@ -13,9 +14,13 @@ "path.with.spaces": "Не удалось найти путь компилятора с пробелами. Если предполагается включение аргументов компилятора, заключите путь компилятора в двойные кавычки ({0}).", "cannot.find": "Не удается найти: {0}", "path.is.not.a.file": "Путь не является файлом: {0}", + "resolve.includePath.took.too.long": "Оценка проверки пути включения заняла {0} с", + "resolve.includePath.failed": "Не удалось разрешить путь включения. Ошибка: {0}", "wrapped.with.quotes": "Не добавляйте лишние кавычки вокруг путей.", "path.is.not.a.directory": "Путь не является каталогом: {0}", "duplicate.name": "{0} является дубликатом. Имя конфигурации должно быть уникальным.", + "resolve.path.took.too.long": "Оценка пути заняла {0} с", + "resolve.path.failed": "Не удалось разрешить путь {0}. Ошибка: {1}", "multiple.paths.not.allowed": "Запрещено использовать несколько путей.", "multiple.paths.should.be.separate.entries": "Несколько путей должны быть отдельными записями в массиве.", "paths.are.not.directories": "Пути не являются каталогами: {0}" diff --git a/Extension/i18n/rus/ui/settings.html.i18n.json b/Extension/i18n/rus/ui/settings.html.i18n.json index 1c0d68c18..97f85b2ce 100644 --- a/Extension/i18n/rus/ui/settings.html.i18n.json +++ b/Extension/i18n/rus/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "Версия стандарта языка C++, используемая для IntelliSense. Примечание: стандарты GNU используются только для запроса определений GNU у установленного компилятора, а IntelliSense будет эмулировать эквивалентную версию стандарта C++.", "advanced.settings": "Дополнительные параметры", "configuration.provider": "Поставщик конфигурации", - "configuration.provider.description": "Идентификатор расширения VS Code, которое может предоставлять сведения о конфигурации IntelliSense для исходных файлов. Например, используйте идентификатор расширения VS Code {0}, чтобы предоставить сведения о конфигурации из расширения \"Средства CMake\".", + "configuration.provider.description": "Идентификатор расширения VS Code, которое может предоставлять сведения о конфигурации IntelliSense для исходных файлов. Например, используйте идентификатор расширения VS Code {0}, чтобы предоставить сведения о конфигурации из расширения CMake Tools.", "windows.sdk.version": "Версия Windows SDK", "windows.sdk.version.description": "Версия пути включения Windows SDK для использования в Windows, например {0}.", "mac.framework.path": "Путь к платформе Mac", diff --git a/Extension/i18n/trk/package.i18n.json b/Extension/i18n/trk/package.i18n.json index e78861af3..90c846fd4 100644 --- a/Extension/i18n/trk/package.i18n.json +++ b/Extension/i18n/trk/package.i18n.json @@ -255,6 +255,7 @@ "c_cpp.configuration.vcpkg.enabled.markdownDescription": "[vcpkg bağımlılık yöneticisi](https://aka.ms/vcpkg/) için tümleştirme hizmetlerini etkinleştirin.", "c_cpp.configuration.addNodeAddonIncludePaths.markdownDescription": "`nan` ve `node-addon-api` bağımlılık olduğunda bunlardan ekleme yolları ekleyin.", "c_cpp.configuration.copilotHover.markdownDescription": "`disabled` durumunda, üzerine gelindiğinde 'Copilot özeti oluştur' seçeneği görüntülenmez.", + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": "Ayar `disabled` olursa, Windows Hata Bildirimi devre dışı bırakılır. Ayar `default` olursa, Windows Hata Bildirimi etkinleştirilir ancak geçerli oturumdaki ilk kilitlenmenin ardından devre dışı duruma geçer. Ayarın değiştirilmesi, şu anda çalışmakta olan IntelliSense işlemlerini etkilemez.", "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": "`true` ise, 'Sembolü Yeniden Adlandır' işlemi için geçerli bir C/C++ tanımlayıcısı gerekir.", "c_cpp.configuration.autocompleteAddParentheses.markdownDescription": "`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.markdownDescription": "Klasörleri (ve `#C_Cpp.exclusionPolicy#` değiştirilirse dosyaları) hariç tutmak için glob desenlerini yapılandırın. Bunlar, C/C++ uzantısına özgüdür ve `#files.exclude#` öğesine ek olarak, ancak `#files.exclude#` öğesinden farklı olarak, geçerli çalışma alanı klasörünün dışındaki yollara da uygulanırlar ve Explorer görünümünden kaldırılmazlar. [Glob desenleri](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) ile ilgili daha fazla bilgi edinin.", diff --git a/Extension/i18n/trk/src/LanguageServer/client.i18n.json b/Extension/i18n/trk/src/LanguageServer/client.i18n.json index e00893b94..baabfc89c 100644 --- a/Extension/i18n/trk/src/LanguageServer/client.i18n.json +++ b/Extension/i18n/trk/src/LanguageServer/client.i18n.json @@ -30,6 +30,9 @@ "config.not.found": "İstenen yapılandırma adı bulunamadı: {0}", "unsupported.client": "Desteklenmeyen istemci", "timed.out": "{0} ms'de zaman aşımına uğradı.", + "parsing.stats.large.project": "{1} C/C++ kaynak dosyası algılanan {0} dosya listelendi. Daha iyi performans için bazı dosyaları hariç tutmayı düşünebilirsiniz.", + "learn.more": "Daha Fazla Bilgi Edinin", + "dont.show.again": "Bir Daha Gösterme", "update.intellisense.time": "IntelliSense güncelleştirme zamanı (sn): {0}", "configurations.received": "Alınan özel yapılandırmalar:", "browse.configuration.received": "Özel gözatma yapılandırması alındı: {0}", diff --git a/Extension/i18n/trk/src/LanguageServer/configurations.i18n.json b/Extension/i18n/trk/src/LanguageServer/configurations.i18n.json index e0f009e6f..9a690d6dc 100644 --- a/Extension/i18n/trk/src/LanguageServer/configurations.i18n.json +++ b/Extension/i18n/trk/src/LanguageServer/configurations.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "incompatible.intellisense.mode": "{0} IntelliSense modu, derleyici yolu ile uyumsuz.", + "resolve.configuration.processed": "c_cpp_properties.json dosyası {0} saniyede işlendi", "failed.to.create.config.folder": "\"{0}\" oluşturulamadı", "invalid.configuration.file": "Yapılandırma dosyası geçersiz. Dizide mevcut en az bir yapılandırma olmalıdır.", "unknown.properties.version": "c_cpp_properties.json dosyasında bilinmeyen sürüm numarası bulundu. Bazı özellikler beklendiği gibi çalışmayabilir.", @@ -13,9 +14,13 @@ "path.with.spaces": "Boşluk içeren derleyici yolu bulunamadı. Eğer bunun, derleyici bağımsız değişkenlerini içermesi amaçlandıysa, derleyici yolunu çift tırnak ({0}) ile çevreleyin.", "cannot.find": "{0} bulunamıyor", "path.is.not.a.file": "Yol bir dosya değil: {0}", + "resolve.includePath.took.too.long": "Dahil etme yolu doğrulama {0} saniye sürdü", + "resolve.includePath.failed": "Dahil etme yolunu çözemedi. Hata: {0}", "wrapped.with.quotes": "Yolların etrafına fazladan tırnak işareti eklemeyin.", "path.is.not.a.directory": "Yol bir dizin değil: {0}", "duplicate.name": "{0} yineleniyor. Yapılandırma adı benzersiz olmalıdır.", + "resolve.path.took.too.long": "Yolun değerlendirilmesi {0} saniye sürdü", + "resolve.path.failed": "Yol {0} çözülemedi. Hata: {1}", "multiple.paths.not.allowed": "Birden fazla yola izin verilmez.", "multiple.paths.should.be.separate.entries": "Birden çok yol bir dizideki ayrı girişler olmalıdır.", "paths.are.not.directories": "Yollar dizin değil: {0}" diff --git a/Extension/i18n/trk/ui/settings.html.i18n.json b/Extension/i18n/trk/ui/settings.html.i18n.json index c340cd2b2..ef9983598 100644 --- a/Extension/i18n/trk/ui/settings.html.i18n.json +++ b/Extension/i18n/trk/ui/settings.html.i18n.json @@ -44,7 +44,7 @@ "cpp.standard.description": "IntelliSense için kullanılacak C++ dil standardı sürümü. Not: GNU standartları yalnızca GNU tanımlarını almak için ayarlanan derleyiciyi sorgulamak amacıyla kullanılır ve IntelliSense, eşdeğer C++ standart sürümüne öykünür.", "advanced.settings": "Gelişmiş Ayarlar", "configuration.provider": "Yapılandırma sağlayıcısı", - "configuration.provider.description": "Kaynak dosyalar için IntelliSense yapılandırma bilgilerini sağlayabilecek VS Code uzantısının kimliği. Örneğin, CMake Araçları uzantısındaki yapılandırma bilgilerini sağlamak için VS Code {0} uzantı kimliğini kullanın.", + "configuration.provider.description": "Kaynak dosyalar için IntelliSense yapılandırma bilgilerini sağlayabilecek VS Code uzantısının kimliği. Örneğin, Cmake Tools uzantısındaki yapılandırma bilgilerini sağlamak için VS Code {0} uzantı kimliğini kullanın.", "windows.sdk.version": "Windows SDK sürümü", "windows.sdk.version.description": "Windows üzerinde kullanılacak Windows SDK ekleme yolu sürümü, örneğin {0}.", "mac.framework.path": "Mac çerçevesi yolu", diff --git a/Extension/package.json b/Extension/package.json index 6b1c0812b..f5b7eddc3 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.27.0-main", + "version": "1.27.7-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", @@ -1901,6 +1901,7 @@ "bugprone-bitwise-pointer-cast", "bugprone-bool-pointer-implicit-conversion", "bugprone-branch-clone", + "bugprone-capturing-this-in-member-variable", "bugprone-casting-through-void", "bugprone-chained-comparison", "bugprone-compare-pointer-to-member-virtual-function", @@ -1926,6 +1927,7 @@ "bugprone-lambda-function-name", "bugprone-macro-parentheses", "bugprone-macro-repeated-side-effects", + "bugprone-misleading-setter-of-reference", "bugprone-misplaced-*", "bugprone-misplaced-operator-in-strlen-in-alloc", "bugprone-misplaced-pointer-arithmetic-in-alloc", @@ -1982,6 +1984,7 @@ "bugprone-unhandled-*", "bugprone-unhandled-exception-at-new", "bugprone-unhandled-self-assignment", + "bugprone-unintended-char-ostream-output", "bugprone-unique-ptr-array-mismatch", "bugprone-unsafe-functions", "bugprone-unused-*", @@ -2208,6 +2211,8 @@ "cppcoreguidelines-rvalue-reference-param-not-moved", "cppcoreguidelines-slicing", "cppcoreguidelines-special-member-functions", + "cppcoreguidelines-use-*", + "cppcoreguidelines-use-enum-class", "cppcoreguidelines-use-default-member-init", "cppcoreguidelines-virtual-class-destructor", "darwin-*", @@ -2293,6 +2298,7 @@ "llvm-prefer-*", "llvm-prefer-isa-or-dyn-cast-in-conditionals", "llvm-prefer-register-over-unsigned", + "llvm-prefer-static-over-anonymous-namespace", "llvm-qualified-auto", "llvm-twine-local", "llvmlibc-*", @@ -2370,6 +2376,7 @@ "modernize-use-nullptr", "modernize-use-override", "modernize-use-ranges", + "modernize-use-scoped-lock", "modernize-use-starts-ends-with", "modernize-use-std-*", "modernize-use-std-format", @@ -2421,11 +2428,13 @@ "performance-unnecessary-copy-initialization", "performance-unnecessary-value-param", "portability-*", + "portability-avoid-pragma-once", "portability-restrict-system-includes", "portability-simd-intrinsics", "portability-std-allocator-const", "portability-template-virtual-member-function", "readability-*", + "readability-ambiguous-smartptr-reset-call", "readability-avoid-*", "readability-avoid-const-params-in-decls", "readability-avoid-nested-conditional-operator", @@ -2486,6 +2495,7 @@ "readability-uppercase-literal-suffix", "readability-use-*", "readability-use-anyofallof", + "readability-use-concise-preprocessor-directives", "readability-use-std-min-max", "zircon-temporary-objects" ] @@ -2561,6 +2571,7 @@ "bugprone-bitwise-pointer-cast", "bugprone-bool-pointer-implicit-conversion", "bugprone-branch-clone", + "bugprone-capturing-this-in-member-variable", "bugprone-casting-through-void", "bugprone-chained-comparison", "bugprone-compare-pointer-to-member-virtual-function", @@ -2586,6 +2597,7 @@ "bugprone-lambda-function-name", "bugprone-macro-parentheses", "bugprone-macro-repeated-side-effects", + "bugprone-misleading-setter-of-reference", "bugprone-misplaced-*", "bugprone-misplaced-operator-in-strlen-in-alloc", "bugprone-misplaced-pointer-arithmetic-in-alloc", @@ -2642,6 +2654,7 @@ "bugprone-unhandled-*", "bugprone-unhandled-exception-at-new", "bugprone-unhandled-self-assignment", + "bugprone-unintended-char-ostream-output", "bugprone-unique-ptr-array-mismatch", "bugprone-unsafe-functions", "bugprone-unused-*", @@ -2868,6 +2881,8 @@ "cppcoreguidelines-rvalue-reference-param-not-moved", "cppcoreguidelines-slicing", "cppcoreguidelines-special-member-functions", + "cppcoreguidelines-use-*", + "cppcoreguidelines-use-enum-class", "cppcoreguidelines-use-default-member-init", "cppcoreguidelines-virtual-class-destructor", "darwin-*", @@ -2953,6 +2968,7 @@ "llvm-prefer-*", "llvm-prefer-isa-or-dyn-cast-in-conditionals", "llvm-prefer-register-over-unsigned", + "llvm-prefer-static-over-anonymous-namespace", "llvm-qualified-auto", "llvm-twine-local", "llvmlibc-*", @@ -3030,6 +3046,7 @@ "modernize-use-nullptr", "modernize-use-override", "modernize-use-ranges", + "modernize-use-scoped-lock", "modernize-use-starts-ends-with", "modernize-use-std-*", "modernize-use-std-format", @@ -3081,11 +3098,13 @@ "performance-unnecessary-copy-initialization", "performance-unnecessary-value-param", "portability-*", + "portability-avoid-pragma-once", "portability-restrict-system-includes", "portability-simd-intrinsics", "portability-std-allocator-const", "portability-template-virtual-member-function", "readability-*", + "readability-ambiguous-smartptr-reset-call", "readability-avoid-*", "readability-avoid-const-params-in-decls", "readability-avoid-nested-conditional-operator", @@ -3146,6 +3165,7 @@ "readability-uppercase-literal-suffix", "readability-use-*", "readability-use-anyofallof", + "readability-use-concise-preprocessor-directives", "readability-use-std-min-max", "zircon-temporary-objects" ] @@ -3379,6 +3399,17 @@ "default": "default", "markdownDescription": "%c_cpp.configuration.copilotHover.markdownDescription%", "scope": "window" + }, + "C_Cpp.windowsErrorReportingMode": { + "type": "string", + "enum": [ + "default", + "enabled", + "disabled" + ], + "default": "default", + "markdownDescription": "%c_cpp.configuration.windowsErrorReportingMode.markdownDescription%", + "scope": "window" } } } @@ -6625,4 +6656,4 @@ "postcss": "^8.4.31", "gulp-typescript/**/glob-parent": "^5.1.2" } -} +} \ No newline at end of file diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 34295589f..c6bc95490 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -790,6 +790,12 @@ "{Locked=\"`disabled`\"} {Locked=\"Copilot\"}" ] }, + "c_cpp.configuration.windowsErrorReportingMode.markdownDescription": { + "message": "If `disabled`, Windows Error Reporting will be disabled. If `default`, Windows Error Reporting will be enabled, but it becomes disabled after the first crash in the current session. Changing the setting doesn't affect currently running IntelliSense processes.", + "comment": [ + "{Locked=\"`disabled`\"} {Locked=\"`default`\"} {Locked=\"`IntelliSense`\"}" + ] + }, "c_cpp.configuration.renameRequiresIdentifier.markdownDescription": { "message": "If `true`, 'Rename Symbol' will require a valid C/C++ identifier.", "comment": [ @@ -1084,4 +1090,4 @@ "c_cpp.configuration.refactoring.includeHeader.never.description": "Never include the header file.", "c_cpp.languageModelTools.configuration.displayName": "C/C++ configuration", "c_cpp.languageModelTools.configuration.userDescription": "Configuration of the active C or C++ file, like language standard version and target platform." -} +} \ No newline at end of file diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 7345b0c78..40611c728 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -59,7 +59,7 @@ import { CopilotCompletionContextFeatures, CopilotCompletionContextProvider } fr import { CustomConfigurationProvider1, getCustomConfigProviders, isSameProviderExtensionId } from './customProviders'; import { DataBinding } from './dataBinding'; import { cachedEditorConfigSettings, getEditorConfigSettings } from './editorConfig'; -import { CppSourceStr, clients, configPrefix, initializeIntervalTimer, updateLanguageConfigurations, usesCrashHandler, watchForCrashes } from './extension'; +import { CppSourceStr, clients, configPrefix, initializeIntervalTimer, isWritingCrashCallStack, updateLanguageConfigurations, usesCrashHandler, watchForCrashes } from './extension'; import { LocalizeStringParams, getLocaleId, getLocalizedString } from './localization'; import { PersistentFolderState, PersistentState, PersistentWorkspaceState } from './persistentState'; import { RequestCancelled, ServerCancelled, createProtocolFilter } from './protocolFilter'; @@ -90,6 +90,7 @@ export function hasTrustedCompilerPaths(): boolean { // Data shared by all clients. let languageClient: LanguageClient; let firstClientStarted: Promise<{ wasShutdown: boolean }>; +let languageClientHasCrashed: boolean = false; let languageClientCrashedNeedsRestart: boolean = false; const languageClientCrashTimes: number[] = []; let compilerDefaults: configs.CompilerDefaults | undefined; @@ -953,6 +954,8 @@ export class DefaultClient implements Client { public getShowConfigureIntelliSenseButton(): boolean { return this.showConfigureIntelliSenseButton; } public setShowConfigureIntelliSenseButton(show: boolean): void { this.showConfigureIntelliSenseButton = show; } + private lastInvokedLspMessage: string = ""; // e.g. cpptools/hover + /** * don't use this.rootFolder directly since it can be undefined */ @@ -1387,7 +1390,7 @@ export class DefaultClient implements Client { this.semanticTokensProviderDisposable = vscode.languages.registerDocumentSemanticTokensProvider(util.documentSelector, this.semanticTokensProvider, semanticTokensLegend); } - this.copilotCompletionProvider = await CopilotCompletionContextProvider.Create(); + this.copilotCompletionProvider = CopilotCompletionContextProvider.Create(); this.disposables.push(this.copilotCompletionProvider); // Listen for messages from the language server. @@ -1598,6 +1601,7 @@ export class DefaultClient implements Client { codeAnalysisMaxMemory: workspaceSettings.codeAnalysisMaxMemory, codeAnalysisUpdateDelay: workspaceSettings.codeAnalysisUpdateDelay, copilotHover: workspaceSettings.copilotHover, + windowsErrorReportingMode: workspaceSettings.windowsErrorReportingMode, workspaceFolderSettings: workspaceFolderSettingsParams }; } @@ -1686,9 +1690,9 @@ export class DefaultClient implements Client { errorHandler: { error: (_error, _message, _count) => ({ action: ErrorAction.Continue }), closed: () => { + languageClientHasCrashed = true; languageClientCrashTimes.push(Date.now()); languageClientCrashedNeedsRestart = true; - telemetry.logLanguageServerEvent("languageClientCrash"); let restart: boolean = true; if (languageClientCrashTimes.length < 5) { void clients.recreateClients(); @@ -1702,6 +1706,27 @@ export class DefaultClient implements Client { void clients.recreateClients(); } } + + // Wait 1 second to allow time for the file watcher to signal a crash call stack write has occurred. + setTimeout(() => { + const sanitizedLspMessage = this.lastInvokedLspMessage.replace('/', '.'); + telemetry.logLanguageServerEvent("languageClientCrash", + { + lastInvokedLspMessage: sanitizedLspMessage + }, + { + restarting: Number(restart), + writingCrashCallStack: Number(isWritingCrashCallStack), + initializingWorkspace: Number(this.model.isInitializingWorkspace.Value), + indexingWorkspace: Number(this.model.isIndexingWorkspace.Value), + parsingWorkspace: Number(this.model.isParsingWorkspace.Value), + parsingFiles: Number(this.model.isParsingFiles.Value), + updatingIntelliSense: Number(this.model.isUpdatingIntelliSense.Value), + runningCodeAnalysis: Number(this.model.isRunningCodeAnalysis.Value) + } + ); + }, 1000); + const message: string = restart ? localize('server.crashed.restart', 'The language server crashed. Restarting...') : localize('server.crashed2', 'The language server crashed 5 times in the last 3 minutes. It will not be restarted.'); @@ -1723,13 +1748,19 @@ export class DefaultClient implements Client { languageClient = new LanguageClient(`cpptools`, serverOptions, clientOptions); languageClient.onNotification(DebugProtocolNotification, logDebugProtocol); languageClient.onNotification(DebugLogNotification, logLocalized); - languageClient.onNotification(LogTelemetryNotification, (e) => this.logTelemetry(e)); + languageClient.onNotification(LogTelemetryNotification, (e) => void this.logTelemetry(e)); languageClient.onNotification(ShowMessageWindowNotification, showMessageWindow); languageClient.registerProposedFeatures(); await languageClient.start(); if (usesCrashHandler()) { watchForCrashes(await languageClient.sendRequest(PreInitializationRequest, null)); + } else if (os.platform() === "win32") { + const settings: CppSettings = new CppSettings(); + if ((settings.windowsErrorReportingMode === "default" && !languageClientHasCrashed) || + settings.windowsErrorReportingMode === "enabled") { + await languageClient.sendRequest(PreInitializationRequest, null); + } } // Move initialization to a separate message, so we can see log output from it. @@ -2262,9 +2293,12 @@ export class DefaultClient implements Client { message += ` (${err})`; } - if (await vscode.window.showInformationMessage(message, dismiss, disable) === disable) { - settings.toggleSetting("configurationWarnings", "enabled", "disabled"); - } + // Do not await here, as that would prevent the function from returning until the user dismisses the message. + void vscode.window.showInformationMessage(message, dismiss, disable).then(result => { + if (result === disable) { + settings.toggleSetting("configurationWarnings", "enabled", "disabled"); + } + }); } } return result; @@ -2757,10 +2791,38 @@ export class DefaultClient implements Client { } } - private logTelemetry(notificationBody: TelemetryPayload): void { + private excessiveFilesWarningShown: boolean = false; + private async logTelemetry(notificationBody: TelemetryPayload): Promise { if (notificationBody.event === "includeSquiggles" && this.configurationProvider && notificationBody.properties) { notificationBody.properties["providerId"] = this.configurationProvider; } + + const showExcessiveFilesWarning = new PersistentWorkspaceState('CPP.showExcessiveFilesWarning', true); + if (!this.excessiveFilesWarningShown && showExcessiveFilesWarning.Value && notificationBody.event === 'ParsingStats') { + const filesDiscovered = notificationBody.metrics?.filesDiscovered ?? 0; + const parsableFiles = notificationBody.metrics?.parsableFiles ?? 0; + if (filesDiscovered > 250000 || parsableFiles > 100000) { + // According to telemetry, less than 3% of workspaces have this many files so it seems like a reasonable threshold. + + const message = localize( + "parsing.stats.large.project", + 'Enumerated {0} files with {1} C/C++ source files detected. You may want to consider excluding some files for better performance.', + filesDiscovered, + parsableFiles); + const learnMore = localize('learn.more', 'Learn More'); + const dontShowAgain = localize('dont.show.again', 'Don\'t Show Again'); + + // We only want to show this once per session. + this.excessiveFilesWarningShown = true; + const response = await vscode.window.showInformationMessage(message, learnMore, dontShowAgain); + + if (response === dontShowAgain) { + showExcessiveFilesWarning.Value = false; + } else if (response === learnMore) { + void vscode.commands.executeCommand('vscode.open', vscode.Uri.parse('https://go.microsoft.com/fwlink/?linkid=2333292')); + } + } + } telemetry.logLanguageServerEvent(notificationBody.event, notificationBody.properties, notificationBody.metrics); } @@ -2768,55 +2830,59 @@ export class DefaultClient implements Client { const message: string = notificationBody.status; util.setProgress(util.getProgressExecutableSuccess()); const testHook: TestHook = getTestHook(); - if (message.endsWith("Idle")) { - const status: IntelliSenseStatus = { status: Status.Idle }; - testHook.updateStatus(status); - } else if (message.endsWith("Parsing")) { - this.model.isParsingWorkspace.Value = true; - this.model.isInitializingWorkspace.Value = false; - this.model.isIndexingWorkspace.Value = false; - const status: IntelliSenseStatus = { status: Status.TagParsingBegun }; - testHook.updateStatus(status); - } else if (message.endsWith("Initializing")) { - this.model.isInitializingWorkspace.Value = true; - this.model.isIndexingWorkspace.Value = false; - this.model.isParsingWorkspace.Value = false; - } else if (message.endsWith("Indexing")) { - this.model.isIndexingWorkspace.Value = true; - this.model.isInitializingWorkspace.Value = false; - this.model.isParsingWorkspace.Value = false; - } else if (message.endsWith("files")) { - this.model.isParsingFiles.Value = true; - } else if (message.endsWith("IntelliSense")) { - timeStamp = Date.now(); - this.model.isUpdatingIntelliSense.Value = true; - const status: IntelliSenseStatus = { status: Status.IntelliSenseCompiling }; - testHook.updateStatus(status); - } else if (message.endsWith("IntelliSense done")) { - getOutputChannelLogger().appendLineAtLevel(6, localize("update.intellisense.time", "Update IntelliSense time (sec): {0}", (Date.now() - timeStamp) / 1000)); - this.model.isUpdatingIntelliSense.Value = false; - const status: IntelliSenseStatus = { status: Status.IntelliSenseReady }; - testHook.updateStatus(status); - } else if (message.endsWith("Parsing done")) { // Tag Parser Ready - this.model.isParsingWorkspace.Value = false; - const status: IntelliSenseStatus = { status: Status.TagParsingDone }; - testHook.updateStatus(status); - util.setProgress(util.getProgressParseRootSuccess()); - } else if (message.endsWith("files done")) { - this.model.isParsingFiles.Value = false; - } else if (message.endsWith("Analysis")) { - this.model.isRunningCodeAnalysis.Value = true; - this.model.codeAnalysisTotal.Value = 1; - this.model.codeAnalysisProcessed.Value = 0; - } else if (message.endsWith("Analysis done")) { - this.model.isRunningCodeAnalysis.Value = false; - } else if (message.includes("Squiggles Finished - File name:")) { - const index: number = message.lastIndexOf(":"); - const name: string = message.substring(index + 2); - const status: IntelliSenseStatus = { status: Status.IntelliSenseReady, filename: name }; - testHook.updateStatus(status); - } else if (message.endsWith("No Squiggles")) { - util.setIntelliSenseProgress(util.getProgressIntelliSenseNoSquiggles()); + if (message.startsWith("C_Cpp: ")) { + if (message.endsWith("Idle")) { + const status: IntelliSenseStatus = { status: Status.Idle }; + testHook.updateStatus(status); + } else if (message.endsWith("Parsing")) { + this.model.isParsingWorkspace.Value = true; + this.model.isInitializingWorkspace.Value = false; + this.model.isIndexingWorkspace.Value = false; + const status: IntelliSenseStatus = { status: Status.TagParsingBegun }; + testHook.updateStatus(status); + } else if (message.endsWith("Initializing")) { + this.model.isInitializingWorkspace.Value = true; + this.model.isIndexingWorkspace.Value = false; + this.model.isParsingWorkspace.Value = false; + } else if (message.endsWith("Indexing")) { + this.model.isIndexingWorkspace.Value = true; + this.model.isInitializingWorkspace.Value = false; + this.model.isParsingWorkspace.Value = false; + } else if (message.endsWith("files")) { + this.model.isParsingFiles.Value = true; + } else if (message.endsWith("IntelliSense")) { + timeStamp = Date.now(); + this.model.isUpdatingIntelliSense.Value = true; + const status: IntelliSenseStatus = { status: Status.IntelliSenseCompiling }; + testHook.updateStatus(status); + } else if (message.endsWith("IntelliSense done")) { + getOutputChannelLogger().appendLineAtLevel(6, localize("update.intellisense.time", "Update IntelliSense time (sec): {0}", (Date.now() - timeStamp) / 1000)); + this.model.isUpdatingIntelliSense.Value = false; + const status: IntelliSenseStatus = { status: Status.IntelliSenseReady }; + testHook.updateStatus(status); + } else if (message.endsWith("Parsing done")) { // Tag Parser Ready + this.model.isParsingWorkspace.Value = false; + const status: IntelliSenseStatus = { status: Status.TagParsingDone }; + testHook.updateStatus(status); + util.setProgress(util.getProgressParseRootSuccess()); + } else if (message.endsWith("files done")) { + this.model.isParsingFiles.Value = false; + } else if (message.endsWith("Analysis")) { + this.model.isRunningCodeAnalysis.Value = true; + this.model.codeAnalysisTotal.Value = 1; + this.model.codeAnalysisProcessed.Value = 0; + } else if (message.endsWith("Analysis done")) { + this.model.isRunningCodeAnalysis.Value = false; + } else if (message.includes("Squiggles Finished - File name:")) { + const index: number = message.lastIndexOf(":"); + const name: string = message.substring(index + 2); + const status: IntelliSenseStatus = { status: Status.IntelliSenseReady, filename: name }; + testHook.updateStatus(status); + } else if (message.endsWith("No Squiggles")) { + util.setIntelliSenseProgress(util.getProgressIntelliSenseNoSquiggles()); + } + } else if (message.includes("/")) { + this.lastInvokedLspMessage = message; } } diff --git a/Extension/src/LanguageServer/clientCollection.ts b/Extension/src/LanguageServer/clientCollection.ts index 6788eb65d..a6b21f431 100644 --- a/Extension/src/LanguageServer/clientCollection.ts +++ b/Extension/src/LanguageServer/clientCollection.ts @@ -121,6 +121,7 @@ export class ClientCollection { const client: cpptools.Client = pair[1]; const newClient: cpptools.Client = this.createClient(client.RootFolder, true); + await newClient.ready; for (const document of client.TrackedDocuments.values()) { this.transferOwnership(document, client); await newClient.sendDidOpen(document); diff --git a/Extension/src/LanguageServer/codeAnalysis.ts b/Extension/src/LanguageServer/codeAnalysis.ts index 64a00247c..02d35a58c 100644 --- a/Extension/src/LanguageServer/codeAnalysis.ts +++ b/Extension/src/LanguageServer/codeAnalysis.ts @@ -379,7 +379,7 @@ export function publishCodeAnalysisDiagnostics(params: PublishCodeAnalysisDiagno docPage = `checks${checksGroup}/${checksPage}.html`; } // TODO: This should be checking the clang-tidy version used to better support usage of older versions. - const primaryDocUri: vscode.Uri = vscode.Uri.parse(`https://releases.llvm.org/20.1.0/tools/clang/tools/extra/docs/clang-tidy/${docPage}`); + const primaryDocUri: vscode.Uri = vscode.Uri.parse(`https://releases.llvm.org/21.1.0/tools/clang/tools/extra/docs/clang-tidy/${docPage}`); diagnostic.code = { value: identifier.code, target: primaryDocUri }; if (new CppSettings().clangTidyCodeActionShowDocumentation) { diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index 8a08b9987..ea135109d 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -24,6 +24,7 @@ import { PersistentFolderState } from './persistentState'; import { CppSettings, OtherSettings } from './settings'; import { SettingsPanel } from './settingsPanel'; import { ConfigurationType, getUI } from './ui'; +import { Deferral } from './utils'; import escapeStringRegExp = require('escape-string-regexp'); nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); @@ -152,7 +153,6 @@ export class CppProperties { private defaultCStandard: string | null = null; private defaultCppStandard: string | null = null; private defaultWindowsSdkVersion: string | null = null; - private isCppPropertiesJsonVisible: boolean = false; private vcpkgIncludes: string[] = []; private vcpkgPathReady: boolean = false; private nodeAddonIncludes: string[] = []; @@ -250,7 +250,6 @@ export class CppProperties { } public setupConfigurations(): void { - // defaultPaths is only used when there isn't a c_cpp_properties.json, but we don't send the configuration changed event // to the language server until the default include paths and frameworks have been sent. @@ -280,21 +279,21 @@ export class CppProperties { }); vscode.workspace.onDidChangeTextDocument((e) => { - if (e.document.uri.fsPath === settingsPath && this.isCppPropertiesJsonVisible) { - void this.handleSquiggles().catch(logAndReturn.undefined); + if (e.document.uri.fsPath === settingsPath) { + this.handleSquiggles(e.document); } }); - vscode.window.onDidChangeVisibleTextEditors((editors) => { - const wasVisible: boolean = this.isCppPropertiesJsonVisible; - editors.forEach(editor => { - if (editor.document.uri.fsPath === settingsPath) { - this.isCppPropertiesJsonVisible = true; - if (!wasVisible) { - void this.handleSquiggles().catch(logAndReturn.undefined); - } - } - }); + vscode.workspace.onDidOpenTextDocument(document => { + if (document.uri.fsPath === settingsPath) { + this.handleSquiggles(); + } + }); + + vscode.workspace.onDidCloseTextDocument(document => { + if (document.uri.fsPath === settingsPath) { + this.diagnosticCollection.clear(); + } }); vscode.workspace.onDidSaveTextDocument((doc: vscode.TextDocument) => { @@ -331,6 +330,7 @@ export class CppProperties { } }); } + public set CompilerDefaults(compilerDefaults: CompilerDefaults) { this.defaultCompilerPath = compilerDefaults.trustedCompilerFound ? compilerDefaults.compilerPath : null; this.knownCompilers = compilerDefaults.knownCompilers; @@ -353,7 +353,7 @@ export class CppProperties { private onSelectionChanged(): void { this.selectionChanged.fire(this.CurrentConfigurationIndex); - void this.handleSquiggles().catch(logAndReturn.undefined); + this.handleSquiggles(); } private onCompileCommandsChanged(path: string): void { @@ -493,9 +493,10 @@ export class CppProperties { }); } } - } catch (error) { /*ignore*/ } finally { + } catch (error) { + /*ignore*/ + } finally { this.vcpkgPathReady = true; - this.handleConfigurationChange(); } } @@ -795,7 +796,7 @@ export class CppProperties { return result; } - private resolveAndSplit(paths: string[] | undefined, defaultValue: string[] | undefined, env: Environment, assumeRelative: boolean = true, glob: boolean = false): string[] { + private async resolveAndSplit(paths: string[] | undefined, defaultValue: string[] | undefined, env: Environment, assumeRelative: boolean = true, glob: boolean = false): Promise { const resolvedVariables: string[] = []; if (paths === undefined) { return resolvedVariables; @@ -846,7 +847,7 @@ export class CppProperties { if (isGlobPattern) { // fastGlob silently strips non-found paths. Limit that behavior to dynamic paths only. const matches: string[] = fastGlob.isDynamicPattern(normalized) ? - fastGlob.sync(normalized, { onlyDirectories: true, cwd, suppressErrors: true, deep: 15 }) : [res]; + await fastGlob.async(normalized, { onlyDirectories: true, cwd, suppressErrors: true, deep: 15 }) : [res]; resolvedGlob.push(...matches.map(s => s + suffix)); if (resolvedGlob.length === 0) { resolvedGlob.push(normalized); @@ -881,14 +882,14 @@ export class CppProperties { return property; } - private updateConfigurationPathsArray(paths: string[] | undefined, defaultValue: string[] | undefined, env: Environment, assumeRelative: boolean = true): string[] | undefined { + private updateConfigurationPathsArray(paths: string[] | undefined, defaultValue: string[] | undefined, env: Environment, assumeRelative: boolean = true): Promise { if (paths) { return this.resolveAndSplit(paths, defaultValue, env, assumeRelative, true); } - if (!paths && defaultValue) { + if (defaultValue) { return this.resolveAndSplit(defaultValue, [], env, assumeRelative, true); } - return paths; + return Promise.resolve(undefined); } private updateConfigurationBoolean(property: boolean | string | undefined | null, defaultValue: boolean | undefined | null): boolean | undefined { @@ -933,7 +934,7 @@ export class CppProperties { return this.configProviderAutoSelected; } - private updateServerOnFolderSettingsChange(): void { + private async updateServerOnFolderSettingsChange(): Promise { this.configProviderAutoSelected = false; if (!this.configurationJson) { return; @@ -946,7 +947,7 @@ export class CppProperties { configuration.compilerPathInCppPropertiesJson = configuration.compilerPath; configuration.compileCommandsInCppPropertiesJson = configuration.compileCommands; configuration.configurationProviderInCppPropertiesJson = configuration.configurationProvider; - configuration.includePath = this.updateConfigurationPathsArray(configuration.includePath, settings.defaultIncludePath, env); + configuration.includePath = await this.updateConfigurationPathsArray(configuration.includePath, settings.defaultIncludePath, env); // in case includePath is reset below const origIncludePath: string[] | undefined = configuration.includePath; if (userSettings.addNodeAddonIncludePaths) { @@ -964,7 +965,7 @@ export class CppProperties { configuration.macFrameworkPath = this.updateConfigurationStringArray(configuration.macFrameworkPath, settings.defaultMacFrameworkPath, env); configuration.windowsSdkVersion = this.updateConfigurationString(configuration.windowsSdkVersion, settings.defaultWindowsSdkVersion, env); - configuration.forcedInclude = this.updateConfigurationPathsArray(configuration.forcedInclude, settings.defaultForcedInclude, env, false); + configuration.forcedInclude = await this.updateConfigurationPathsArray(configuration.forcedInclude, settings.defaultForcedInclude, env, false); configuration.compileCommands = this.updateConfigurationStringArray(configuration.compileCommands, settings.defaultCompileCommands, env); configuration.compilerArgs = this.updateConfigurationStringArray(configuration.compilerArgs, settings.defaultCompilerArgs, env); configuration.cStandard = this.updateConfigurationString(configuration.cStandard, settings.defaultCStandard, env); @@ -1042,7 +1043,7 @@ export class CppProperties { // Otherwise, if the browse path is not set, let the native process populate it // with include paths, including any parsed from compilerArgs. } else { - configuration.browse.path = this.updateConfigurationPathsArray(configuration.browse.path, settings.defaultBrowsePath, env); + configuration.browse.path = await this.updateConfigurationPathsArray(configuration.browse.path, settings.defaultBrowsePath, env); } configuration.browse.limitSymbolsToIncludedHeaders = this.updateConfigurationBoolean(configuration.browse.limitSymbolsToIncludedHeaders, settings.defaultLimitSymbolsToIncludedHeaders); @@ -1261,7 +1262,7 @@ export class CppProperties { this.settingsPanel.selectedConfigIndex = this.CurrentConfigurationIndex; this.settingsPanel.createOrShow(configNames, this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex], - this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex), + await this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex), viewColumn); } } @@ -1292,7 +1293,7 @@ export class CppProperties { } this.settingsPanel.updateConfigUI(configNames, this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex], - this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex)); + await this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex)); } else { // Parse failed, open json file void vscode.workspace.openTextDocument(this.propertiesFile).then(undefined, logAndReturn.undefined); @@ -1321,13 +1322,13 @@ export class CppProperties { return trimmedPaths; } - private saveConfigurationUI(): void { + private async saveConfigurationUI(): Promise { this.parsePropertiesFile(); // Clear out any modifications we may have made internally. if (this.settingsPanel && this.configurationJson) { const config: Configuration = this.settingsPanel.getLastValuesFromConfigUI(); this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex] = config; this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex].includePath = this.trimPathWhitespace(this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex].includePath); - this.settingsPanel.updateErrors(this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex)); + this.settingsPanel.updateErrors(await this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex)); this.writeToJson(); } // Any time parsePropertiesFile is called, configurationJson gets @@ -1335,12 +1336,12 @@ export class CppProperties { this.handleConfigurationChange(); } - private onConfigSelectionChanged(): void { + private async onConfigSelectionChanged(): Promise { const configNames: string[] | undefined = this.ConfigurationNames; if (configNames && this.settingsPanel && this.configurationJson) { this.settingsPanel.updateConfigUI(configNames, this.configurationJson.configurations[this.settingsPanel.selectedConfigIndex], - this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex)); + await this.getErrorsForConfigUI(this.settingsPanel.selectedConfigIndex)); } } @@ -1393,7 +1394,9 @@ export class CppProperties { } void this.applyDefaultIncludePathsAndFrameworks().catch(logAndReturn.undefined); - this.updateServerOnFolderSettingsChange(); + void this.timeOperation(() => this.updateServerOnFolderSettingsChange()).then(result => { + getOutputChannelLogger().appendLineAtLevel(5, localize('resolve.configuration.processed', "Processed c_cpp_properties.json in {0}s", result.duration)); + }).catch(logAndReturn.undefined); } private async ensurePropertiesFile(): Promise { @@ -1454,6 +1457,7 @@ export class CppProperties { return false; } let success: boolean = true; + const firstParse = this.configurationJson === undefined; try { const readResults: string = fs.readFileSync(this.propertiesFile.fsPath, 'utf8'); if (readResults === "") { @@ -1584,6 +1588,14 @@ export class CppProperties { e.recursiveIncludesOrderIsExplicit = e.recursiveIncludes?.order !== undefined; }); + if (firstParse) { + // Check documents that are already open since no event will fire for them. + const fsPath = this.propertiesFile.fsPath; + const document = vscode.workspace.textDocuments.find(doc => doc.uri.fsPath === fsPath); + if (document) { + this.handleSquiggles(document); + } + } } catch (errJS) { const err: Error = errJS as Error; const failedToParse: string = localize("failed.to.parse.properties", 'Failed to parse "{0}"', this.propertiesFile.fsPath); @@ -1712,7 +1724,21 @@ export class CppProperties { return compilerPathAndArgs; } - private getErrorsForConfigUI(configIndex: number): ConfigurationErrors { + /** + * Time an operation and return the result plus the length of the operation. + * + * @param operation The async operation to perform. + * @returns The result of the operation and the time it took to complete in seconds. + */ + private async timeOperation(operation: () => Promise): Promise<{ result: T | undefined; duration: number }> { + const start = process.hrtime(); + const result = await operation(); + const diff = process.hrtime(start); + const duration = diff[0] + diff[1] / 1e9; // diff[0] is in seconds, diff[1] is in nanoseconds + return { result, duration }; + } + + private async getErrorsForConfigUI(configIndex: number): Promise { const errors: ConfigurationErrors = {}; if (!this.configurationJson) { return errors; @@ -1731,15 +1757,20 @@ export class CppProperties { errors.compilerPath = compilerPathAndArgs.error; // Validate paths (directories) - errors.includePath = this.validatePath(config.includePath, { globPaths: true }); - errors.macFrameworkPath = this.validatePath(config.macFrameworkPath); - errors.browsePath = this.validatePath(config.browse ? config.browse.path : undefined); + try { + const { result, duration } = await this.timeOperation(() => this.validatePath(config.includePath, { globPaths: true })); + errors.includePath = result ?? duration >= 10 ? localize('resolve.includePath.took.too.long', "The include path validation took {0}s to evaluate", duration) : undefined; + } catch (e) { + errors.includePath = localize('resolve.includePath.failed', "Failed to resolve include path. Error: {0}", (e as Error).message); + } + errors.macFrameworkPath = await this.validatePath(config.macFrameworkPath); + errors.browsePath = await this.validatePath(config.browse ? config.browse.path : undefined); // Validate files - errors.forcedInclude = this.validatePath(config.forcedInclude, { isDirectory: false, assumeRelative: false }); - errors.compileCommands = this.validatePath(config.compileCommands, { isDirectory: false }); - errors.dotConfig = this.validatePath(config.dotConfig, { isDirectory: false }); - errors.databaseFilename = this.validatePath(config.browse ? config.browse.databaseFilename : undefined, { isDirectory: false }); + errors.forcedInclude = await this.validatePath(config.forcedInclude, { isDirectory: false, assumeRelative: false }); + errors.compileCommands = await this.validatePath(config.compileCommands, { isDirectory: false }); + errors.dotConfig = await this.validatePath(config.dotConfig, { isDirectory: false }); + errors.databaseFilename = await this.validatePath(config.browse ? config.browse.databaseFilename : undefined, { isDirectory: false }); // Validate intelliSenseMode if (isWindows) { @@ -1752,7 +1783,7 @@ export class CppProperties { return errors; } - private validatePath(input: string | string[] | undefined, { isDirectory = true, assumeRelative = true, globPaths = false } = {}): string | undefined { + private async validatePath(input: string | string[] | undefined, { isDirectory = true, assumeRelative = true, globPaths = false } = {}): Promise { if (!input) { return undefined; } @@ -1768,7 +1799,7 @@ export class CppProperties { } // Resolve and split any environment variables - paths = this.resolveAndSplit(paths, undefined, this.ExtendedEnvironment, assumeRelative, globPaths); + paths = await this.resolveAndSplit(paths, undefined, this.ExtendedEnvironment, assumeRelative, globPaths); for (const p of paths) { let pathExists: boolean = true; @@ -1834,7 +1865,24 @@ export class CppProperties { return errorMsg; } - private async handleSquiggles(): Promise { + private lastConfigurationVersion: number = 0; + private handleSquigglesDeferral: Deferral | undefined; + + private handleSquiggles(doc?: vscode.TextDocument): void { + // When we open the doc or the active config changes, we don't pass the doc in since we always want to process squiggles. + if (doc?.version !== this.lastConfigurationVersion) { + this.lastConfigurationVersion = doc?.version ?? 0; + + // Debounce the squiggles requests. + this.handleSquigglesDeferral?.cancel(); + this.handleSquigglesDeferral = new Deferral(() => void this.handleSquigglesImpl().catch(logAndReturn.undefined), 1000); + } + } + + /** + * Not to be called directly. Use the `handleSquiggles` method instead which will debounce the calls. + */ + private async handleSquigglesImpl(): Promise { if (!this.propertiesFile) { return; } @@ -1949,9 +1997,9 @@ export class CppProperties { curText = curText.substring(0, nextNameStart2); } if (this.prevSquiggleMetrics.get(currentConfiguration.name) === undefined) { - this.prevSquiggleMetrics.set(currentConfiguration.name, { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0, MultiplePathsNotAllowed: 0, MultiplePathsShouldBeSeparated: 0 }); + this.prevSquiggleMetrics.set(currentConfiguration.name, { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, SlowPathResolution: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0, MultiplePathsNotAllowed: 0, MultiplePathsShouldBeSeparated: 0 }); } - const newSquiggleMetrics: { [key: string]: number } = { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0, MultiplePathsNotAllowed: 0, MultiplePathsShouldBeSeparated: 0 }; + const newSquiggleMetrics: { [key: string]: number } = { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, SlowPathResolution: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0, MultiplePathsNotAllowed: 0, MultiplePathsShouldBeSeparated: 0 }; const isWindows: boolean = os.platform() === 'win32'; // TODO: Add other squiggles. @@ -2085,8 +2133,33 @@ export class CppProperties { // and extend that pattern to the next quote before and next quote after it. const pattern: RegExp = new RegExp(`"[^"]*?(?<="|;)${escapedPath}(?="|;).*?"`, "g"); const configMatches: string[] | null = curText.match(pattern); + let expandedPaths: string[]; - const expandedPaths: string[] = this.resolveAndSplit([curPath], undefined, this.ExtendedEnvironment, true, true); + try { + const { result, duration } = await this.timeOperation(() => this.resolveAndSplit([curPath], undefined, this.ExtendedEnvironment, true, true)); + expandedPaths = result ?? []; + if (duration > 10 && configMatches) { + newSquiggleMetrics.SlowPathResolution++; + const curOffset = curText.indexOf(configMatches[0]); + const endOffset = curOffset + curPath.length; + const diagnostic: vscode.Diagnostic = new vscode.Diagnostic( + new vscode.Range(document.positionAt(curTextStartOffset + curOffset), document.positionAt(curTextStartOffset + endOffset)), + localize('resolve.path.took.too.long', "Path took {0}s to evaluate", duration), + vscode.DiagnosticSeverity.Warning); + diagnostics.push(diagnostic); + } + } catch (e) { + expandedPaths = []; + if (configMatches) { + const curOffset = curText.indexOf(configMatches[0]); + const endOffset = curOffset + curPath.length; + const diagnostic: vscode.Diagnostic = new vscode.Diagnostic( + new vscode.Range(document.positionAt(curTextStartOffset + curOffset), document.positionAt(curTextStartOffset + endOffset)), + localize('resolve.path.failed', "Failed to resolve path {0}. Error: {1}", curPath, (e as Error).message), + vscode.DiagnosticSeverity.Warning); + diagnostics.push(diagnostic); + } + } const incorrectExpandedPaths: string[] = []; if (expandedPaths.length <= 0) { diff --git a/Extension/src/LanguageServer/copilotCompletionContextProvider.ts b/Extension/src/LanguageServer/copilotCompletionContextProvider.ts index cdf75308f..1e6d32658 100644 --- a/Extension/src/LanguageServer/copilotCompletionContextProvider.ts +++ b/Extension/src/LanguageServer/copilotCompletionContextProvider.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All Rights Reserved. * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -import { ContextResolver, ResolveRequest, SupportedContextItem } from '@github/copilot-language-server'; +import { ContextResolver, ResolveRequest, SupportedContextItem, type ContextProvider } from '@github/copilot-language-server'; import { randomUUID } from 'crypto'; import * as vscode from 'vscode'; import { DocumentSelector } from 'vscode-languageserver-protocol'; @@ -11,7 +11,7 @@ import { getOutputChannelLogger, Logger } from '../logger'; import * as telemetry from '../telemetry'; import { CopilotCompletionContextResult } from './client'; import { CopilotCompletionContextTelemetry } from './copilotCompletionContextTelemetry'; -import { getCopilotApi } from './copilotProviders'; +import { getCopilotChatApi, getCopilotClientApi, type CopilotContextProviderAPI } from './copilotProviders'; import { clients } from './extension'; import { CppSettings } from './settings'; @@ -83,7 +83,7 @@ export class CopilotCompletionContextProvider implements ContextResolver { - const properties: Record = {}; + public registerCopilotContextProvider(): void { const registerCopilotContextProvider = 'registerCopilotContextProvider'; - try { - const copilotApi = await getCopilotApi(); - if (!copilotApi) { throw new CopilotContextProviderException("getCopilotApi() returned null, Copilot is missing or inactive."); } - const hasGetContextProviderAPI = "getContextProviderAPI" in copilotApi; - if (!hasGetContextProviderAPI) { throw new CopilotContextProviderException("getContextProviderAPI() is not available."); } - const contextAPI = await copilotApi.getContextProviderAPI("v1"); - if (!contextAPI) { throw new CopilotContextProviderException("getContextProviderAPI(v1) returned null."); } - this.contextProviderDisposable = contextAPI.registerContextProvider({ - id: CopilotCompletionContextProvider.providerId, - selector: CopilotCompletionContextProvider.defaultCppDocumentSelector, - resolver: this - }); - properties["cppCodeSnippetsProviderRegistered"] = "true"; - } catch (e) { - console.debug("Failed to register the Copilot Context Provider."); - properties["error"] = "Failed to register the Copilot Context Provider"; + const contextProvider = { + id: CopilotCompletionContextProvider.providerId, + selector: CopilotCompletionContextProvider.defaultCppDocumentSelector, + resolver: this + }; + type RegistrationResult = { message: string } | boolean; + const clientPromise: Promise = getCopilotClientApi().then(async (api) => { + if (!api) { + throw new CopilotContextProviderException("getCopilotApi() returned null, Copilot client is missing or inactive."); + } + const disposable = await this.installContextProvider(api, contextProvider); + if (disposable) { + this.contextProviderDisposables = this.contextProviderDisposables ?? []; + this.contextProviderDisposables.push(disposable); + return true; + } else { + throw new CopilotContextProviderException("getContextProviderAPI() is not available in Copilot client."); + } + }).catch((e) => { + console.debug("Failed to register the Copilot Context Provider with Copilot client."); + let message = "Failed to register the Copilot Context Provider with Copilot client"; if (e instanceof CopilotContextProviderException) { - properties["error"] += `: ${e.message} `; + message += `: ${e.message} `; } - } finally { + return { message }; + }); + const chatPromise: Promise = getCopilotChatApi().then(async (api) => { + if (!api) { + throw new CopilotContextProviderException("getCopilotChatApi() returned null, Copilot Chat is missing or inactive."); + } + const disposable = await this.installContextProvider(api, contextProvider); + if (disposable) { + this.contextProviderDisposables = this.contextProviderDisposables ?? []; + this.contextProviderDisposables.push(disposable); + return true; + } else { + throw new CopilotContextProviderException("getContextProviderAPI() is not available in Copilot Chat."); + } + }).catch((e) => { + console.debug("Failed to register the Copilot Context Provider with Copilot Chat."); + let message = "Failed to register the Copilot Context Provider with Copilot Chat"; + if (e instanceof CopilotContextProviderException) { + message += `: ${e.message} `; + } + return { message }; + }); + // The client usually doesn't block. So test it first. + clientPromise.then((clientResult) => { + const properties: Record = {}; + if (isBoolean(clientResult) && clientResult) { + properties["cppCodeSnippetsProviderRegistered"] = "true"; + telemetry.logCopilotEvent(registerCopilotContextProvider, { ...properties }); + return; + } + return chatPromise.then((chatResult) => { + const properties: Record = {}; + if (isBoolean(chatResult) && chatResult) { + properties["cppCodeSnippetsProviderRegistered"] = "true"; + telemetry.logCopilotEvent(registerCopilotContextProvider, { ...properties }); + return; + } else if (!isBoolean(clientResult) && isString(clientResult.message)) { + properties["error"] = clientResult.message; + } else if (!isBoolean(chatResult) && isString(chatResult.message)) { + properties["error"] = chatResult.message; + } else { + properties["error"] = "Failed to register the Copilot Context Provider for unknown reason."; + } + telemetry.logCopilotEvent(registerCopilotContextProvider, { ...properties }); + }); + }).catch((e) => { + const properties: Record = {}; + properties["error"] = `Failed to register the Copilot Context Provider with exception: ${e}`; telemetry.logCopilotEvent(registerCopilotContextProvider, { ...properties }); + }); + } + + private async installContextProvider(copilotAPI: CopilotContextProviderAPI, contextProvider: ContextProvider): Promise { + const hasGetContextProviderAPI = typeof copilotAPI.getContextProviderAPI === 'function'; + if (hasGetContextProviderAPI) { + const contextAPI = await copilotAPI.getContextProviderAPI("v1"); + if (contextAPI) { + return contextAPI.registerContextProvider(contextProvider); + } + return undefined; + } else { + return undefined; } } } diff --git a/Extension/src/LanguageServer/copilotProviders.ts b/Extension/src/LanguageServer/copilotProviders.ts index e0551edcb..31cf21f3e 100644 --- a/Extension/src/LanguageServer/copilotProviders.ts +++ b/Extension/src/LanguageServer/copilotProviders.ts @@ -24,7 +24,11 @@ export interface CopilotTrait { promptTextOverride?: string; } -export interface CopilotApi { +export interface CopilotContextProviderAPI { + getContextProviderAPI(version: string): Promise; +} + +export interface CopilotApi extends CopilotContextProviderAPI { registerRelatedFilesProvider( providerId: { extensionId: string; languageId: string }, callback: ( @@ -33,11 +37,10 @@ export interface CopilotApi { cancellationToken: vscode.CancellationToken ) => Promise<{ entries: vscode.Uri[]; traits?: CopilotTrait[] } | undefined> ): Disposable; - getContextProviderAPI(version: string): Promise; } export async function registerRelatedFilesProvider(): Promise { - const api = await getCopilotApi(); + const api = await getCopilotClientApi(); if (util.extensionContext && api) { try { for (const languageId of ['c', 'cpp', 'cuda-cpp']) { @@ -129,7 +132,7 @@ async function getIncludes(uri: vscode.Uri, maxDepth: number): Promise { +export async function getCopilotClientApi(): Promise { const copilotExtension = vscode.extensions.getExtension('github.copilot'); if (!copilotExtension) { return undefined; @@ -145,3 +148,31 @@ export async function getCopilotApi(): Promise { return copilotExtension.exports; } } + +export async function getCopilotChatApi(): Promise { + type CopilotChatApi = { getAPI?(version: number): CopilotContextProviderAPI | undefined }; + const copilotExtension = vscode.extensions.getExtension('github.copilot-chat'); + if (!copilotExtension) { + return undefined; + } + + let exports: CopilotChatApi | undefined; + if (!copilotExtension.isActive) { + try { + exports = await copilotExtension.activate(); + } catch { + return undefined; + } + } else { + exports = copilotExtension.exports; + } + if (!exports || typeof exports.getAPI !== 'function') { + return undefined; + } + const result = exports.getAPI(1); + return result; +} + +interface Disposable { + dispose(): void; +} diff --git a/Extension/src/LanguageServer/dataBinding.ts b/Extension/src/LanguageServer/dataBinding.ts index 26a4691b7..5dcceaf5d 100644 --- a/Extension/src/LanguageServer/dataBinding.ts +++ b/Extension/src/LanguageServer/dataBinding.ts @@ -3,23 +3,7 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ import * as vscode from 'vscode'; - -class Deferral { - private timer?: NodeJS.Timeout; - - constructor(callback: () => void, timeout: number) { - this.timer = setTimeout(() => { - this.timer = undefined; - callback(); - }, timeout); - } - public cancel() { - if (this.timer) { - clearTimeout(this.timer); - this.timer = undefined; - } - } -} +import { Deferral } from './utils'; export class DataBinding { private valueChanged = new vscode.EventEmitter(); diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 445edc009..6db23d4a6 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -55,6 +55,7 @@ let languageConfigurations: vscode.Disposable[] = []; let intervalTimer: NodeJS.Timeout; let codeActionProvider: vscode.Disposable; export const intelliSenseDisabledError: string = "Do not activate the extension when IntelliSense is disabled."; +export let isWritingCrashCallStack: boolean = false; type VcpkgDatabase = Record; // Stored as
-> [] let vcpkgDbPromise: Promise; @@ -477,21 +478,7 @@ async function onSwitchHeaderSource(): Promise { } }); const document: vscode.TextDocument = await vscode.workspace.openTextDocument(targetFileName); - const workbenchConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("workbench"); - let foundEditor: boolean = false; - if (workbenchConfig.get("editor.revealIfOpen")) { - // If the document is already visible in another column, open it there. - vscode.window.visibleTextEditors.forEach(editor => { - if (editor.document === document && !foundEditor) { - foundEditor = true; - void vscode.window.showTextDocument(document, editor.viewColumn).then(undefined, logAndReturn.undefined); - } - }); - } - - if (!foundEditor) { - void vscode.window.showTextDocument(document).then(undefined, logAndReturn.undefined); - } + void vscode.window.showTextDocument(document).then(undefined, logAndReturn.undefined); } /** @@ -1012,7 +999,7 @@ export function watchForCrashes(crashDirectory: string): void { // vscode.workspace.createFileSystemWatcher only works in workspace folders. try { fs.watch(crashDirectory, (event, filename) => { - if (event !== "rename") { + if (event !== "change") { return; } if (!filename || filename === prevCppCrashFile) { @@ -1023,9 +1010,11 @@ export function watchForCrashes(crashDirectory: string): void { return; } const crashDate: Date = new Date(); + isWritingCrashCallStack = true; // Wait 5 seconds to allow time for the crash log to finish being written. setTimeout(() => { + isWritingCrashCallStack = false; fs.readFile(path.resolve(crashDirectory, filename), 'utf8', (err, data) => { void handleCrashFileRead(crashDirectory, filename, crashDate, err, data); }); @@ -1177,7 +1166,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr } const lines: string[] = data.split("\n"); - let addressData: string = ".\n"; + let addressData: string; const isCppToolsSrv: boolean = crashFile.startsWith("cpptools-srv"); const telemetryHeader: string = (isCppToolsSrv ? "cpptools-srv.txt" : crashFile) + "\n"; const filtPath: string | null = which.sync("c++filt", { nothrow: true }); @@ -1207,17 +1196,20 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, cr crashStackStartLine = ++crashLogLine; } if (lines[crashStackStartLine].startsWith("SIG")) { - signalType = lines[crashStackStartLine] + "\n"; + signalType = `${lines[crashStackStartLine]}\n`; + addressData = `${lines[crashStackStartLine + 1]}:${lines[crashStackStartLine + 2]}\n`; // signalCode:signalAddr + crashStackStartLine += 3; } else { // The signal type may fail to be written. // Intentionally different from SIGUNKNOWN from cpptools, // and not SIG-? to avoid matching the regex in containsFilteredTelemetryData. signalType = "SIGMISSING\n"; + addressData = ".\n"; } data = telemetryHeader + signalType; let crashCallStack: string = ""; let validFrameFound: boolean = false; - for (let lineNum: number = crashStackStartLine + 1; lineNum < lines.length - 3; ++lineNum) { // skip last lines + for (let lineNum: number = crashStackStartLine; lineNum < lines.length - 3; ++lineNum) { // skip last lines const line: string = lines[lineNum]; const startPos: number = line.indexOf(startStr); let pendingCallStack: string = ""; @@ -1391,7 +1383,7 @@ export async function preReleaseCheck(): Promise { const data: any = await response?.json().catch(logAndReturn.undefined); - const preReleaseAvailable = data?.results[0].extensions[0].versions[0].properties.some((e: object) => Object.values(e).includes("Microsoft.VisualStudio.Code.PreRelease")); + const preReleaseAvailable = data?.results?.[0]?.extensions?.[0]?.versions?.[0]?.properties?.some((e: object) => Object.values(e).includes("Microsoft.VisualStudio.Code.PreRelease")); // If the user isn't on the pre-release version, but one is available, prompt them to install it. if (preReleaseAvailable) { diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 0f35cc315..6e199cd64 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -164,6 +164,7 @@ export interface SettingsParams { codeAnalysisUpdateDelay: number; workspaceFolderSettings: WorkspaceFolderSettingsParams[]; copilotHover: string; + windowsErrorReportingMode: string; } function getTarget(): vscode.ConfigurationTarget { @@ -478,6 +479,7 @@ export class CppSettings extends Settings { } return this.getAsString("copilotHover"); } + public get windowsErrorReportingMode(): string { return this.getAsString("windowsErrorReportingMode"); } public get cppContextProviderParams(): string | undefined { const value = super.Section.get("copilotContextProviderParams"); if (isString(value)) { diff --git a/Extension/src/LanguageServer/utils.ts b/Extension/src/LanguageServer/utils.ts index 3a46a486a..fff791eef 100644 --- a/Extension/src/LanguageServer/utils.ts +++ b/Extension/src/LanguageServer/utils.ts @@ -118,3 +118,23 @@ export async function checkDuration(fn: () => Promise): Promise<{ result: const result = await fn(); return { result, duration: performance.now() - start }; } + +/** + * A class that delays the execution of a callback until a specified timeout period has elapsed. + */ +export class Deferral { + private timer?: NodeJS.Timeout; + + constructor(callback: () => void, timeout: number) { + this.timer = setTimeout(() => { + this.timer = undefined; + callback(); + }, timeout); + } + public cancel() { + if (this.timer) { + clearTimeout(this.timer); + this.timer = undefined; + } + } +} diff --git a/Extension/src/main.ts b/Extension/src/main.ts index 2f47e0ef3..be5f02274 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -125,9 +125,15 @@ export async function activate(context: vscode.ExtensionContext): Promise - Learn more about the C/C++ properties by going to C/C++ Properties Schema Reference.
+ Learn more about the C/C++ properties by going to C/C++ Properties Schema Reference.