From 5669aeb26a1777b44d7fa677a6d8331c02cda026 Mon Sep 17 00:00:00 2001 From: Alex Hsu Date: Thu, 25 Aug 2022 19:20:28 -0700 Subject: [PATCH 01/16] [Auto] Localization - Translated Strings (#9572) --- Extension/CHANGELOG.md | 2 +- Extension/i18n/chs/package.i18n.json | 13 +++++++++---- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/chs/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/cht/package.i18n.json | 11 ++++++++--- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/cht/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/csy/package.i18n.json | 5 +++++ .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/csy/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/deu/package.i18n.json | 15 ++++++++++----- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/deu/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/esn/package.i18n.json | 15 ++++++++++----- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/esn/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/fra/package.i18n.json | 7 ++++++- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/fra/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/ita/package.i18n.json | 5 +++++ .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/ita/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/jpn/package.i18n.json | 19 ++++++++++++------- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../jpn/src/LanguageServer/settings.i18n.json | 2 +- .../i18n/jpn/src/nativeStrings.i18n.json | 3 ++- .../run-and-debug-project-mac.md.i18n.json | 2 +- Extension/i18n/kor/package.i18n.json | 9 +++++++-- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/kor/src/nativeStrings.i18n.json | 3 ++- .../Reinstalling the Extension.md.i18n.json | 2 +- Extension/i18n/plk/package.i18n.json | 9 +++++++-- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../plk/src/LanguageServer/settings.i18n.json | 2 +- .../i18n/plk/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/ptb/package.i18n.json | 17 +++++++++++------ .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/ptb/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/rus/package.i18n.json | 5 +++++ .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../rus/src/LanguageServer/settings.i18n.json | 2 +- .../i18n/rus/src/nativeStrings.i18n.json | 3 ++- Extension/i18n/trk/package.i18n.json | 11 ++++++++--- .../src/Debugger/attachToProcess.i18n.json | 7 +++++-- .../Debugger/configurationProvider.i18n.json | 1 + .../src/LanguageServer/extension.i18n.json | 1 + .../i18n/trk/src/nativeStrings.i18n.json | 3 ++- .../run-and-debug-project-windows.md | 16 ++++++++-------- 72 files changed, 234 insertions(+), 91 deletions(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 511513e796..adf990773c 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -354,7 +354,7 @@ * Fix an issue with cppdbg debugging on Windows x64. [#7971](https://github.com/microsoft/vscode-cpptools/issues/7971) * Fix an issue with VS `` header causing IntelliSense process crash. [#7972](https://github.com/microsoft/vscode-cpptools/issues/7972) * Fix insiders update install loop for remote scenarios. [#8000](https://github.com/microsoft/vscode-cpptools/issues/8000) -* Fix MacOS unable to use external terminal to debug [#8008](https://github.com/microsoft/vscode-cpptools/issues/8008) +* Fix macOS unable to use external terminal to debug [#8008](https://github.com/microsoft/vscode-cpptools/issues/8008) ## Version 1.5.1: July 9, 2021 ### Bug Fixes diff --git a/Extension/i18n/chs/package.i18n.json b/Extension/i18n/chs/package.i18n.json index 1bac80b3b1..8af68c5e98 100644 --- a/Extension/i18n/chs/package.i18n.json +++ b/Extension/i18n/chs/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "调试 C/C++ 文件", "c_cpp.command.BuildAndRunFile.title": "运行 C/C++ 文件", "c_cpp.command.AddDebugConfiguration.title": "添加调试配置", + "c_cpp.command.GenerateDoxygenComment.title": "生成 Doxygen 注释", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "用于语言服务处理的最大并发线程数。该值是一个提示,且不能始终使用。默认值 `null` (空)使用可用的逻辑处理器数。", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "用于语言服务处理的最大缓存进程数。默认值 `null` (空)使用可用逻辑处理器数的两倍。", "c_cpp.configuration.maxMemory.markdownDescription": "可用于语言服务处理的最大内存(以 MB 为单位)。超过此内存使用量后,将缓存且并发运行较少的进程。默认值 `null` (空)使用系统的空闲内存。", @@ -49,12 +50,13 @@ "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "对匹配文件同辈进行其他检查。将 `$(basename)` 用作匹配文件名变量。", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "如果为 `true`,则代码分析将在文件打开或保存后自动在文件上运行。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果为`true`,`禁用'代码操作将在可用时显示(下次运行代码分析时)。使用`禁用'代码操作时,它会将警告代码添加到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled`设置。", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果为`true`,“显示文档”代码操作将在可用时显示(下次运行代码分析时)。", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果为 `true`,“显示文档”代码操作将在可用时显示(下次运行代码分析时)。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "控制哪些“清除”代码分析问题代码操作选项可用。更改设置以显示更多选项可能需要重新运行代码分析。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "不显示“清除”代码操作。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "仅显示“全部清除”代码操作(如果只有一种类型,则显示“清除所有”,如果只有一个问题,则显示“清除此项”)。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "如果存在多个问题类型,显示“全部清除”代码操作和“清除所有 ”代码操作(或如果只有一个问题,显示“清除此项”)", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "如果有多个问题类型,显示“全部清除”,如果有多个 问题,显示“清除所有 ”以及显示“清除此项”代码操作", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "如果为 `true`,则在 `修复` 代码操作更改的行上运行格式设置。", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "如果为 `true`,则在 `#C_Cpp.codeAnalysis.runAutomatically#` 为 `true` (默认值)时,将启用并自动运行使用 `clang-tidy` 的代码分析。", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` 可执行文件的完整路径。如果未指定,并且 `clang-tidy` 在环境路径中可用,则使用该路径。如果在环境路径中找不到,则将使用与扩展捆绑的 `clang-tidy`。", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "指定 YAML/JSON 格式的 `clang-tidy` 配置: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{键: x, 值: y}]}`。当值为空时,`clang-tidy` 将尝试为其父目录中的每个源文件查找名为 `.clang-tidy` 的文件。", @@ -174,9 +176,9 @@ "c_cpp.configuration.inlayHints.autoDeclarationTypes.enabled.markdownDescription": "在声明中使用 `auto` 时显示推导类型的内嵌提示:\n```cpp \n\n auto index /* : int */ = 0;\n```", "c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "在标识符左侧声明中使用 `auto` 时显示推导类型的内嵌提示:\n```cpp \n\n auto /* int */ index = 0;\n```", "c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "显示参数名称的内嵌提示:\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```", - "c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "在参数名称提示中隐藏开头的`_`。", - "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "当参数文本或内联注释包含参数名称时,隐藏参数名称提示:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```", - "c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "显示非 const 引用传递的参数的内嵌提示引用运算符 `&`:\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```", + "c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "在参数名称提示中隐藏开头的 `_`。", + "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "当参数文本或内联注释包含参数名称时,抑制参数名称提示:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```", + "c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "显示非常量引用传递的参数的内嵌提示引用运算符 `&`:\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```", "c_cpp.configuration.inlayHints.referenceOperator.showSpace.markdownDescription": "控制在 `&` 后是否显示非常量引用传递的参数的空格:\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```", "c_cpp.configuration.loggingLevel.markdownDescription": "输出面板中日志记录的详细程度。从最不详细到最详细的级别顺序为: `None` < `Error` < `Warning` < `Information` < `Debug`。", "c_cpp.configuration.autoAddFileAssociations.markdownDescription": "控制当文件为 C/C++ 文件中导航操作的目标时,其是否自动添加到 `#files.associations#`。", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "将针对每个遇到的文件和文件夹评估排除筛选器。", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "用作 `#include` 自动完成结果的路径分隔符的字符。", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "如果为 `true`,则悬停和自动完成的工具提示将仅显示结构化注释的某些标签。否则,将显示所有注释。", + "c_cpp.configuration.doxygen.generateOnType.description": "控制在键入所选注释样式后是否自动插入 Doxygen 注释。", + "c_cpp.configuration.doxygen.generatedStyle.description": "用作 Doxygen 注释起始行的字符串。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "开始多行或单行注释块的模式。多行注释块的延续模式默认为 ` * `,或单行注释块默认为此字符串。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "开启一个多行或单行注释块的模式。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "在多行或单行注释块内按下 Enter 键时要插入到下一行的文本。", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "MI 调试程序(如 gdb)的路径。如果未指定,将首先在路径中搜索调试程序。", "c_cpp.debuggers.miDebuggerArgs.description": "MI 调试程序(如 gdb)的其他参数。", "c_cpp.debuggers.miDebuggerServerAddress.description": "要连接到的 MI 调试程序服务器的网络地址(示例: localhost:1234)。", + "c_cpp.debuggers.useExtendedRemote.description": "使用目标扩展远程模式连接到 MI 调试器服务器。", "c_cpp.debuggers.stopAtEntry.description": "可选参数。如果为 true,则调试程序应在目标的入口点处停止。如果传递了 processId,则不起任何作用。", "c_cpp.debuggers.debugServerPath.description": "到要启动的调试服务器的可选完整路径。默认值为 null。该路径与 “miDebugServerAddress” 或带有运行 “-target-select remote ” 的 “customSetupCommand” 的自有服务器配合使用。", "c_cpp.debuggers.debugServerArgs.description": "可选调试服务器参数。默认为 null。", diff --git a/Extension/i18n/chs/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/chs/src/Debugger/attachToProcess.i18n.json index adc1e1ac36..8f51657a68 100644 --- a/Extension/i18n/chs/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/chs/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "所选的调试配置不包含 {0}", + "debugger.path.and.server.address.required": "调试配置中的 {0} 需要 {1} 和 {2}", + "no.pipetransport.useextendedremote": "所选的调试配置不包含 {0} 或 {1}", "select.process.attach": "选择要附加到的进程", "process.not.selected": "未选择进程。", "pipe.failed": "管道传输未能获取 OS 和进程。", - "no.process.list": "传输附加无法获取进程列表。" + "no.process.list": "传输附加无法获取进程列表。", + "failed.to.make.gdb.connection": "无法建立 GDB 连接:“{0}”。", + "failed.to.parse.processes": "无法分析进程:“{0}”。" } \ No newline at end of file diff --git a/Extension/i18n/chs/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/chs/src/Debugger/configurationProvider.i18n.json index 9b6f379ec6..05a60cf765 100644 --- a/Extension/i18n/chs/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/chs/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "找不到用于 lldb-mi 的 \"LLDB.framework\"。请安装 XCode 或 XCode 命令行工具。", "debugger.launchConfig": "启动配置:", "vs.code.1.69+.required": "\"deploySteps\" 需要 VS Code 1.69+。", + "running.deploy.steps": "正在运行部署步骤...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "生成和调试活动文件", "cl.exe.not.available": "仅当从 VS 开发人员命令提示符处运行 VS Code 时,{0} 生成和调试才可用。", diff --git a/Extension/i18n/chs/src/LanguageServer/extension.i18n.json b/Extension/i18n/chs/src/LanguageServer/extension.i18n.json index 09e06f4033..ed5a7bca33 100644 --- a/Extension/i18n/chs/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/chs/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "了解如何使用 vcpkg 为此标头安装库", "copy.vcpkg.command": "将用于安装“{0}”的 vcpkg 命令复制到剪贴板", + "on.disabled.command": "当 `C_Cpp.intelliSenseEngine` 设置为 `Disabled` 时,无法执行与 IntelliSense 相关的命令。", "client.not.found": "未找到客户端", "configuration.select.first": "首先打开一个文件夹以选择配置", "configuration.provider.select.first": "首先打开一个文件夹以选择配置提供程序", diff --git a/Extension/i18n/chs/src/nativeStrings.i18n.json b/Extension/i18n/chs/src/nativeStrings.i18n.json index 8cc3afa0b6..a31f5347a5 100644 --- a/Extension/i18n/chs/src/nativeStrings.i18n.json +++ b/Extension/i18n/chs/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "文件夹", "file_tag": "文件", "compiler_default_language_standard_version_old": "编译器返回默认语言标准版本:{0}。由于此版本是旧版本,因此将尝试使用较新版本 {1} 作为默认版本。", - "unexpected_output_from_clang_tidy": "来自 clang-tidy 的意外输出:{0}。应为:{1}。" + "unexpected_output_from_clang_tidy": "来自 clang-tidy 的意外输出:{0}。应为:{1}。", + "generate_doxygen_comment": "生成 Doxygen 注释" } \ No newline at end of file diff --git a/Extension/i18n/cht/package.i18n.json b/Extension/i18n/cht/package.i18n.json index 55e50ea109..0560ed930f 100644 --- a/Extension/i18n/cht/package.i18n.json +++ b/Extension/i18n/cht/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "偵錯 C/C++ 檔案", "c_cpp.command.BuildAndRunFile.title": "執行 C/C++ 檔案", "c_cpp.command.AddDebugConfiguration.title": "新增偵錯設定", + "c_cpp.command.GenerateDoxygenComment.title": "產生 Doxygen 註解", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "用於語言服務處理的並行執行緒數目上限。該值是提示,且可能不會一律使用。預設的 `null` (空白) 會使用可用的邏輯處理器數目。", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "用於語言服務處理的快取處理序數目上限。預設的 `null` (空白) 使用的邏輯處理器數目是可用邏輯處理器的兩倍。", "c_cpp.configuration.maxMemory.markdownDescription": "記憶體上限 (MB) 可供語言服務處理。超過此記憶體使用量之後,同時快取及執行的處理序將會減少。預設的 `null` (空白) 會使用系統的可用記憶體。", @@ -48,20 +49,21 @@ "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "要符合檔案路徑的 Glob 模式。設為 `true` 或 `false` 可啟用或停用模式。", "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "對相符檔案同層級進行額外檢查。請使用 `$(basename)` 作為相符檔案名稱的變數。", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "若為 `true`,則程式碼分析將會在檔案開啟或儲存之後,自動在該檔案上執行。", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果為 `true`,則在可用時 (下次執行程式碼分析時),將會顯示 '禁用' 程式碼動作。使用 '禁用' 程式碼動作時,它會將警告碼新增到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 設定。", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果為 `true`,則在可用時 (下次執行程式碼分析時),將會顯示 '顯示 的文件' 程式碼動作。", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "如果為`true`,則在可用時 (下次執行程式碼分析時),將會顯示 '停用' 程式碼動作。使用 '停用' 程式碼動作時,它會將警告碼新增到 `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 設定。", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "如果為 `true`,則在可用時 (下次執行程式碼分析時),將會顯示 '顯示的文件' 程式碼動作。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "控制可使用哪些 '清除' 程式碼分析問題程式碼動作選項。變更設定以顯示更多選項可能需要重新執行程式碼分析。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "不顯示 '清除' 程式碼動作。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "如果只有一種類型,則只顯示 '清除所有' 程式碼動作 (如果只有一種類型,則顯示 '清除所有 ,或如果只有一個問題,則顯示 '清除此')。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "顯示 '清除所有' 程式碼動作 (如果有多種問題類型) 和 '清除所有 ' 程式碼動作 (如果 只有一個問題,則顯示 '清除此')", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "顯示 '清除所有' (如果有多個問題類型)、'清除所有 ' (如果 有多個問題) 和 '清除此' 程式碼動作", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "如果為 `true`,格式就會在由 '修正' 程式碼動作變更的行上執行。", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "若為 `true`,則會啟用使用 `clang-tidy` 的程式碼分析,並在 `#C_Cpp.codeAnalysis.runAutomatically#` 為 `true` 時自動執行 (預設)。", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` 可執行檔的完整路徑。若未指定可執行檔,且可在環境路徑中使用 `clang-tidy`,則會加以使用。若在環境路徑中找不到可執行檔,則會使用與延伸模組搭配的 `clang-tidy`。", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "以 YAML/JSON 格式指定 `clang-tidy` 組態: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{索引鍵: x, 值: y}]}`。當值為空白時,`clang-tidy` 將會嘗試為其父目錄中的每個來源檔案尋找名為 `.clang-tidy` 的檔案。", "c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "當 `#C_Cpp.codeAnalysis.clangTidy.config#` 未設定且找不到 `.clang-tidy` 檔案時,指定 YAML/JSON 格式的 `clang-tidy` 組態用作遞補: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{索引鍵: x, 值: y}]}`。", "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "符合輸出診斷來源之標頭名稱的 POSIX 擴充規則運算式 (ERE)。來自每個編譯單位之主要檔案的診斷將一律顯示。支援 `${workspaceFolder}` 變數 (如果沒有 `.clang-tidy` 檔案,則作為預設後援值)。若此選項並非 `null` (空白),則會覆寫 `.clang-tidy` 檔案中的 `HeaderFilterRegex` 選項 (如果有的話)。", "c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": "要傳遞給 `clang-tidy` 的其他命令列引數。這些命令列引數會比對等的 `C_Cpp.codeAnalysis.clangTidy.*` 設定優先考慮。", - "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "如果設定了 `true` 和 'compileCommands',則 `-p=` 引數會傳遞至 `clang-tidy`,而非在 `--` 之後傳遞組建引數。若未設定環境變數以找到系統包含的環境變數,可能無法運作。", + "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "如果設定了 `true` 和 `compileCommands`,則 `-p=` 引數會傳遞至 `clang-tidy`,而非在 `--` 之後傳遞組建引數。若未設定環境變數以找到系統包含的環境變數,可能無法運作。", "c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "已啟用的 `clang-tidy` 檢查清單。值會附加到 `.clang-tidy` 檔案中的 `Checks` 或 `#C_Cpp.codeAnalysis.clangTidy.config#` (如果有的話)。除非明確地停用,否則一律使用預設檢查 `clang-analyzer-*`。", "c_cpp.configuration.codeAnalysis.clangTidy.checks.disabled.markdownDescription": "已停用的 `clang-tidy` 檢查清單。值會附加到 `.clang-tidy` 檔案中的 `Checks` 或 `#C_Cpp.codeAnalysis.clangTidy.config#` (如果有的話)。", "c_cpp.configuration.formatting.description": "選擇格式設定引擎。", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "將會針對每個遇到的檔案和資料夾評估排除篩選。", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "用作 `#include` 自動完成結果路徑分隔符號的字元。", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "若為 `true`,暫留與自動完成的工具提示只會顯示特定結構化註解標籤,否則將會顯示所有註解。", + "c_cpp.configuration.doxygen.generateOnType.description": "控制是否在輸入選擇的註解樣式後自動插入 Doxygen 註解。", + "c_cpp.configuration.doxygen.generatedStyle.description": "作為 Doxygen 註解起始行的字元字串。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "開始多行或單行註解區塊的模式。對於多行註解區塊,接續模式預設為 ` * `,或此字串表示單行註解區塊。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "開始多行或單行註解區塊的模式。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "在多行或單行註解區塊中按下 ENTER 時,將在下一行插入的文字。", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "MI 偵錯工具 (例如 gdb) 的路徑。若未指定,會先搜尋偵錯工具的路徑。", "c_cpp.debuggers.miDebuggerArgs.description": "MI 偵錯工具 (例如 gdb) 的其他引數。", "c_cpp.debuggers.miDebuggerServerAddress.description": "MI 偵錯工具伺服器要連線至的網路位址 (範例: localhost:1234)。", + "c_cpp.debuggers.useExtendedRemote.description": "使用目標延伸的遠端模式連線到 MI 偵錯工具伺服器。", "c_cpp.debuggers.stopAtEntry.description": "選擇性參數。若為 true,則偵錯工具應該在目標的進入點停止。如果已傳遞 processId。就沒有效果。", "c_cpp.debuggers.debugServerPath.description": "要啟動的偵錯伺服器選用完整路徑。預設為 Null。使用時,會將 \"miDebugServerAddress\" 或您自己的伺服器與 \"customSetupCommand\" 連接,以執行 \"-target-select remote <伺服器:連接埠>\"。", "c_cpp.debuggers.debugServerArgs.description": "選擇性偵錯伺服器引數。預設為 null。", diff --git a/Extension/i18n/cht/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/cht/src/Debugger/attachToProcess.i18n.json index 28cacbdec2..5b8b1cfdb6 100644 --- a/Extension/i18n/cht/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/cht/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "選擇的偵錯組態未包含 {0}", + "debugger.path.and.server.address.required": "偵錯設定中的 {0} 需要 {1} 和 {2}", + "no.pipetransport.useextendedremote": "選擇的偵錯設定未包含 {0} 或 {1}", "select.process.attach": "選取要附加至的目標處理序", "process.not.selected": "未選取處理序。", "pipe.failed": "管道傳輸無法取得 OS 和處理序。", - "no.process.list": "傳輸附加無法取得處理序清單。" + "no.process.list": "傳輸附加無法取得處理序清單。", + "failed.to.make.gdb.connection": "無法建立 GDB 連線: \"{0}\"。", + "failed.to.parse.processes": "無法剖析處理式: \"{0}\"。" } \ No newline at end of file diff --git a/Extension/i18n/cht/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/cht/src/Debugger/configurationProvider.i18n.json index c309ad84fb..11242b9648 100644 --- a/Extension/i18n/cht/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/cht/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "找不到 lldb-mi 的 'LLDB.framework'。請安裝 XCode 或 XCode 命令列工具。", "debugger.launchConfig": "啟動設定:", "vs.code.1.69+.required": "'deploySteps' 需要 VS Code 1.69+。", + "running.deploy.steps": "正在執行部署步驟...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "建置及偵錯使用中的檔案", "cl.exe.not.available": "只有從 VS 的開發人員命令提示字元執行 VS Code 時,才可使用 {0} 組建和偵錯。", diff --git a/Extension/i18n/cht/src/LanguageServer/extension.i18n.json b/Extension/i18n/cht/src/LanguageServer/extension.i18n.json index e88887b9d9..91057c12c4 100644 --- a/Extension/i18n/cht/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/cht/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "了解如何使用 vcpkg 安裝此標頭的程式庫", "copy.vcpkg.command": "將用於安裝 '{0}' 的 vcpkg 命令複製到剪貼簿", + "on.disabled.command": "當 `C_Cpp.intelliSenseEngine` 設為 `Disabled` 時,無法執行 IntelliSense 的相關命令。", "client.not.found": "找不到用戶端", "configuration.select.first": "先開啟資料夾以選取組態", "configuration.provider.select.first": "先開啟資料夾以選取組態提供者", diff --git a/Extension/i18n/cht/src/nativeStrings.i18n.json b/Extension/i18n/cht/src/nativeStrings.i18n.json index cf9ab65d2b..442d5d1530 100644 --- a/Extension/i18n/cht/src/nativeStrings.i18n.json +++ b/Extension/i18n/cht/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "資料夾", "file_tag": "檔案", "compiler_default_language_standard_version_old": "編譯器傳回預設語言標準版本: {0}。因為此版本為舊版本,將嘗試使用較新的版本 {1} 為預設版本。", - "unexpected_output_from_clang_tidy": "來自 clang-tidy 的未預期輸出: {0}。預期是: {1}。" + "unexpected_output_from_clang_tidy": "來自 clang-tidy 的未預期輸出: {0}。預期是: {1}。", + "generate_doxygen_comment": "產生 Doxygen 註解" } \ No newline at end of file diff --git a/Extension/i18n/csy/package.i18n.json b/Extension/i18n/csy/package.i18n.json index 6be9589766..f96f613ba8 100644 --- a/Extension/i18n/csy/package.i18n.json +++ b/Extension/i18n/csy/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "Ladit soubor C/C++", "c_cpp.command.BuildAndRunFile.title": "Spustit soubor C/C++", "c_cpp.command.AddDebugConfiguration.title": "Přidat konfiguraci ladění", + "c_cpp.command.GenerateDoxygenComment.title": "Vygenerovat komentář Doxygenu", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Maximální počet souběžných vláken, která se mají použít pro zpracování služby jazyka. Hodnota je nápověda a nemusí být vždy použita. Výchozí hodnota `null` (prázdná) používá počet dostupných logických procesorů.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Maximální počet procesů uložených v mezipaměti, které se mají použít pro zpracování služby jazyka. Výchozí hodnota `null` (prázdná) používá dvojnásobek dostupného počtu logických procesorů.", "c_cpp.configuration.maxMemory.markdownDescription": "Maximální paměť (v MB), která je k dispozici pro zpracování služby jazyka. Po překročení tohoto využití paměti bude uloženo do mezipaměti méně procesů, které budou spuštěny souběžně. Výchozí hodnota `null` (prázdná) používá volnou paměť systému.", @@ -55,6 +56,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Zobrazit jenom akci kódu Vymazat vše (nebo Vymazat vše , pokud existuje jenom jeden typ, nebo Vymazat toto, pokud je jenom jeden problém).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Zobrazit akci kódu Vymazat vše (pokud existuje více typů problémů) a akci kódu Vymazat vše (nebo Vymazat toto, pokud u dochází pouze k jednomu problému)", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Zobrazení možnosti Vymazat vše (pokud existuje více typů problémů), Vymazat všechny (pokud existuje více problémů pro ) a Vymazat tento kód", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Pokud je hodnota `true`, formátování se spustí na řádcích změněných akcemi kódu 'Opravit'.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Pokud `true`, bude analýza kódu pomocí `clang-tidy` povolena a spuštěna automaticky, pokud je `#C_Cpp.codeAnalysis.runAutomatically#` `true` (výchozí).", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Úplná cesta ke spustitelnému souboru `clang-tidy`. Pokud se nespecifikuje a `clang-tidy` je k dispozici na cestě prostředí, použije se. Pokud se na cestě prostředí nenajde, použije se kopie `clang-tidy`, která se dodává spolu s rozšířením.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Určuje konfiguraci `clang-tidy` ve formátu YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{key: x, value: y}]}`. Když je hodnota prázdná, `clang-tidy` se pokusí najít soubor s názvem `.clang-tidy` pro každý zdrojový soubor v jeho nadřazených adresářích.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Filtry vyloučení se vyhodnotí pro každý soubor a složku, které se vyskytnou.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Znak, který se použije jako oddělovač cest pro výsledky automatického dokončení direktiv `#include`", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Když se tato možnost nastaví na `true`, popisky ovládacích prvků po najetí myší a automatické dokončování budou zobrazovat jen určité popisky strukturovaných komentářů. Jinak se budou zobrazovat všechny komentáře.", + "c_cpp.configuration.doxygen.generateOnType.description": "Určuje, jestli se má po zadání zvoleného stylu komentáře automaticky vložit komentář Doxygen.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Řetězec znaků použitý jako počáteční řádek komentáře Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Vzor, který zahájí víceřádkový nebo jednořádkový blok komentáře. Výchozí vzor pro pokračování je pro víceřádkové bloky komentářů ` * `, nebo tento řetězec pro jednořádkové bloky.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Vzor, který zahájí víceřádkový nebo jednořádkový blok komentáře", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Text, který se vloží na další řádek, když se ve víceřádkovém nebo jednořádkovém bloku komentáře stiskne klávesa Enter.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Cesta k ladicímu programu MI (třeba gdb). Pokud se nezadá, vyhledá se pro ladicí program nejdříve cesta.", "c_cpp.debuggers.miDebuggerArgs.description": "Další argumenty pro ladicí program MI (třeba gdb)", "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.description": "Nepovinný parametr. Když se nastaví na true, ladicí program by se měl zastavit u vstupního bodu cíle. Pokud se předá processId, nemá parametr žá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 miDebugServerAddress, nebo s vlastním serverem s customSetupCommand, na kterém běží \"-target-select remote \".", "c_cpp.debuggers.debugServerArgs.description": "Volitelné argumenty ladicího serveru. Výchozí hodnota je null.", diff --git a/Extension/i18n/csy/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/csy/src/Debugger/attachToProcess.i18n.json index a769493093..f0ad4e7900 100644 --- a/Extension/i18n/csy/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/csy/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "Zvolená konfigurace ladění neobsahuje {0}.", + "debugger.path.and.server.address.required": "{0} v konfiguraci ladění vyžaduje {1} a {2}", + "no.pipetransport.useextendedremote": "Zvolená konfigurace ladění neobsahuje {0} nebo {1}", "select.process.attach": "Vyberte proces, ke kterému se má program připojit.", "process.not.selected": "Proces se nevybral.", "pipe.failed": "Operaci přenosu přes kanál se nepovedlo získat operační systém a procesy.", - "no.process.list": "Operaci připojení přenosu se nepovedlo získat seznam procesů." + "no.process.list": "Operaci připojení přenosu se nepovedlo získat seznam procesů.", + "failed.to.make.gdb.connection": "Nepodařilo se vytvořit připojení GDB: {0}.", + "failed.to.parse.processes": "Nepodařilo se parsovat procesy: {0}." } \ No newline at end of file diff --git a/Extension/i18n/csy/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/csy/src/Debugger/configurationProvider.i18n.json index b101a39342..673ae56b2d 100644 --- a/Extension/i18n/csy/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/csy/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "Nepovedlo se najít LLDB.framework pro lldb-mi. Nainstalujte prosím XCode nebo jeho nástroje příkazového řádku.", "debugger.launchConfig": "Spustit konfiguraci:", "vs.code.1.69+.required": "DeploySteps vyžaduje VS Code 1.69+.", + "running.deploy.steps": "Spouští se kroky nasazení...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "sestavit a ladit aktivní soubor", "cl.exe.not.available": "Sestavení a ladění {0} je k dispozici jen v případě, že se nástroj VS Code spustil z nástroje Developer Command Prompt pro VS.", diff --git a/Extension/i18n/csy/src/LanguageServer/extension.i18n.json b/Extension/i18n/csy/src/LanguageServer/extension.i18n.json index fb3edfaffb..fcfa5cf9bf 100644 --- a/Extension/i18n/csy/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/csy/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Jak nainstalovat knihovnu pro tuto hlavičku pomocí vcpkg", "copy.vcpkg.command": "Zkopírovat příkaz vcpkg pro instalaci {0} do schránky", + "on.disabled.command": "Příkazy související s IntelliSense se nedají spustit, když je `C_Cpp.intelliSenseEngine` nastavené na `Disabled`.", "client.not.found": "klient se nenašel", "configuration.select.first": "Pokud chcete vybrat konfiguraci, otevřete nejdříve složku.", "configuration.provider.select.first": "Pokud chcete vybrat poskytovatele konfigurace, otevřete nejdříve složku.", diff --git a/Extension/i18n/csy/src/nativeStrings.i18n.json b/Extension/i18n/csy/src/nativeStrings.i18n.json index ae55990840..79e77ed517 100644 --- a/Extension/i18n/csy/src/nativeStrings.i18n.json +++ b/Extension/i18n/csy/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Složka", "file_tag": "Soubor", "compiler_default_language_standard_version_old": "Kompilátor vrátil standardní verzi výchozího jazyka: {0}. Protože je tato verze stará, pokusí se použít novější verzi {1} jako výchozí.", - "unexpected_output_from_clang_tidy": "Neočekávaný výstup z clang-tidy: {0}. Očekáváno: {1}." + "unexpected_output_from_clang_tidy": "Neočekávaný výstup z clang-tidy: {0}. Očekáváno: {1}.", + "generate_doxygen_comment": "Vygenerovat komentář Doxygenu" } \ No newline at end of file diff --git a/Extension/i18n/deu/package.i18n.json b/Extension/i18n/deu/package.i18n.json index 0756567d00..e4756c5e01 100644 --- a/Extension/i18n/deu/package.i18n.json +++ b/Extension/i18n/deu/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "C/C++-Datei debuggen", "c_cpp.command.BuildAndRunFile.title": "C/C++-Datei ausführen", "c_cpp.command.AddDebugConfiguration.title": "Debugkonfiguration hinzufügen", + "c_cpp.command.GenerateDoxygenComment.title": "Doxygenkommentar generieren", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Die maximale Anzahl gleichzeitiger Threads, die für die Sprachdienstverarbeitung verwendet werden sollen. Der Wert ist ein Hinweis und kann unter Umständen nicht immer verwendet werden. Mit dem Standardwert `null` (leer) werden doppelt so viele logische Prozessoren wie verfügbar verwendet.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Die maximale Anzahl zwischengespeicherter Prozesse, die für die Sprachdienstverarbeitung verwendet werden sollen. Mit dem Standardwert `null` (leer) werden doppelt so viele logische Prozessoren wie verfügbar verwendet.", "c_cpp.configuration.maxMemory.markdownDescription": "Der maximale Arbeitsspeicher (in MB), der für die Sprachdienstverarbeitung verfügbar ist. Weniger Prozesse werden zwischengespeichert und gleichzeitig ausgeführt, nachdem diese Speicherauslastung überschritten wurde. Beim Standardwert `null` (leer) wird der freie Arbeitsspeicher des Systems verwendet.", @@ -48,20 +49,21 @@ "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "Das Globmuster, mit dem Dateipfade verglichen werden sollen. Legen Sie diesen Wert auf `true` oder `false` fest, um das Muster zu aktivieren bzw. zu deaktivieren.", "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "Zusätzliche Überprüfung der gleichgeordneten Elemente einer entsprechenden Datei. Verwenden Sie `$(basename)` als Variable für den entsprechenden Dateinamen.", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "Bei `true` wird die Codeanalyse automatisch für eine Datei ausgeführt, nachdem sie geöffnet oder gespeichert wurde.", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`True` gibt an, dass die Codeaktion „Deaktivieren“ angezeigt wird, wenn sie verfügbar ist (bei der nächsten Ausführung der Codeanalyse). Wenn die Codeaktion „Deaktivieren“ verwendet wird, wird der Warnungscode der Einstellung `C_Cpp.codeAnalysis.clangTidy.checks.disabled` hinzugefügt.", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "Bei `true` wird die Codeaktion „Dokumentation anzeigen für“ angezeigt, wenn sie verfügbar ist (bei der nächsten Ausführung der Codeanalyse).", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true` gibt an, dass die Codeaktion \"Deaktivieren\" angezeigt wird, wenn sie verfügbar ist (bei der nächsten Ausführung der Codeanalyse). Wenn die Codeaktion \"Deaktivieren\" verwendet wird, wird der Warnungscode der Einstellung `C_Cpp.codeAnalysis.clangTidy.checks.disabled` hinzugefügt.", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "Bei `true` wird die Codeaktion \"Dokumentation anzeigen für\" angezeigt, wenn sie verfügbar ist (bei der nächsten Ausführung der Codeanalyse).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "Steuert, welche Codeaktionsoptionen für „Löschen“-Codeanalyseprobleme verfügbar sind. Wenn Sie die Einstellung ändern, um weitere Optionen anzuzeigen, muss die Codeanalyse möglicherweise erneut ausgeführt werden.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "Keine „Löschen“-Codeaktionen anzeigen.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Zeigen Sie nur die Codeaktion „Alle löschen“ an (oder „Alle löschen“, wenn nur ein Typ vorhanden ist, oder „Diese löschen“, wenn nur ein Problem vorliegt).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Zeigen Sie die Codeaktion „Alle löschen“ (wenn mehrere Problemtypen vorhanden sind) und die Codeaktion „Alle löschen“ (oder „Diese löschen“, wenn nur ein Problem für den vorliegt)", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Zeigen Sie die Codeaktionen „Alle löschen“ (wenn mehrere Problemtypen vorhanden sind), „Alle löschen“ (wenn mehrere Probleme für den vorhanden sind) und „Diese löschen“ an.", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Bei `true` wird die Formatierung in den Zeilen ausgeführt, die durch Codeaktionen vom Typ \"Korrigieren\" geändert wurden.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Bei `true` wird die Codeanalyse mit `clang-tidy` aktiviert und automatisch ausgeführt, wenn `#C_Cpp.codeAnalysis.runAutomatically#` gleich `true` (Standardeinstellung) ist.", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Der vollständige Pfad der ausführbaren Datei `clang-tidy`. Wenn nicht angegeben, ist `clang-tidy` im verwendeten Umgebungspfad verfügbar. Wenn der Umgebungspfad nicht gefunden wird, wird die `clang-tidy` verwendet, die mit der Erweiterung gebündelt ist.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Gibt eine `clang-tidy`-Konfiguration im YAML-/JSON-Format an: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{Schlüssel: x, Wert: y}]}`. Wenn der Wert leer ist, versucht `clang-tidy`, eine Datei namens `.clang-tidy` für jede Quelldatei in den übergeordneten Verzeichnissen zu finden.", "c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "Gibt eine `clang-tidy`-Konfiguration im YAML-/JSON-Format an, die als Fallback verwendet werden soll, wenn `#C_Cpp.codeAnalysis.clangTidy.config#` nicht festgelegt ist und keine `.clang-tidy`-Datei gefunden wird: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{Schlüssel: x, Wert: y}]}`.", "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "Ein erweiterter regulärer POSIX-Ausdruck (Extended Regular Expression/ERE), der dem Namen der Header entspricht, aus denen die Diagnose ausgegeben werden soll. Diagnosen aus der Hauptdatei jeder Übersetzungseinheit werden immer angezeigt. Die Variable `${workspaceFolder}` wird unterstützt (und als standardmäßiger Fallbackwert benutzt, wenn keine `.clang-tidy`-Datei vorhanden ist). Wenn diese Option nicht `null` (leer) ist, überschreibt sie die Option `HeaderFilterRegex` in einer `.clang-tidy`-Datei, sofern vorhanden.", "c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": "Zusätzliche Befehlszeilenargumente, die an `clang-tidy` übergeben werden sollen. Diese haben Vorrang vor den entsprechenden Einstellungen für `C_Cpp.codeAnalysis.clangTidy.*`.", - "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "Wenn `true` und `compileCommands` festgelegt sind, wird das Argument `-p=` an `clang-tidy` übergeben, anstatt nach `--` Buildargumente zu übergeben. Dies funktioniert möglicherweise nicht, wenn Umgebungsvariablen nicht so festgelegt sind, dass vom System eingeschlossene Elemente gefunden werden können.", + "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "Wenn `true` und `compileCommands` festgelegt sind, wird das Argument `-p=` an `clang-tidy` übergeben, anstatt Buildargumente hinter `--` zu übergeben. Dies funktioniert möglicherweise nicht, wenn Umgebungsvariablen nicht so festgelegt sind, dass vom System eingeschlossene Elemente gefunden werden können.", "c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "Liste der aktivierten `clang-tidy`-Überprüfungen. Die Werte werden an `Checks` in einer `.clang-tidy`-Datei oder (falls vorhanden) an `#C_Cpp.codeAnalysis.clangTidy.config#` angefügt. Die Standardüberprüfung `clang-analyzer-*` wird immer verwendet, es sei denn, sie ist explizit deaktiviert.", "c_cpp.configuration.codeAnalysis.clangTidy.checks.disabled.markdownDescription": "Liste der aktivierten `clang-tidy`-Überprüfungen. Die Werte werden an `Checks` in einer `.clang-tidy`-Datei oder (falls vorhanden) an `#C_Cpp.codeAnalysis.clangTidy.config#` angefügt.", "c_cpp.configuration.formatting.description": "Konfiguriert das Formatierungsmodul.", @@ -175,7 +177,7 @@ "c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "Zeigt Einlegehinweise für den abgeleiteten Typ an, wenn `auto` in einer Deklaration links vom Bezeichner verwendet wird:\n```cpp \n\n auto /* int */ index = 0;\n```", "c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "Inlayhinweise für Parameternamen anzeigen:\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```", "c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "Blendet führendes `_` in Parameternamenshinweisen aus.", - "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "Parameternamenhinweise unterdrücken, wenn der Argumenttext oder der Inlinekommentar den Parameternamen enthält:\n```cpp \n\nint a = getArea(width, /* height: */ y);\n```", + "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "Parameternamenhinweise unterdrücken, wenn der Argumenttext oder der Inlinekommentar den Parameternamen enthält:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```", "c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "Zeigen Sie den Inlayhinweis-Verweisoperator `&` für Parameter an, die von einem nicht konstanten Verweis übergeben werden:\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```", "c_cpp.configuration.inlayHints.referenceOperator.showSpace.markdownDescription": "Steuert, ob nach `&` ein Leerzeichen für Parameter angezeigt wird, die von einem nicht konstanten Verweis übergeben werden:\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```", "c_cpp.configuration.loggingLevel.markdownDescription": "Die Ausführlichkeit der Protokollierung im Ausgabebereich. Die Reihenfolge der Ebenen von \"am wenigsten ausführlich\" bis \"am ausführlichsten\" lautet: `None` < `Error` < `Warning` < `Information` < `Debug`.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Die Ausschlussfilter werden für jede gefundene Datei und jeden gefundenen Ordner ausgewertet.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Das Zeichen, das als Pfadtrennzeichen für die Ergebnisse der automatischen Vervollständigung `#include` verwendet wird.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Wenn `true` festgelegt ist, zeigen die QuickInfos für Draufzeigen und AutoVervollständigen nur bestimmte Bezeichnungen strukturierter Kommentare an. Andernfalls werden alle Kommentare angezeigt.", + "c_cpp.configuration.doxygen.generateOnType.description": "Steuert, ob der Doxygenkommentar nach Eingabe des ausgewählten Kommentarstils automatisch eingefügt wird.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Die Zeichenfolge von Zeichen, die als Startzeile des Doxygen-Kommentars verwendet wird.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Muster, mit dem ein mehrzeiliger oder einzeiliger Kommentarblock beginnt. Das Fortsetzungsmuster wird standardmäßig auf ` * ` für mehrzeilige Kommentarblöcke oder auf diese Zeichenfolge für einzeilige Kommentarblöcke festgelegt.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Das Muster, mit dem ein mehrzeiliger oder einzeiliger Kommentarblock beginnt.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Der Text, der in der nächsten Zeile eingefügt wird, wenn in einem mehrzeiligen oder einzeiligen Kommentarblock die EINGABETASTE gedrückt wird.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Der Pfad zum MI-Debugger (z. B. gdb). Ist die Option nicht angegeben, wird zuerst nach dem Pfad für den Debugger gesucht.", "c_cpp.debuggers.miDebuggerArgs.description": "Zusätzliche Argumente für den MI-Debugger (z. B. gdb).", "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.description": "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 \"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\".", @@ -287,7 +292,7 @@ "c_cpp.debuggers.coreDumpPath.description": "Optionaler vollständiger Pfad zu einer Kern-Speicherabbilddatei für das angegebene Programm. Der Standardwert ist \"NULL\".", "c_cpp.debuggers.cppdbg.externalConsole.description": "Wenn dieser Wert auf TRUE festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei FALSE wird die Komponente unter Linux und Windows in der integrierten Konsole angezeigt.", "c_cpp.debuggers.cppvsdbg.externalConsole.description": "[Veraltet für \"console\"] Wenn dieser Wert auf TRUE festgelegt ist, wird eine Konsole für die zu debuggende Komponente gestartet. Bei FALSE wird keine Konsole gestartet.", - "c_cpp.debuggers.cppvsdbg.console.description": "Gibt an, wo das Debugziel gestartet wird. Wenn keine Angabe vorliegt, wird standardmäßig \"internalConsole\" verwendet.", + "c_cpp.debuggers.cppvsdbg.console.description": "Gibt an, wo das Debugziel gestartet wird. Wenn keine Angabe vorliegt, wird standardmäßig „internalConsole“ verwendet.", "c_cpp.debuggers.cppvsdbg.console.internalConsole.description": "Die Ausgabe an die Debugging-Konsole von VS Code. Das Lesen von Konsoleneingaben (z. B. `std::cin` oder `scanf`) wird nicht unterstützt.", "c_cpp.debuggers.cppvsdbg.console.integratedTerminal.description": "Das integrierte Terminal von VS Code.", "c_cpp.debuggers.cppvsdbg.console.externalTerminal.description": "Konsolenanwendungen werden in einem externen Terminalfenster gestartet. Das Fenster wird in Neustartszenarien erneut verwendet und beim Beenden der Anwendung nicht automatisch ausgeblendet.", diff --git a/Extension/i18n/deu/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/deu/src/Debugger/attachToProcess.i18n.json index 0978109d0a..bc59c8c193 100644 --- a/Extension/i18n/deu/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/deu/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "\"{0}\" ist in der ausgewählten Debugkonfiguration nicht enthalten.", + "debugger.path.and.server.address.required": "{0} in der Debugkonfiguration erfordert {1} und {2}.", + "no.pipetransport.useextendedremote": "{0} oder {1} ist in der ausgewählten Debugkonfiguration nicht enthalten.", "select.process.attach": "Prozess auswählen, an den angefügt werden soll", "process.not.selected": "Der Prozess wurde nicht ausgewählt.", "pipe.failed": "Der Pipetransport konnte das Betriebssystem und die Prozesse nicht abrufen.", - "no.process.list": "Beim Anhängen an den Transport konnte die Prozessliste nicht abgerufen werden." + "no.process.list": "Beim Anhängen an den Transport konnte die Prozessliste nicht abgerufen werden.", + "failed.to.make.gdb.connection": "Fehler beim Herstellen einer GDB-Verbindung: „{0}“.", + "failed.to.parse.processes": "Fehler beim Analysieren von Prozessen: „{0}“." } \ No newline at end of file diff --git a/Extension/i18n/deu/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/deu/src/Debugger/configurationProvider.i18n.json index 2aa99be562..5037215c40 100644 --- a/Extension/i18n/deu/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/deu/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "\"LLDB.framework\" wurde für LLDB-Mi nicht gefunden. Installieren Sie XCode oder die XCode-Befehlszeilentools.", "debugger.launchConfig": "Startkonfiguration:", "vs.code.1.69+.required": "„deploySteps“ erfordert VS Code 1.69 oder höher.", + "running.deploy.steps": "Bereitstellungsschritte werden ausgeführt...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "Aktive Datei erstellen und debuggen", "cl.exe.not.available": "{0}-Build und -Debuggen können nur verwendet werden, wenn VS Code von der Developer-Eingabeaufforderung für VS ausgeführt wird.", diff --git a/Extension/i18n/deu/src/LanguageServer/extension.i18n.json b/Extension/i18n/deu/src/LanguageServer/extension.i18n.json index 599dcbc9a8..03ca8cc5f0 100644 --- a/Extension/i18n/deu/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/deu/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Erfahren Sie, wie Sie mit vcpkg eine Bibliothek für diesen Header installieren.", "copy.vcpkg.command": "vcpkg-Befehl zum Installieren von \"{0}\" in die Zwischenablage kopieren", + "on.disabled.command": "IntelliSense-bezogene Befehle können nicht ausgeführt werden, wenn `C_Cpp.intelliSenseEngine` auf `Disabled` festgelegt ist.", "client.not.found": "Client nicht gefunden.", "configuration.select.first": "Zum Auswählen einer Konfiguration zuerst einen Ordner öffnen", "configuration.provider.select.first": "Zum Auswählen eines Konfigurationsanbieters zuerst einen Ordner öffnen", diff --git a/Extension/i18n/deu/src/nativeStrings.i18n.json b/Extension/i18n/deu/src/nativeStrings.i18n.json index d33dbf90f0..162ee23fd8 100644 --- a/Extension/i18n/deu/src/nativeStrings.i18n.json +++ b/Extension/i18n/deu/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Ordner", "file_tag": "Datei", "compiler_default_language_standard_version_old": "Der Compiler hat die Standardversion der Standardsprache zurückgegeben: {0}. Da diese Version alt ist, wird versucht, eine neuere Version {1} als Standard zu verwenden.", - "unexpected_output_from_clang_tidy": "Unerwartete Ausgabe von „clang-tidy“: {0}. Erwartet: {1}." + "unexpected_output_from_clang_tidy": "Unerwartete Ausgabe von „clang-tidy“: {0}. Erwartet: {1}.", + "generate_doxygen_comment": "Doxygenkommentar generieren" } \ No newline at end of file diff --git a/Extension/i18n/esn/package.i18n.json b/Extension/i18n/esn/package.i18n.json index 0a41834ac4..aebeae0c75 100644 --- a/Extension/i18n/esn/package.i18n.json +++ b/Extension/i18n/esn/package.i18n.json @@ -33,19 +33,20 @@ "c_cpp.command.BuildAndDebugFile.title": "Depurar archivo C/C++", "c_cpp.command.BuildAndRunFile.title": "Ejecutar archivo C/C++", "c_cpp.command.AddDebugConfiguration.title": "Agregar configuración de depuración", + "c_cpp.command.GenerateDoxygenComment.title": "Generar comentario de Doxygen", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Número máximo de subprocesos simultáneos que se usarán para el procesamiento del servicio de lenguaje. El valor es una sugerencia y no se puede usar siempre. El valor predeterminado de `null` (vacío) usa el número de procesadores lógicos disponibles.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Número máximo de procesos almacenados en caché que se usarán para el procesamiento del servicio de lenguaje. El valor predeterminado de `null` (vacío) usa el doble de procesadores lógicos disponibles.", "c_cpp.configuration.maxMemory.markdownDescription": "Memoria máxima (en MB) disponible para el procesamiento del servicio de lenguaje. Menos procesos se almacenarán en caché y se ejecutarán simultáneamente después de que se supere el uso de memoria. El valor predeterminado de `null` (vacío) usa la memoria libre del sistema.", "c_cpp.configuration.intelliSense.maxCachedProcesses.markdownDescription": "Número máximo de procesos de IntelliSense que se van a seguir ejecutando. El valor predeterminado `null` (vacío) usa el valor heredado de `#C_Cpp.maxCachedProcesses#`.", "c_cpp.configuration.intelliSense.maxMemory.markdownDescription": "Los procesos anteriores de IntelliSense se cerrarán antes de que se creen nuevos procesos después de superar este uso de memoria (en MB). El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxMemory#`.", - "c_cpp.configuration.references.maxConcurrentThreads.markdownDescription": "Número máximo de subprocesos simultáneos que se usarán para `Find all references` y `Rename`. El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxConcurrentThreads#`.", + "c_cpp.configuration.references.maxConcurrentThreads.markdownDescription": "Número máximo de subprocesos simultáneos que se usarán para 'Buscar todas las referencias' y 'Cambiar nombre'. El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxConcurrentThreads#`.", "c_cpp.configuration.references.maxCachedProcesses.markdownDescription": "Número máximo de procesos que se mantendrán en memoria para `Find All References` y `Rename`. El valor `0` deshabilita esta característica. El valor `null` (vacío) usa el valor heredado de `#C_Cpp.maxCachedProcesses#`.", - "c_cpp.configuration.references.maxMemory.markdownDescription": "Menos procesos de `Find All References` y `Rename` se ejecutarán simultáneamente después de superar este uso de memoria (en MB). El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxMemory#`.", + "c_cpp.configuration.references.maxMemory.markdownDescription": "Menos procesos de 'Buscar todas las referencias' y 'Cambiar nombre' se ejecutarán simultáneamente después de superar este uso de memoria (en MB). El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxMemory#`.", "c_cpp.configuration.codeAnalysis.maxConcurrentThreads.markdownDescription": "Número máximo de subprocesos simultáneos que se usarán para análisis de código. El valor predeterminado de `null` (vacío) usa la mitad del valor heredado de `#C_Cpp.maxConcurrentThreads#`.", "c_cpp.configuration.codeAnalysis.maxMemory.markdownDescription": "Menos procesos de análisis de código se ejecutarán simultáneamente después de superar este uso de memoria (en MB). El valor predeterminado de `null` (vacío) usa el valor heredado de `#C_Cpp.maxMemory#`.", "c_cpp.configuration.codeAnalysis.updateDelay.markdownDescription": "Controla el retraso en milisegundos antes de que el análisis de código empiece a procesarse después de que se desencadene un guardado desde una edición cuando `#files.autoSave#` es `afterDelay` y `#C_Cpp.codeAnalysis.runAutomatically#` es `true`.", "c_cpp.configuration.codeAnalysis.exclude.markdownDescription": "Configure patrones globales para excluir carpetas y archivos para el análisis de código. Los archivos que no estén en la carpeta del área de trabajo siempre se excluyen. Hereda valores de `#files.exclude#` y `#C_Cpp.files.exclude#`. Más información sobre los patrones globales [aquí](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", - "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "El patrón global con el que se van a comparar las rutas de acceso de los archivos. Establézcalo en `true` o `false` para habilitarlo o deshabilitarlo.", + "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "El patrón global con el que se van a comparar las rutas de acceso de los archivos. Establézcalo en`true` o `false` para habilitarlo o deshabilitarlo.", "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Usa `$(basename)` como variable para el nombre del archivo coincidente.", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "Si es `true`, el análisis de código se ejecutará automáticamente en un archivo después de abrirlo o guardarlo.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "Si es `true`, la acción de código 'Deshabilitar' se mostrará cuando esté disponible (la próxima vez que se ejecute el análisis de código). Cuando se usa la acción de código 'Deshabilitar', agrega el código de advertencia a la configuración `C_Cpp.codeAnalysis.clangTidy.checks.disabled`.", @@ -55,6 +56,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Mostrar solo la acción de código 'Borrar todo' (o 'Borrar todos los ' si solo hay un tipo o 'Borrar esto' si solo hay un problema).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Mostrar la acción de código 'Borrar todo' (si hay varios tipos de problema) y la acción de código 'Borrar todos los ' (o 'Borrar esto' si solo hay un problema para el )", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Mostrar las acciones de código 'Borrar todo' (si hay varios tipos de problema), 'Borrar todos los ' (si hay varios problemas para el ) y 'Borrar este'", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Si es `true`, el formato se ejecutará en las líneas modificadas por las acciones de código \"Corregir\".", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Si es `true`, el análisis de código que usa `clang-tidy` se habilitará y se ejecutará automáticamente si `#C_Cpp.codeAnalysis.runAutomatically#` es `true` (valor predeterminado).", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Ruta de acceso completa del archivo ejecutable de `clang-tidy`. Si no se especifica y `clang-tidy` está disponible en la ruta de acceso del entorno, se usará este. Si no se encuentra en la ruta de acceso del entorno, se usará el `clang-tidy` incluido con la extensión.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Especifica una configuración `clang-tidy` en formato YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{clave: x, valor: y}]}`. Cuando el valor está vacío, `clang-tidy` intentará encontrar un archivo denominado `.clang-tidy` para cada archivo de origen en sus directorios primarios.", @@ -173,7 +175,7 @@ "c_cpp.configuration.inactiveRegionBackgroundColor.description": "Controla el color de fondo de los bloques de preprocesador inactivos. La entrada se realiza en forma de código de color hexadecimal o de un color para temas válido. Si no se establece, el valor predeterminado es transparente. Esta configuración solo se aplica cuando está habilitada la atenuación de regiones inactivas.", "c_cpp.configuration.inlayHints.autoDeclarationTypes.enabled.markdownDescription": "Mostrar sugerencias de incrustación para el tipo deducido cuando se usa `auto` en una declaración:\n```cpp \n\n auto index /* : int */ = 0;\n```", "c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "Mostrar sugerencias de incrustación para el tipo deducido cuando se usa `auto` en una declaración:\n```cpp \n\n auto /* int */ index = 0;\n```", - "c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "Mostrar sugerencias de incrustación para nombres de parámetros:\n```cpp \n\nint a = getArea(/* width: */ x, /* height: */ y);\n```", + "c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "Mostrar sugerencias de incrustación para nombres de parámetros:\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```", "c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "Ocultar el `_` inicial en las sugerencias de nombre de parámetro.", "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "Suprima las sugerencias de nombre de parámetro cuando el texto del argumento o el comentario insertado contenga el nombre del parámetro:\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```", "c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "Muestra el operador de referencia de sugerencia de incrustación `&` para los parámetros pasados por una referencia no const:\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Los filtros de exclusión se evaluarán con cada archivo y carpeta encontrados.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Carácter usado como separador de ruta de acceso para los resultados de finalización automática de instrucciones `#include`.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Si es `true`, la información sobre herramientas al mantener el puntero y autocompletar solo mostrará ciertas etiquetas de comentarios estructurados. De lo contrario, se muestran todos los comentarios.", + "c_cpp.configuration.doxygen.generateOnType.description": "Controla si se va a insertar automáticamente el comentario de Doxygen después de escribir el estilo de comentario elegido.", + "c_cpp.configuration.doxygen.generatedStyle.description": "La cadena de caracteres utilizada como línea de inicio del comentario de Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Patrón que comienza un bloque de comentario de una o varias líneas. El valor predeterminado del patrón de continuación es ` * ` para los bloques de comentario multilínea o esta cadena para los bloques de comentario de una línea.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Patrón que comienza un bloque de comentario de una o varias líneas.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Texto que se insertará en la línea siguiente cuando se presione Entrar dentro de un bloque de comentario de una o varias líneas.", @@ -224,7 +228,7 @@ "c_cpp.configuration.codeFolding.description": "Si está habilitada, el servidor de lenguaje proporciona intervalos de plegado de código.", "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.renameRequiresIdentifier.markdownDescription": "Si es `true`, 'Rename Symbol' requerirá un identificador de C/C++ válido.", + "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": "Configura patrones globales para excluir carpetas (y archivos si se cambia `#C_Cpp.exclusionPolicy#`). Estos son específicos de la extensión de C/C++ y se agregan a `#files.exclude#`, pero a diferencia de `#files.exclude#` también se aplican a rutas fuera de la carpeta del área de trabajo actual y no se quitan de la Vista del explorador. Más información acerca de los patrones de globales [aquí](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", "c_cpp.configuration.filesExcludeBoolean.markdownDescription": "El patrón global con el que se van a comparar las rutas de acceso de los archivos. Establézcalo en `true` o `false` para habilitarlo o deshabilitarlo.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Ruta de acceso del depurador MI (como gdb). Si no se especifica, se busca primero el depurador donde indica la instrucción path.", "c_cpp.debuggers.miDebuggerArgs.description": "Argumentos adicionales para el depurador MI (como gdb).", "c_cpp.debuggers.miDebuggerServerAddress.description": "Dirección de red del servidor del depurador MI al que debe conectarse (ejemplo: localhost:1234).", + "c_cpp.debuggers.useExtendedRemote.description": "Conéctese al servidor del depurador de Instancia administrada con el modo extendido-remoto de destino.", "c_cpp.debuggers.stopAtEntry.description": "Parámetro opcional. Si se establece en true, el depurador debe detenerse en el punto de entrada del destino. Si se pasa processId, no tiene efecto.", "c_cpp.debuggers.debugServerPath.description": "Ruta de acceso completa opcional al servidor de depuración que se va a iniciar. El valor predeterminado es null. Se usa junto con \"miDebugServerAddress\" o su servidor propio con un comando \"customSetupCommand\" que ejecuta \"-target-select remote \".", "c_cpp.debuggers.debugServerArgs.description": "Argumentos opcionales del servidor de depuración. El valor predeterminado es NULL.", diff --git a/Extension/i18n/esn/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/esn/src/Debugger/attachToProcess.i18n.json index edfae81df6..f41c06c401 100644 --- a/Extension/i18n/esn/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/esn/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "La configuración de depuración elegida no contiene {0}", + "debugger.path.and.server.address.required": "{0} en la configuración de depuración requiere {1} y {2}", + "no.pipetransport.useextendedremote": "La configuración de depuración elegida no contiene {0} ni {1}", "select.process.attach": "Seleccione el proceso al que debe asociarse", "process.not.selected": "No se ha seleccionado el proceso.", "pipe.failed": "El transporte de canalización no pudo obtener el sistema operativo y los procesos.", - "no.process.list": "La asociación de transporte no puede obtener la lista de procesos." + "no.process.list": "La asociación de transporte no puede obtener la lista de procesos.", + "failed.to.make.gdb.connection": "No se pudo establecer la conexión GDB: \"{0}\".", + "failed.to.parse.processes": "No se pudieron analizar los procesos: \"{0}\"." } \ No newline at end of file diff --git a/Extension/i18n/esn/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/esn/src/Debugger/configurationProvider.i18n.json index 4173983d30..cbd885b525 100644 --- a/Extension/i18n/esn/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/esn/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "No se encuentra \"LLDB.framework\" para lldb-mi. Instale XCode o las herramientas de línea de comandos de XCode.", "debugger.launchConfig": "Configuración de inicio:", "vs.code.1.69+.required": "\"deploySteps\" requiere VS Code 1.69 ó posterior.", + "running.deploy.steps": "Ejecutando pasos de implementación...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "Compilar y depurar el archivo activo", "cl.exe.not.available": "La compilación y depuración de {0} solo se puede usar cuando VS Code se ejecuta desde el Símbolo del sistema para desarrolladores de Visual Studio.", diff --git a/Extension/i18n/esn/src/LanguageServer/extension.i18n.json b/Extension/i18n/esn/src/LanguageServer/extension.i18n.json index 22f1d8813d..85fb973976 100644 --- a/Extension/i18n/esn/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/esn/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Más información sobre el modo de instalar una biblioteca para este encabezado con vcpkg", "copy.vcpkg.command": "Copie el comando vcpkg para instalar \"{0}\" en el Portapapeles", + "on.disabled.command": "Los comandos relacionados con IntelliSense no se pueden ejecutar cuando `C_Cpp.intelliSenseEngine` está establecido en `Disabled`.", "client.not.found": "No se encuentra el cliente", "configuration.select.first": "Abra una carpeta primero para seleccionar una configuración", "configuration.provider.select.first": "Abra una carpeta primero para seleccionar un proveedor de configuración", diff --git a/Extension/i18n/esn/src/nativeStrings.i18n.json b/Extension/i18n/esn/src/nativeStrings.i18n.json index c25285390b..5f18efb33d 100644 --- a/Extension/i18n/esn/src/nativeStrings.i18n.json +++ b/Extension/i18n/esn/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Carpeta", "file_tag": "Archivo", "compiler_default_language_standard_version_old": "El compilador devolvió la versión estándar del lenguaje predeterminado: {0}. Dado que esta versión es antigua, se intentará usar la versión {1}, más reciente, como predeterminada.", - "unexpected_output_from_clang_tidy": "Salida inesperada de Clang-Tidy: {0}. Se esperaba: {1}." + "unexpected_output_from_clang_tidy": "Salida inesperada de Clang-Tidy: {0}. Se esperaba: {1}.", + "generate_doxygen_comment": "Generar comentario de Doxygen" } \ No newline at end of file diff --git a/Extension/i18n/fra/package.i18n.json b/Extension/i18n/fra/package.i18n.json index 44c0ced7eb..9a714c13e9 100644 --- a/Extension/i18n/fra/package.i18n.json +++ b/Extension/i18n/fra/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "Déboguer le fichier C/C++", "c_cpp.command.BuildAndRunFile.title": "Exécuter le fichier C/C++", "c_cpp.command.AddDebugConfiguration.title": "Ajouter une configuration de débogage", + "c_cpp.command.GenerateDoxygenComment.title": "Générer un commentaire Doxygen", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Nombre maximal de threads simultanés à utiliser pour le traitement du service de langage. La valeur est un indicateur et ne peut pas toujours être utilisée. La valeur par défaut de `null` (vide) utilise le nombre de processeurs logiques disponibles.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Nombre maximal de processus mis en cache à utiliser pour le traitement du service de langage. La valeur par défaut de `null` (vide) utilise deux fois plus de processeurs logiques disponibles.", "c_cpp.configuration.maxMemory.markdownDescription": "Mémoire maximale (en Mo) disponible pour le traitement du service de langage. Moins de processus seront mis en cache et exécutés simultanément après le dépassement de cette utilisation de la mémoire. La valeur par défaut de `null` (vide) utilise la mémoire libre du système.", @@ -55,6 +56,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Affichez uniquement l’action de code « Effacer tout » (ou « Effacer tous les » s’il n’y a qu’un seul type ou « Effacer ceci » s’il n’y a qu’un seul problème).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Afficher l’action de code « Effacer tout » (s’il existe plusieurs types de problèmes) et l’action de code « Effacer tous les » (ou « Effacer ceci » s’il n’y a qu’un seul problème pour le )", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Afficher l’option « Effacer tout » (s’il existe plusieurs types de problèmes), « Effacer tous les » (s’il existe plusieurs problèmes pour le ) et les actions de code « Effacer ceci »", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Si la valeur est `true`, la mise en forme est exécutée sur les lignes modifiées par les actions de code 'Corriger'.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Si la valeur est `true`, l’analyse du code à l’aide de `clang-tidy` est activée et s’exécute automatiquement si `#C_Cpp.codeAnalysis.runAutomatically#` a la valeur `true` (valeur par défaut).", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Le chemin complet de l'exécutable `clang-tidy`. S'il n'est pas spécifié, et que `clang-tidy` est disponible dans le chemin de l'environnement, il sera utilisé. S'il n'est pas trouvé dans le chemin de l'environnement, le `clang-tidy` fourni avec l'extension sera utilisé.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Spécifie une configuration `clang-tidy` au format YAML/JSON : `{Checks: '-*,clang-analyzer-*', CheckOptions: [{clé : x, valeur : y}]}`. Quand la valeur est vide, `clang-tidy` tente de trouver un fichier nommé `.clang-tidy` pour chaque fichier source dans ses répertoires parents.", @@ -175,7 +177,7 @@ "c_cpp.configuration.inlayHints.autoDeclarationTypes.showOnLeft.markdownDescription": "Afficher les indicateurs d’inlay pour le type déduit quand `auto` est utilisé dans une déclaration à gauche de l’identificateur :\n```cpp \n\n auto /* int */ index = 0;\n```", "c_cpp.configuration.inlayHints.parameterNames.enabled.markdownDescription": "Afficher des indicateurs d’inlay pour les noms de paramètres :\n```cpp \n\n int a = getArea(/* width: */ x, /* height: */ y);\n```", "c_cpp.configuration.inlayHints.parameterNames.hideLeadingUnderscores.markdownDescription": "Masquez `_` principal dans les indicateurs de nom de paramètre.", - "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "Supprimez les indicateurs de nom de paramètre lorsque le texte de l’argument ou le commentaire inline contient le nom du paramètre :\n```cpp \n\n int a = getArea(width, /* height: */ y);\n``", + "c_cpp.configuration.inlayHints.parameterNames.suppressWhenArgumentContainsName.markdownDescription": "Supprimez les indicateurs de nom de paramètre lorsque le texte de l’argument ou le commentaire inline contient le nom du paramètre :\n```cpp \n\n int a = getArea(width, /* height: */ y);\n```", "c_cpp.configuration.inlayHints.referenceOperator.enabled.markdownDescription": "Afficher l’opérateur de référence d’indicateur d’inlay `&` pour les paramètres passés par une référence non const :\n```cpp \n\n swap(/* &first: */ str1, /* &last: */ str2);\n```", "c_cpp.configuration.inlayHints.referenceOperator.showSpace.markdownDescription": "Contrôle si un espace est affiché après `&` pour les paramètres passés par référence non-const.\n```cpp \n\n swap(/* & first: */ str1, /* & last: */ str2);\n```", "c_cpp.configuration.loggingLevel.markdownDescription": "La verbosité de la journalisation dans le panneau de sortie. L'ordre des niveaux du moins verbeux au plus verbeux est : `None` < `Error` < `Warning` < `Information` < `Debug`.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Les filtres d'exclusion seront évalués pour chaque fichier et dossier rencontré.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Caractère utilisé comme séparateur de chemin dans les résultats d'autocomplétion de `#include`.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Si la valeur est `true`, les info-bulles de pointage et d'autocomplétion affichent uniquement certaines étiquettes de commentaires structurés. Sinon, tous les commentaires sont affichés.", + "c_cpp.configuration.doxygen.generateOnType.description": "Contrôle s’il faut insérer automatiquement le commentaire Doxygen après avoir tapé le style de commentaire choisi.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Chaîne de caractères utilisée comme ligne de départ du commentaire Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Modèle qui commence un bloc de commentaires multiligne ou monoligne. Le modèle consécutif a la valeur par défaut ` * ` pour les blocs de commentaires multilignes ou cette chaîne pour les blocs de commentaires monolignes.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Modèle qui commence un bloc de commentaires multiligne ou monoligne.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Texte à insérer sur la ligne suivante quand vous appuyez sur la touche Entrée dans un bloc de commentaires multiligne ou monoligne.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Chemin du débogueur MI (par exemple gdb). Si aucune valeur n'est spécifiée, le chemin du débogueur est recherché en premier lieu.", "c_cpp.debuggers.miDebuggerArgs.description": "Arguments supplémentaires pour le débogueur MI (par exemple gdb).", "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.description": "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é, le paramètre 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 \"miDebugServerAddress\" 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.", diff --git a/Extension/i18n/fra/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/fra/src/Debugger/attachToProcess.i18n.json index add1343802..9ce1774624 100644 --- a/Extension/i18n/fra/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/fra/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "La configuration de débogage choisie ne contient pas {0}", + "debugger.path.and.server.address.required": "{0} dans la configuration de débogage requiert {1} et {2}", + "no.pipetransport.useextendedremote": "La configuration de débogage choisie ne contient ni {0} ni {1}", "select.process.attach": "Sélectionner le processus à attacher", "process.not.selected": "Processus non sélectionné.", "pipe.failed": "Le transport de canal n'a pas pu obtenir le système d'exploitation et les processus.", - "no.process.list": "L'attachement de transport n'a pas pu obtenir la liste des processus." + "no.process.list": "L'attachement de transport n'a pas pu obtenir la liste des processus.", + "failed.to.make.gdb.connection": "Échec de la connexion GDB : «{0}».", + "failed.to.parse.processes": "Échec de l’analyse des processus : «{0}»." } \ No newline at end of file diff --git a/Extension/i18n/fra/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/fra/src/Debugger/configurationProvider.i18n.json index b20eb95da2..add3b808f0 100644 --- a/Extension/i18n/fra/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/fra/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "Impossible de localiser 'LLDB.framework' pour lldb-mi. Installez XCode ou les outils en ligne de commande XCode.", "debugger.launchConfig": "Lancer la configuration :", "vs.code.1.69+.required": "'deploySteps' nécessite VS Code 1.69+.", + "running.deploy.steps": "Exécution des étapes de déploiement...", "pre.Launch.Task": "tâche de prélancement : {0}", "build.and.debug.active.file": "Générer et déboguer le fichier actif", "cl.exe.not.available": "La génération et le débogage de {0} peuvent être utilisés uniquement quand VS Code est exécuté à partir de l'invite de commandes développeur pour VS.", diff --git a/Extension/i18n/fra/src/LanguageServer/extension.i18n.json b/Extension/i18n/fra/src/LanguageServer/extension.i18n.json index 0af4b82730..b0afae422c 100644 --- a/Extension/i18n/fra/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/fra/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Découvrir comment installer une bibliothèque pour cet en-tête avec vcpkg", "copy.vcpkg.command": "Copier la commande vcpkg pour installer '{0}' dans le Presse-papiers", + "on.disabled.command": "Les commandes liées à IntelliSense ne peuvent pas être exécutées quand `C_Cpp.intelliSenseEngine` a la valeur `Disabled`.", "client.not.found": "client introuvable", "configuration.select.first": "Commencer par ouvrir un dossier pour sélectionner une configuration", "configuration.provider.select.first": "Commencer par ouvrir un dossier pour sélectionner un fournisseur de configuration", diff --git a/Extension/i18n/fra/src/nativeStrings.i18n.json b/Extension/i18n/fra/src/nativeStrings.i18n.json index d5f7bd4612..94e1c1f455 100644 --- a/Extension/i18n/fra/src/nativeStrings.i18n.json +++ b/Extension/i18n/fra/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Dossier", "file_tag": "Fichier", "compiler_default_language_standard_version_old": "Le compilateur a retourné la version standard du langage par défaut : {0}. Étant donné que cette version est ancienne, essaiera d’utiliser une version plus récente {1} par défaut.", - "unexpected_output_from_clang_tidy": "Sortie inattendue de clang-tidy : {0}. Attendu : {1}." + "unexpected_output_from_clang_tidy": "Sortie inattendue de clang-tidy : {0}. Attendu : {1}.", + "generate_doxygen_comment": "Générer un commentaire Doxygen" } \ No newline at end of file diff --git a/Extension/i18n/ita/package.i18n.json b/Extension/i18n/ita/package.i18n.json index 61e46316ee..e09046dde0 100644 --- a/Extension/i18n/ita/package.i18n.json +++ b/Extension/i18n/ita/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "Debug file C/C++", "c_cpp.command.BuildAndRunFile.title": "Esegui file C/C++", "c_cpp.command.AddDebugConfiguration.title": "Aggiungere configurazione di debug", + "c_cpp.command.GenerateDoxygenComment.title": "Genera commento Doxygen", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Numero massimo di thread simultanei da utilizzare per l'elaborazione del servizio di linguaggio. Il valore è un suggerimento e non può essere sempre utilizzato. Il valore predefinito di `null` (vuoto) utilizza il numero di processori logici disponibili.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Numero massimo di processi memorizzati nella cache da utilizzare per l'elaborazione del servizio di linguaggio. Il valore predefinito di `null` (vuoto) utilizza il doppio del numero di processori logici disponibili.", "c_cpp.configuration.maxMemory.markdownDescription": "Memoria massima (in MB) disponibile per l'elaborazione del servizio di linguaggio. Un numero minore di processi verrà memorizzato nella cache ed eseguito contemporaneamente dopo il superamento dell'utilizzo della memoria. Il valore predefinito di `null` (vuoto) utilizza la memoria disponibile del sistema.", @@ -55,6 +56,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Mostrare solo l'azione codice 'Cancella tutto' (o 'Cancella tutti ' se è presente un solo tipo o 'Cancella questo' se è presente un solo problema).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Mostrare l'azione codice 'Cancella tutto' (se sono presenti più tipi di problema) e l'azione codice 'Cancella tutti ' (o 'Cancella questo' se è presente un solo problema per )", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Mostrare le azioni codice 'Cancella tutto' (se sono presenti più tipi di problema), 'Cancella tutti ' (se sono presenti più problemi per ) e 'Cancella questo'", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Se `true`, la formattazione verrà eseguita nelle righe modificate dalle azioni del codice 'Correggi'.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Se è `true`, l'analisi del codice che usa `clang-tidy` verrà abilitata ed eseguita automaticamente se `#C_Cpp.codeAnalysis.runAutomatically#` è `true` (impostazione predefinita).", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Percorso completo dell'eseguibile `clang-tidy`. Se non è specificato, `clang-tidy` è disponibile nel percorso dell'ambiente usato. Se non viene trovato nel percorso dell'ambiente, verrà usato `clang-tidy` in bundle con l'estensione.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Specifica una configurazione `clang-tidy` in formato YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{chiave: x, valore: y}]}`. Quando il valore è vuoto, `clang-tidy` tenterà di trovare un file denominato `.clang-tidy` per ogni file di origine nelle directory padre.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "I filtri di esclusione verranno valutati in base a ogni file e cartella rilevati.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Carattere usato come separatore di percorso per i risultati di completamento automatico di `#include`.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Se è `true`, le descrizioni comando al passaggio del mouse e del completamento automatico visualizzeranno solo alcune etichette di commenti strutturati. In caso contrario, vengono visualizzati tutti i commenti.", + "c_cpp.configuration.doxygen.generateOnType.description": "Controlla se inserire automaticamente il commento Doxygen dopo aver digitato lo stile di commento scelto.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Stringa di caratteri utilizzata come riga iniziale del commento Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Criterio con cui inizia un blocco di commento su più righe o su una sola riga. Il criterio di continuazione è impostato su `* ` per i blocchi di commento su più righe o su questa stringa per i blocchi di commento su una sola riga.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Criterio con cui inizia un blocco di commento su più righe o su una sola riga.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Testo che verrà inserito alla riga successiva quando si preme INVIO all'interno di un blocco di commento su più righe o su una sola riga.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Percorso del debugger MI, ad esempio gdb. Se non viene specificato, il debugger verrà cercato prima in PATH.", "c_cpp.debuggers.miDebuggerArgs.description": "Argomenti aggiuntivi per il debugger MI, ad esempio gdb.", "c_cpp.debuggers.miDebuggerServerAddress.description": "Indirizzo di rete del server del debugger MI a cui connettersi. Esempio: localhost:1234.", + "c_cpp.debuggers.useExtendedRemote.description": "Connettersi al server del debugger MI con la modalità estesa-remota di destinazione.", "c_cpp.debuggers.stopAtEntry.description": "Parametro facoltativo. Se è true, il debugger deve arrestarsi in corrispondenza del punto di ingresso della destinazione. Se viene passato ProcessId, non ha alcun effetto.", "c_cpp.debuggers.debugServerPath.description": "Percorso completo facoltativo del server di debug da avviare. L'impostazione predefinita è Null. Viene usata insieme a \"miDebugServerAddress\" o al proprio server con un comando \"customSetupCommand\" che esegue \"-target-select remote \".", "c_cpp.debuggers.debugServerArgs.description": "Argomenti facoltativi del server di debug. L'impostazione predefinita è null.", diff --git a/Extension/i18n/ita/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/ita/src/Debugger/attachToProcess.i18n.json index 36c8a6f0ce..4431156923 100644 --- a/Extension/i18n/ita/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/ita/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "La configurazione di debug scelta non contiene {0}", + "debugger.path.and.server.address.required": "{0} nella configurazione di debug richiede {1} e {2}", + "no.pipetransport.useextendedremote": "La configurazione di debug scelta non contiene {0} o {1}", "select.process.attach": "Selezionare il processo a cui collegarsi", "process.not.selected": "Processo non selezionato.", "pipe.failed": "Il trasporto pipe non è riuscito a ottenere il sistema operativo e i processi.", - "no.process.list": "Il collegamento del trasporto non è riuscito a ottenere l'elenco dei processi." + "no.process.list": "Il collegamento del trasporto non è riuscito a ottenere l'elenco dei processi.", + "failed.to.make.gdb.connection": "Non è stato possibile creare la connessione GDB: \"{0}\".", + "failed.to.parse.processes": "Non è stato possibile analizzare i processi: \"{0}\"." } \ No newline at end of file diff --git a/Extension/i18n/ita/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/ita/src/Debugger/configurationProvider.i18n.json index 61041e962d..fa13572d19 100644 --- a/Extension/i18n/ita/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/ita/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "Non è possibile trovare 'LLDB.framework' per lldb-mi. Installare Xcode o gli strumenti da riga di comando Xcode.", "debugger.launchConfig": "Configurazione di avvio:", "vs.code.1.69+.required": "'deploySteps' richiede VS Code 1.69+.", + "running.deploy.steps": "Esecuzione dei passaggi di distribuzione in corso...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "compilare ed eseguire il debug del file attivo", "cl.exe.not.available": "La compilazione e il debug di {0} sono utilizzabili solo quando VS Code viene eseguito da Prompt dei comandi per gli sviluppatori per Visual Studio.", diff --git a/Extension/i18n/ita/src/LanguageServer/extension.i18n.json b/Extension/i18n/ita/src/LanguageServer/extension.i18n.json index b962744aad..6433205865 100644 --- a/Extension/i18n/ita/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/ita/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Informazioni su come installare una libreria per questa intestazione con vcpkg", "copy.vcpkg.command": "Copiare il comando vcpkg per installare '{0}' negli Appunti", + "on.disabled.command": "Non è possibile eseguire comandi correlati a IntelliSense quando `C_Cpp.intelliSenseEngine` è impostato su `Disabled`.", "client.not.found": "client non trovato", "configuration.select.first": "Aprire prima una cartella per selezionare una configurazione", "configuration.provider.select.first": "Aprire prima una cartella per selezionare un provider di configurazione", diff --git a/Extension/i18n/ita/src/nativeStrings.i18n.json b/Extension/i18n/ita/src/nativeStrings.i18n.json index 11844f4ccf..ec488e72ac 100644 --- a/Extension/i18n/ita/src/nativeStrings.i18n.json +++ b/Extension/i18n/ita/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Cartella", "file_tag": "File", "compiler_default_language_standard_version_old": "Il compilatore ha restituito la versione standard del linguaggio predefinito: {0}. Poiché questa versione è obsoleta, verrà eseguito un tentativo di utilizzare la versione più recente {1} come predefinita.", - "unexpected_output_from_clang_tidy": "Output imprevisto da clang-tidy: {0}. Previsto: {1}." + "unexpected_output_from_clang_tidy": "Output imprevisto da clang-tidy: {0}. Previsto: {1}.", + "generate_doxygen_comment": "Genera commento Doxygen" } \ No newline at end of file diff --git a/Extension/i18n/jpn/package.i18n.json b/Extension/i18n/jpn/package.i18n.json index fae02e8891..c255c4625b 100644 --- a/Extension/i18n/jpn/package.i18n.json +++ b/Extension/i18n/jpn/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "C/C++ ファイルのデバッグ", "c_cpp.command.BuildAndRunFile.title": "C/C++ ファイルの実行", "c_cpp.command.AddDebugConfiguration.title": "デバッグ構成の追加", + "c_cpp.command.GenerateDoxygenComment.title": "Doxygen コメントの生成", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "言語サービスの処理に使用する同時実行スレッドの最大数。値はヒントであり、常に使用されるとは限りません。既定値の `null` (空) では、使用可能な論理プロセッサの数が使用されます。", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "言語サービスの処理に使用するキャッシュされたプロセスの最大数。既定値の `null` (空) では、使用可能な論理プロセッサの数の 2 倍が使用されます。", "c_cpp.configuration.maxMemory.markdownDescription": "言語サービスの処理に使用できる最大メモリ (MB 単位)。このメモリ使用量を超えると、キャッシュされ、同時に実行されるプロセスの数が少なくなります。既定値の `null` (空) では、システムの空きメモリが使用されます。", @@ -40,7 +41,7 @@ "c_cpp.configuration.intelliSense.maxMemory.markdownDescription": "古い IntelliSense プロセスは、このメモリ使用量 (MB) を超えた後に新しいプロセスが作成される前にシャットダウンされます。既定値の `null` (空) では、`#C_Cpp.maxMemory#` から継承された値が使用されます。", "c_cpp.configuration.references.maxConcurrentThreads.markdownDescription": "[すべての参照の検索] と [名前の変更] に使用する同時実行スレッドの最大数。既定値の `null` (空) では、`#C_Cpp.maxConcurrentThreads#` から継承された値が使用されます。", "c_cpp.configuration.references.maxCachedProcesses.markdownDescription": "[すべての参照の検索] と [名前の変更] のメモリ内に保持するプロセスの最大数。既定値の `0` は、この機能を無効にします。`null` 値 (空) は、`#C_Cpp.maxCachedProcesses#` から継承された値を使用します。", - "c_cpp.configuration.references.maxMemory.markdownDescription": "このメモリ使用量 (MB 単位) を超えると、キャッシュされ、同時に実行される 'すべての参照の検索' プロセスと '名前の変更' プロセスの数が少なくなります。既定値の `null` (空) では、`#C_Cpp.maxMemory#` から継承された値が使用されます。", + "c_cpp.configuration.references.maxMemory.markdownDescription": "このメモリ使用量 (MB 単位) を超えると、キャッシュされ、同時に実行される 'すべての参照の検索' プロセスと '名前の変更' プロセスの数が少なくなります。既定値の `null` (空) では、`#C_Cpp.maxMemory#` から継承された値が使用されます。", "c_cpp.configuration.codeAnalysis.maxConcurrentThreads.markdownDescription": "コード分析に使用する同時実行スレッドの最大数。既定値の `null` (空) では、`#C_Cpp.maxConcurrentThreads#` から継承された値の半分が使用されます。", "c_cpp.configuration.codeAnalysis.maxMemory.markdownDescription": "このメモリ使用量 (MB 単位) を超えると、同時に実行されるコード分析プロセスの数が減少します。既定値の `null` (空) では、`#C_Cpp.maxMemory#` から継承された値が使用されます。", "c_cpp.configuration.codeAnalysis.updateDelay.markdownDescription": "`#files.autoSave#` が `afterDelay` で `#C_Cpp.codeAnalysis.runAutomatically#` が `true` の場合に、編集から保存がトリガーされてからコード分析が処理を開始するまでの遅延をミリ秒単位で制御します。", @@ -48,18 +49,19 @@ "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "ファイル パスの照合基準となる glob パターン。これを `true` または `false` に設定すると、パターンがそれぞれ有効/無効になります。", "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "一致するファイルの兄弟をさらにチェックします。一致するファイル名の変数として `$(basename)` を使用します。", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "`true` の場合、ファイルを開いたり保存したりすると、コード分析が自動的に実行されます。", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true` の場合、使用可能な場合 (次回コード分析が実行される時) に 'Disable' コード アクションが表示されます。'Disable' コード アクションを使用すると、警告コードが `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 設定に追加されます。", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "`true` の場合、使用可能な場合 (次回コード分析が実行されるときに) [ドキュメントの表示] コード アクションが表示されます。", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "使用可能な 'Clear' コード分析の問題コード アクション オプションを制御します。その他のオプションを表示するように設定を変更すると、コード分析を再び実行することが必要になる場合があります。", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true` の場合、使用可能な場合 (次回コード分析が実行される時) に '無効' コード アクションが表示されます。'無効' コード アクションを使用すると、警告コードが `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 設定に追加されます。", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "`true` の場合、使用可能な場合 (次回コード分析が実行されるときに) [ドキュメントの表示] コード アクションが表示されます。", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "使用可能な 'クリア' コード分析の問題コード アクション オプションを制御します。その他のオプションを表示するように設定を変更すると、コード分析を再び実行することが必要になる場合があります。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "'クリア' コード アクションを表示しません。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "[すべてクリア] コード アクションのみを表示します (型が 1 つだけの場合は [すべてクリア] ' を、問題が 1 つしかない場合は [クリア] を選択します)。", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "[すべてクリア] コード アクション (複数の問題の種類がある場合) と [すべてのをクリアする] コード アクションを表示する (または、に問題が 1 つだけある場合は [これをクリア] を表示する)", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "[すべてクリア] (複数の問題の種類がある場合)、[すべてののクリア] (に複数の問題がある場合)、'これをクリア' コード アクションを表示する", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "`true` の場合、'修正' コード アクションによって変更された行に対して書式設定が実行されます。", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "`true` の場合、 `clang-tidy` を使用したコード分析が有効になり、`#C_Cpp.codeAnalysis.runAutomatically#` が `true` (既定値) の場合に自動的に実行されます。", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` の実行可能ファイルの完全なパスです。指定されておらず、`clang-tidy` が環境パスに置かれている場合は、それが使用されます。環境パスに見つからない場合は、拡張機能にバンドルされている `clang-tidy` が使用されます。", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "YAML/JSON 形式の `clang-tidy` 構成を指定します: `{Checks: '-*,clang-analyzer-*',CheckOptions: [{キー: x, 値: y}]}`。値が空の場合、`clang-tidy` は親ディレクトリ内の各ソース ファイルの `.clang-tidy` という名前のファイルの検索を試みます。", - "c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "`#C_Cpp.codeAnalysis.clangTidy.config#` が設定されておらず、`clang-tidy` ファイルが見つからない場合に、フォールバックとして使用する YAML/JSON 形式の `clang-tidy` 構成を指定します: `{Checks: '-*,clang-analyzer-*',CheckOptions: [{キー: x, 値: y}]}`。", - "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "診断を出力するヘッダーの名前と一致する POSIX 拡張正規表現 (ERE)。各翻訳単位のメイン ファイルからの診断は常に表示されます。`${workspaceFolder}` 変数はサポートされています (`.clang-tidy` ファイルが存在しない場合は、既定のフォールバック値として使用されます)。このオプションが `null` (空) でない場合は、`.clang-tidy` ファイルの `HeaderFilterRegex` オプションがオーバーライドされます (存在する場合)。", + "c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "`#C_Cpp.codeAnalysis.clangTidy.config#` が設定されておらず、`clang-tidy` ファイルが見つからない場合に、フォールバックとして使用する YAML/JSON 形式の `clang-tidy` 構成を指定します: `{Checks: '-*,clang-analyzer-*',CheckOptions: [{キー: x, 値: y}]}`。", + "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "診断を出力するヘッダーの名前と一致する POSIX 拡張正規表現 (ERE)。各翻訳単位のメイン ファイルからの診断は常に表示されます。`${workspaceFolder}` 変数はサポートされています (`.clang-tidy` ファイルが存在しない場合は、既定のフォールバック値として使用されます)。このオプションが `null` (空) でない場合は、`.clang-tidy` ファイルの `HeaderFilterRegex` オプションがオーバーライドされます (存在する場合)。", "c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": "`clang-tidy` に渡す追加のコマンド ライン引数。これらは、同等の `C_Cpp.codeAnalysis.clangTidy.*` 設定よりも優先されます。", "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "`true` および `compileCommands` が設定されている場合、ビルド引数が `--` の後に渡されるのではなく、`-p=` 引数が `clang-tidy` に渡されます。システム インクルードを見つけることができるように環境変数が設定されていない場合には、機能しない可能性があります。", "c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "有効な `clang-tidy` チェックの一覧。値は、`.clang-tidy` ファイルの `Checks` または `#C_Cpp.codeAnalysis.clangTidy.config#` (存在する場合) に追加されます。既定のチェック `clang-analyzer-*` は、明示的に無効にされていない限り、常に使用されます。", @@ -156,7 +158,7 @@ "c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "コード ブロックは、常に `C_Cpp.vcFormat.newLine.*` 設定の値に基づいて書式設定されます。", "c_cpp.configuration.clang_format_path.markdownDescription": "`clang-format` の実行可能ファイルの完全なパスです。指定されておらず、`clang-format` が環境パスに置かれている場合は、それが使用されます。環境パスに見つからない場合は、拡張機能にバンドルされている `clang-format` が使用されます。", "c_cpp.configuration.clang_format_style.markdownDescription": "次のコーディング スタイルが現在サポートされています: `Visual Studio`、`LLVM`、`Google`、`Chromium`、`Mozilla`、`WebKit`、`Microsoft`、`GNU`、`file` を使用して、現在のディレクトリまたは親ディレクトリにある `.clang-format` ファイルからスタイルを読み込みます。特定のパラメーターを設定するには、`{キー: 値, ...}` を使用します。たとえば、`Visual Studio` のスタイルは次のようになります: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。", - "c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "`clang-format` が `file` スタイルで呼び出されたものの `.clang-format` ファイルが見つからない場合に、フォールバックとして使用される定義済みスタイルの名前。使用可能な値は、`Visual Studio`、`LLVM`、`Google、Chromium`、`Mozilla、WebKit`、`Microsoft`、`GNU`、`none` です。または、{キー: 値, ...} を使用して特定のパラメーターを設定することもできます。たとえば、\"Visual Studio\" スタイルは次のようになります: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。", + "c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "`clang-format` が `file` スタイルで呼び出されたものの `.clang-format` ファイルが見つからない場合に、フォールバックとして使用される定義済みスタイルの名前。使用可能な値は、`Visual Studio`、`LLVM`、`Google、Chromium`、`Mozilla、WebKit`、`Microsoft`、`GNU`、`none` です。または、{キー: 値, ...} を使用して特定のパラメーターを設定することもできます。たとえば、\"Visual Studio\" スタイルは次のようになります: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`。", "c_cpp.configuration.clang_format_sortIncludes.markdownDescription": "設定されている場合、`SortIncludes` パラメーターによって決定されるインクルードの並べ替え動作がオーバーライドされます。", "c_cpp.configuration.intelliSenseEngine.description": "IntelliSense プロバイダーを制御します。", "c_cpp.configuration.intelliSenseEngine.default.description": "独立した IntelliSense プロセスを使用してコンテキストを認識する結果を提供します。", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "除外フィルターは、検出されたすべてのファイルとフォルダーに対して評価されます。", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "`#include` のオートコンプリート結果でパス区切り記号として使用される文字です。", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "`true` の場合、ホバーおよびオートコンプリートのヒントに、構造化されたコメントの特定のラベルのみが表示されます。それ以外の場合は、すべてのコメントが表示されます。", + "c_cpp.configuration.doxygen.generateOnType.description": "選択したコメント スタイルを入力した後に、Doxygen コメントを自動的に挿入するかどうかを制御します。", + "c_cpp.configuration.doxygen.generatedStyle.description": "Doxygen コメントの開始行として使用される文字列です。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "複数行または単一行のコメント ブロックの先頭に置くパターン。継続のパターンの既定値は、複数行コメント ブロックの場合は ` * `、単一行コメント ブロックの場合はこの文字列です。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "複数行または単一行のコメント ブロックの先頭に置くパターン。", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "複数行または単一行のコメント ブロック内で Enter を押したときに、次の行に挿入されるテキストです。", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "MI デバッガー (gdb など) へのパス。これを指定しないと、デバッガーの検索はパスから開始されます。", "c_cpp.debuggers.miDebuggerArgs.description": "MI デバッガー (gdb など) の追加の引数。", "c_cpp.debuggers.miDebuggerServerAddress.description": "接続先の MI デバッガー サーバーのネットワークアドレスです (例: localhost: 1234)。", + "c_cpp.debuggers.useExtendedRemote.description": "ターゲットの拡張リモート モードで MI デバッガー サーバーに接続します。", "c_cpp.debuggers.stopAtEntry.description": "オプションのパラメーターです。true の場合、デバッガーはターゲットのエントリポイントで停止します。processId が渡された場合は効果はありません。", "c_cpp.debuggers.debugServerPath.description": "起動するデバッグ サーバーの完全なパス (省略可能)。既定値は null です。これは、\"miDebugServerAddress\"、または \"-target-select remote \" を実行する \"customSetupCommand\" を含む独自のサーバーのいずれかと接合して使用されます。", "c_cpp.debuggers.debugServerArgs.description": "デバッグ サーバー引数 (省略可能)。既定値は null です。", diff --git a/Extension/i18n/jpn/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/jpn/src/Debugger/attachToProcess.i18n.json index c96baa71d0..b92a94f821 100644 --- a/Extension/i18n/jpn/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/jpn/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "選択されたデバッグ構成に {0} が含まれていません", + "debugger.path.and.server.address.required": "デバッグ構成の{0}には、{1}と {2} が必要です", + "no.pipetransport.useextendedremote": "選択されたデバッグ構成には {0} または {1} は含まれません", "select.process.attach": "アタッチするプロセスを選択する", "process.not.selected": "プロセスが選択されていません。", "pipe.failed": "パイプ トランスポートで OS とプロセスを取得できませんでした。", - "no.process.list": "転送アタッチでプロセス一覧を取得できませんでした。" + "no.process.list": "転送アタッチでプロセス一覧を取得できませんでした。", + "failed.to.make.gdb.connection": "GDB 接続を作成できませんでした: \"{0}\"。", + "failed.to.parse.processes": "プロセスを解析できませんでした: \"{0}\"。" } \ No newline at end of file diff --git a/Extension/i18n/jpn/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/jpn/src/Debugger/configurationProvider.i18n.json index 5875870e67..9d88c1a537 100644 --- a/Extension/i18n/jpn/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/jpn/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "lldb-mi の 'LLDB.framework' が見つかりません。XCode または XCode コマンド ライン ツールをインストールしてください。", "debugger.launchConfig": "起動の構成:", "vs.code.1.69+.required": "'deploySteps' にはVS Code 1.69 以降が必要です。", + "running.deploy.steps": "配置ステップを実行しています...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "アクティブ ファイルのビルドとデバッグ", "cl.exe.not.available": "{0} のビルドとデバッグを使用できるのは、VS 用開発者コマンド プロンプトから VS Code を実行する場合のみです。", diff --git a/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json b/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json index 52819411cb..70a8fae9b1 100644 --- a/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/jpn/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "このヘッダーのライブラリを vcpkg でインストールする方法の詳細", "copy.vcpkg.command": "'{0}' をインストールするための vcpkg コマンドをクリップボードにコピーする", + "on.disabled.command": "`C_Cpp.intelliSenseEngine` が `Disabled` に設定されている場合、IntelliSense 関連のコマンドは実行できません。", "client.not.found": "クライアントが見つかりませんでした", "configuration.select.first": "構成を選択するには、まずフォルダーを開いてください", "configuration.provider.select.first": "構成プロバイダーを選択するには、まずフォルダーを開いてください", diff --git a/Extension/i18n/jpn/src/LanguageServer/settings.i18n.json b/Extension/i18n/jpn/src/LanguageServer/settings.i18n.json index ca3a87f893..15f69e856a 100644 --- a/Extension/i18n/jpn/src/LanguageServer/settings.i18n.json +++ b/Extension/i18n/jpn/src/LanguageServer/settings.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "editorconfig.default.behavior": "コードのフォーマットでは、.clang-format ではなく .editorconfig の設定を使用しています。詳細については、'C_Cpp.formatting' 設定の 'Default' 値に関するドキュメントを参照してください。" + "editorconfig.default.behavior": "コードのフォーマットでは、.clang-format ではなく .editorconfig の設定を使用しています。詳細については、'C_Cpp.formatting' 設定の 'Default' 値に関するドキュメントを参照してください。" } \ No newline at end of file diff --git a/Extension/i18n/jpn/src/nativeStrings.i18n.json b/Extension/i18n/jpn/src/nativeStrings.i18n.json index ce76213358..16a3cfa11b 100644 --- a/Extension/i18n/jpn/src/nativeStrings.i18n.json +++ b/Extension/i18n/jpn/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "フォルダー", "file_tag": "ファイル", "compiler_default_language_standard_version_old": "コンパイラから既定の言語の標準バージョンが返されました: {0}。このバージョンは古いため、より新しいバージョン {1} をデフォルトとして使用しようとします。", - "unexpected_output_from_clang_tidy": "clang-tidy からの予期しない出力: {0}。期待値: {1}。" + "unexpected_output_from_clang_tidy": "clang-tidy からの予期しない出力: {0}。期待値: {1}。", + "generate_doxygen_comment": "Doxygen コメントの生成" } \ No newline at end of file diff --git a/Extension/i18n/jpn/walkthrough/debugconfig/run-and-debug-project-mac.md.i18n.json b/Extension/i18n/jpn/walkthrough/debugconfig/run-and-debug-project-mac.md.i18n.json index 2ac1da16d2..5c0a78dc96 100644 --- a/Extension/i18n/jpn/walkthrough/debugconfig/run-and-debug-project-mac.md.i18n.json +++ b/Extension/i18n/jpn/walkthrough/debugconfig/run-and-debug-project-mac.md.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkthrough.mac.title.run.and.debug.your.file": "MacOS でお使いの C++ ファイルを実行してデバッグする", + "walkthrough.mac.title.run.and.debug.your.file": "macOS でお使いの C++ ファイルを実行してデバッグする", "walkthrough.mac.run.and.debug.your.file": "VS Code でお使いの C++ ファイルを実行およびデバッグするには、次の操作に従います。", "walkthrough.mac.instructions1": "実行してデバッグする C++ ソース ファイルを開きます。エディターで、このファイルがアクティブ (現在表示され、選択されている) であることを確認してください。", "walkthrough.mac.press.f5": "{0} を押します。あるいは、メイン メニューで {1} を選択します。", diff --git a/Extension/i18n/kor/package.i18n.json b/Extension/i18n/kor/package.i18n.json index e951f8e488..39f599eb8e 100644 --- a/Extension/i18n/kor/package.i18n.json +++ b/Extension/i18n/kor/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "C/C++ 파일 디버그", "c_cpp.command.BuildAndRunFile.title": "C/C++ 파일 실행", "c_cpp.command.AddDebugConfiguration.title": "디버그 구성 추가", + "c_cpp.command.GenerateDoxygenComment.title": "Doxygen 주석 생성", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "언어 서비스 처리에 사용할 최대 동시 스레드 수입니다. 값은 힌트이며 항상 사용되는 것은 아닙니다. 기본값 `null`(비어 있음)은 사용 가능한 논리 프로세서 수를 사용합니다.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "언어 서비스 처리에 사용할 최대 캐시 프로세스 수입니다. 기본값인 `null`(비어 있음)은 사용 가능한 논리 프로세서 수의 두 배를 사용합니다.", "c_cpp.configuration.maxMemory.markdownDescription": "언어 서비스 처리에 사용할 수 있는 최대 메모리(MB)입니다. 이 메모리 사용량이 초과되면 더 적은 수의 프로세스가 캐시되고 동시에 실행됩니다. 기본값 `null`(비어 있음)은 시스템의 여유 메모리를 사용합니다.", @@ -48,13 +49,14 @@ "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "파일 경로를 일치시킬 GLOB 패턴입니다. 패턴을 사용하거나 사용하지 않도록 설정하려면 `true` 또는 `false`로 설정하세요.", "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "일치하는 파일의 형제에 대한 추가 검사입니다. `$(basename)`을 일치하는 파일 이름에 대한 변수로 사용하세요.", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "`true`인 경우 파일을 열거나 저장한 후 코드 분석이 자동으로 실행됩니다.", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true`이면 사용 가능한 경우 '비활성화' 코드 작업이 표시됩니다(다음 번에 코드 분석이 실행될 때). 'Disable' 코드 액션을 사용하면 `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 설정에 경고 코드를 추가합니다.", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "`true`인 경우 사용 가능한 경우 '다음에 대한 문서 표시' 코드 작업이 표시됩니다(다음 코드 분석이 실행될 때).", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true`이면 사용 가능한 경우 '비활성화' 코드 작업이 표시됩니다(다음 번에 코드 분석이 실행될 때). '비활성화' 코드 액션을 사용하면 `C_Cpp.codeAnalysis.clangTidy.checks.disabled` 설정에 경고 코드를 추가합니다.", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "`true`이면 사용 가능한 경우 '다음에 대한 문서 표시' 코드 작업이 표시됩니다(다음 번에 코드 분석이 실행될 때).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "사용 가능한 '지우기' 코드 분석 문제 코드 작업 옵션을 제어합니다. 더 많은 옵션을 표시하도록 설정을 변경하려면 코드 분석을 다시 실행해야 할 수 있습니다.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "'지우기' 코드 작업을 표시하지 않습니다.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "'모두 지우기' 코드 작업만 표시합니다(또는 유형이 하나뿐인 경우 '모두 지우기 ' 또는 문제가 하나만 있는 경우 '이것 지우기').", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "'모두 지우기' 코드 작업(여러 문제 유형이 있는 경우) 및 '모두 지우기 ' 코드 작업 표시(또는 에 대한 문제가 하나만 있는 경우 '이 항목 지우기')", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "'모두 지우기'(여러 문제 유형이 있는 경우), '모두 지우기 '(에 대해 여러 문제가 있는 경우) 및 '이 항목 지우기' 코드 작업 표시", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "`true`이면 '수정' 코드 동작에 의해 변경된 줄에서 서식이 실행됩니다.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "`true`인 경우 `#C_Cpp.codeAnalysis.runAutomatically#`가 `true`(기본값)인 경우 `clang-tidy`를 사용한 코드 분석이 사용하도록 설정되고 자동으로 실행됩니다.", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` 실행 파일의 전체 경로입니다. 지정하지 않은 경우 `clang-tidy`를 환경 경로에서 사용할 수 있으면 해당 실행 파일이 사용됩니다. 환경 경로에 없는 경우에는 확장과 함께 제공된 `clang-tidy`가 사용됩니다.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "YAML/JSON 형식의 `clang-tidy` 구성을 지정합니다. `{Checks: '-*,clang-analyzer-*', CheckOptions: [{키: x, 값: y}]}`. 값이 비어 있으면 `clang-tidy`는 상위 디렉터리의 각 소스 파일에 대해 `.clang-tidy`라는 파일을 찾으려고 시도합니다.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "제외 필터는 발생한 모든 파일 및 폴더에 대해 평가됩니다.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "`#include` 자동 완성 결과의 경로 구분 기호로 사용되는 문자입니다.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "`true`인 경우 가리키기 및 자동 완성 도구 설명에 구조적 주석의 특정 레이블만 표시됩니다. 그렇지 않으면 모든 주석이 표시됩니다.", + "c_cpp.configuration.doxygen.generateOnType.description": "선택한 주석 스타일을 입력한 후 Doxygen 주석을 자동으로 삽입할지 여부를 제어합니다.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Doxygen 주석의 시작 줄로 사용되는 문자 문자열입니다.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "여러 줄 또는 한 줄 주석 블록을 시작하는 패턴입니다. 기본적으로 여러 줄 주석 블록의 계속 패턴은 ` * `로 설정되고, 한 줄 주석 블록의 경우 이 문자열로 설정됩니다.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "여러 줄 또는 한 줄 주석 블록을 시작하는 패턴입니다.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "여러 줄 또는 한 줄 주석 블록 내부에서 키를 누를 때 다음 줄에 삽입할 텍스트입니다.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "MI 디버거(예: gdb)의 경로입니다. 지정되지 않은 디버거 확장은 먼저 경로에서 디버거를 검색합니다.", "c_cpp.debuggers.miDebuggerArgs.description": "MI 디버거(예: gdb)의 추가 인수입니다.", "c_cpp.debuggers.miDebuggerServerAddress.description": "연결할 MI 디버거 서버의 네트워크 주소입니다(예: localhost:1234).", + "c_cpp.debuggers.useExtendedRemote.description": "대상 확장 원격 모드를 사용하여 MI 디버거 서버에 연결합니다.", "c_cpp.debuggers.stopAtEntry.description": "선택적 매개 변수입니다. True이면 디버거가 대상의 진입점에서 중지됩니다. processId가 전달되는 경우 영향을 주지 않습니다.", "c_cpp.debuggers.debugServerPath.description": "시작할 디버그 서버의 전체 경로입니다(선택 사항). 기본값은 null입니다. 이 옵션은 \"miDebugServerAddress\"와 함께 사용되거나 \"-target-select remote \"를 실행하는 \"customSetupCommand\"와 자체 서버와 함께 사용됩니다.", "c_cpp.debuggers.debugServerArgs.description": "선택적 디버그 서버 인수입니다. 기본값은 null입니다.", diff --git a/Extension/i18n/kor/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/kor/src/Debugger/attachToProcess.i18n.json index b3d9288472..7f73c5da24 100644 --- a/Extension/i18n/kor/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/kor/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "선택한 디버그 구성에 {0}이(가) 포함되어 있지 않습니다.", + "debugger.path.and.server.address.required": "디버그 구성에서 {0}을 사용하려면 {1} 및 {2}이(가) 있어야 합니다.", + "no.pipetransport.useextendedremote": "선택한 디버그 구성에 {0} 또는 {1}이(가) 포함되어 있지 않습니다.", "select.process.attach": "연결할 프로세스 선택", "process.not.selected": "프로세스가 선택되지 않았습니다.", "pipe.failed": "파이프 전송이 OS 및 프로세스를 가져오지 못했습니다.", - "no.process.list": "전송 연결이 프로세스 목록을 가져올 수 없습니다." + "no.process.list": "전송 연결이 프로세스 목록을 가져올 수 없습니다.", + "failed.to.make.gdb.connection": "다음 GDB 연결을 만들지 못했습니다. \"{0}\"", + "failed.to.parse.processes": "다음 프로세스를 구문 분석하지 못했습니다. \"{0}\"" } \ No newline at end of file diff --git a/Extension/i18n/kor/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/kor/src/Debugger/configurationProvider.i18n.json index 55bb4c728f..c840f5b299 100644 --- a/Extension/i18n/kor/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/kor/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "lldb-mi에 대한 'LLDB.framework'를 찾을 수 없습니다. XCode 또는 XCode 명령줄 도구를 설치하세요.", "debugger.launchConfig": "시작 구성:", "vs.code.1.69+.required": "'deploySteps'에는 VS Code 1.69 이상이 필요합니다.", + "running.deploy.steps": "배포 단계 실행 중...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "활성 파일 빌드 및 디버그", "cl.exe.not.available": "{0} 빌드 및 디버그는 VS의 개발자 명령 프롬프트에서 VS Code를 실행하는 경우에만 사용할 수 있습니다.", diff --git a/Extension/i18n/kor/src/LanguageServer/extension.i18n.json b/Extension/i18n/kor/src/LanguageServer/extension.i18n.json index 5ac44ee56c..d58bf85cb5 100644 --- a/Extension/i18n/kor/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/kor/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "vcpkg를 사용하여 이 헤더의 라이브러리를 설치하는 방법 알아보기", "copy.vcpkg.command": "'{0}'을(를) 설치할 vcpkg 명령을 클립보드에 복사", + "on.disabled.command": "IntelliSense 관련 명령은 `C_Cpp.intelliSenseEngine`이 `Disabled`로 설정된 경우 실행할 수 없습니다.", "client.not.found": "클라이언트를 찾을 수 없음", "configuration.select.first": "먼저 구성을 선택할 폴더 열기", "configuration.provider.select.first": "먼저 구성 공급자를 선택할 폴더 열기", diff --git a/Extension/i18n/kor/src/nativeStrings.i18n.json b/Extension/i18n/kor/src/nativeStrings.i18n.json index 8fb247ac7f..b3156f9374 100644 --- a/Extension/i18n/kor/src/nativeStrings.i18n.json +++ b/Extension/i18n/kor/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "폴더", "file_tag": "파일", "compiler_default_language_standard_version_old": "컴파일러가 기본 언어 표준 버전 {0}을(를) 반환했습니다. 이 버전은 이전 버전이므로 새 버전 {1}을(를) 기본으로 사용하려고 합니다.", - "unexpected_output_from_clang_tidy": "clang-tidy에서 예기치 않은 출력: {0}. 예상: {1}." + "unexpected_output_from_clang_tidy": "clang-tidy에서 예기치 않은 출력: {0}. 예상: {1}.", + "generate_doxygen_comment": "Doxygen 주석 생성" } \ No newline at end of file diff --git a/Extension/i18n/plk/Reinstalling the Extension.md.i18n.json b/Extension/i18n/plk/Reinstalling the Extension.md.i18n.json index 8f63c8a193..bf6faeeda7 100644 --- a/Extension/i18n/plk/Reinstalling the Extension.md.i18n.json +++ b/Extension/i18n/plk/Reinstalling the Extension.md.i18n.json @@ -10,7 +10,7 @@ "bug.report.link.title": "Zgłoś problem", "reinstalling.extension.heading": "Ponowne instalowanie rozszerzenia C/C++", "reinstall.extension.text1": "Podczas ponownego instalowania równoważnej wersji rozszerzenia, program VS Code może ponownie użyć istniejącego katalogu rozszerzeń. Aby temu zapobiec, podczas ponownej instalacji rozszerzenia C/C++, może być konieczne wstępne usunięcie istniejącego katalogu rozszerzeń.", - "reinstall.extension.text2": "Zainstalowane katalogi rozszerzeń można znaleźć w jednej z następujących ścieżek w katalogu użytkownika („%USERPROFILE%“ w systemie Windows lub „$HOME“ w systemach Linux i MacOS)", + "reinstall.extension.text2": "Zainstalowane katalogi rozszerzeń można znaleźć w jednej z następujących ścieżek w katalogu użytkownika („%USERPROFILE%“ w systemie Windows lub „$HOME“ w systemach Linux i macOS)", "reinstall.extension.text3": "W połączeniu zdalnym:", "reinstall.extension.text4": "Przykładowe ścieżki do zainstalowanych katalogów rozszerzeń C/C++:", "reinstall.extension.text5": "W systemie Windows:", diff --git a/Extension/i18n/plk/package.i18n.json b/Extension/i18n/plk/package.i18n.json index 15659bafe2..c97b0ba35c 100644 --- a/Extension/i18n/plk/package.i18n.json +++ b/Extension/i18n/plk/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "Debuguj plik C/C++", "c_cpp.command.BuildAndRunFile.title": "Uruchom plik C/C++", "c_cpp.command.AddDebugConfiguration.title": "Dodaj konfigurację debugowania", + "c_cpp.command.GenerateDoxygenComment.title": "Generuj komentarz Doxygen", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Maksymalna liczba współbieżnych wątków do użycia na potrzeby przetwarzania usług językowych. Wartość jest wskazówką i nie zawsze może być używana. Wartość domyślna `null` (pusta) używa liczby dostępnych procesorów logicznych.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Maksymalna liczba buforowanych procesów do użycia na potrzeby przetwarzania usług językowych. Wartość domyślna `null` (pusta) używa podwójnej liczby dostępnych procesorów logicznych.", "c_cpp.configuration.maxMemory.markdownDescription": "Maksymalna ilość pamięci (w MB) dostępna na potrzeby przetwarzania usług językowych. Mniej procesów będzie buforowanych i uruchamianych współbieżnie po przekroczeniu tego użycia pamięci. Wartość domyślna `null` (pusta) używa wolnej pamięci systemu.", @@ -55,6 +56,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Pokaż tylko działanie kodu „Wyczyść wszystko” (lub pozycję „Wyczyść wszystkie ”, jeśli istnieje tylko jeden typ, lub pozycję \"Wyczyść to\", jeśli występuje tylko jeden problem).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Pokaż działanie kodu „Wyczyść wszystko” (jeśli istnieje wiele typów problemów) i akcję kodu „Wyczyść wszystkie ” (lub pozycję „Wyczyść to”, jeśli istnieje tylko jeden problem z )", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Pokaż polecenie „Wyczyść wszystko” (jeśli istnieje wiele typów problemów), „Wyczyść wszystkie ” (jeśli istnieje wiele problemów dotyczących ), a także działanie kodu „Wyczyść to”", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "W przypadku wartości `true` formatowanie będzie uruchamiane w wierszach zmienionych przez akcje kodu „Rozwiąż”.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "W przypadku wartości `true` analiza kodu przy użyciu elementu `clang-tidy` zostanie włączona i będzie uruchamiana automatycznie, jeśli parametr `#C_Cpp.codeAnalysis.runAutomatically#` ma wartość `true` (wartość domyślna).", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Pełna ścieżka pliku wykonywalnego `clang-tidy`. Jeśli nie zostanie określony, a element `clang-tidy` jest dostępny w ścieżce środowiska, jest używany. Jeśli ścieżka środowiska nie zostanie znaleziona, zostanie użyty element `clang-tidy` w pakiecie z rozszerzeniem.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Określa konfigurację `clang-tidy` w formacie YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{klucz: x, wartość: y}]}`. Gdy wartość jest pusta, element `clang-tidy` podejmie próbę znalezienia pliku o nazwie `clang-tidy` dla każdego pliku źródłowego w jego katalogach nadrzędnych.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Filtry wykluczeń będą oceniane w stosunku do każdego napotkanego pliku lub folderu.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Znak używany jako separator ścieżki na potrzeby wyników automatycznego uzupełniania dyrektywy `#include`.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "W przypadku wartości `true` etykietki narzędzi najechania kursorem oraz automatycznego uzupełniania będą wyświetlać tylko określone etykiety komentarzy ze strukturą. W przeciwnym razie wyświetlane będą wszystkie komentarze.", + "c_cpp.configuration.doxygen.generateOnType.description": "Określa, czy komentarz Doxygen ma być wstawiany automatycznie po wpisaniu wybranego stylu komentarza.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Ciąg znaków używany jako wiersz początkowy komentarza Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Wzorzec, który rozpoczyna wielowierszowy lub jednowierszowy blok komentarza. Wartość domyślna wzorca kontynuacji to ` * ` w przypadku wielowierszowych bloków komentarzy lub ten ciąg w przypadku jednowierszowych bloków komentarza.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Wzorzec, który rozpoczyna wielowierszowy lub jednowierszowy blok komentarza.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Tekst, który będzie wstawiany w następnym wierszu po naciśnięciu klawisza Enter w wielowierszowym lub jednowierszowym bloku komentarza.", @@ -224,9 +228,9 @@ "c_cpp.configuration.codeFolding.description": "Jeśli ta opcja jest włączona, zakresy składania kodu są dostarczane przez serwer języka.", "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.renameRequiresIdentifier.markdownDescription": "Jeśli ma wartość `true`, element „Rename Symbol” będzie wymagać prawidłowego identyfikatora C/C++.", + "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 elementu `#C_Cpp.exclusionPolicy#`). Są one specyficzne dla rozszerzenia języka C/C++ i są dodatkiem do elementu „#files.exclude#”, ale w przeciwieństwie do tego elementu 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 [tutaj](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", + "c_cpp.configuration.filesExclude.markdownDescription": "Skonfiguruj wzorce globalne na potrzeby wykluczania folderów (i plików w przypadku zmiany elementu `#C_Cpp.exclusionPolicy#`). Są one specyficzne dla rozszerzenia języka C/C++ i są dodatkiem do elementu `#files.exclude#`, ale w przeciwieństwie do tego elementu 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 [tutaj](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", "c_cpp.configuration.filesExcludeBoolean.markdownDescription": "Wzorzec globalny do dopasowywania ścieżek do plików. Aby włączyć lub wyłączyć wzorzec, ustaw na wartość `true` lub `false`.", "c_cpp.configuration.filesExcludeWhen.markdownDescription": "Dodatkowe sprawdzenie elementów równorzędnych pasującego pliku. Użyj ciągu `$(basename)` jako zmiennej dla nazwy pasującego pliku.", "c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "Jeśli `true`, to podstawianie komend powłoki debuggera będzie używało przestarzałego backticka ``(`)``.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Ścieżka do debugera MI (takiego jak gdb). Jeśli nie jest podana, najpierw zostanie przeszukana ścieżka debugera.", "c_cpp.debuggers.miDebuggerArgs.description": "Dodatkowe argumenty dla debugera MI (takiego jak gdb).", "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.description": "Parametr opcjonalny. Jeśli wartość to true, debuger powinien zostać zatrzymany w punkcie wejścia obiektu docelowego. W przypadku przekazania identyfikatora procesu parametr ten nie ma ż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ą \"miDebugServerAddress\" 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.", diff --git a/Extension/i18n/plk/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/plk/src/Debugger/attachToProcess.i18n.json index e830cc4ea4..2c5c46ae2d 100644 --- a/Extension/i18n/plk/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/plk/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "Wybrana konfiguracja debugowania nie zawiera elementu {0}", + "debugger.path.and.server.address.required": "{0} w konfiguracji debugowania wymaga {1} i {2}", + "no.pipetransport.useextendedremote": "Wybrana konfiguracja debugowania nie zawiera elementu {0} lub {1}", "select.process.attach": "Wybierz docelowy proces dołączania", "process.not.selected": "Nie wybrano procesu.", "pipe.failed": "Transport potokowy nie może pobrać systemu operacyjnego i procesów.", - "no.process.list": "Dołączanie transportu nie mogło uzyskać listy procesów." + "no.process.list": "Dołączanie transportu nie mogło uzyskać listy procesów.", + "failed.to.make.gdb.connection": "Nie można nawiązać połączenia GDB: „{0}”.", + "failed.to.parse.processes": "Nie można przeanalizować procesów: „{0}”." } \ No newline at end of file diff --git a/Extension/i18n/plk/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/plk/src/Debugger/configurationProvider.i18n.json index 95918cc7f5..7517ea503a 100644 --- a/Extension/i18n/plk/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/plk/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "Nie można zlokalizować elementu „LLDB.framework” dla narzędzia lldb-mi. Zainstaluj środowisko XCode lub narzędzia wiersza polecenia środowiska XCode.", "debugger.launchConfig": "Konfiguracja uruchamiania:", "vs.code.1.69+.required": "Instrukcja „deploySteps” wymaga edytora VS Code 1.69 lub nowszego.", + "running.deploy.steps": "Trwa uruchamianie kroków wdrażania...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "Kompiluj i debuguj aktywny plik", "cl.exe.not.available": "{0} — funkcji kompilacji i debugowania można używać tylko wtedy, gdy program VS Code został uruchomiony z wiersza polecenia dla deweloperów w programie VS.", diff --git a/Extension/i18n/plk/src/LanguageServer/extension.i18n.json b/Extension/i18n/plk/src/LanguageServer/extension.i18n.json index 43596db198..a5ce146b32 100644 --- a/Extension/i18n/plk/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/plk/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Dowiedz się, jak zainstalować bibliotekę dla tego nagłówka przy użyciu menedżera vcpkg", "copy.vcpkg.command": "Skopiuj polecenie vcpkg, aby zainstalować element „{0}” w schowku", + "on.disabled.command": "Nie można wykonywać poleceń związanych z funkcją IntelliSense, gdy właściwość `C_Cpp.intelliSenseEngine` ma wartość `Disabled`.", "client.not.found": "nie znaleziono klienta", "configuration.select.first": "Otwórz najpierw folder, aby wybrać konfigurację", "configuration.provider.select.first": "Otwórz najpierw folder, aby wybrać dostawcę konfiguracji", diff --git a/Extension/i18n/plk/src/LanguageServer/settings.i18n.json b/Extension/i18n/plk/src/LanguageServer/settings.i18n.json index 0a6d227e34..3dc140ce11 100644 --- a/Extension/i18n/plk/src/LanguageServer/settings.i18n.json +++ b/Extension/i18n/plk/src/LanguageServer/settings.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "editorconfig.default.behavior": "Formatowanie kodu używa ustawień z pliku .editorconfig zamiast .clang-format. Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą wartości 'Default' ustawienia „C_Cpp.formatting”." + "editorconfig.default.behavior": "Formatowanie kodu używa ustawień z pliku .editorconfig zamiast .clang-format. Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą wartości „Default” ustawienia „C_Cpp.formatting”." } \ No newline at end of file diff --git a/Extension/i18n/plk/src/nativeStrings.i18n.json b/Extension/i18n/plk/src/nativeStrings.i18n.json index 129a8a71e2..47db5561a9 100644 --- a/Extension/i18n/plk/src/nativeStrings.i18n.json +++ b/Extension/i18n/plk/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Folder", "file_tag": "Plik", "compiler_default_language_standard_version_old": "Kompilator zwrócił domyślną wersję standardową języka: {0}. Ponieważ ta wersja jest stara, spróbuje użyć nowszej wersji {1} jako domyślnej.", - "unexpected_output_from_clang_tidy": "Nieoczekiwane dane wyjściowe z narzędzia Clang-Tidy: {0}. Oczekiwano: {1}." + "unexpected_output_from_clang_tidy": "Nieoczekiwane dane wyjściowe z narzędzia Clang-Tidy: {0}. Oczekiwano: {1}.", + "generate_doxygen_comment": "Generuj komentarz Doxygen" } \ No newline at end of file diff --git a/Extension/i18n/ptb/package.i18n.json b/Extension/i18n/ptb/package.i18n.json index 71f4e1b9ac..08515a1226 100644 --- a/Extension/i18n/ptb/package.i18n.json +++ b/Extension/i18n/ptb/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "Depurar Arquivo C/C++", "c_cpp.command.BuildAndRunFile.title": "Executar Arquivo C/C++", "c_cpp.command.AddDebugConfiguration.title": "Adicionar a Configuração de Depuração", + "c_cpp.command.GenerateDoxygenComment.title": "Gerar Comentário do Doxygen", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "O número máximo de threads simultâneos a serem usado para processamento de serviço de linguagem. O valor é uma dica e nem sempre pode ser usado. O padrão de `null` (vazio) usa o número de processadores lógicos disponíveis.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "O número máximo de processos armazenados em cache a serem usado para o processamento do serviço de linguagem. O padrão `null` (vazio) usa duas vezes o número de processadores lógicos disponíveis.", "c_cpp.configuration.maxMemory.markdownDescription": "A memória máxima (em MB) disponível para processamento do serviço de idioma. Menos processos serão armazenados em cache e executados simultaneamente depois que esse uso de memória for excedido. O padrão `null` (vazio) usa a memória livre do sistema.", @@ -55,14 +56,15 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Mostrar apenas a ação de código 'Limpar tudo' (ou 'Limpar todos ' se houver apenas um tipo ou 'Limpar isso' se houver apenas um problema).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Mostrar a ação de código 'Limpar tudo' (se houver vários tipos de problema) e a ação de código 'Limpar tudo ' código de ação (ou 'Limpar isso' se houver apenas um problema para o )", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Mostrar 'Limpar tudo' (se houver vários tipos de problema), 'Limpar todos os ' (se houver vários problemas para o ), e 'Limpar isso' para código de ações", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Se for `true`, a formatação será executada nas linhas alteradas pelas ações de código 'Corrigir'.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "Se for `true`, a análise de código usando `clang-tidy` será habilitada e executada automaticamente se `#C_Cpp.codeAnalysis.runAutomatically#` for `true` (o padrão).", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "O caminho completo do executável `clang-tidy`. Se não for especificado, o `clang-tidy` estará disponível no caminho do ambiente usado. Se não for encontrado no caminho do ambiente, o `clang-tidy` empacotado com a extensão será usado.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Especifica uma configuração `clang-tidy` no formato YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{chave: x, valor: y}]}`. Quando o valor estiver vazio, `clang-tidy` tentará localizar um arquivo chamado `.clang-tidy` para cada arquivo de origem em seus diretórios pai.", "c_cpp.configuration.codeAnalysis.clangTidy.fallbackConfig.markdownDescription": "Especifica uma configuração `clang-tidy` no formato YAML/JSON a ser usada como fallback quando `#C_Cpp.codeAnalysis.clangTidy.config#` não estiver definido e nenhum arquivo `.clang-tidy` for encontrado: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{chave: x, valor: y}]}`.", "c_cpp.configuration.codeAnalysis.clangTidy.headerFilter.markdownDescription": "Uma expressão regular estendida (ERE) que corresponde ao nome do cabeçalho a partir do qual o diagnóstico deve ser gerado. Os diagnósticos do arquivo principal de cada unidade de tradução são sempre exibidos. A variável `${workspaceFolder}` é suportada (e será usada como o valor de fallback padrão se o arquivo `.clang-tidy` não existir). Se esta opção não for `null` (vazia), ela substituirá a opção `HeaderFilterRegex` em um arquivo `.clang-tidy`, se houver.", "c_cpp.configuration.codeAnalysis.clangTidy.args.markdownDescription": "Argumentos de linha de comando adicionais a serem passados para `clang-tidy`. Elas têm precedência sobre as configurações `C_Cpp.codeAnalysis.clangTidy.*` equivalentes.", - "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "Se `true` e `compileCommands` estiver definido, o argumento `-p=` será passado para `clang-tidy` em vez dos argumentos de compilação que estão sendo passados após `--`. Isso pode não funcionar se as variáveis de ambiente não estão definidas para que as insições do sistema possam ser encontradas.", - "c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "Lista de verificações `clang-tidy` habilitadas. Os valores são acrescentados às `Checks` em um arquivo `.clang-tidy` ou `#C_Cpp.codeAnalysis.clangTidy.config#`, se houver. A verificação padrão `clang-analyzer-*` é sempre usada, a menos que seja explicitamente desabilitada.", + "c_cpp.configuration.codeAnalysis.clangTidy.useBuildPath.markdownDescription": "Se `true` e `compileCommands` estiver definido, o argumento `-p=` será passado para `clang-tidy` em vez dos argumentos de compilação que estão sendo passados após `--`. Isso pode não funcionar se as variáveis de ambiente não estão definidas para que as inscrições do sistema possam ser encontradas.", + "c_cpp.configuration.codeAnalysis.clangTidy.checks.enabled.markdownDescription": "Lista de verificações `clang-tidy` habilitadas. Os valores são acrescentados às `Checks` em um arquivo `.clang-tidy` ou\n`#C_Cpp.codeAnalysis.clangTidy.config#`, se houver. A verificação padrão `clang-analyzer-*` é sempre usada, a menos que seja explicitamente desabilitada.", "c_cpp.configuration.codeAnalysis.clangTidy.checks.disabled.markdownDescription": "Lista de verificações `clang-tidy` desabilitadas. Os valores são acrescentados às `Checks` em um arquivo `.clang-tidy` ou `#C_Cpp.codeAnalysis.clangTidy.config#`, se houver.", "c_cpp.configuration.formatting.description": "Configura o mecanismo de formatação.", "c_cpp.configuration.formatting.clangFormat.markdownDescription": "`clang-format` será usado para formatar o código.", @@ -156,7 +158,7 @@ "c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": "Os blocos de código são sempre formatados com base nos valores das configurações `C_Cpp.vcFormat.newLine. *`.", "c_cpp.configuration.clang_format_path.markdownDescription": "O caminho completo do executável `clang-format`. Se não for especificado, o `clang-format` estará disponível no caminho do ambiente usado. Se não for encontrado no caminho do ambiente, o `clang-format` empacotado com a extensão será usado.", "c_cpp.configuration.clang_format_style.markdownDescription": "Estilo de codificação, atualmente suporta: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Use `file` para carregar o estilo de um arquivo `.clang-format` no diretório atual ou pai. Use `{key: value, ...}` para definir parâmetros específicos. Por exemplo, o estilo `Visual Studio` é semelhante a: `{BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifier: - 4, NamespaceIndentation: All, FixNamespaceComments: false}`.", - "c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "Nome do estilo predefinido usado como fallback no caso de `clang-format` ser invocado com o estilo `file`, mas o arquivo `.clang-format` não for encontrado. Os valores possíveis são `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`, `none` ou use `{key: value, .. .}` para definir parâmetros específicos. Por exemplo, o estilo `Visual Studio` é semelhante a:`{BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifier: - 4, NamespaceIndentation: All, FixNamespaceComments: false}`.", + "c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": "Nome do estilo predefinido usado como fallback no caso de `clang-format` ser invocado com o estilo `file`, mas o arquivo `.clang-format` não for encontrado. Os valores possíveis são `Visual Studio`,`LLVM`, `Google`,`Chromium`, `Mozilla`,`WebKit`, `Microsoft`, `GNU`, `none` ou use `{key: value, .. .}` para definir parâmetros específicos. Por exemplo, o estilo `Visual Studio` é semelhante a: `{BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifier: - 4, NamespaceIndentation: All, FixNamespaceComments: false}`.", "c_cpp.configuration.clang_format_sortIncludes.markdownDescription": "Se definido, substitui o comportamento de classificação de inclusão determinado pelo parâmetro `SortIncludes`.", "c_cpp.configuration.intelliSenseEngine.description": "Controla o provedor IntelliSense.", "c_cpp.configuration.intelliSenseEngine.default.description": "Fornece resultados baseados no contextopor meio de um processo IntelliSense separado.", @@ -187,18 +189,20 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Os filtros de exclusão serão avaliados em relação a todos os arquivos e pastas encontrados.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "O caractere usado como separador de caminho para resultados de preenchimento automático de #include.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Se for `true`, as dicas de passar o mouse e autocompletar exibirão apenas alguns rótulos de comentários estruturados. Caso contrário, todos os comentários serão exibidos.", + "c_cpp.configuration.doxygen.generateOnType.description": "Controle se o comentário Doxygen deve ser inserido automaticamente depois de digitar o estilo de comentário escolhido.", + "c_cpp.configuration.doxygen.generatedStyle.description": "A cadeia de caracteres usada como a linha inicial do comentário Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "O padrão que inicia um bloco de comentário de várias linhas ou de uma linha. O padrão de continuação é `*` para blocos de comentários de várias linhas ou esta cadeia de caracteres para blocos de comentários de uma única linha.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "O padrão que inicia um bloco de comentário de linha única ou de várias linhas.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "O texto que será inserido na próxima linha quando Enter for pressionado dentro de um bloco de comentário de linha única ou de várias linhas.", "c_cpp.configuration.commentContinuationPatterns.description": "Define o comportamento do editor para quando a tecla Enter é pressionada dentro de um bloco de comentário de linha única ou de várias linhas.", "c_cpp.configuration.configurationWarnings.description": "Determina se as notificações pop-up serão mostradas quando uma extensão do provedor de configuração não puder fornecer uma configuração para um arquivo de origem.", - "c_cpp.configuration.intelliSenseCachePath.markdownDescription": "Define o caminho da pasta para cabeçalhos pré-compilados em cache usados ​​pelo IntelliSense. O caminho de cache padrão é `%LocalAppData%/Microsoft/vscode-cpptools` no Windows, `$XDG_CACHE_HOME/vscode-cpptools/` no Linux (ou `$HOME/.cache/vscode-cpptools/` se `XDG_CACHE_HOME` não é definido) e `$HOME/Library/Caches/vscode-cpptools/` no macOS. O caminho padrão será usado se nenhum caminho for especificado ou se um caminho especificado for inválido.", + "c_cpp.configuration.intelliSenseCachePath.markdownDescription": "Define o caminho da pasta para cabeçalhos pré-compilados em cache usados ​​pelo IntelliSense. O caminho de cache padrão é `%LocalAppData%/Microsoft/vscode-cpptools` no Windows,`$XDG_CACHE_HOME/vscode-cpptools/` no Linux (ou `$HOME/.cache/vscode-cpptools/` se`XDG_CACHE_HOME` não é definido) e `$HOME/Library/Caches/vscode-cpptools/` no macOS. O caminho padrão será usado se nenhum caminho for especificado ou se um caminho especificado for inválido.", "c_cpp.configuration.intelliSenseCacheSize.markdownDescription": "Tamanho máximo do espaço do disco rígido por espaço de trabalho em megabytes (MB) para cabeçalhos pré-compilados em cache; o uso real pode oscilar em torno desse valor. O tamanho padrão é `5120` MB. O cache de cabeçalho pré-compilado é desabilitado quando o tamanho é `0`.", "c_cpp.configuration.intelliSenseMemoryLimit.markdownDescription": "Limite de uso de memória em megabytes (MB) de um processo IntelliSense. O padrão é `4096` e o máximo é `16384`. A extensão será desligada e reiniciada um processo IntelliSense quando ele exceder o limite.", "c_cpp.configuration.intelliSenseUpdateDelay.description": "Controla o atraso em milissegundos até que o IntelliSense comece a ser atualizado após uma modificação.", "c_cpp.configuration.default.includePath.markdownDescription": "O valor a ser usado em uma configuração se `includePath` não for especificado em `c_cpp_properties.json`. Se `includePath` for especificado, adicione `${default}` ao array para inserir os valores desta configuração. Normalmente, isso não deve incluir inclusões de sistema; em vez disso, defina `#C_Cpp.default.compilerPath#`.", "c_cpp.configuration.default.defines.markdownDescription": "O valor a ser usado em uma configuração se `defines` não for especificado, ou os valores a serem inseridos se `${default}` estiver presente em `defines`.", - "c_cpp.configuration.default.macFrameworkPath.markdownDescription": "O valor a ser usado em uma configuração se `macFrameworkPath` não for especificado, ou os valores a serem inseridos se `${default}` estiver presente em `macFrameworkPath`.", + "c_cpp.configuration.default.macFrameworkPath.markdownDescription": "O valor a ser usado em uma configuração se `macFrameworkPath` não for especificado, ou os valores a serem inseridos se `${default}`estiver presente em `macFrameworkPath`.", "c_cpp.configuration.default.windowsSdkVersion.markdownDescription": "A versão do SDK do Windows inclui o caminho a ser usado no Windows, por exemplo, `10.0.17134.0`.", "c_cpp.configuration.default.compileCommands.markdownDescription": "O valor a ser usado em uma configuração se `compileCommands` não for especificado ou definido como `${default}`.", "c_cpp.configuration.default.forcedInclude.markdownDescription": "O valor a usar em uma configuração se `forcedInclude` não for especificado, ou os valores a inserir se `${default}` estiver presente em `forcedInclude`.", @@ -224,7 +228,7 @@ "c_cpp.configuration.codeFolding.description": "Se habilitado, os intervalos de dobramento de código serão fornecidos pelo servidor de idiomas.", "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.renameRequiresIdentifier.markdownDescription": "Se `true`, 'Rename Symbol' exigirá um identificador C/C++ válido.", + "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 os padrões glob para excluir pastas (e arquivos se `#C_Cpp.exclusionPolicy#` for alterado). Eles são específicos para a extensão C/C++ e são adicionais a `#files.exclude#`, mas ao contrário de `#files.exclude#` eles também se aplicam a caminhos fora da pasta do espaço de trabalho atual e não são removidos da visualização do Explorer. Leia mais sobre padrões glob [aqui](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options).", "c_cpp.configuration.filesExcludeBoolean.markdownDescription": "O padrão glob para corresponder aos caminhos de arquivo. Defina como `true` ou `false` para habilitar ou desabilitar o padrão.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "O caminho para o depurador de MI (como o gdb). Quando não for especificado, ele pesquisará primeiro o caminho para o depurador.", "c_cpp.debuggers.miDebuggerArgs.description": "Argumentos adicionais para o depurador MI (como o gdb).", "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.description": "Parâmetro opcional. Se for true, o depurador deverá parar no ponto de entrada do destino. Se processId for passado, 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 \"miDebugServerAddress\" ou 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.", diff --git a/Extension/i18n/ptb/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/ptb/src/Debugger/attachToProcess.i18n.json index 80b0453b7c..0ec97b1cd5 100644 --- a/Extension/i18n/ptb/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/ptb/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "A configuração de depuração escolhida não contém {0}", + "debugger.path.and.server.address.required": "{0} na configuração de depuração requer {1} e {2}", + "no.pipetransport.useextendedremote": "A configuração de depuração escolhida não contém {0} ou {1}", "select.process.attach": "Selecione o processo ao qual anexar", "process.not.selected": "Processo não selecionado.", "pipe.failed": "O transporte de pipe falhou ao obter o SO e os processos.", - "no.process.list": "A anexação do transporte não pôde obter a lista de processos." + "no.process.list": "A anexação do transporte não pôde obter a lista de processos.", + "failed.to.make.gdb.connection": "Falha ao fazer conexão GDB: \"{0}\".", + "failed.to.parse.processes": "Falha ao analisar processos: \"{0}\"." } \ No newline at end of file diff --git a/Extension/i18n/ptb/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/ptb/src/Debugger/configurationProvider.i18n.json index 2c9cb58e48..312bdc8327 100644 --- a/Extension/i18n/ptb/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/ptb/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "Não é possível localizar 'LLDB.framework' para lldb-mi. Instale o XCode ou as Ferramentas de Linha de Comando do XCode.", "debugger.launchConfig": "Iniciar configuração:", "vs.code.1.69+.required": "'deploySteps' requer VS Code 1.69 ou superior.", + "running.deploy.steps": "Executando etapas de implantação...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "Compilar e depurar o arquivo ativo", "cl.exe.not.available": "A criação e a depuração de {0} só podem ser usadas quando o VS Code é executado por meio do Prompt de Comando do Desenvolvedor para VS.", diff --git a/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json b/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json index 013aa82479..bd054a55cf 100644 --- a/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/ptb/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Saiba como instalar uma biblioteca para este cabeçalho com vcpkg", "copy.vcpkg.command": "Copiar o comando vcpkg para instalar '{0}' para a área de transferência", + "on.disabled.command": "Comandos relacionados ao IntelliSense não podem ser executados quando `C_Cpp.intelliSenseEngine` está definido como `Disabled`.", "client.not.found": "o cliente não foi encontrado", "configuration.select.first": "Abrir uma pasta primeiro para selecionar uma configuração", "configuration.provider.select.first": "Abrir uma pasta primeiro para selecionar um provedor de configuração", diff --git a/Extension/i18n/ptb/src/nativeStrings.i18n.json b/Extension/i18n/ptb/src/nativeStrings.i18n.json index 12fcb922dc..e3f0b1e491 100644 --- a/Extension/i18n/ptb/src/nativeStrings.i18n.json +++ b/Extension/i18n/ptb/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Pasta", "file_tag": "Arquivo", "compiler_default_language_standard_version_old": "O compilador retornou a versão padrão do idioma padrão: {0}. Como essa versão é antiga, tentaremos usar a versão {1} mais recente como padrão.", - "unexpected_output_from_clang_tidy": "Saída inesperada de clang-tidy: {0}. Esperado: {1}." + "unexpected_output_from_clang_tidy": "Saída inesperada de clang-tidy: {0}. Esperado: {1}.", + "generate_doxygen_comment": "Gerar Comentário do Doxygen" } \ No newline at end of file diff --git a/Extension/i18n/rus/package.i18n.json b/Extension/i18n/rus/package.i18n.json index dd9fe0e00b..1d2661f38a 100644 --- a/Extension/i18n/rus/package.i18n.json +++ b/Extension/i18n/rus/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "Выполнить отладку файла C/C++", "c_cpp.command.BuildAndRunFile.title": "Запустить файл C/C++", "c_cpp.command.AddDebugConfiguration.title": "Добавление конфигурации отладки", + "c_cpp.command.GenerateDoxygenComment.title": "Создать комментарий Doxygen", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Максимальное число одновременных потоков, используемых для обработки задач языковой службы. Это значение является рекомендуемым и может использоваться не всегда. При заданном по умолчанию значении `null` (пусто) используется число доступных логических процессоров.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Максимальное число кэшированных процессов, используемых для обработки задач языковой службы. При заданном по умолчанию значении `null` (пусто) используется число, вдвое большее количества доступных логических процессоров.", "c_cpp.configuration.maxMemory.markdownDescription": "Максимальный объем памяти (в МБ), доступный для обработки задач языковой службы. После превышения этого объема памяти будет кэшироваться и одновременно выполняться меньше процессов. При заданном по умолчанию значении `null` (пусто) используется свободная память системы.", @@ -55,6 +56,7 @@ "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Отображение только действия кода \"Очистить все проблемы\", \"Очистить все проблемы типа <тип>\" (при единственном типе) или \"Очистить эту проблему\" (при единственной проблеме).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "Отображение действия кода \"Очистить все проблемы\" (при множестве типов проблем), \"Очистить все проблемы типа <тип>\" или \"Очистить эту проблему\" (при единственной проблеме определенного <типа>).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "Отображение действий кода \"Очистить все проблемы\" (при множестве типов проблем), \"Очистить все проблемы типа <тип>\" (при множестве проблем определенного <типа>) и \"Очистить эту проблему\".", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "Если установлено значение `true`, форматирование будет выполняться в строках, измененных действиями кода \"Исправить\".", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "При значении `true` анализ кода с использованием `clang-tidy` будет включен, запускаясь автоматически при значении `true` (по умолчанию) для `#C_Cpp.codeAnalysis.runAutomatically#`.", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "Полный путь к исполняемому файлу `clang-tidy`. Если значение не указано, а `clang-tidy` доступен в переменной среды PATH, используется именно он. Если `clang-tidy` не найден в переменной среды PATH, будет использоваться `clang-tidy`, связанный с расширением.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "Задает конфигурацию `clang-tidy` в формате YAML/JSON: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{ключ: x, значение: y}]}`. Если значение пусто, `clang-tidy` попытается найти файл с именем `.clang-tidy` для каждого исходного файла в его родительских каталогах.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Фильтры исключения будут вычисляться для каждого найденного файла и папки.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "Символ, используемый в качестве разделителя пути для результатов автозавершения `#include`.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "Если выбрано значение `true`, в подсказках при наведении указателя и автозавершении будут отображаться только определенные метки со структурированными комментариями. В противном случае отображаются все комментарии.", + "c_cpp.configuration.doxygen.generateOnType.description": "Определяет, следует ли автоматически вставлять комментарий Doxygen после ввода выбранного стиля комментария.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Строка символов, используемая в качестве начальной строки комментария Doxygen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Шаблон, который начинается с многострочного или однострочного примечания. Шаблон продолжения по умолчанию имеет значение ` * ` для многострочных примечаний или соответствует этой строке для однострочных примечаний.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Шаблон, который начинается с многострочного или однострочного примечания.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Текст, который будет вставлен в следующую строку при нажатии клавиши ВВОД в многострочном или однострочном примечании.", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "Путь к отладчику MI (например, GDB). Если он не задан, сначала будет выполнен поиск пути для отладчика.", "c_cpp.debuggers.miDebuggerArgs.description": "Дополнительные аргументы для отладчика MI (например, GDB).", "c_cpp.debuggers.miDebuggerServerAddress.description": "Сетевой адрес сервера отладчика MI, к которому требуется подключиться (пример: localhost:1234).", + "c_cpp.debuggers.useExtendedRemote.description": "Подключение к серверу отладчика MI в целевом расширенном удаленном режиме.", "c_cpp.debuggers.stopAtEntry.description": "Необязательный параметр. Если задано значение true, отладчик должен остановиться на точке входа целевого объекта. Если передается идентификатор процесса (processId), он не оказывает никакого влияния.", "c_cpp.debuggers.debugServerPath.description": "Необязательный полный путь к запускаемому серверу отладки. Значение по умолчанию — NULL. Применяется с параметром miDebugServerAddress или с вашим собственным сервером через команду customSetupCommand, использующую -target-select remote .", "c_cpp.debuggers.debugServerArgs.description": "Необязательные аргументы сервера отладки. Значение по умолчанию: null.", diff --git a/Extension/i18n/rus/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/rus/src/Debugger/attachToProcess.i18n.json index 4cd1578d7a..69b3e064af 100644 --- a/Extension/i18n/rus/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/rus/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "Выбранная конфигурация отладки не содержит {0}", + "debugger.path.and.server.address.required": "Для {0} в конфигурации отладки требуются {1} и {2}", + "no.pipetransport.useextendedremote": "Выбранная конфигурация отладки не содержит {0} или {1}", "select.process.attach": "Выберите процесс, к которому нужно выполнить подключение", "process.not.selected": "Процесс не выбран.", "pipe.failed": "Транспорту канала не удалось получить ОС и процессы.", - "no.process.list": "При подключении транспорта не удалось получить список процессов." + "no.process.list": "При подключении транспорта не удалось получить список процессов.", + "failed.to.make.gdb.connection": "Не удалось установить подключение GDB: \"{0}\".", + "failed.to.parse.processes": "Не удалось проанализировать процессы: \"{0}\"." } \ No newline at end of file diff --git a/Extension/i18n/rus/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/rus/src/Debugger/configurationProvider.i18n.json index 0d45d1ca95..393deb3ba7 100644 --- a/Extension/i18n/rus/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/rus/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "Не удается найти \"LLDB.framework\" для lldb-mi. Установите XCode или средства командной строки XCode.", "debugger.launchConfig": "Конфигурация запуска:", "vs.code.1.69+.required": "\"deploySteps\" требует VS Code 1.69+.", + "running.deploy.steps": "Выполнение действий развертывания...", "pre.Launch.Task": "ЗадачаПредварительногоЗапуска: {0}", "build.and.debug.active.file": "сборка и отладка активного файла", "cl.exe.not.available": "Сборку и отладку {0} можно использовать только при запуске VS Code из Командной строки разработчика для VS.", diff --git a/Extension/i18n/rus/src/LanguageServer/extension.i18n.json b/Extension/i18n/rus/src/LanguageServer/extension.i18n.json index c0589d52e0..1720099be1 100644 --- a/Extension/i18n/rus/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/rus/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "Сведения об установке библиотеки для этого заголовка с помощью vcpkg", "copy.vcpkg.command": "Копировать команду vcpkg для установки \"{0}\" в буфер обмена", + "on.disabled.command": "Команды, связанные с IntelliSense, не могут быть выполнены, если для `C_Cpp.intelliSenseEngine` установлено значение `Disabled`.", "client.not.found": "Клиент не найден.", "configuration.select.first": "Сначала откройте папку, чтобы выбрать конфигурацию", "configuration.provider.select.first": "Сначала откройте папку, чтобы выбрать поставщик конфигурации", diff --git a/Extension/i18n/rus/src/LanguageServer/settings.i18n.json b/Extension/i18n/rus/src/LanguageServer/settings.i18n.json index fbb7b5f164..e4b9fbb8f8 100644 --- a/Extension/i18n/rus/src/LanguageServer/settings.i18n.json +++ b/Extension/i18n/rus/src/LanguageServer/settings.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "editorconfig.default.behavior": "Форматирование кода использует параметры из .editorconfig вместо .clang-format. Дополнительные сведения см. в документации, в которой приведено значение по умолчанию `Default` для параметра 'C_Cpp.formatting'." + "editorconfig.default.behavior": "Форматирование кода использует параметры из .editorconfig вместо .clang-format. Дополнительные сведения см. в документации, в которой приведено значение по умолчанию 'Default' для параметра 'C_Cpp.formatting'." } \ No newline at end of file diff --git a/Extension/i18n/rus/src/nativeStrings.i18n.json b/Extension/i18n/rus/src/nativeStrings.i18n.json index fbf06a3737..b046271b95 100644 --- a/Extension/i18n/rus/src/nativeStrings.i18n.json +++ b/Extension/i18n/rus/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Папка", "file_tag": "Файл", "compiler_default_language_standard_version_old": "Компилятор вернул стандартную версию языка по умолчанию: {0}. Так как эта версия устарела, будет предпринята попытка использовать более новую версию {1} по умолчанию.", - "unexpected_output_from_clang_tidy": "Непредусмотренные выходные данные Clang-Tidy: {0}. Ожидалось: {1}." + "unexpected_output_from_clang_tidy": "Непредусмотренные выходные данные Clang-Tidy: {0}. Ожидалось: {1}.", + "generate_doxygen_comment": "Создать комментарий Doxygen" } \ No newline at end of file diff --git a/Extension/i18n/trk/package.i18n.json b/Extension/i18n/trk/package.i18n.json index 5aa673d32b..1e6f9613b5 100644 --- a/Extension/i18n/trk/package.i18n.json +++ b/Extension/i18n/trk/package.i18n.json @@ -33,6 +33,7 @@ "c_cpp.command.BuildAndDebugFile.title": "C/C++ Dosyasında Hata Ayıklama", "c_cpp.command.BuildAndRunFile.title": "C/C++ Dosyasını Çalıştırın", "c_cpp.command.AddDebugConfiguration.title": "Hata Ayıklama Yapılandırması Ekle", + "c_cpp.command.GenerateDoxygenComment.title": "Doxygen Açıklaması Oluştur", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": "Dil hizmeti işleme için kullanılacak maksimum eşzamanlı iş parçacığı sayısı. Değer bir ipucudur ve her zaman kullanılamaz. `null` (boş) varsayılanı, mevcut mantıksal işlemcilerin sayısını kullanır.", "c_cpp.configuration.maxCachedProcesses.markdownDescription": "Dil hizmeti işleme için kullanılacak önbelleğe alınmış maksimum işlem sayısı. Varsayılan `null` (boş) değeri kullanılabilir mantıksal işlemci sayısının iki katını kullanıyor.", "c_cpp.configuration.maxMemory.markdownDescription": "Dil hizmeti işleme için kullanılabilen maksimum bellek (MB cinsinden). Bu bellek kullanımı aşıldıktan sonra daha az işlem önbelleğe alınacak ve eşzamanlı olarak çalıştırılacaktır. Varsayılan `null` (boş) sistemin boş belleğini kullanır.", @@ -48,13 +49,14 @@ "c_cpp.configuration.codeAnalysis.excludeBoolean.markdownDescription": "Dosya yollarıyla eşleşecek glob deseni. Deseni etkinleştirmek veya devre dışı bırakmak için `true` ya da `false` olarak ayarlayın.", "c_cpp.configuration.codeAnalysis.excludeWhen.markdownDescription": "Eşleşen bir dosyanın eşdüzey öğeleri üzerindeki ek denetim. Eşleşen dosya adı için değişken olarak `$(basename)` kullanın.", "c_cpp.configuration.codeAnalysis.runAutomatically.markdownDescription": "`true` ise, dosya açıldıktan veya kaydedildikten sonra kod analizi otomatik olarak çalışır.", - "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true` ise kullanılabilir olduğunda, 'Devre dışı bırak' kod eylemi gösterilir (bir sonraki kod analizi çalıştırıldığında). 'Devre dışı bırak' kod eylemi kullanıldığında, uyarı kodunu `C_Cpp.codeAnalysis.clangTidy.checks.disabled` ayarına ekler.", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDisable.markdownDescription": "`true`ise kullanılabilir olduğunda, 'Devre dışı bırak' kod eylemi gösterilir (bir sonraki kod analizi çalıştırıldığında). 'Devre dışı bırak' kod eylemi kullanıldığında, uyarı kodunu `C_Cpp.codeAnalysis.clangTidy.checks.disabled`ayarına ekler.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showDocumentation.markdownDescription": "`true` ise, kullanılabilir olduğunda, 'için Belgeleri Göster' kod eylemi gösterilir (bir sonraki kod analizi çalıştırıldığında).", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.description": "Hangi 'Temizle' kod analizi sorun kodu eylem seçeneklerinin kullanılabilir olduğunu kontrol eder. Ayarın daha fazla seçenek göstermek için değiştirilmesi kod analizinin yeniden çalıştırılmasını gerektirebilir.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.None.description": "'Temizle' kod eylemi gösterme.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllOnly.description": "Yalnızca 'Tümünü temizle' (veya yalnızca bir tür varsa, 'Tüm temizle' veya sadece tek bir sorun varsa 'Bunu temizle') kod eylemini göster.", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllType.description": "'Tümünü temizle' (birden çok sorun türü varsa) ve 'Tüm temizle' (veya için sadece tek bir sorun varsa, 'Bunu temizle' kod eylemini göster)", "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.showClear.AllAndAllTypeAndThis.description": "'Tümünü temizle' (birden çok sorun türü varsa), 'Tüm temizle' ( için birden çok sorun varsa) ve 'Bunu temizle' kod eylemlerini göster", + "c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription": "`true` ise biçimlendirme 'Fix' kod eylemlerinin değiştirdiği satırlarda çalıştırılacaktır.", "c_cpp.configuration.codeAnalysis.clangTidy.enabled.markdownDescription": "`True` ise `#C_Cpp.codeAnalysis.runAutomatically#` değeri `true` ise `clang-tidy` kullanan kod analizi etkinleştirilir ve otomatik olarak çalıştırılır.", "c_cpp.configuration.codeAnalysis.clangTidy.path.markdownDescription": "`clang-tidy` yürütülebilir dosyasının tam yolu. Belirtilmemişse ve ortam yolunda `clang-tidy` mevcutsa, bu kullanılır. Ortam yolunda bulunamazsa, uzantıyla birlikte gelen `clang-tidy` kullanılacaktır.", "c_cpp.configuration.codeAnalysis.clangTidy.config.markdownDescription": "YAML/JSON biçiminde bir `clang-tidy` yapılandırmasını belirtir: `{Checks: '-*,clang-analyzer-*', CheckOptions: [{anahtar: x, değer: y}]}`. Değer boş olduğunda, `clang-tidy`, üst dizinlerinde her kaynak dosya için `clang-tidy` adlı bir dosya bulmayı dener.", @@ -106,7 +108,7 @@ "c_cpp.configuration.vcFormat.newLine.closeBraceSameLine.emptyFunction.description": "Boş işlev gövdeleri için kapatma küme ayracını açma küme ayracıyla aynı satıra taşıyın.", "c_cpp.configuration.vcFormat.newLine.beforeCatch.markdownDescription": "`catch` ve benzer anahtar sözcükleri yeni bir satıra yerleştirin.", "c_cpp.configuration.vcFormat.newLine.beforeElse.markdownDescription": "`else` ifadesini yeni bir satıra yerleştirin.", - "c_cpp.configuration.vcFormat.newLine.beforeWhileInDoWhile.markdownDescription": "`do`-`while` döngüsündeki `while` ifadesini yeni bir satıra yerleştirin.", + "c_cpp.configuration.vcFormat.newLine.beforeWhileInDoWhile.markdownDescription": "`do`-`while` döngüsündeki 'while' ifadesini yeni bir satıra yerleştirin.", "c_cpp.configuration.vcFormat.space.beforeFunctionOpenParenthesis.description": "İşlev adları arasındaki boşluklar ve bağımsız değişken listelerinin açma parantezleri.", "c_cpp.configuration.vcFormat.space.beforeFunctionOpenParenthesis.insert.description": "İşlevin açma parantezinden önce bir boşluk eklenir.", "c_cpp.configuration.vcFormat.space.beforeFunctionOpenParenthesis.remove.description": "İşleve ait sol ayraçtan önceki boşluklar kaldırıldı.", @@ -187,6 +189,8 @@ "c_cpp.configuration.exclusionPolicy.checkFilesAndFolders.description": "Dışlama filtreleri, karşılaşılan her dosya ve klasörle değerlendirilecek.", "c_cpp.configuration.preferredPathSeparator.markdownDescription": "`#include` otomatik tamamlama sonuçları için yol ayırıcısı olarak kullanılan karakter.", "c_cpp.configuration.simplifyStructuredComments.markdownDescription": "`true` ise, üzerine gelme ve otomatik tamamlama araç ipuçları, yapılandırılmış açıklamaların yalnızca belirli etiketlerini görüntüler. Aksi halde tüm açıklamalar görüntülenir.", + "c_cpp.configuration.doxygen.generateOnType.description": "Seçilen açıklama stilini girdikten sonra Doxygen açıklamasının otomatik olarak eklenip eklenmeyeceğini kontrol eder.", + "c_cpp.configuration.doxygen.generatedStyle.description": "Doxygen açıklamasının başlangıç satırı olarak kullanılan karakter dizesi.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.string.markdownDescription": "Çok satırlı veya tek satırlı açıklama bloğu başlatan desen. Devam deseni, çok satırlı açıklama blokları için varsayılan olarak ` * ` değerini veya tek satırlı açıklama blokları için bu dize değerini alır.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.begin.description": "Çok satırlı veya tek satırlı açıklama bloğu başlatan desen.", "c_cpp.configuration.commentContinuationPatterns.items.anyof.object.continue.description": "Çok satırlı veya tek satırlı açıklama bloğu içinde ENTER tuşuna basıldığında sonraki satıra eklenecek metin.", @@ -229,7 +233,7 @@ "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 ile ilgili daha fazla bilgiyi [buradan](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) okuyun.", "c_cpp.configuration.filesExcludeBoolean.markdownDescription": "Dosya yollarıyla eşleşecek glob deseni. Deseni etkinleştirmek veya devre dışı bırakmak için `true` ya da `false` olarak ayarlayın.", "c_cpp.configuration.filesExcludeWhen.markdownDescription": "Eşleşen bir dosyanın eşdüzey öğeleri üzerindeki ek denetim. Eşleşen dosya adı için değişken olarak `$(basename)` kullanın.", - "c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "`true` ise, hata ayıklayıcı kabuk komut değiştirme eski kesme işaretini ``(`)`` kullanır.", + "c_cpp.configuration.debugger.useBacktickCommandSubstitution.markdownDescription": "`true`ise, hata ayıklayıcı kabuk komut değiştirme eski kesme işaretini ``(`)`` kullanır.", "c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "Derleyici bağımsız değişken ayarlarında kabuk kaçışı işleme şekli için v1.10.0 öncesi davranışı etkinleştirin. v1.10.0'da başlayan bağımsız değişken dizileri için kabuk kaçışı artık beklenmiyor veya varsayılan olarak desteklenmiyor.", "c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "Bu ayar, v1.10.0'da düzeltilmiş davranışa geçişi geçici olarak destekliyor.", "c_cpp.contributes.views.cppReferencesView.title": "C/C++: Diğer başvuru sonuçları", @@ -277,6 +281,7 @@ "c_cpp.debuggers.miDebuggerPath.description": "MI hata ayıklayıcısının (gdb gibi) yolu. Belirtilmediğinde, ilk olarak hata ayıklayıcısı için yol araması yapar.", "c_cpp.debuggers.miDebuggerArgs.description": "MI hata ayıklayıcısı için ek bağımsız değişkenler (gdb gibi).", "c_cpp.debuggers.miDebuggerServerAddress.description": "Bağlanılacak MI Hata Ayıklayıcısı Sunucusunun ağ adresi (örnek: localhost:1234).", + "c_cpp.debuggers.useExtendedRemote.description": "Hedef genişletilmiş uzak modundayken MI Hata Ayıklayıcısı Sunucusuna bağlanın.", "c_cpp.debuggers.stopAtEntry.description": "İsteğe bağlı parametre. Değeri true ise, hata ayıklayıcısının hedefin giriş noktasında durması gerekir. processId geçirilirse hiçbir etkisi olmaz.", "c_cpp.debuggers.debugServerPath.description": "Başlatılacak sunucuda hata ayıklama için isteğe bağlı tam yol. Varsayılan değeri null. \"miDebugServerAddress\" veya kendi sunucunuzun \"-target-select remote \" çalıştıran bir \"customSetupCommand\" ile birlikte kullanılır.", "c_cpp.debuggers.debugServerArgs.description": "İsteğe bağlı hata ayıklama sunucusu bağımsız değişkenleri. Varsayılan olarak şu değeri alır: null.", diff --git a/Extension/i18n/trk/src/Debugger/attachToProcess.i18n.json b/Extension/i18n/trk/src/Debugger/attachToProcess.i18n.json index e86d48829c..766960e31b 100644 --- a/Extension/i18n/trk/src/Debugger/attachToProcess.i18n.json +++ b/Extension/i18n/trk/src/Debugger/attachToProcess.i18n.json @@ -4,9 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "no.pipetransport": "Seçilen hata ayıklama yapılandırması {0} içermiyor", + "debugger.path.and.server.address.required": "Hata ayıklama yapılandırmasındaki {0}, {1} ve {2} gerektirir", + "no.pipetransport.useextendedremote": "Seçilen hata ayıklama yapılandırması {0} veya {1} içermiyor", "select.process.attach": "Eklenilecek işlemi seçin", "process.not.selected": "İşlem seçilmedi.", "pipe.failed": "Kanal aktarımı, işletim sistemini ve işlemleri alamadı.", - "no.process.list": "Aktarım ekleme, işlemler listesini alamadı." + "no.process.list": "Aktarım ekleme, işlemler listesini alamadı.", + "failed.to.make.gdb.connection": "GDB bağlantısı yapılamadı: \"{0}\".", + "failed.to.parse.processes": "İşlemler ayrıştırılamadı: \"{0}\"." } \ No newline at end of file diff --git a/Extension/i18n/trk/src/Debugger/configurationProvider.i18n.json b/Extension/i18n/trk/src/Debugger/configurationProvider.i18n.json index fbe2cc7141..0c9d94a42e 100644 --- a/Extension/i18n/trk/src/Debugger/configurationProvider.i18n.json +++ b/Extension/i18n/trk/src/Debugger/configurationProvider.i18n.json @@ -12,6 +12,7 @@ "lldb.framework.not.found": "lldb-mi için 'LLDB.framework' bulunamıyor. Lütfen XCode'u veya XCode Komut Satırı Araçları'nı yükleyin.", "debugger.launchConfig": "Yapılandırmayı başlat:", "vs.code.1.69+.required": "'deploySteps' 1.69+ VS Code gerektirir.", + "running.deploy.steps": "Dağıtım adımları çalıştırılıyor...", "pre.Launch.Task": "preLaunchTask: {0}", "build.and.debug.active.file": "etkin dosyayı derle ve dosyada hata ayıkla", "cl.exe.not.available": "{0} derlemesi ve hata ayıklama yalnızca VS Code, VS için Geliştirici Komut İstemi'nden çalıştırıldığında kullanılabilir.", diff --git a/Extension/i18n/trk/src/LanguageServer/extension.i18n.json b/Extension/i18n/trk/src/LanguageServer/extension.i18n.json index c956923538..caf036dc0a 100644 --- a/Extension/i18n/trk/src/LanguageServer/extension.i18n.json +++ b/Extension/i18n/trk/src/LanguageServer/extension.i18n.json @@ -6,6 +6,7 @@ { "learn.how.to.install.a.library": "vcpkg ile bu üst bilgi için bir kitaplık yüklemeyi öğrenin", "copy.vcpkg.command": "'{0}' yükleme vcpkg komutunu panoya kopyalayın", + "on.disabled.command": "`C_Cpp.intelliSenseEngine` `Disabled` olarak ayarlandığında IntelliSense ile ilgili komutlar yürütülemez.", "client.not.found": "istemci bulunamadı", "configuration.select.first": "Yapılandırma seçmek için önce bir klasör açın", "configuration.provider.select.first": "Yapılandırma sağlayıcısı seçmek için önce bir klasör açın", diff --git a/Extension/i18n/trk/src/nativeStrings.i18n.json b/Extension/i18n/trk/src/nativeStrings.i18n.json index 5d20608655..95833776ae 100644 --- a/Extension/i18n/trk/src/nativeStrings.i18n.json +++ b/Extension/i18n/trk/src/nativeStrings.i18n.json @@ -221,5 +221,6 @@ "folder_tag": "Klasör", "file_tag": "Dosya", "compiler_default_language_standard_version_old": "Derleyici varsayılan dil standart sürümünü döndürdü: {0}. Bu sürüm eski olduğundan daha yeni {1} sürümünü varsayılan olarak kullanmayı deneyeceğiz.", - "unexpected_output_from_clang_tidy": "Clang-tidy öğesinden beklenmeyen çıkış: {0}. Beklenen: {1}." + "unexpected_output_from_clang_tidy": "Clang-tidy öğesinden beklenmeyen çıkış: {0}. Beklenen: {1}.", + "generate_doxygen_comment": "Doxygen Açıklaması Oluştur" } \ No newline at end of file diff --git a/Extension/walkthrough/debugconfig/run-and-debug-project-windows.md b/Extension/walkthrough/debugconfig/run-and-debug-project-windows.md index 22be524b49..2958479ee2 100644 --- a/Extension/walkthrough/debugconfig/run-and-debug-project-windows.md +++ b/Extension/walkthrough/debugconfig/run-and-debug-project-windows.md @@ -1,15 +1,15 @@ -

Run and debug your C++ file on Windows

-

To run and debug your C++ file in VS Code:

+

Run and debug your C++ file on Windows

+

To run and debug your C++ file in VS Code:

    -
  1. Open the C++ source file that you want to run and debug. Make sure this file is active (currently displayed and selected) in the editor.

    +
  2. Open the C++ source file that you want to run and debug. Make sure this file is active (currently displayed and selected) in the editor.

  3. -
  4. Press F5. Or, from the main menu, choose Run > Start Debugging.

    +
  5. Press F5. Or, from the main menu, choose Run > Start Debugging.

  6. -
  7. Select C++ (Windows).

    +
  8. Select C++ (Windows).

  9. -
  10. Choose cl.exe - Build and debug active file.

    +
  11. Choose cl.exe - Build and debug active file.

-

After running and debugging your C++ file for the first time, you'll notice two new files inside your project's .vscode folder: tasks.json and launch.json.

+

After running and debugging your C++ file for the first time, you'll notice two new files inside your project's .vscode folder: tasks.json and launch.json.

-

For more complex build and debug scenarios, you can customize your build tasks and debug configurations in tasks.json and launch.json. For example, if you normally pass arguments to your compiler when building from the command line, you can specify those arguments in tasks.json using the compilerArgs property. Similarly, you can define arguments to pass to your program for debugging in launch.json.

+

For more complex build and debug scenarios, you can customize your build tasks and debug configurations in tasks.json and launch.json. For example, if you normally pass arguments to your compiler when building from the command line, you can specify those arguments in tasks.json using the compilerArgs property. Similarly, you can define arguments to pass to your program for debugging in launch.json.

From 2832e546e0a0bb0325c09e245c7d8180fe245cb7 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 26 Aug 2022 13:58:23 -0700 Subject: [PATCH 02/16] Update changelog for 1.12.3. (#9794) * Update changelog for 1.12.3. --- Extension/CHANGELOG.md | 80 ++++++++++++++++-------------------------- Extension/package.json | 2 +- 2 files changed, 32 insertions(+), 50 deletions(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index adf990773c..8afad58116 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,55 +1,25 @@ # C/C++ for Visual Studio Code Changelog -## Version 1.12.2 (pre-release): August 24, 2022 -## Enhancements +## Version 1.12.3: August 29, 2022 +### New Features +* Add Doxygen comment generation via command, context menu, code action, or typing. [#5683](https://github.com/microsoft/vscode-cpptools/issues/5683) +* Add auto-complete of Doxygen keywords in comments. + +### Enhancements +* Add auto-formatting of lines that are changed by code analysis fixes. [#9322](https://github.com/microsoft/vscode-cpptools/issues/9322) +* Add compile arguments to enable colorized output in cppBuild tasks for clang. [#9643](https://github.com/microsoft/vscode-cpptools/issues/9643) +* Cache and reuse SSH passwords in the current remote debugging session. [PR #9654](https://github.com/microsoft/vscode-cpptools/pull/9654) * Fix "natvis collections only show the first 50 elements". [MIEngine#821](https://github.com/microsoft/MIEngine/issues/821) * Related [#9377](https://github.com/microsoft/vscode-cpptools/issues/9377) * Fix "cppdbg doesn't support array view of char* buf". [MIEngine#1258](https://github.com/microsoft/MIEngine/issues/1258) * Support explicit `this` references in natvis files. * @Trass3r [PR MIEngine#1163](https://github.com/microsoft/MIEngine/pull/1163) - -## Bug Fixes -* Fix code analysis fixes generating invalid code when the fix has escaped characters. [#9683](https://github.com/microsoft/vscode-cpptools/issues/9683) -* Fix tag parser crash. [#9679](https://github.com/microsoft/vscode-cpptools/issues/9679), [#9695](https://github.com/microsoft/vscode-cpptools/issues/9695) -* Fix code analysis fixes not being available when more than one check is associated with a fix. [#9755](https://github.com/microsoft/vscode-cpptools/issues/9755) -* Fix the asterisk alignment of the ending `*/` for generated Doxygen comments. [#9758](https://github.com/microsoft/vscode-cpptools/issues/9758) -* Fix infinite memory usage if a code analysis fix causes line deletion when formatting uses `vcFormat`. [#9761](https://github.com/microsoft/vscode-cpptools/issues/9761) -* Fix error when debugging is started without a launch.json and IntelliSense is disabled. [#9762](https://github.com/microsoft/vscode-cpptools/issues/9762) -* Fix "The result of GDB -exec evaluate request in all contexts is printed in debug console." [MIEngine #1236](https://github.com/microsoft/MIEngine/issues/1236) -* Fix "Evaluating a variable after a failed Step Out causes a fatal error, leaving debug session unusable". [MIEngine#1336](https://github.com/microsoft/MIEngine/issues/1336) - * Gareth Rees (@gareth-rees) [PR MIEngine#1337](https://github.com/microsoft/MIEngine/pull/1337) -* Fix deadlock in HandleStackTraceRequestAsync where lock was hold too long. - * GeorgeMay (@JoergMeier106) [PR MIEngine#1309](https://github.com/microsoft/MIEngine/pull/1309) - -## Version 1.12.1 (pre-release): August 15, 2022 -## New Features -* Add Doxygen comment generation via command, context menu, code action, or typing. [#5683](https://github.com/microsoft/vscode-cpptools/issues/5683) -* Add auto-complete of Doxygen keywords in comments. - -## Enhancements -* Enable auto-formatting of lines that are changed by code analysis fixes. [#9322](https://github.com/microsoft/vscode-cpptools/issues/9322) -* Enable colorized output in cppBuild tasks for clang. [#9643](https://github.com/microsoft/vscode-cpptools/issues/9643) -* Cache and reuse SSH passwords in the current remote debugging session. [PR #9654](https://github.com/microsoft/vscode-cpptools/pull/9654) * Do std fallback when compiler querying, even when explicitly specified via a compiler arg. -## Bug Fixes -* Fix C++20 IntelliSense parsing bugs. [#7446](https://github.com/microsoft/vscode-cpptools/issues/7446), [#9215](https://github.com/microsoft/vscode-cpptools/issues/9215) +### Bug Fixes +* Fix several IntelliSense parsing bugs. [#3683](https://github.com/microsoft/vscode-cpptools/issues/3683), [#6659](https://github.com/microsoft/vscode-cpptools/issues/6659), [#7446](https://github.com/microsoft/vscode-cpptools/issues/7446), [#9215](https://github.com/microsoft/vscode-cpptools/issues/9215) * Fix crash when tag parsing files containing certain string literals. [#9538](https://github.com/microsoft/vscode-cpptools/issues/9538) * Fix incorrect semantic tokens with templated operator overloads. [#9556](https://github.com/microsoft/vscode-cpptools/issues/9556) -* Fix `llvm-project` parser crash on file: `clang/test/parser/parser_overflow.c`. [#9653](https://github.com/microsoft/vscode-cpptools/issues/9653) -* Fix tag parsing of classes and enums with attributes. [#9672](https://github.com/microsoft/vscode-cpptools/issues/9672) -* Add PID to the extended remote process picker. [PR #9673](https://github.com/microsoft/vscode-cpptools/pull/9673) -* Fix `llvm-project` parser crash on file: `libcxx/test/support/test.support/make_string_header.pass.cpp`. [#9679](https://github.com/microsoft/vscode-cpptools/issues/9679) -* Fix unintended generation of `nul.d` file when querying clang or gcc, when compiler arguments include dependency generation arguments. [9707](https://github.com/microsoft/vscode-cpptools/issues/9707) -* Fix issue with stuck database icon when an excluded file is open on launch or when the database is reset. - -## Version 1.12.0 (pre-release): July 27, 2022 -## Enhancements -* Show an informative message when an IntelliSense-related command is executed while IntelliSense is disabled. [#9614](https://github.com/microsoft/vscode-cpptools/issues/9614) -* Add the `.vs` folder to the default exclusions. [PR #9629](https://github.com/microsoft/vscode-cpptools/pull/9629) - -## Bug Fixes -* Fix some IntelliSense parsing bugs. [#3683](https://github.com/microsoft/vscode-cpptools/issues/3683), [#6659](https://github.com/microsoft/vscode-cpptools/issues/6659) * Fix `.` to `->` completion in functions defined in the class/struct definition. [#9599](https://github.com/microsoft/vscode-cpptools/issues/9599) * Fix inlay hint filtering not working with some cases of whitespace. [#9606](https://github.com/microsoft/vscode-cpptools/issues/9606) * Fix Chinese translation mistakes. @@ -57,23 +27,35 @@ * Fix IntelliSense error with ARM register declarations. [#9627](https://github.com/microsoft/vscode-cpptools/issues/9627) * Fix files with a `.c` extension not using a C++ `std` version passed in the `compilerArgs` or `compilerFragments`. [#9628](https://github.com/microsoft/vscode-cpptools/issues/9628) * Fix unnecessary IntelliSense process restarting on file creation handling. [#9630](https://github.com/microsoft/vscode-cpptools/issues/9630) +* Fix tag parsing of classes and enums with attributes. [#9672](https://github.com/microsoft/vscode-cpptools/issues/9672) +* Add PID to the extended remote process picker. [PR #9673](https://github.com/microsoft/vscode-cpptools/pull/9673) +* Fix tag parser crash. [#9679](https://github.com/microsoft/vscode-cpptools/issues/9679), [#9695](https://github.com/microsoft/vscode-cpptools/issues/9695) +* Fix code analysis fixes generating invalid code when the fix has escaped characters. [#9683](https://github.com/microsoft/vscode-cpptools/issues/9683) +* Fix unintended generation of `nul.d` file when querying clang or gcc, when compiler arguments include dependency generation arguments. [#9707](https://github.com/microsoft/vscode-cpptools/issues/9707) +* Fix code analysis fixes not being available when more than one check is associated with a fix. [#9755](https://github.com/microsoft/vscode-cpptools/issues/9755) +* Fix error when debugging is started without a launch.json and IntelliSense is disabled. [#9762](https://github.com/microsoft/vscode-cpptools/issues/9762) +* Fix "The result of GDB -exec evaluate request in all contexts is printed in debug console." [MIEngine #1236](https://github.com/microsoft/MIEngine/issues/1236) +* Fix "Evaluating a variable after a failed Step Out causes a fatal error, leaving debug session unusable". [MIEngine#1336](https://github.com/microsoft/MIEngine/issues/1336) + * Gareth Rees (@gareth-rees) [PR MIEngine#1337](https://github.com/microsoft/MIEngine/pull/1337) +* Fix deadlock in HandleStackTraceRequestAsync where lock was hold too long. + * GeorgeMay (@JoergMeier106) [PR MIEngine#1309](https://github.com/microsoft/MIEngine/pull/1309) * Fix potential crashes on shutdown. ## Version 1.11.5: August 9, 2022 -## Bug Fixes +### Bug Fixes * Fix crash when tag parsing files containing certain string literals. [#9538](https://github.com/microsoft/vscode-cpptools/issues/9538) * Fix `llvm-project` parser crash on file: `clang/test/parser/parser_overflow.c`. [#9653](https://github.com/microsoft/vscode-cpptools/issues/9653) * Fix `llvm-project` parser crash on file: `libcxx/test/support/test.support/make_string_header.pass.cpp`. [#9679](https://github.com/microsoft/vscode-cpptools/issues/9679) ## Version 1.11.4: July 21, 2022 -## New Features +### New Features * Add inlay hints for parameters and auto types. [#5845](https://github.com/microsoft/vscode-cpptools/issues/5845) * Add extended remote support for debugging. [#8497](https://github.com/microsoft/vscode-cpptools/issues/8497), [#9195](https://github.com/microsoft/vscode-cpptools/issues/9195), [#9491](https://github.com/microsoft/vscode-cpptools/discussions/9491), [#9505](https://github.com/microsoft/vscode-cpptools/issues/9505) -## Enhancements +### Enhancements * Add deploySteps and variables to cppdbg. [PR #9418](https://github.com/microsoft/vscode-cpptools/pull/9418) -## Bug Fixes +### Bug Fixes * Fix "unknown register name" IntelliSense error. [#4382](https://github.com/microsoft/vscode-cpptools/issues/4382) * Fix performance issue with tag parsing a file with a lot of defines. [#6454](https://github.com/microsoft/vscode-cpptools/issues/6454) * Fix IntelliSense with gcc vector extension types. [#6890](https://github.com/microsoft/vscode-cpptools/issues/6890) @@ -133,7 +115,7 @@ * Fix several IntelliSense bugs. [#6226](https://github.com/microsoft/vscode-cpptools/issues/6226), [#8294](https://github.com/microsoft/vscode-cpptools/issues/8294), [#8530](https://github.com/microsoft/vscode-cpptools/issues/8530), [#8725](https://github.com/microsoft/vscode-cpptools/issues/8725), [#8751](https://github.com/microsoft/vscode-cpptools/issues/8751), [#9076](https://github.com/microsoft/vscode-cpptools/issues/9076), [#9224](https://github.com/microsoft/vscode-cpptools/issues/9224), [#9336](https://github.com/microsoft/vscode-cpptools/issues/9336). * Fix issue with shell processing incorrectly occurring for `arguments` fields in `compile_commands.json` files. [#8649](https://github.com/microsoft/vscode-cpptools/issues/8649) * Fix handling of `@response` files for clang-tidy on Windows. [#8843](https://github.com/microsoft/vscode-cpptools/issues/8843), [#9032](https://github.com/microsoft/vscode-cpptools/issues/9032), [#9102](https://github.com/microsoft/vscode-cpptools/issues/9102) -* Fix issue with inconsistent handling of shell escaping in compiler arg fields. All compiler arg array fields are now assumed to not include shell quoting, escaping or shell variables. Added a `C_Cpp.legacyCompilerArgsBehavior` to restore the legacy behavior. [#8963](https://github.com/microsoft/vscode-cpptools/issues/8963) +* Fix issue with inconsistent handling of shell escaping in compiler arg fields. All compiler arg array fields are now assumed to not include shell quoting, escaping or shell variables. Added a `C_Cpp.legacyCompilerArgsBehavior` to restore the legacy behavior. [#8963](https://github.com/microsoft/vscode-cpptools/issues/8963) * Add localized strings for build tasks. [#9051](https://github.com/microsoft/vscode-cpptools/issues/9051) * Fix Go to Definition with C for identifiers that are C++ keywords. [#9081](https://github.com/microsoft/vscode-cpptools/issues/9081) * Fix the new Run/Debug Code button not working with a modified program location. [#9082](https://github.com/microsoft/vscode-cpptools/issues/9082) @@ -311,7 +293,7 @@ * Fix an issue related to arg parsing in build tasks. [#7891](https://github.com/microsoft/vscode-cpptools/issues/7891) * Add a check when cppbuild task is used when the active file is not a source file. [#7892](https://github.com/microsoft/vscode-cpptools/issues/7892) * Fix a cpptools crash [#8055](https://github.com/microsoft/vscode-cpptools/issues/8055) -* Fix issue "LogPoint stopped working v1.6.0". [#8065](https://github.com/microsoft/vscode-cpptools/issues/8065) +* Fix issue "LogPoint stopped working v1.6.0". [#8065](https://github.com/microsoft/vscode-cpptools/issues/8065) * [PR MIEngine#1208](https://github.com/microsoft/MIEngine/pull/1208) * Fix issue "Debugger won't read/write from/to stdio". [#8075](https://github.com/microsoft/vscode-cpptools/issues/8075) * [PR MIEngine#1209](https://github.com/microsoft/MIEngine/pull/1209) @@ -431,7 +413,7 @@ * Fix an IntelliSense crash with `#pragma GCC target`. [#6698](https://github.com/microsoft/vscode-cpptools/issues/6698), [#7377](https://github.com/microsoft/vscode-cpptools/issues/7377) * Fix bitness detection for compilers targeting esp32. [#7034](https://github.com/microsoft/vscode-cpptools/issues/7034) * Fix -idirafter directories being included too early. [#7129](https://github.com/microsoft/vscode-cpptools/issues/7129) -* Fix issue with the cpptools process lingering when no longer needed. [#7262](https://github.com/microsoft/vscode-cpptools/issues/7262) +* Fix issue with the cpptools process lingering when no longer needed. [#7262](https://github.com/microsoft/vscode-cpptools/issues/7262) * Filter out C++ std when querying the compiler as C (and vice versa). [#7269](https://github.com/microsoft/vscode-cpptools/issues/7269) * Fix `files.exclude` ending with `/folder/**` not excluding `/folder`. [#7331](https://github.com/microsoft/vscode-cpptools/issues/7331) * Fix VS Code UI freezing when hovering over very large literals. [#7334](https://github.com/microsoft/vscode-cpptools/issues/7334), [#7577](https://github.com/microsoft/vscode-cpptools/issues/7577) @@ -900,7 +882,7 @@ * Fix failure to detect CL.exe if VS Installer files are stored on a drive other than the system drive. [#4929](https://github.com/microsoft/vscode-cpptools/issues/4929) * Fix extension randomly getting stuck while communicating with the IntelliSense process on Mac. [#4989](https://github.com/microsoft/vscode-cpptools/issues/4989) * Fix completion results appearing after numeric literals. [#5019](https://github.com/microsoft/vscode-cpptools/issues/5019) -* Fix issue with cancellation of a `Rename` operation causing subsequent `Find All References` and `Rename` operations to fail. [#5022](https://github.com/microsoft/vscode-cpptools/issues/5022) +* Fix issue with cancellation of a `Rename` operation causing subsequent `Find All References` and `Rename` operations to fail. [#5022](https://github.com/microsoft/vscode-cpptools/issues/5022) * Fix some settings not being editable in the UI. [PR #5126](https://github.com/microsoft/vscode-cpptools/pull/5126) * Fix `cpp_properties.json` error squiggles not appearing. [#5131](https://github.com/microsoft/vscode-cpptools/issues/5131) * Fix `search.exclude` not applying if there are > 1 symbols matching in the excluded file. [#5152](https://github.com/microsoft/vscode-cpptools/issues/5152) diff --git a/Extension/package.json b/Extension/package.json index 1a4a5086c5..8cd4818c6a 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.12.2-main", + "version": "1.12.3-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", From 3ff67ac89acd4ab9d057aaf2003c6625a386f1a3 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 29 Aug 2022 18:11:05 -0700 Subject: [PATCH 03/16] Update date. (#9811) --- Extension/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 8afad58116..7ef77a8ce1 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,6 +1,6 @@ # C/C++ for Visual Studio Code Changelog -## Version 1.12.3: August 29, 2022 +## Version 1.12.3: August 30, 2022 ### New Features * Add Doxygen comment generation via command, context menu, code action, or typing. [#5683](https://github.com/microsoft/vscode-cpptools/issues/5683) * Add auto-complete of Doxygen keywords in comments. From 58cce1a99618fad4d99ca1ef5c4b1821093fa299 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 30 Aug 2022 18:45:38 -0700 Subject: [PATCH 04/16] Update clang_format_style description. (#9788) * Update clang_format_style scope and description. --- Extension/package.nls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 23cae98b06..65fca2d92d 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -152,7 +152,7 @@ "c_cpp.configuration.vcFormat.wrap.preserveBlocks.allOneLineScopes.markdownDescription": { "message": "Any code where the opening and closing brace is entered on one line is kept on one line, regardless of the values of any of the `C_Cpp.vcFormat.newLine.*` settings.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.vcFormat.wrap.preserveBlocks.never.markdownDescription": { "message": "Code blocks are always formatted based on the values of the `C_Cpp.vcFormat.newLine.*` settings.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.clang_format_path.markdownDescription": { "message": "The full path of the `clang-format` executable. If not specified, and `clang-format` is available in the environment path, that is used. If not found in the environment path, the `clang-format` bundled with the extension will be used.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, - "c_cpp.configuration.clang_format_style.markdownDescription": { "message": "Coding style, currently supports: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Use `file` to load the style from a `.clang-format` file in the current or parent directory. Use `{key: value, ...}` to set specific parameters. For example, the `Visual Studio` style is similar to: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`.", "comment": [ "Words 'key' and 'value' in '{key: value, ...}' should be translated, but all other markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, + "c_cpp.configuration.clang_format_style.markdownDescription": { "message": "Coding style, currently supports: `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`. Use `file` to load the style from a `.clang-format` file in the current or parent directory, or use `file:/.clang-format` to reference a specific path. Use `{key: value, ...}` to set specific parameters. For example, the `Visual Studio` style is similar to: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`.", "comment": [ "Words 'key' and 'value' in '{key: value, ...}' and the word 'path' in 'file:/.clang-format' should be translated, but all other markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.clang_format_fallbackStyle.markdownDescription": { "message": "Name of the predefined style used as a fallback in case `clang-format` is invoked with style `file` but the `.clang-format` file is not found. Possible values are `Visual Studio`, `LLVM`, `Google`, `Chromium`, `Mozilla`, `WebKit`, `Microsoft`, `GNU`, `none`, or use `{key: value, ...}` to set specific parameters. For example, the `Visual Studio` style is similar to: `{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All, FixNamespaceComments: false }`.", "comment": [ "Words 'key' and 'value' in '{key: value, ...}' should be translated, but all other markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.clang_format_sortIncludes.markdownDescription": { "message": "If set, overrides the include sorting behavior determined by the `SortIncludes` parameter.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.intelliSenseEngine.description": "Controls the IntelliSense provider.", From b38e9ef00ac3b26a79b4ff656e3d9642801e3543 Mon Sep 17 00:00:00 2001 From: Bob Brown Date: Wed, 31 Aug 2022 14:42:38 -0700 Subject: [PATCH 05/16] Revert "Switch to new key format since AIF is retired (#9769)" (#9822) --- Extension/package.json | 4 ++-- Extension/src/telemetry.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 8cd4818c6a..6f31295027 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2920,7 +2920,7 @@ "rust" ], "_aiKeyComment": "Ignore 'Property aiKey is not allowed'. See https://github.com/microsoft/vscode/issues/76493", - "aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "variables": { "pickProcess": "extension.pickNativeProcess", "pickRemoteProcess": "extension.pickRemoteNativeProcess" @@ -4450,7 +4450,7 @@ "rust" ], "_aiKeyComment": "Ignore 'Property aiKey is not allowed'. See https://github.com/microsoft/vscode/issues/76493", - "aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "variables": { "pickProcess": "extension.pickNativeProcess" }, diff --git a/Extension/src/telemetry.ts b/Extension/src/telemetry.ts index f2010bc587..6dddb38154 100644 --- a/Extension/src/telemetry.ts +++ b/Extension/src/telemetry.ts @@ -55,7 +55,7 @@ export class ExperimentationTelemetry implements IExperimentationTelemetry { let initializationPromise: Promise | undefined; let experimentationTelemetry: ExperimentationTelemetry | undefined; -const appInsightsKey: string = "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255"; +const appInsightsKey: string = "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217"; export function activate(): void { try { From 9e9430e9b4bf4c36d7dd123be7f6af0ca6df965e Mon Sep 17 00:00:00 2001 From: Michelle Matias <38734287+michelleangela@users.noreply.github.com> Date: Wed, 31 Aug 2022 14:48:08 -0700 Subject: [PATCH 06/16] changelog 1.12.4 (#9823) --- Extension/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 7ef77a8ce1..e52e5941bd 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,9 @@ # C/C++ for Visual Studio Code Changelog +## Version 1.12.4: August 31, 2022 +### Other +* Revert changes to telemetry key format. [PR #9822](https://github.com/microsoft/vscode-cpptools/pull/9822) + ## Version 1.12.3: August 30, 2022 ### New Features * Add Doxygen comment generation via command, context menu, code action, or typing. [#5683](https://github.com/microsoft/vscode-cpptools/issues/5683) From feb70a368051ac0907fcf6787a8f0b7b84d9fac2 Mon Sep 17 00:00:00 2001 From: browntarik <111317156+browntarik@users.noreply.github.com> Date: Thu, 1 Sep 2022 12:56:55 -0700 Subject: [PATCH 07/16] update extension pack (#9830) --- ExtensionPack/CHANGELOG.md | 4 +--- ExtensionPack/README.md | 2 -- ExtensionPack/package.json | 6 ++---- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/ExtensionPack/CHANGELOG.md b/ExtensionPack/CHANGELOG.md index e96597a69f..f6da759cb2 100644 --- a/ExtensionPack/CHANGELOG.md +++ b/ExtensionPack/CHANGELOG.md @@ -1,9 +1,7 @@ # C/C++ Extension Pack for Visual Studio Code Change Log -## Version 1.2.0 +## Version 1.3.0 ### List of extensions: * C/C++ * C/C++ Themes * CMake Tools -* Doxygen Documentation Generator -* Better C++ Syntax diff --git a/ExtensionPack/README.md b/ExtensionPack/README.md index 7ab2b78276..5bd2fa9710 100644 --- a/ExtensionPack/README.md +++ b/ExtensionPack/README.md @@ -5,5 +5,3 @@ This extension pack includes a set of popular extensions for C++ development in * [C/C++ Themes](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-themes) * [CMake](https://marketplace.visualstudio.com/items?itemName=twxs.cmake) * [CMake Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) -* [Doxygen Documentation Generator](https://marketplace.visualstudio.com/items?itemName=cschlosser.doxdocgen) -* [Better C++ Syntax](https://marketplace.visualstudio.com/items?itemName=jeff-hykin.better-cpp-syntax) diff --git a/ExtensionPack/package.json b/ExtensionPack/package.json index 55ce5aa0fa..3b2bcb247e 100644 --- a/ExtensionPack/package.json +++ b/ExtensionPack/package.json @@ -9,7 +9,7 @@ "name": "Microsoft Corporation" }, "license": "SEE LICENSE IN LICENSE.txt", - "version": "1.2.0", + "version": "1.3.0", "engines": { "vscode": "^1.48.0" }, @@ -37,8 +37,6 @@ "extensionPack": [ "ms-vscode.cpptools", "ms-vscode.cpptools-themes", - "ms-vscode.cmake-tools", - "cschlosser.doxdocgen", - "jeff-hykin.better-cpp-syntax" + "ms-vscode.cmake-tools" ] } From 08fd6214c97bb8e83bf9db2d6dd852480e7185e3 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 1 Sep 2022 15:58:19 -0700 Subject: [PATCH 08/16] Remove HttpsProxyAgent (#9833) --- Extension/package.json | 8 ++- Extension/src/common.ts | 103 ------------------------------------- Extension/src/telemetry.ts | 2 +- Extension/yarn.lock | 44 +--------------- 4 files changed, 5 insertions(+), 152 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 6f31295027..6903c47085 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.12.3-main", + "version": "1.12.4-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", @@ -2920,7 +2920,7 @@ "rust" ], "_aiKeyComment": "Ignore 'Property aiKey is not allowed'. See https://github.com/microsoft/vscode/issues/76493", - "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", "variables": { "pickProcess": "extension.pickNativeProcess", "pickRemoteProcess": "extension.pickRemoteNativeProcess" @@ -4450,7 +4450,7 @@ "rust" ], "_aiKeyComment": "Ignore 'Property aiKey is not allowed'. See https://github.com/microsoft/vscode/issues/76493", - "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255", "variables": { "pickProcess": "extension.pickNativeProcess" }, @@ -5440,7 +5440,6 @@ "gulp-mocha": "^8.0.0", "gulp-sourcemaps": "^2.6.5", "gulp-typescript": "^5.0.1", - "http-proxy-agent": "^2.1.0", "minimist": "^1.2.6", "mocha": "^8.3.2", "parse-git-config": "^3.0.0", @@ -5462,7 +5461,6 @@ "editorconfig": "^0.15.3", "escape-string-regexp": "^2.0.0", "glob": "^7.1.6", - "https-proxy-agent": "^2.2.4", "minimatch": "^3.0.4", "mkdirp": "^0.5.5", "plist": "^3.0.5", diff --git a/Extension/src/common.ts b/Extension/src/common.ts index 65a32fa908..83e788270a 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -9,14 +9,10 @@ import * as os from 'os'; import * as child_process from 'child_process'; import * as vscode from 'vscode'; import * as Telemetry from './telemetry'; -import HttpsProxyAgent = require('https-proxy-agent'); -import * as url from 'url'; import { PlatformInformation } from './platform'; import { getOutputChannelLogger, showOutputChannel } from './logger'; import * as assert from 'assert'; -import * as https from 'https'; import * as tmp from 'tmp'; -import { ClientRequest, OutgoingHttpHeaders } from 'http'; import * as nls from 'vscode-nls'; import * as jsonc from 'comment-json'; import { TargetPopulation } from 'vscode-tas-client'; @@ -443,32 +439,6 @@ export function getDebugAdaptersPath(file: string): string { return path.resolve(getExtensionFilePath("debugAdapters"), file); } -export function getHttpsProxyAgent(): HttpsProxyAgent | undefined { - let proxy: string | undefined = vscode.workspace.getConfiguration().get('http.proxy'); - if (!proxy) { - proxy = process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy; - if (!proxy) { - return undefined; // No proxy - } - } - - // Basic sanity checking on proxy url - const proxyUrl: any = url.parse(proxy); - if (proxyUrl.protocol !== "https:" && proxyUrl.protocol !== "http:") { - return undefined; - } - - const strictProxy: any = vscode.workspace.getConfiguration().get("http.proxyStrictSSL", true); - const proxyOptions: any = { - host: proxyUrl.hostname, - port: parseInt(proxyUrl.port, 10), - auth: proxyUrl.auth, - rejectUnauthorized: strictProxy - }; - - return new HttpsProxyAgent(proxyOptions); -} - /** Test whether a file exists */ export function checkFileExists(filePath: string): Promise { return new Promise((resolve, reject) => { @@ -899,79 +869,6 @@ export function createTempFileWithPostfix(postfix: string): Promise { - return new Promise((resolve, reject) => { - const parsedUrl: url.Url = url.parse(urlStr); - const request: ClientRequest = https.request({ - host: parsedUrl.host, - path: parsedUrl.path, - agent: getHttpsProxyAgent(), - rejectUnauthorized: vscode.workspace.getConfiguration().get('http.proxyStrictSSL', true), - headers: headers - }, (response) => { - if (response.statusCode === 301 || response.statusCode === 302) { // If redirected - // Download from new location - let redirectUrl: string; - if (typeof response.headers.location === 'string') { - redirectUrl = response.headers.location; - } else { - if (!response.headers.location) { - return reject(new Error(localize("invalid.download.location.received", 'Invalid download location received'))); - } - redirectUrl = response.headers.location[0]; - } - return resolve(downloadFileToDestination(redirectUrl, destinationPath, headers)); - } - if (response.statusCode !== 200) { // If request is not successful - return reject(); - } - // Write file using downloaded data - const createdFile: fs.WriteStream = fs.createWriteStream(destinationPath); - createdFile.on('finish', () => { resolve(); }); - response.on('error', (error) => { reject(error); }); - response.pipe(createdFile); - }); - request.on('error', (error) => { reject(error); }); - request.end(); - }); -} - -export function downloadFileToStr(urlStr: string, headers?: OutgoingHttpHeaders): Promise { - return new Promise((resolve, reject) => { - const parsedUrl: url.Url = url.parse(urlStr); - const request: ClientRequest = https.request({ - host: parsedUrl.host, - path: parsedUrl.path, - agent: getHttpsProxyAgent(), - rejectUnauthorized: vscode.workspace.getConfiguration().get('http.proxyStrictSSL', true), - headers: headers - }, (response) => { - if (response.statusCode === 301 || response.statusCode === 302) { // If redirected - // Download from new location - let redirectUrl: string; - if (typeof response.headers.location === 'string') { - redirectUrl = response.headers.location; - } else { - if (!response.headers.location) { - return reject(new Error(localize("invalid.download.location.received", 'Invalid download location received'))); - } - redirectUrl = response.headers.location[0]; - } - return resolve(downloadFileToStr(redirectUrl, headers)); - } - if (response.statusCode !== 200) { // If request is not successful - return reject(); - } - let downloadedData: string = ''; - response.on('data', (data) => { downloadedData += data; }); - response.on('error', (error) => { reject(error); }); - response.on('end', () => { resolve(downloadedData); }); - }); - request.on('error', (error) => { reject(error); }); - request.end(); - }); -} - function resolveWindowsEnvironmentVariables(str: string): string { return str.replace(/%([^%]+)%/g, (withPercents, withoutPercents) => { const found: string | undefined = process.env[withoutPercents]; diff --git a/Extension/src/telemetry.ts b/Extension/src/telemetry.ts index 6dddb38154..f2010bc587 100644 --- a/Extension/src/telemetry.ts +++ b/Extension/src/telemetry.ts @@ -55,7 +55,7 @@ export class ExperimentationTelemetry implements IExperimentationTelemetry { let initializationPromise: Promise | undefined; let experimentationTelemetry: ExperimentationTelemetry | undefined; -const appInsightsKey: string = "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217"; +const appInsightsKey: string = "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255"; export function activate(): void { try { diff --git a/Extension/yarn.lock b/Extension/yarn.lock index 31b1826c79..1b4de971c5 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -700,13 +700,6 @@ acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -agent-base@4, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1536,13 +1529,6 @@ debug-fabulous@1.X: memoizee "0.4.X" object-assign "4.X" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@3.X: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -1571,7 +1557,7 @@ debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -1887,18 +1873,6 @@ es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - es6-symbol@^3.1.1, es6-symbol@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" @@ -2996,14 +2970,6 @@ hosted-git-info@^2.1.4, hosted-git-info@^3.0.8: dependencies: lru-cache "^6.0.0" -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -3013,14 +2979,6 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -https-proxy-agent@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" From 466fb3b6bc57942b388f4327323ad6e0997493ab Mon Sep 17 00:00:00 2001 From: xisui-MSFT <44103947+xisui-MSFT@users.noreply.github.com> Date: Thu, 1 Sep 2022 16:19:14 -0700 Subject: [PATCH 09/16] rsync support in deploySteps (#9808) --- Extension/package.json | 126 ++++++++++++++---- Extension/package.nls.json | 10 +- .../src/Debugger/configurationProvider.ts | 23 +++- Extension/src/SSH/commands.ts | 29 +++- Extension/tools/OptionsSchema.json | 53 ++++++-- 5 files changed, 195 insertions(+), 46 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 6903c47085..99993d5b1b 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2333,7 +2333,7 @@ "markdownDescription": "%c_cpp.configuration.simplifyStructuredComments.markdownDescription%", "scope": "application" }, - "C_Cpp.doxygen.generateOnType":{ + "C_Cpp.doxygen.generateOnType": { "type": "boolean", "default": true, "description": "%c_cpp.configuration.doxygen.generateOnType.description%", @@ -2341,13 +2341,13 @@ }, "C_Cpp.doxygen.generatedStyle": { "type": "string", - "enum":[ + "enum": [ "///", "/**", "/*!", "//!" ], - "default":"///", + "default": "///", "description": "%c_cpp.configuration.doxygen.generatedStyle.description%", "scope": "resource" }, @@ -2897,7 +2897,7 @@ "icon": "$(debug-configure)" }, { - "command": "C_Cpp.GenerateDoxygenComment", + "command": "C_Cpp.GenerateDoxygenComment", "title": "%c_cpp.command.GenerateDoxygenComment.title%", "category": "C/C++" } @@ -3355,7 +3355,7 @@ "anyOf": [ { "type": "object", - "description": "%c_cpp.debuggers.deploySteps.scp.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.description%", "default": {}, "required": [ "type", @@ -3366,10 +3366,11 @@ "properties": { "type": { "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.description%", "default": "", "enum": [ - "scp" + "scp", + "rsync" ] }, "files": { @@ -3384,7 +3385,7 @@ } } ], - "description": "%c_cpp.debuggers.deploySteps.scp.files.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.files.description%", "default": "" }, "host": { @@ -3512,19 +3513,57 @@ }, "targetDir": { "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.targetDir.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.targetDir.description%", "default": "" }, - "scpPath": { - "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.scpPath.description%", - "default": "" + "recursive": { + "type": "boolean", + "description": "%c_cpp.debuggers.deploySteps.copyFile.recursive.description%", + "default": "true" }, "debug": { "type": "boolean", "description": "%c_cpp.debuggers.deploySteps.debug%" } - } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "scp" + } + } + }, + "then": { + "properties": { + "scpPath": { + "type": "string", + "description": "%c_cpp.debuggers.deploySteps.copyFile.scpPath.description%", + "default": "" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "rsync" + } + } + }, + "then": { + "properties": { + "rsyncPath": { + "type": "string", + "description": "%c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description%", + "default": "" + } + } + } + } + ] }, { "type": "object", @@ -4034,7 +4073,7 @@ "anyOf": [ { "type": "object", - "description": "%c_cpp.debuggers.deploySteps.scp.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.description%", "default": {}, "required": [ "type", @@ -4045,10 +4084,11 @@ "properties": { "type": { "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.description%", "default": "", "enum": [ - "scp" + "scp", + "rsync" ] }, "files": { @@ -4063,7 +4103,7 @@ } } ], - "description": "%c_cpp.debuggers.deploySteps.scp.files.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.files.description%", "default": "" }, "host": { @@ -4191,19 +4231,57 @@ }, "targetDir": { "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.targetDir.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.targetDir.description%", "default": "" }, - "scpPath": { - "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.scpPath.description%", - "default": "" + "recursive": { + "type": "boolean", + "description": "%c_cpp.debuggers.deploySteps.copyFile.recursive.description%", + "default": "true" }, "debug": { "type": "boolean", "description": "%c_cpp.debuggers.deploySteps.debug%" } - } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "scp" + } + } + }, + "then": { + "properties": { + "scpPath": { + "type": "string", + "description": "%c_cpp.debuggers.deploySteps.copyFile.scpPath.description%", + "default": "" + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "rsync" + } + } + }, + "then": { + "properties": { + "rsyncPath": { + "type": "string", + "description": "%c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description%", + "default": "" + } + } + } + } + ] }, { "type": "object", diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 65fca2d92d..06fb48615c 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -321,10 +321,12 @@ "c_cpp.debuggers.host.localForward.localSocket.description": "Local socket", "c_cpp.debuggers.host.localForward.remoteSocket.description": "Remote socket", "c_cpp.debuggers.deploySteps.description": "Steps needed to deploy the application. Order matters.", - "c_cpp.debuggers.deploySteps.scp.description": "Copy files using SCP.", - "c_cpp.debuggers.deploySteps.scp.files.description": "Files to be copied via SCP. Supports path pattern.", - "c_cpp.debuggers.deploySteps.scp.targetDir.description": "Target directory.", - "c_cpp.debuggers.deploySteps.scp.scpPath.description": "Optional full path to SCP. Assumes SCP is on PATH if not specified", + "c_cpp.debuggers.deploySteps.copyFile.description": "Copy files using SCP or rsync.", + "c_cpp.debuggers.deploySteps.copyFile.files.description": "Files to be copied. Supports path pattern.", + "c_cpp.debuggers.deploySteps.copyFile.targetDir.description": "Target directory.", + "c_cpp.debuggers.deploySteps.copyFile.recursive.description": "If true, copies folders recursively.", + "c_cpp.debuggers.deploySteps.copyFile.scpPath.description": "Optional full path to SCP. Assumes SCP is on PATH if not specified", + "c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description": "Optional full path to rsync. Assumes rsync is on PATH if not specified", "c_cpp.debuggers.deploySteps.debug": "If true, skip when starting without debugging. If false, skip when starting debugging. If undefined, never skip.", "c_cpp.debuggers.deploySteps.ssh.description": "SSH command step.", "c_cpp.debuggers.deploySteps.ssh.command.description": "Command to be executed via SSH. The command after '-c' in SSH command.", diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index bffa461215..8917b5de4d 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -24,7 +24,7 @@ import { Environment, ParsedEnvironmentFile } from './ParsedEnvironmentFile'; import { CppSettings, OtherSettings } from '../LanguageServer/settings'; import { configPrefix } from '../LanguageServer/extension'; import { expandAllStrings, ExpansionOptions, ExpansionVars } from '../expand'; -import { scp, ssh } from '../SSH/commands'; +import { rsync, scp, ssh } from '../SSH/commands'; import * as glob from 'glob'; import { promisify } from 'util'; import { AttachItemsProvider, AttachPicker, RemoteAttachPicker } from './attachToProcess'; @@ -35,6 +35,7 @@ const localize: nls.LocalizeFunc = nls.loadMessageBundle(); enum StepType { scp = 'scp', + rsync = 'rsync', ssh = 'ssh', shell = 'shell', remoteShell = 'remoteShell', @@ -1011,7 +1012,8 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv // Skip steps that doesn't match current launch mode. Explicit true/false check, since a step is always run when debug is undefined. return true; } - switch (step.type) { + const stepType: StepType = step.type; + switch (stepType) { case StepType.command: { // VS Code commands are the same regardless of which extension invokes them, so just invoke them here. if (step.args && !Array.isArray(step.args)) { @@ -1021,9 +1023,11 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv const returnCode: unknown = await vscode.commands.executeCommand(step.command, ...step.args); return !returnCode; } - case StepType.scp: { + case StepType.scp: + case StepType.rsync: { + const isScp: boolean = stepType === StepType.scp; if (!step.files || !step.targetDir || !step.host) { - logger.getOutputChannelLogger().showErrorMessage(localize('missing.properties.scp', '"host", "files", and "targetDir" are required in scp steps.')); + logger.getOutputChannelLogger().showErrorMessage(localize('missing.properties.copyFile', '"host", "files", and "targetDir" are required in {0} steps.', isScp ? 'SCP' : 'rsync')); return false; } const host: util.ISshHostInfo = { hostName: step.host.hostName, user: step.host.user, port: step.host.port }; @@ -1036,10 +1040,17 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv files = files.concat((await globAsync(fileGlob)).map(file => vscode.Uri.file(file))); } } else { - logger.getOutputChannelLogger().showErrorMessage(localize('incorrect.files.type.scp', '"files" must be a string or an array of strings in scp steps.')); + logger.getOutputChannelLogger().showErrorMessage(localize('incorrect.files.type.copyFile', '"files" must be a string or an array of strings in {0} steps.', isScp ? 'SCP' : 'rsync')); return false; } - const scpResult: util.ProcessReturnType = await scp(files, host, step.targetDir, config.scpPath, jumpHosts, cancellationToken); + + let scpResult: util.ProcessReturnType; + if (isScp) { + scpResult = await scp(files, host, step.targetDir, config.scpPath, config.recursive, jumpHosts, cancellationToken); + } else { + scpResult = await rsync(files, host, step.targetDir, config.scpPath, config.recursive, jumpHosts, cancellationToken); + } + if (!scpResult.succeeded || cancellationToken?.isCancellationRequested) { return false; } diff --git a/Extension/src/SSH/commands.ts b/Extension/src/SSH/commands.ts index 08378704e1..1d11aae167 100644 --- a/Extension/src/SSH/commands.ts +++ b/Extension/src/SSH/commands.ts @@ -12,8 +12,11 @@ import { runSshTerminalCommandWithLogin } from './sshCommandRunner'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); -export async function scp(files: vscode.Uri[], host: ISshHostInfo, targetDir: string, scpPath?: string, jumpHosts?: ISshHostInfo[], cancellationToken?: vscode.CancellationToken): Promise { +export async function scp(files: vscode.Uri[], host: ISshHostInfo, targetDir: string, recursive: boolean = true, scpPath?: string, jumpHosts?: ISshHostInfo[], cancellationToken?: vscode.CancellationToken): Promise { const args: string[] = []; + if (recursive) { + args.push('-r'); + } if (jumpHosts && jumpHosts.length > 0) { args.push('-J', jumpHosts.map(getFullHostAddress).join(',')); } @@ -26,6 +29,30 @@ export async function scp(files: vscode.Uri[], host: ISshHostInfo, targetDir: st return runSshTerminalCommandWithLogin(host, { systemInteractor: defaultSystemInteractor, nickname: 'scp', command: `"${scpPath || 'scp'}" ${args.join(' ')}`, token: cancellationToken }); } +// Recursive is less important in rsync thank in SCP. SCP under recursive mode always follows symlinks, and potentially causes problems. +// In rsync, there are options to avoid this issue (-l, -K). To mitigate confusion, we still provide a recursive option here like in SCP. +export async function rsync(files: vscode.Uri[], host: ISshHostInfo, targetDir: string, recursive: boolean = true, rsyncPath?: string, jumpHosts?: ISshHostInfo[], cancellationToken?: vscode.CancellationToken): Promise { + // --links, -l When symlinks are encountered, recreate the symlink on the destination. + // --keep-dirlinks, -K Treat symlinked dir on receiver as dir. + // --perms, -p Keep permissions. + // --verbose, -v Verbose. + // --compress, -z Compress file data during the transfer. + const args: string[] = ['-lKpvz']; + if (recursive) { + args.push('-r'); + } + if (jumpHosts && jumpHosts.length > 0) { + args.push('-e', `ssh -J ${jumpHosts.map(getFullHostAddress).join(',')}`); + } + if (host.port) { + // upper case P + args.push(`--port=${host.port}`); + } + args.push(files.map(uri => `"${uri.fsPath}"`).join(' '), `${getFullHostAddressNoPort(host)}:${targetDir}`); + + return runSshTerminalCommandWithLogin(host, { systemInteractor: defaultSystemInteractor, nickname: 'rsync', command: `"${rsyncPath || 'rsync'}" ${args.join(' ')}`, token: cancellationToken }); +} + export function ssh(host: ISshHostInfo, command: string, sshPath?: string, jumpHosts?: ISshHostInfo[], localForwards?: ISshLocalForwardInfo[], continueOn?: string, cancellationToken?: vscode.CancellationToken): Promise { const args: string[] = []; if (jumpHosts && jumpHosts.length > 0) { diff --git a/Extension/tools/OptionsSchema.json b/Extension/tools/OptionsSchema.json index 204d397a5f..3e94a44cbe 100644 --- a/Extension/tools/OptionsSchema.json +++ b/Extension/tools/OptionsSchema.json @@ -1,6 +1,6 @@ { "_comment": "See README.md for information about this file", - "$schema": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-07/schema#", "title": "VS Code launch/attach options", "description": "A json schema for the VS Code attach and launch options", "type": "object", @@ -367,7 +367,7 @@ "anyOf": [ { "type": "object", - "description": "%c_cpp.debuggers.deploySteps.scp.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.description%", "default": {}, "required": [ "type", @@ -378,10 +378,11 @@ "properties": { "type": { "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.description%", "default": "", "enum": [ - "scp" + "scp", + "rsync" ] }, "files": { @@ -396,7 +397,7 @@ } } ], - "description": "%c_cpp.debuggers.deploySteps.scp.files.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.files.description%", "default": "" }, "host": { @@ -404,19 +405,49 @@ }, "targetDir": { "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.targetDir.description%", + "description": "%c_cpp.debuggers.deploySteps.copyFile.targetDir.description%", "default": "" }, - "scpPath": { - "type": "string", - "description": "%c_cpp.debuggers.deploySteps.scp.scpPath.description%", - "default": "" + "recursive": { + "type": "boolean", + "description": "%c_cpp.debuggers.deploySteps.copyFile.recursive.description%", + "default": "true" }, "debug": { "type": "boolean", "description": "%c_cpp.debuggers.deploySteps.debug%" } - } + }, + "allOf": [ + { + "if": { + "properties": { "type": { "const": "scp" } } + }, + "then": { + "properties": { + "scpPath": { + "type": "string", + "description": "%c_cpp.debuggers.deploySteps.copyFile.scpPath.description%", + "default": "" + } + } + } + }, + { + "if": { + "properties": { "type": { "const": "rsync" } } + }, + "then": { + "properties": { + "rsyncPath": { + "type": "string", + "description": "%c_cpp.debuggers.deploySteps.copyFile.rsyncPath.description%", + "default": "" + } + } + } + } + ] }, { "type": "object", From 03b3995e19d45ce05038137f0f11ac739a019af4 Mon Sep 17 00:00:00 2001 From: xisui-MSFT <44103947+xisui-MSFT@users.noreply.github.com> Date: Thu, 1 Sep 2022 16:53:18 -0700 Subject: [PATCH 10/16] SSH Target Selector (#9760) * SSH Target Selector --- Extension/package.json | 973 ++++++++++-------- Extension/package.nls.json | 8 + .../src/Debugger/configurationProvider.ts | 4 +- Extension/src/Debugger/extension.ts | 91 +- Extension/src/LanguageServer/extension.ts | 40 +- Extension/src/SSH/TargetsView/common.ts | 40 + .../src/SSH/TargetsView/sshTargetsProvider.ts | 119 +++ Extension/src/SSH/TargetsView/targetNodes.ts | 59 ++ Extension/src/SSH/commandInteractors.ts | 24 + Extension/src/SSH/sshCommandRunner.ts | 6 +- Extension/src/SSH/sshCommandToConfig.ts | 260 +++++ Extension/src/SSH/sshHosts.ts | 216 ++++ Extension/src/common.ts | 81 +- Extension/src/logger.ts | 6 +- Extension/src/main.ts | 43 +- Extension/src/types/posix-getopt.d.ts | 19 + Extension/src/types/ssh-config.d.ts | 81 ++ Extension/test.tsconfig.json | 3 +- Extension/tools/OptionsSchema.json | 217 ++-- Extension/webpack.config.js | 3 + Extension/yarn.lock | 61 +- 21 files changed, 1742 insertions(+), 612 deletions(-) create mode 100644 Extension/src/SSH/TargetsView/common.ts create mode 100644 Extension/src/SSH/TargetsView/sshTargetsProvider.ts create mode 100644 Extension/src/SSH/TargetsView/targetNodes.ts create mode 100644 Extension/src/SSH/sshCommandToConfig.ts create mode 100644 Extension/src/SSH/sshHosts.ts create mode 100644 Extension/src/types/posix-getopt.d.ts create mode 100644 Extension/src/types/ssh-config.d.ts diff --git a/Extension/package.json b/Extension/package.json index 99993d5b1b..79413a7280 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -77,6 +77,9 @@ "onCommand:C_Cpp.RunCodeAnalysisOnOpenFiles", "onCommand:C_Cpp.RunCodeAnalysisOnAllFiles", "onCommand:C_Cpp.RemoveAllCodeAnalysisProblems", + "onCommand:C_Cpp.selectActiveSshTarget", + "onCommand:C_Cpp.selectSshTarget", + "onCommand:C_Cpp.activeSshTarget", "onDebugResolve:cppdbg", "onDebugResolve:cppvsdbg", "workspaceContains:/.vscode/c_cpp_properties.json", @@ -244,6 +247,13 @@ "name": "%c_cpp.contributes.views.cppReferencesView.title%", "when": "cppReferenceTypes:hasResults" } + ], + "debug": [ + { + "id": "CppSshTargetsView", + "name": "%c_cpp.contributes.views.sshTargetsView.title%", + "when": "showCppSshTargetsView" + } ] }, "viewsWelcome": [ @@ -2894,12 +2904,51 @@ "command": "C_Cpp.AddDebugConfiguration", "title": "%c_cpp.command.AddDebugConfiguration.title%", "category": "C/C++", - "icon": "$(debug-configure)" + "icon": "$(debug-configure)" }, { "command": "C_Cpp.GenerateDoxygenComment", "title": "%c_cpp.command.GenerateDoxygenComment.title%", "category": "C/C++" + }, + { + "command": "C_Cpp.addSshTarget", + "category": "C/C++", + "title": "%c_cpp.command.addSshTarget.title%", + "icon": "$(plus)" + }, + { + "command": "C_Cpp.removeSshTarget", + "category": "C/C++", + "title": "%c_cpp.command.removeSshTarget.title%", + "icon": "$(remove)" + }, + { + "command": "C_Cpp.setActiveSshTarget", + "category": "C/C++", + "title": "%c_cpp.command.setActiveSshTarget.title%", + "icon": "$(check)" + }, + { + "command": "C_Cpp.selectActiveSshTarget", + "category": "C/C++", + "title": "%c_cpp.command.selectActiveSshTarget.title%" + }, + { + "command": "C_Cpp.selectSshTarget", + "category": "C/C++", + "title": "%c_cpp.command.selectSshTarget.title%" + }, + { + "command": "C_Cpp.activeSshTarget", + "category": "C/C++", + "title": "%c_cpp.command.activeSshTarget.title%" + }, + { + "command": "C_Cpp.refreshCppSshTargetsView", + "category": "C/C++", + "title": "%c_cpp.command.refreshCppSshTargetsView.title%", + "icon": "$(refresh)" } ], "keybindings": [ @@ -3389,127 +3438,136 @@ "default": "" }, "host": { - "type": "object", - "description": "%c_cpp.debuggers.host.description%", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { + "anyOf": [ + { "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" + "description": "%c_cpp.debuggers.host.description%", + "default": "hello@microsoft.com" }, - "port": { - "anyOf": [ - { - "type": "number" + { + "type": "object", + "description": "%c_cpp.debuggers.host.description%", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 - }, - "jumpHosts": { - "type": "array", - "description": "%c_cpp.debuggers.host.jumpHost.description%", - "items": { - "type": "object", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { - "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 + }, + "jumpHosts": { + "type": "array", + "description": "%c_cpp.debuggers.host.jumpHost.description%", + "items": { + "type": "object", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 + } } - } - } - }, - "localForwards": { - "type": "array", - "description": "%c_cpp.debuggers.host.localForward.description%", - "items": { - "type": "object", - "default": {}, - "properties": { - "bindAddress": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + }, + "localForwards": { + "type": "array", + "description": "%c_cpp.debuggers.host.localForward.description%", + "items": { + "type": "object", + "default": {}, + "properties": { + "bindAddress": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", + "default": "" }, - { + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.port.description%" + }, + "host": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.localForward.port.description%" - }, - "host": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.host.description%", - "default": "" - }, - "hostPort": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.localForward.host.description%", + "default": "" }, - { + "hostPort": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" + }, + "localSocket": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", + "default": "" + }, + "remoteSocket": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", + "default": "" } - ], - "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" - }, - "localSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", - "default": "" - }, - "remoteSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", - "default": "" + } } } } } - } + ] }, "targetDir": { "type": "string", @@ -3584,127 +3642,136 @@ ] }, "host": { - "type": "object", - "description": "%c_cpp.debuggers.host.description%", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { + "anyOf": [ + { "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" + "description": "%c_cpp.debuggers.host.description%", + "default": "hello@microsoft.com" }, - "port": { - "anyOf": [ - { - "type": "number" + { + "type": "object", + "description": "%c_cpp.debuggers.host.description%", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 - }, - "jumpHosts": { - "type": "array", - "description": "%c_cpp.debuggers.host.jumpHost.description%", - "items": { - "type": "object", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { - "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 + }, + "jumpHosts": { + "type": "array", + "description": "%c_cpp.debuggers.host.jumpHost.description%", + "items": { + "type": "object", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 + } } - } - } - }, - "localForwards": { - "type": "array", - "description": "%c_cpp.debuggers.host.localForward.description%", - "items": { - "type": "object", - "default": {}, - "properties": { - "bindAddress": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + }, + "localForwards": { + "type": "array", + "description": "%c_cpp.debuggers.host.localForward.description%", + "items": { + "type": "object", + "default": {}, + "properties": { + "bindAddress": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.port.description%" }, - { + "host": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.localForward.port.description%" - }, - "host": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.host.description%", - "default": "" - }, - "hostPort": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.localForward.host.description%", + "default": "" + }, + "hostPort": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" }, - { + "localSocket": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", + "default": "" + }, + "remoteSocket": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", + "default": "" } - ], - "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" - }, - "localSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", - "default": "" - }, - "remoteSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", - "default": "" + } } } } } - } + ] }, "command": { "type": "string", @@ -4107,127 +4174,136 @@ "default": "" }, "host": { - "type": "object", - "description": "%c_cpp.debuggers.host.description%", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { + "anyOf": [ + { "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" + "description": "%c_cpp.debuggers.host.description%", + "default": "hello@microsoft.com" }, - "port": { - "anyOf": [ - { - "type": "number" + { + "type": "object", + "description": "%c_cpp.debuggers.host.description%", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 - }, - "jumpHosts": { - "type": "array", - "description": "%c_cpp.debuggers.host.jumpHost.description%", - "items": { - "type": "object", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { - "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 + }, + "jumpHosts": { + "type": "array", + "description": "%c_cpp.debuggers.host.jumpHost.description%", + "items": { + "type": "object", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 + } } - } - } - }, - "localForwards": { - "type": "array", - "description": "%c_cpp.debuggers.host.localForward.description%", - "items": { - "type": "object", - "default": {}, - "properties": { - "bindAddress": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + }, + "localForwards": { + "type": "array", + "description": "%c_cpp.debuggers.host.localForward.description%", + "items": { + "type": "object", + "default": {}, + "properties": { + "bindAddress": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.port.description%" }, - { + "host": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.localForward.port.description%" - }, - "host": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.host.description%", - "default": "" - }, - "hostPort": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.localForward.host.description%", + "default": "" + }, + "hostPort": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" }, - { + "localSocket": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", + "default": "" + }, + "remoteSocket": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", + "default": "" } - ], - "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" - }, - "localSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", - "default": "" - }, - "remoteSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", - "default": "" + } } } } } - } + ] }, "targetDir": { "type": "string", @@ -4302,127 +4378,136 @@ ] }, "host": { - "type": "object", - "description": "%c_cpp.debuggers.host.description%", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { + "anyOf": [ + { "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" + "description": "%c_cpp.debuggers.host.description%", + "default": "hello@microsoft.com" }, - "port": { - "anyOf": [ - { - "type": "number" + { + "type": "object", + "description": "%c_cpp.debuggers.host.description%", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 - }, - "jumpHosts": { - "type": "array", - "description": "%c_cpp.debuggers.host.jumpHost.description%", - "items": { - "type": "object", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { - "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 + }, + "jumpHosts": { + "type": "array", + "description": "%c_cpp.debuggers.host.jumpHost.description%", + "items": { + "type": "object", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 + } } - } - } - }, - "localForwards": { - "type": "array", - "description": "%c_cpp.debuggers.host.localForward.description%", - "items": { - "type": "object", - "default": {}, - "properties": { - "bindAddress": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + }, + "localForwards": { + "type": "array", + "description": "%c_cpp.debuggers.host.localForward.description%", + "items": { + "type": "object", + "default": {}, + "properties": { + "bindAddress": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.port.description%" }, - { + "host": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.localForward.port.description%" - }, - "host": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.host.description%", - "default": "" - }, - "hostPort": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.localForward.host.description%", + "default": "" + }, + "hostPort": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" }, - { + "localSocket": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", + "default": "" + }, + "remoteSocket": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", + "default": "" } - ], - "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" - }, - "localSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", - "default": "" - }, - "remoteSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", - "default": "" + } } } } } - } + ] }, "command": { "type": "string", @@ -4951,6 +5036,28 @@ "command": "C_Cpp.referencesViewUngroupByType", "when": "view == CppReferencesView && !refView.isGroupedByFile", "group": "navigation" + }, + { + "command": "C_Cpp.addSshTarget", + "when": "view == CppSshTargetsView", + "group": "navigation" + }, + { + "command": "C_Cpp.refreshCppSshTargetsView", + "when": "view == CppSshTargetsView", + "group": "navigation" + } + ], + "view/item/context": [ + { + "command": "C_Cpp.removeSshTarget", + "when": "viewItem == CppSshTargetsView.targetLeafRemovable || viewItem == CppSshTargetsView.targetLeafRemovableCanSetActive", + "group": "inline@1" + }, + { + "command": "C_Cpp.setActiveSshTarget", + "when": "viewItem == CppSshTargetsView.targetLeafCanSetActive || viewItem == CppSshTargetsView.targetLeafRemovableCanSetActive", + "group": "inline@0" } ], "editor/title/run": [ @@ -5017,6 +5124,30 @@ { "command": "C_Cpp.referencesViewUngroupByType", "when": "cppReferenceTypes:hasResults" + }, + { + "command": "C_Cpp.addSshTarget", + "when": "never" + }, + { + "command": "C_Cpp.removeSshTarget", + "when": "never" + }, + { + "command": "C_Cpp.setActiveSshTarget", + "when": "never" + }, + { + "command": "C_Cpp.selectSshTarget", + "when": "never" + }, + { + "command": "C_Cpp.activeSshTarget", + "when": "never" + }, + { + "command": "C_Cpp.refreshCppSshTargetsView", + "when": "never" } ] }, @@ -5498,6 +5629,7 @@ "@types/plist": "^3.0.2", "@types/semver": "^7.1.0", "@types/tmp": "^0.1.0", + "@types/shell-quote": "^1.7.1", "@types/which": "^1.3.2", "@types/yauzl": "^2.9.1", "@typescript-eslint/eslint-plugin": "^4.31.1", @@ -5535,14 +5667,19 @@ "xml2js": "^0.4.19" }, "dependencies": { + "chokidar": "^3.5.3", "comment-json": "^4.1.1", "editorconfig": "^0.15.3", "escape-string-regexp": "^2.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4", "mkdirp": "^0.5.5", + "node-loader": "^2.0.0", "plist": "^3.0.5", "tmp": "^0.2.1", + "posix-getopt": "^1.2.1", + "shell-quote": "^1.7.3", + "ssh-config": "^4.1.0", "vscode-cpptools": "^6.1.0", "@vscode/extension-telemetry": "^0.6.2", "vscode-languageclient": "^8.0.1", @@ -5566,4 +5703,4 @@ "minimist": "^1.2.6", "terser": "^5.14.2" } -} +} \ No newline at end of file diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 06fb48615c..10ab54a58f 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -29,6 +29,13 @@ "c_cpp.command.BuildAndRunFile.title": "Run C/C++ File", "c_cpp.command.AddDebugConfiguration.title": "Add Debug Configuration", "c_cpp.command.GenerateDoxygenComment.title": "Generate Doxygen Comment", + "c_cpp.command.addSshTarget.title": "Add SSH target", + "c_cpp.command.removeSshTarget.title": "Remove SSH target", + "c_cpp.command.setActiveSshTarget.title": "Set this SSH target as the active target", + "c_cpp.command.selectActiveSshTarget.title": "Select an active SSH target", + "c_cpp.command.selectSshTarget.title": "Select SSH target", + "c_cpp.command.activeSshTarget.title": "Get the active SSH target", + "c_cpp.command.refreshCppSshTargetsView.title": "Refresh", "c_cpp.configuration.maxConcurrentThreads.markdownDescription": { "message": "The maximum number of concurrent threads to use for language service processing. The value is a hint and may not always be used. The default of `null` (empty) uses the number of logical processors available.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.maxCachedProcesses.markdownDescription": { "message": "The maximum number of cached processes to use for language service processing. The default of `null` (empty) uses twice the number of logical processors available.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.maxMemory.markdownDescription": { "message": "The maximum memory (in MB) available for language service processing. Fewer processes will be cached and run concurrently after this memory usage is exceeded. The default of `null` (empty) uses the system's free memory.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, @@ -232,6 +239,7 @@ "c_cpp.configuration.legacyCompilerArgsBehavior.markdownDescription": "Enable pre-v1.10.0 behavior for how shell escaping is handled in compiler arg settings. Shell escaping is no longer expected or supported by default in arg arrays starting in v1.10.0.", "c_cpp.configuration.legacyCompilerArgsBehavior.deprecationMessage": "This setting is temporary to support transitioning to corrected behavior in v1.10.0.", "c_cpp.contributes.views.cppReferencesView.title": "C/C++: Other references results", + "c_cpp.contributes.views.sshTargetsView.title": { "message": "Cpptools: SSH targets", "comment": [ "Do not localize `Cpptools`." ] }, "c_cpp.contributes.viewsWelcome.contents": { "message": "To learn more about launch.json, see [Configuring C/C++ debugging](https://code.visualstudio.com/docs/cpp/launch-json-reference).", "comment": [ "Markdown text between () should not be altered: https://en.wikipedia.org/wiki/Markdown" ] }, "c_cpp.configuration.debugShortcut.description": "Show the \"Run and Debug\" play button and \"Add Debug Configuration\" gear in the editor title bar for C++ files.", "c_cpp.debuggers.pipeTransport.description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the MI-enabled debugger backend executable (such as gdb).", diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 8917b5de4d..674e164593 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -1030,7 +1030,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv logger.getOutputChannelLogger().showErrorMessage(localize('missing.properties.copyFile', '"host", "files", and "targetDir" are required in {0} steps.', isScp ? 'SCP' : 'rsync')); return false; } - const host: util.ISshHostInfo = { hostName: step.host.hostName, user: step.host.user, port: step.host.port }; + const host: util.ISshHostInfo = util.isString(step.host) ? { hostName: step.host } : { hostName: step.host.hostName, user: step.host.user, port: step.host.port }; const jumpHosts: util.ISshHostInfo[] = step.host.jumpHosts; let files: vscode.Uri[] = []; if (util.isString(step.files)) { @@ -1061,7 +1061,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv logger.getOutputChannelLogger().showErrorMessage(localize('missing.properties.ssh', '"host" and "command" are required for ssh steps.')); return false; } - const host: util.ISshHostInfo = { hostName: step.host.hostName, user: step.host.user, port: step.host.port }; + const host: util.ISshHostInfo = util.isString(step.host) ? { hostName: step.host } : { hostName: step.host.hostName, user: step.host.user, port: step.host.port }; const jumpHosts: util.ISshHostInfo[] = step.host.jumpHosts; const localForwards: util.ISshLocalForwardInfo[] = step.host.localForwards; const continueOn: string = step.continueOn; diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index e51c5e3d61..3d6290d7cb 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -11,11 +11,22 @@ import { DebugConfigurationProvider, ConfigurationAssetProviderFactory, Configur import { CppdbgDebugAdapterDescriptorFactory, CppvsdbgDebugAdapterDescriptorFactory } from './debugAdapterDescriptorFactory'; import { DebuggerType } from './configurations'; import * as nls from 'vscode-nls'; +import { getActiveSshTarget, initializeSshTargets, selectSshTarget, SshTargetsProvider } from '../SSH/TargetsView/sshTargetsProvider'; +import { addSshTarget, BaseNode, refreshCppSshTargetsView } from '../SSH/TargetsView/common'; +import { setActiveSshTarget, TargetLeafNode } from '../SSH/TargetsView/targetNodes'; +import { sshCommandToConfig } from '../SSH/sshCommandToConfig'; +import { getSshConfiguration, getSshConfigurationFiles, writeSshConfiguration } from '../SSH/sshHosts'; +import { pathAccessible } from '../common'; +import * as fs from 'fs'; +import { Configuration } from 'ssh-config'; +import * as chokidar from 'chokidar'; // The extension deactivate method is asynchronous, so we handle the disposables ourselves instead of using extensionContext.subscriptions. const disposables: vscode.Disposable[] = []; const localize: nls.LocalizeFunc = nls.loadMessageBundle(); +const fileWatchers: chokidar.FSWatcher[] = []; + export async function initialize(context: vscode.ExtensionContext): Promise { // Activate Process Picker Commands const attachItemsProvider: AttachItemsProvider = NativeAttachItemsProviderFactory.Get(); @@ -64,9 +75,87 @@ export async function initialize(context: vscode.ExtensionContext): Promise sshTargetsProvider.refresh(node))); + disposables.push(vscode.commands.registerCommand('C_Cpp.setActiveSshTarget', async (node: TargetLeafNode) => { + await setActiveSshTarget(node.name); + await vscode.commands.executeCommand(refreshCppSshTargetsView); + })); + disposables.push(vscode.commands.registerCommand('C_Cpp.selectSshTarget', selectSshTarget)); + disposables.push(vscode.commands.registerCommand('C_Cpp.selectActiveSshTarget', async () => { + const name: string | undefined = await selectSshTarget(); + if (name) { + await setActiveSshTarget(name); + await vscode.commands.executeCommand(refreshCppSshTargetsView); + } + })); + disposables.push(vscode.commands.registerCommand('C_Cpp.activeSshTarget', getActiveSshTarget)); + disposables.push(sshTargetsProvider); + for (const sshConfig of getSshConfigurationFiles()) { + fileWatchers.push(chokidar.watch(sshConfig, {ignoreInitial: true}) + .on('add', () => vscode.commands.executeCommand(refreshCppSshTargetsView)) + .on('change', () => vscode.commands.executeCommand(refreshCppSshTargetsView)) + .on('unlink', () => vscode.commands.executeCommand(refreshCppSshTargetsView))); + } + vscode.commands.executeCommand('setContext', 'showCppSshTargetsView', true); } export function dispose(): void { + // Don't wait + fileWatchers.forEach(watcher => watcher.close().then(() => {}, () => {})); disposables.forEach(d => d.dispose()); } + +async function addSshTargetImpl(): Promise { + const name: string | undefined = await vscode.window.showInputBox({ + title: localize('enter.ssh.target.name', 'Enter SSH Target Name'), + placeHolder: localize('ssh.target.name.place.holder', 'Example: `mySSHTarget`'), + ignoreFocusOut: true + }); + if (name === undefined) { + // Cancelled + return ''; + } + + const command: string | undefined = await vscode.window.showInputBox({ + title: localize('enter.ssh.connection.command', 'Enter SSH Connection Command'), + placeHolder: localize('ssh.connection.command.place.holder', 'Example: `ssh hello@microsoft.com -A`'), + ignoreFocusOut: true + }); + if (!command) { + return ''; + } + + const newEntry: { [key: string]: string } = sshCommandToConfig(command, name); + + const targetFile: string | undefined = await vscode.window.showQuickPick(getSshConfigurationFiles().filter(file => pathAccessible(file, fs.constants.W_OK)), { title: localize('select.ssh.config.file', 'Select an SSH configuration file') }); + if (!targetFile) { + return ''; + } + + const parsedSshConfig: Configuration = await getSshConfiguration(targetFile, false); + parsedSshConfig.prepend(newEntry, true); + await writeSshConfiguration(targetFile, parsedSshConfig); + + return name; +} + +async function removeSshTargetImpl(node: TargetLeafNode): Promise { + const labelYes: string = localize('yes', 'Yes'); + const labelNo: string = localize('no', 'No'); + const confirm: string | undefined = await vscode.window.showInformationMessage(localize('ssh.target.delete.confirmation', 'Are you sure you want to permanamtly delete "{0}"?', node.name), labelYes, labelNo); + if (!confirm || confirm === labelNo) { + return false; + } + + const parsedSshConfig: Configuration = await getSshConfiguration(node.sshConfigHostInfo.file, false); + parsedSshConfig.remove({ Host: node.name }); + await writeSshConfiguration(node.sshConfigHostInfo.file, parsedSshConfig); + + return true; +} diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index e6cef52cf6..5b655ce153 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -26,7 +26,6 @@ import * as yauzl from 'yauzl'; import { Readable } from 'stream'; import * as nls from 'vscode-nls'; import { CppBuildTaskProvider } from './cppBuildTaskProvider'; -import { UpdateInsidersAccess } from '../main'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -1023,3 +1022,42 @@ export function getClients(): ClientCollection { export function getActiveClient(): Client { return clients.ActiveClient; } + +export function UpdateInsidersAccess(): void { + let installPrerelease: boolean = false; + + // Only move them to the new prerelease mechanism if using updateChannel of Insiders. + const settings: CppSettings = new CppSettings(); + const migratedInsiders: PersistentState = new PersistentState("CPP.migratedInsiders", false); + if (settings.updateChannel === "Insiders") { + // Don't do anything while the user has autoUpdate disabled, so we do not cause the extension to be updated. + if (!migratedInsiders.Value && vscode.workspace.getConfiguration("extensions", null).get("autoUpdate")) { + installPrerelease = true; + migratedInsiders.Value = true; + } + } else { + // Reset persistent value, so we register again if they switch to "Insiders" again. + if (migratedInsiders.Value) { + migratedInsiders.Value = false; + } + } + + // Mitigate an issue with VS Code not recognizing a programmatically installed VSIX as Prerelease. + // If using VS Code Insiders, and updateChannel is not explicitly set, default to Prerelease. + // Only do this once. If the user manually switches to Release, we don't want to switch them back to Prerelease again. + if (util.isVsCodeInsiders()) { + const insidersMitigationDone: PersistentState = new PersistentState("CPP.insidersMitigationDone", false); + if (!insidersMitigationDone.Value) { + if (vscode.workspace.getConfiguration("extensions", null).get("autoUpdate")) { + if (settings.getWithUndefinedDefault("updateChannel") === undefined) { + installPrerelease = true; + } + } + insidersMitigationDone.Value = true; + } + } + + if (installPrerelease) { + vscode.commands.executeCommand("workbench.extensions.installExtension", "ms-vscode.cpptools", { installPreReleaseVersion: true }); + } +} diff --git a/Extension/src/SSH/TargetsView/common.ts b/Extension/src/SSH/TargetsView/common.ts new file mode 100644 index 0000000000..ab9aff5560 --- /dev/null +++ b/Extension/src/SSH/TargetsView/common.ts @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import * as vscode from 'vscode'; + +/** + * Base class of nodes in all tree nodes + */ +export interface BaseNode { + /** + * Get the child nodes of this node + */ + getChildren(): Promise; + + /** + * Get the vscode.TreeItem associated with this node + */ + getTreeItem(): Promise; +} + +export class LabelLeafNode implements BaseNode { + constructor(private readonly label: string) { /* blank */ } + + async getChildren(): Promise { + return []; + } + + getTreeItem(): Promise { + return Promise.resolve(new vscode.TreeItem(this.getLabel(), vscode.TreeItemCollapsibleState.None)); + } + + getLabel(): string { + return this.label; + } +} + +export const refreshCppSshTargetsView: string = 'C_Cpp.refreshCppSshTargetsView'; +export const addSshTarget: string = 'C_Cpp.addSshTarget'; diff --git a/Extension/src/SSH/TargetsView/sshTargetsProvider.ts b/Extension/src/SSH/TargetsView/sshTargetsProvider.ts new file mode 100644 index 0000000000..9f9291ca2f --- /dev/null +++ b/Extension/src/SSH/TargetsView/sshTargetsProvider.ts @@ -0,0 +1,119 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { getSshConfigHostInfos } from '../sshHosts'; +import * as vscode from 'vscode'; +import { addSshTarget, BaseNode, LabelLeafNode, refreshCppSshTargetsView } from './common'; +import { TargetLeafNode, filesWritable, setActiveSshTarget, _activeTarget, workspaceState_activeSshTarget } from './targetNodes'; +import { extensionContext, ISshConfigHostInfo } from '../../common'; +import * as nls from 'vscode-nls'; + +nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); +const localize: nls.LocalizeFunc = nls.loadMessageBundle(); + +let _targets: Map = new Map(); + +export class SshTargetsProvider implements vscode.TreeDataProvider, vscode.Disposable { + private readonly _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); + + public get onDidChangeTreeData(): vscode.Event { + return this._onDidChangeTreeData.event; + } + + async getChildren(node?: BaseNode): Promise { + if (node) { + return node.getChildren(); + } + + const children: BaseNode[] = await this.getTargets(); + if (children.length === 0) { + return [new LabelLeafNode(localize('no.ssh.targets', 'No SSH targets'))]; + } + + return children; + } + + getTreeItem(node: BaseNode): Promise { + return node.getTreeItem(); + } + + refresh(node?: BaseNode): void { + this._onDidChangeTreeData.fire(node); + } + + dispose(): void { + this._onDidChangeTreeData.dispose(); + } + + private async getTargets(): Promise { + filesWritable.clear(); + _targets = await getSshConfigHostInfos(); + const targetNodes: BaseNode[] = []; + // Currently, the best place to check if a connection is removed is during refresh, since the active target could be removed + // by editing the SSH config file directly. If we see any performance issue in the future, we can move this to removeSshTargetImpl, + // and the file watchers. + let activeTargetRemoved: boolean = true; + const cachedActiveTarget: string | undefined = await getActiveSshTarget(false); + for (const host of Array.from(_targets.keys())) { + const sshConfigHostInfo: ISshConfigHostInfo | undefined = _targets.get(host); + if (sshConfigHostInfo) { + targetNodes.push(new TargetLeafNode(host, sshConfigHostInfo)); + if (host === cachedActiveTarget) { + activeTargetRemoved = false; + } + } + } + if (activeTargetRemoved) { + setActiveSshTarget(undefined); + } + return targetNodes; + } +} + +export async function initializeSshTargets(): Promise { + _targets = await getSshConfigHostInfos(); + let activeTargetRemoved: boolean = true; + const cachedActiveTarget: string | undefined = await getActiveSshTarget(false); + for (const host of Array.from(_targets.keys())) { + if (host === cachedActiveTarget) { + activeTargetRemoved = false; + } + } + if (activeTargetRemoved) { + setActiveSshTarget(undefined); + } + await setActiveSshTarget(extensionContext?.workspaceState.get(workspaceState_activeSshTarget)); +} + +export async function getActiveSshTarget(selectWhenNotSet: boolean = true): Promise { + if (_targets.size === 0 && !selectWhenNotSet) { + return undefined; + } + if (!_activeTarget && selectWhenNotSet) { + const name: string | undefined = await selectSshTarget(); + if (!name) { + throw Error(localize('active.ssh.target.selection.cancelled', 'Active SSH target selection cancelled.')); + } + await setActiveSshTarget(name); + await vscode.commands.executeCommand(refreshCppSshTargetsView); + } + return _activeTarget; +} + +const addNewSshTarget: string = localize('add.new.ssh.target', '{0} Add New SSH Target...', '$(plus)'); + +export async function selectSshTarget(): Promise { + const items: string[] = Array.from(_targets.keys()); + // Special item for adding SSH target + items.push(addNewSshTarget); + const selection: string | undefined = await vscode.window.showQuickPick(items, { title: localize('select.ssh.target', 'Select an SSH target') }); + if (!selection) { + return undefined; + } + if (selection === addNewSshTarget) { + return vscode.commands.executeCommand(addSshTarget); + } + return selection; +} diff --git a/Extension/src/SSH/TargetsView/targetNodes.ts b/Extension/src/SSH/TargetsView/targetNodes.ts new file mode 100644 index 0000000000..87a2b0f1bd --- /dev/null +++ b/Extension/src/SSH/TargetsView/targetNodes.ts @@ -0,0 +1,59 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { extensionContext, ISshConfigHostInfo, pathAccessible } from "../../common"; +import { TreeItem } from "vscode"; +import { LabelLeafNode } from "./common"; +import { constants } from 'fs'; +import * as nls from 'vscode-nls'; + +nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); +const localize: nls.LocalizeFunc = nls.loadMessageBundle(); + +export const workspaceState_activeSshTarget: string = 'workspaceState_activeSshTarget'; + +// File path => writable +// Cleared in SSH targets provider during refresh +export const filesWritable: Map = new Map(); +async function isWritable(file: string): Promise { + let cachedWritable: boolean | undefined = filesWritable.get(file); + if (cachedWritable === undefined) { + const writable: boolean = await pathAccessible(file, constants.W_OK); + filesWritable.set(file, writable); + cachedWritable = writable; + } + return cachedWritable; +} + +export class TargetLeafNode extends LabelLeafNode { + constructor(readonly name: string, readonly sshConfigHostInfo: ISshConfigHostInfo) { + super(name); + } + + async getTreeItem(): Promise { + const item: TreeItem = await super.getTreeItem(); + const removable: boolean = await isWritable(this.sshConfigHostInfo.file); + if (_activeTarget === this.name) { + item.description = localize('ssh.target.active.description', '[Active]'); + if (removable) { + item.contextValue = 'CppSshTargetsView.targetLeafRemovable'; + } + } else if (removable) { + item.contextValue = 'CppSshTargetsView.targetLeafRemovableCanSetActive'; + } else { + item.contextValue = 'CppSshTargetsView.targetLeafCanSetActive'; + } + return item; + } +} + +/** + * Should only be used in targetNodes.ts and sshTargetsProvider.ts + */ +export let _activeTarget: string | undefined; +export async function setActiveSshTarget(name: string | undefined): Promise { + _activeTarget = name; + await extensionContext?.workspaceState.update(workspaceState_activeSshTarget, name); +} diff --git a/Extension/src/SSH/commandInteractors.ts b/Extension/src/SSH/commandInteractors.ts index c2fd54cac5..fca593d47f 100644 --- a/Extension/src/SSH/commandInteractors.ts +++ b/Extension/src/SSH/commandInteractors.ts @@ -5,6 +5,11 @@ import * as vscode from 'vscode'; import { stripEscapeSequences, isWindows, escapeStringForRegex, ISshHostInfo, getFullHostAddress, extensionContext } from '../common'; +import { getOutputChannelLogger } from '../logger'; +import * as nls from 'vscode-nls'; + +nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); +const localize: nls.LocalizeFunc = nls.loadMessageBundle(); /** * The users that we autofilled their passwords. @@ -326,6 +331,25 @@ export class ContinueOnInteractor implements IInteractor { } } +export class ConnectionFailureInteractor implements IInteractor { + static ID = 'connectionFailure'; + + constructor(private readonly hostName: string) { } + + get id(): string { + return ConnectionFailureInteractor.ID; + } + + async onData(data: string): Promise { + const result: IInteraction = { postAction: 'keep' }; + if (data.includes('Connection refused') || data.includes('Could not resolve hostname')) { + result.postAction = 'consume'; + getOutputChannelLogger().showErrorMessage(localize('failed.to.connect', 'Failed to connect to {0}', this.hostName)); + } + return result; + } +} + export class ComposedInteractor implements IInteractor { constructor(private readonly interactors: IInteractor[]) { } diff --git a/Extension/src/SSH/sshCommandRunner.ts b/Extension/src/SSH/sshCommandRunner.ts index 54f237e05c..1bc85dff44 100644 --- a/Extension/src/SSH/sshCommandRunner.ts +++ b/Extension/src/SSH/sshCommandRunner.ts @@ -19,7 +19,8 @@ import { ContinueOnInteractor, ISystemInteractor, IInteraction, - autoFilledPasswordForUsers + autoFilledPasswordForUsers, + ConnectionFailureInteractor } from './commandInteractors'; import { isWindows, ISshHostInfo, splitLines, stripEscapeSequences, ProcessReturnType } from '../common'; import { getOutputChannelLogger } from '../logger'; @@ -203,7 +204,8 @@ export async function runSshTerminalCommandWithLogin( new DifferingHostKeyInteractor(showDifferingHostConfirmation), new PasswordInteractor(host, showPasswordInputBox), new TwoFacInteractor(showVerificationCodeInputBox), - new DuoTwoFacInteractor(showVerificationCodeInputBox) + new DuoTwoFacInteractor(showVerificationCodeInputBox), + new ConnectionFailureInteractor(host.hostName) ); } diff --git a/Extension/src/SSH/sshCommandToConfig.ts b/Extension/src/SSH/sshCommandToConfig.ts new file mode 100644 index 0000000000..20454414d7 --- /dev/null +++ b/Extension/src/SSH/sshCommandToConfig.ts @@ -0,0 +1,260 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { BasicParser, IParsedOption } from 'posix-getopt'; +import { parse } from 'shell-quote'; + +/** + * Mapping of flags to functions that add the relevant flag to the map of + * ssh_config entries. If the function takes a second argument, we'll parse + * a value for the flag and pass it in. + */ +const flags: { + [flag: string]: ((entries: { [key: string]: string }, value: string) => void) | null; +} = { + 1: entries => (entries.Protocol = '1'), + 2: entries => (entries.Protocol = '2'), + 4: entries => (entries.AddressFamily = 'inet'), + 6: entries => (entries.AddressFamily = 'inet6'), + A: entries => (entries.ForwardAgent = 'yes'), + b: (entries, address) => (entries.BindAddress = address), + C: entries => (entries.Compression = 'yes'), + c: (entries, cipher) => (entries.Cipher = cipher), + D: (entries, address) => (entries.DynamicForward = address), + // -e (escape code) is used as it's not useful for us and could mess with script execution + e: null, + // -F (config file) is irrelevant + F: null, + // -f (running in background) would interfere with execution + f: null, + g: entries => (entries.GatewayPorts = 'yes'), + I: (entries, device) => (entries.SmartcardDevice = device), + i: (entries, identity) => (entries.IdentityFile = identity), + J: (entries, address) => (entries.ProxyJump = address), + K: entries => (entries.GSSAPIAuthentication = 'yes'), + k: entries => (entries.GSSAPIDelegateCredentials = 'no'), + L: (entries, args) => { + /** + * For the cases of: + * 1. [bind_address:]port:host:hostport + * 2. [bind_address:]port:remote_socket + */ + const parsedArgs: RegExpMatchArray | null = args.match(/^((.*):?\d+)?:(.+?)?$/); + if (parsedArgs) { + const [, listen, , destination] = parsedArgs; + if (listen && destination) { + entries.LocalForward = `${listen} ${destination}`; + return; + } else { + throw new CommandParseError( + `LocalFoward needs a listener and a destination separate by a colon. ${args} does not match.` + ); + } + } + + /** + * For the cases of: + * 1. local_socket:host:hostport + * 2. local_socket:remote_socket + */ + + const delimiter: number = args.indexOf(':'); + if (delimiter === -1) { + throw new CommandParseError( + `LocalFoward needs a listener and a destination separate by a colon. ${args} does not match.` + ); + } + + entries.LocalForward = `${args.substring(0, delimiter)} ${args.substring(delimiter + 1)}`; + }, + l: (entries, user) => (entries.User = user), + M: entries => (entries.ControlMaster = 'yes'), + m: (entries, specs) => (entries.MACs = specs), + // -N (don't execute remote command) would interfere with execution + N: null, + // -n (redirect stdin) would interfere with execution + n: null, + o: (entries, option) => { + // Option keys never have equals signs in them, always fine to split the first + const delimiter: number = option.indexOf('='); + if (delimiter === -1) { + // `ssh` also fails if missing an argument (doesn't default to "yes", or anything) + throw new CommandParseError(`Argument missing for option ${option}`); + } + + entries[option.slice(0, delimiter)] = option.slice(delimiter + 1); + }, + p: (entries, port) => (entries.Port = port), + // -q (quiet mode) not useful for us + q: null, + R: (entries, address) => (entries.RemoteForward = address), + S: (entries, path) => (entries.ControlPath = path), + // -s (remote subsystem invokation), no setting in the config for this + s: null, + // -T (disable pseudo tty), no setting in the config for this + T: null, + // -t (enable pseudo tty), no setting in the config for this + t: null, + // -V (display the version) not relevant for us + V: null, + v: entries => (entries.LogLevel = 'verbose'), + W: (entries, address) => (entries.RemoteForward = address), + w: (entries, value) => (entries.TunnelDevice = value), + X: entries => (entries.ForwardX11 = 'yes'), + x: entries => (entries.ForwardX11 = 'no'), + Y: entries => (entries.ForwardX11Trusted = 'yes'), + // output logging + y: null +}; + +/** + * Directive passed to getopt(). From OpenSSH + * @see https://github.com/openssh/openssh-portable/blob/e3b6c966b79c3ea5d51b923c3bbdc41e13b96ea0/ssh.c#L662 + */ +const getOptDirective: string = '1246ab:c:e:fgi:kl:m:no:p:qstvxAB:CD:E:F:GI:J:KL:MNO:PQ:R:S:TVw:W:XYy'; + +/** + * Error thrown from sshCommandToConfig if the command could not be parsed. + */ +export class CommandParseError extends Error { } + +/** + * Attempts to convert an SSH command to an SSH config entry. + */ +export function sshCommandToConfig(command: string, name?: string): { [key: string]: string } { + const parts: string[] = parse(command) as string[]; + + // ignore 'ssh' if the user entered that as their first word + if (parts[0] === 'ssh') { + parts.shift(); + } + + // Once again following what OpenSSH does internally. libc getopt, and our library + // here, stop when they reach the end of the flags. When that happens we pull + // out the host if we can, and restart it to try to read any remaining flags. + const entries: { [key: string]: string } = {}; + for (let offset: number = 0; offset < parts.length; offset++) { + offset += parseFlags(parts.slice(offset), entries); + + // Only parse the first positional/non-flag argument. The SSH command + // line allows trailing arguments as commands to execute, but we + // don't care about those here. + if (offset < parts.length && !entries.Host) { + const { hostname, port, username } = parseConnectionString(parts[offset]); + entries.Host = name || hostname; + entries.HostName = hostname; + + // In OpenSSH, provided flags take precedence over options in the connection string: + if (!entries.Port && port) { + entries.Port = port; + } + if (!entries.User && username) { + entries.User = username; + } + } + } + + if (!entries.Host) { + throw new CommandParseError('Missing host in SSH connection string'); + } + + // ssh-config requires that the "Host" be the first key in the object + // in order to nest things correctly. Rewrite the object so that + // this is the case. + const { Host, HostName, ...options } = entries; + return { Host, HostName, ...options }; +} + +/** + * Parses flags from the given array of arguments, returning the index of the + * next non-flag in the input (or the total length of the input if none are found). + */ +function parseFlags(input: string[], entries: { [key: string]: string }): number { + // prefix with `:` to tell the library not to log anything itself + const parser: BasicParser = new BasicParser(`:${getOptDirective}`, input, 0); + + while (true) { + const next: void | IParsedOption = parser.getopt(); + if (!next) { + break; + } + + if (next.option === ':') { + throw new CommandParseError(`Expected flag -${next.optopt} to have an argument but it did not`); + } + + if (next.option === '?') { + throw new CommandParseError(`Unknown flag ${next.optopt}`); + } + + const resolver: ((entries: { [key: string]: string }, value: string) => void) | null = flags[next.option]; + if (!resolver) { + continue; // known but ignored flag + } + + resolver(entries, next.optarg); + } + + return parser.optind(); +} + +/** + * Parses the SSH connection address. This behaves like OpenSSH and for the + * sake of parity (and simplicity) also emulates some of its quirks. + * + * The SSH source[1] is relatively simple. First, we try to parse the string as + * a fully-qualified URI. The URL module helps with that. If that works and + * the protocol is `ssh://`, roll with that. + * + * Failing this, we split the host after the last "@" symbol--hostnames cannot + * include @ signs, and trying to include one on the OpenSSH command line fails + * (ssh hello@"example@addr" -> Could not resolve hostname addr). Interestingly, + * OpenSSH doesn't support the `address:port` syntax, so neither do we, + * although eliding parity for this scenario may make sense. + * + * The SSH URI spec allows for additional connection parameters[2], but these + * are not mentioned on the ssh(1) man page and don't seem to have use in the + * wild. In the OpenSSH source, they appear to be ignored[3]. + * + * The `shell-quote` library, like libc does for OpenSSH, takes care of dealing + * with quotations for for us. + * + * 1. https://github.com/openssh/openssh-portable/blob/e3b6c966b79c3ea5d51b923c3bbdc41e13b96ea0/ssh.c#L999 + * 2. https://tools.ietf.org/html/draft-ietf-secsh-scp-sftp-ssh-uri-04#section-3.3 + * 3. https://github.com/openssh/openssh-portable/blob/master///misc.c#L875-L877 + */ +function parseConnectionString(str: string): { hostname: string; port?: string; username?: string } { + let url: URL | void; + try { + url = new URL(str); + } catch { + // ignored + } + + // It may seem a little odd, but the handling within OpenSSH is to fall + // back to the splitting method (rather than erroring) if the wrong protocol + // is provided. Do the same here for parity's sake. + // https://github.com/openssh/openssh-portable/blob/e3b6c966b79c3ea5d51b923c3bbdc41e13b96ea0/misc.c#L854-L855 + if (url && url.protocol === 'ssh:') { + return url; + } + + // Manual splitting algorithm, augmented with the ability to remove the password: + // https://github.com/openssh/openssh-portable/blob/e3b6c966b79c3ea5d51b923c3bbdc41e13b96ea0/ssh.c#L1016-L1030 + const hostDelimiter: number = str.lastIndexOf('@'); + if (hostDelimiter === -1) { + return { hostname: str }; + } + + const hostname: string = str.slice(hostDelimiter + 1); + let username: string = str.slice(0, hostDelimiter); + + const passwordDelimiter: number = username.indexOf(':'); + if (passwordDelimiter !== -1) { + username = username.slice(0, passwordDelimiter); + } + + return { hostname, username }; +} diff --git a/Extension/src/SSH/sshHosts.ts b/Extension/src/SSH/sshHosts.ts new file mode 100644 index 0000000000..dda4303ed8 --- /dev/null +++ b/Extension/src/SSH/sshHosts.ts @@ -0,0 +1,216 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { promises as fs } from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import { + Configuration, + parse, + ResolvedConfiguration, + Type as ConfigurationEntryType, + ConfigurationDirective, + ConfigurationEntry, + HostConfigurationDirective +} from 'ssh-config'; +import { promisify } from 'util'; +import { ISshConfigHostInfo, ISshHostInfo, isWindows, resolveHome } from "../common"; +import { getOutputChannelLogger } from '../logger'; +import * as glob from 'glob'; +import * as vscode from 'vscode'; +import * as nls from 'vscode-nls'; + +nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); +const localize: nls.LocalizeFunc = nls.loadMessageBundle(); + +const globAsync: (pattern: string, options?: glob.IOptions | undefined) => Promise = promisify(glob); + +const userSshConfigurationFile: string = path.resolve(os.homedir(), '.ssh/config'); + +const ProgramData: string = process.env.ALLUSERSPROFILE || process.env.PROGRAMDATA || 'C:\\ProgramData'; +const systemSshConfigurationFile: string = isWindows() ? `${ProgramData}\\ssh\\ssh_config` : '/etc/ssh/ssh_config'; + +export function getSshConfigurationFiles(): string[] { + return [userSshConfigurationFile, systemSshConfigurationFile]; +} + +// Map: host -> info +export async function getSshConfigHostInfos(): Promise> { + const hostInfos: Map = new Map(); + + for (const configPath of getSshConfigurationFiles()) { + const config: Configuration = await getSshConfiguration(configPath); + const hosts: { [host: string]: string } = extractHostNames(config); + Object.keys(hosts).forEach(name => (hostInfos.set(name, { hostName: hosts[name], file: configPath }))); + } + + return hostInfos; +} + +function extractHostNames(parsedConfig: Configuration): { [host: string]: string } { + const hostNames: { [host: string]: string } = Object.create(null); + + extractHosts(parsedConfig).forEach(host => { + const resolvedConfig: ResolvedConfiguration = parsedConfig.compute(host); + if (resolvedConfig.HostName) { + hostNames[host] = resolvedConfig.HostName; + } else { + hostNames[host] = host; + } + }); + + return hostNames; +} + +export async function getConfigurationForHost(host: ISshHostInfo): Promise { + return getConfigurationForHostImpl(host, getSshConfigurationFiles()); +} + +export async function getConfigurationForHostImpl( + host: ISshHostInfo, + configPaths: string[] +): Promise { + for (const configPath of configPaths) { + const configuration: Configuration = await getSshConfiguration(configPath); + const config: ResolvedConfiguration = configuration.compute(host.hostName); + + if (!config || !config.HostName) { + // No real matching config was found + continue; + } + + if (config.IdentityFile) { + config.IdentityFile = config.IdentityFile.map(resolveHome); + } + + return config; + } + + return null; +} + +/** + * Gets parsed SSH configuration from file. Resolves Include directives as well unless specified otherwise. + * @param configurationPath the location of the config file + * @param resolveIncludes by default this is set to true + * @returns + */ +export async function getSshConfiguration(configurationPath: string, resolveIncludes: boolean = true): Promise { + const src: string = await getSshConfigSource(configurationPath); + const config: Configuration = caseNormalizeConfigProps(parse(src)); + if (resolveIncludes) { + await resolveConfigIncludes(config, configurationPath); + } + return config; +} + +async function resolveConfigIncludes(config: Configuration, configPath: string): Promise { + for (const entry of config) { + if (isDirective(entry) && entry.param === 'Include') { + let includePath: string = resolveHome(entry.value); + if (isWindows() && !!includePath.match(/^\/[a-z]:/i)) { + includePath = includePath.substr(1); + } + + if (!path.isAbsolute(includePath)) { + includePath = path.resolve(path.dirname(configPath), includePath); + } + + const pathsToGetFilesFrom: string[] = await globAsync(includePath); + + for (const filePath of pathsToGetFilesFrom) { + await getIncludedConfigFile(config, filePath); + } + } + } +} + +async function getIncludedConfigFile(config: Configuration, includePath: string): Promise { + try { + const includedContents: string = (await fs.readFile(includePath)).toString(); + const parsed: Configuration = parse(includedContents); + config.push(...parsed); + } catch (e) { + getOutputChannelLogger().appendLine(localize("failed.to.read.file", "Failed to read file {0}.", includePath)); + } +} + +export async function writeSshConfiguration(configurationPath: string, configuration: Configuration): Promise { + configurationPath = resolveHome(configurationPath); + try { + await vscode.workspace.fs.createDirectory(vscode.Uri.file(path.dirname(configurationPath))); + await fs.writeFile(configurationPath, configuration.toString()); + } catch (e) { + getOutputChannelLogger().appendLine(localize("failed.to.write.file", "Failed to write to file {0}.", configurationPath)); + } +} + +async function getSshConfigSource(configurationPath: string): Promise { + configurationPath = resolveHome(configurationPath); + try { + const buffer: Buffer = await fs.readFile(configurationPath); + return buffer.toString('utf8'); + } catch (e) { + getOutputChannelLogger().appendLine(localize("failed.to.read.file", "Failed to read file {0}.", configurationPath)); + } + + return ''; +} + +function isDirective(c: ConfigurationEntry): c is ConfigurationDirective { + return c.type === ConfigurationEntryType.Directive; +} + +function isHostDirective(c: ConfigurationEntry | HostConfigurationDirective): c is HostConfigurationDirective { + return isDirective(c) && c.param === 'Host' && !!c.value && !!(c as HostConfigurationDirective).config; +} + +/** + * List of props that we care about and should be case-normalized, should match ResolvedConfiguration type + */ +const CASE_NORMALIZED_PROPS: Map = new Map([ + ['host', 'Host'], + ['hostname', 'HostName'], + ['identityfile', 'IdentityFile'], + ['user', 'User'], + ['port', 'Port'], + ['connecttimeout', 'ConnectTimeout'], + ['remotecommand', 'RemoteCommand'], + ['localforward', 'LocalForward'] +]); +function caseNormalizeConfigProps(config: Configuration): Configuration { + const caseNormalizeDirective: (entry: { param: string }) => void = + (entry: { param: string }) => entry.param = CASE_NORMALIZED_PROPS.get(entry.param.toLowerCase()) || entry.param; + + config.filter(isDirective).forEach(entry => { + caseNormalizeDirective(entry); + + // Only two levels deep + if (isHostDirective(entry)) { + entry.config.filter(isDirective).forEach(caseNormalizeDirective); + } + }); + + return config; +} + +function extractHosts(parsedConfig: Configuration): string[] { + const hosts: Set = new Set(); + parsedConfig.filter(isHostDirective).forEach(c => { + getHostsFromHostConfig(c.value).forEach(h => hosts.add(h)); + }); + + return Array.from(hosts.keys()); +} + +function getHostsFromHostConfig(hostValue: string | string[]): string[] { + const hosts: string[] = Array.isArray(hostValue) ? hostValue : [hostValue]; + + return hosts.filter(h => !containsWildcard(h) && !h.match(/^\s*$/) && !h.match(/^!/)); +} + +function containsWildcard(str: string): boolean { + return !!str.match(/[?*]/); +} diff --git a/Extension/src/common.ts b/Extension/src/common.ts index 83e788270a..a0980fdc94 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -16,7 +16,6 @@ import * as tmp from 'tmp'; import * as nls from 'vscode-nls'; import * as jsonc from 'comment-json'; import { TargetPopulation } from 'vscode-tas-client'; -import { CppSettings } from './LanguageServer/settings'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -349,7 +348,7 @@ export function resolveVariables(input: string | undefined, additionalEnvironmen } // Replace environment and configuration variables. - let regexp: () => RegExp = () => /\$\{((env|config|workspaceFolder|file|fileDirname|fileBasenameNoExtension|execPath|pathSeparator)(\.|:))?(.*?)\}/g; + const regexp: () => RegExp = () => /\$\{((env|config|workspaceFolder|file|fileDirname|fileBasenameNoExtension|execPath|pathSeparator)(\.|:))?(.*?)\}/g; let ret: string = input; const cycleCache: Set = new Set(); while (!cycleCache.has(ret)) { @@ -407,11 +406,12 @@ export function resolveVariables(input: string | undefined, additionalEnvironmen }); } - // Resolve '~' at the start of the path. - regexp = () => /^\~/g; - ret = ret.replace(regexp(), (match: string, name: string) => os.homedir()); + return resolveHome(ret); +} - return ret; +// Resolve '~' at the start of the path. +export function resolveHome(filePath: string): string { + return filePath.replace(/^\~/g, (match: string, name: string) => os.homedir()); } export function asFolder(uri: vscode.Uri): string { @@ -439,17 +439,25 @@ export function getDebugAdaptersPath(file: string): string { return path.resolve(getExtensionFilePath("debugAdapters"), file); } +export async function fsStat(filePath: fs.PathLike): Promise { + let stats: fs.Stats | undefined; + try { + stats = await fs.promises.stat(filePath); + } catch (e) { + // File doesn't exist + return undefined; + } + return stats; +} + +export async function checkPathExists(filePath: string): Promise { + return !!(await fsStat(filePath)); +} + /** Test whether a file exists */ -export function checkFileExists(filePath: string): Promise { - return new Promise((resolve, reject) => { - fs.stat(filePath, (err, stats) => { - if (stats && stats.isFile()) { - resolve(true); - } else { - resolve(false); - } - }); - }); +export async function checkFileExists(filePath: string): Promise { + const stats: fs.Stats | undefined = await fsStat(filePath); + return !!stats && stats.isFile(); } /** Test whether a file exists */ @@ -478,16 +486,9 @@ export async function checkExecutableWithoutExtensionExists(filePath: string): P } /** Test whether a directory exists */ -export function checkDirectoryExists(dirPath: string): Promise { - return new Promise((resolve, reject) => { - fs.stat(dirPath, (err, stats) => { - if (stats && stats.isDirectory()) { - resolve(true); - } else { - resolve(false); - } - }); - }); +export async function checkDirectoryExists(dirPath: string): Promise { + const stats: fs.Stats | undefined = await fsStat(dirPath); + return !!stats && stats.isDirectory(); } export function createDirIfNotExistsSync(filePath: string | undefined): void { @@ -692,8 +693,10 @@ export interface ProcessReturnType { export async function spawnChildProcess(program: string, args: string[] = [], continueOn?: string, cancellationToken?: vscode.CancellationToken): Promise { const programOutput: ProcessOutput = await spawnChildProcessImpl(program, args, continueOn, cancellationToken); const exitCode: number | NodeJS.Signals | undefined = programOutput.exitCode; - const settings: CppSettings = new CppSettings(); - if (settings.loggingLevel === "Information" || settings.loggingLevel === "Debug") { + // Do not use CppSettings to avoid circular require() + const settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", null); + const loggingLevel: string | undefined = settings.get("loggingLevel"); + if (loggingLevel === "Information" || loggingLevel === "Debug") { getOutputChannelLogger().appendLine(`$ ${program} ${args.join(' ')}\n${programOutput.stderr || programOutput.stdout}\n`); } if (programOutput.exitCode) { @@ -764,16 +767,16 @@ async function spawnChildProcessImpl(program: string, args: string[], continueOn }); } +/** + * @param permission fs file access constants: https://nodejs.org/api/fs.html#file-access-constants + */ +export function pathAccessible(filePath: string, permission: number = fs.constants.F_OK): Promise { + if (!filePath) { return Promise.resolve(false); } + return new Promise(resolve => fs.access(filePath, permission, err => resolve(!err))); +} + export function isExecutable(file: string): Promise { - return new Promise((resolve) => { - fs.access(file, fs.constants.X_OK, (err) => { - if (err) { - resolve(false); - } else { - resolve(true); - } - }); - }); + return pathAccessible(file, fs.constants.X_OK); } export async function allowExecution(file: string): Promise { @@ -1386,6 +1389,10 @@ export interface ISshHostInfo { port?: number | string; } +export interface ISshConfigHostInfo extends ISshHostInfo { + file: string; +} + /** user@host */ export function getFullHostAddressNoPort(host: ISshHostInfo): string { return host.user ? `${host.user}@${host.hostName}` : `${host.hostName}`; diff --git a/Extension/src/logger.ts b/Extension/src/logger.ts index 9ed239c086..5ef97622c7 100644 --- a/Extension/src/logger.ts +++ b/Extension/src/logger.ts @@ -6,7 +6,6 @@ import * as vscode from 'vscode'; import * as os from 'os'; -import { CppSettings } from './LanguageServer/settings'; import { CppSourceStr } from './LanguageServer/extension'; import * as nls from 'vscode-nls'; import { getLocalizedString, LocalizeStringParams } from './LanguageServer/localization'; @@ -80,8 +79,9 @@ export let warningChannel: vscode.OutputChannel | undefined; export function getOutputChannel(): vscode.OutputChannel { if (!outputChannel) { outputChannel = vscode.window.createOutputChannel(CppSourceStr); - const settings: CppSettings = new CppSettings(); - const loggingLevel: string | undefined = settings.loggingLevel; + // Do not use CppSettings to avoid circular require() + const settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", null); + const loggingLevel: string | undefined = settings.get("loggingLevel"); if (!!loggingLevel && loggingLevel !== "None" && loggingLevel !== "Error") { outputChannel.appendLine(`loggingLevel: ${loggingLevel}`); } diff --git a/Extension/src/main.ts b/Extension/src/main.ts index 6c46663b4d..eae1302b05 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -55,7 +55,7 @@ export async function activate(context: vscode.ExtensionContext): Promise 0) ? vscode.workspace.workspaceFolders[0]?.uri : undefined); let isOldMacOs: boolean = false; @@ -214,45 +214,6 @@ function sendTelemetry(info: PlatformInformation): void { Telemetry.logDebuggerEvent("acquisition", telemetryProperties); } -export function UpdateInsidersAccess(): void { - let installPrerelease: boolean = false; - - // Only move them to the new prerelease mechanism if using updateChannel of Insiders. - const settings: CppSettings = new CppSettings(); - const migratedInsiders: PersistentState = new PersistentState("CPP.migratedInsiders", false); - if (settings.updateChannel === "Insiders") { - // Don't do anything while the user has autoUpdate disabled, so we do not cause the extension to be updated. - if (!migratedInsiders.Value && vscode.workspace.getConfiguration("extensions", null).get("autoUpdate")) { - installPrerelease = true; - migratedInsiders.Value = true; - } - } else { - // Reset persistent value, so we register again if they switch to "Insiders" again. - if (migratedInsiders.Value) { - migratedInsiders.Value = false; - } - } - - // Mitigate an issue with VS Code not recognizing a programmatically installed VSIX as Prerelease. - // If using VS Code Insiders, and updateChannel is not explicitly set, default to Prerelease. - // Only do this once. If the user manually switches to Release, we don't want to switch them back to Prerelease again. - if (util.isVsCodeInsiders()) { - const insidersMitigationDone: PersistentState = new PersistentState("CPP.insidersMitigationDone", false); - if (!insidersMitigationDone.Value) { - if (vscode.workspace.getConfiguration("extensions", null).get("autoUpdate")) { - if (settings.getWithUndefinedDefault("updateChannel") === undefined) { - installPrerelease = true; - } - } - insidersMitigationDone.Value = true; - } - } - - if (installPrerelease) { - vscode.commands.executeCommand("workbench.extensions.installExtension", "ms-vscode.cpptools", { installPreReleaseVersion: true }); - } -} - async function checkVsixCompatibility(): Promise { const ignoreMismatchedCompatibleVsix: PersistentState = new PersistentState("CPP." + util.packageJson.version + ".ignoreMismatchedCompatibleVsix", false); let resetIgnoreMismatchedCompatibleVsix: boolean = true; diff --git a/Extension/src/types/posix-getopt.d.ts b/Extension/src/types/posix-getopt.d.ts new file mode 100644 index 0000000000..82463dd496 --- /dev/null +++ b/Extension/src/types/posix-getopt.d.ts @@ -0,0 +1,19 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +declare module 'posix-getopt' { + export interface IParsedOption { + error: boolean; + option: string; + optarg: string; + optopt?: string; + } + + export class BasicParser { + constructor(template: string, arguments: ReadonlyArray, skipArgs?: number); + getopt(): IParsedOption | void; + optind(): number; + } +} diff --git a/Extension/src/types/ssh-config.d.ts b/Extension/src/types/ssh-config.d.ts new file mode 100644 index 0000000000..f9a50374de --- /dev/null +++ b/Extension/src/types/ssh-config.d.ts @@ -0,0 +1,81 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +declare module 'ssh-config' { + export type LeafConfigurationEntry = ConfigurationDirective | ConfigurationComment; + export type ConfigurationEntry = HostConfigurationDirective | LeafConfigurationEntry; + + export const enum Type { + Directive = 1, + Comment = 2, + } + + export interface Configuration extends Array { + compute(host: string): ResolvedConfiguration; + + /** + * Appends a map of parameters to values. If "Host" is included + * as one of the keys, all subsequent keys will be nested under + * that host entry. + */ + append(options: { [key: string]: string }): void; + + /** + * Prepends a map of parameters to values. If "Host" is included + * as one of the keys, all subsequent keys will be nested under + * that host entry. + */ + prepend(options: { [key: string]: string }, beforeFirstSection: boolean): void; + + /** + * Removes section by Host or other criteria. + */ + remove(options: { [key: string]: string }): void; + + /** + * Prints the properly formatted configuration. + */ + toString(): string; + } + + /** + * Should match CASE_NORMALIZED_PROPS to be normalized to this casing + */ + export interface ResolvedConfiguration { + Host: string; + HostName: string; + IdentityFile?: string[]; + User?: string; + Port?: string; + ConnectTimeout?: string; + RemoteCommand?: string; + LocalForward?: string[]; + AddressFamily?: string; + } + + export interface BaseConfigurationDirective { + type: Type.Directive; + param: string; + value: string | string[]; + } + + export interface ConfigurationDirective extends BaseConfigurationDirective { + value: string; + } + + export interface HostConfigurationDirective extends BaseConfigurationDirective { + param: 'Host'; + config: LeafConfigurationEntry[]; + } + + export interface ConfigurationComment { + type: Type.Comment; + content: string; + } + + export function parse(raw: string): Configuration; + + export function stringify(directive: ReadonlyArray): string; +} diff --git a/Extension/test.tsconfig.json b/Extension/test.tsconfig.json index 7fa9e7dd75..74ce3d005d 100644 --- a/Extension/test.tsconfig.json +++ b/Extension/test.tsconfig.json @@ -15,6 +15,7 @@ "test/**/*.ts", "tools/**/*.ts", "ui/**/*.ts", - "./vscode*.d.ts" + "./vscode*.d.ts", + "src/types/*.d.ts" ] } \ No newline at end of file diff --git a/Extension/tools/OptionsSchema.json b/Extension/tools/OptionsSchema.json index 3e94a44cbe..4c1c42eb5a 100644 --- a/Extension/tools/OptionsSchema.json +++ b/Extension/tools/OptionsSchema.json @@ -238,127 +238,136 @@ } }, "Host": { - "type": "object", - "description": "%c_cpp.debuggers.host.description%", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { + "anyOf": [ + { "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" + "description": "%c_cpp.debuggers.host.description%", + "default": "hello@microsoft.com" }, - "hostName": { - "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + { + "type": "object", + "description": "%c_cpp.debuggers.host.description%", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 - }, - "jumpHosts": { - "type": "array", - "description": "%c_cpp.debuggers.host.jumpHost.description%", - "items": { - "type": "object", - "default": {}, - "required": [ - "hostName" - ], - "properties": { - "user": { - "type": "string", - "description": "%c_cpp.debuggers.host.user.description%", - "default": "" - }, - "hostName": { - "type": "string", - "description": "%c_cpp.debuggers.host.hostName.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 + }, + "jumpHosts": { + "type": "array", + "description": "%c_cpp.debuggers.host.jumpHost.description%", + "items": { + "type": "object", + "default": {}, + "required": [ + "hostName" + ], + "properties": { + "user": { + "type": "string", + "description": "%c_cpp.debuggers.host.user.description%", + "default": "" }, - { + "hostName": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.hostName.description%", + "default": "" + }, + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.port.description%", + "default": 22 } - ], - "description": "%c_cpp.debuggers.host.port.description%", - "default": 22 + } } - } - } - }, - "localForwards": { - "type": "array", - "description": "%c_cpp.debuggers.host.localForward.description%", - "items": { - "type": "object", - "default": {}, - "properties": { - "bindAddress": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", - "default": "" - }, - "port": { - "anyOf": [ - { - "type": "number" + }, + "localForwards": { + "type": "array", + "description": "%c_cpp.debuggers.host.localForward.description%", + "items": { + "type": "object", + "default": {}, + "properties": { + "bindAddress": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.bindAddress.description%", + "default": "" }, - { + "port": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.port.description%" + }, + "host": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" - } - ], - "description": "%c_cpp.debuggers.host.localForward.port.description%" - }, - "host": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.host.description%", - "default": "" - }, - "hostPort": { - "anyOf": [ - { - "type": "number" + "description": "%c_cpp.debuggers.host.localForward.host.description%", + "default": "" }, - { + "hostPort": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "pattern": "^\\d+$|^\\${.+}$" + } + ], + "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" + }, + "localSocket": { "type": "string", - "pattern": "^\\d+$|^\\${.+}$" + "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", + "default": "" + }, + "remoteSocket": { + "type": "string", + "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", + "default": "" } - ], - "description": "%c_cpp.debuggers.host.localForward.hostPort.description%" - }, - "localSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.localSocket.description%", - "default": "" - }, - "remoteSocket": { - "type": "string", - "description": "%c_cpp.debuggers.host.localForward.remoteSocket.description%", - "default": "" + } } } } } - } + ] }, "DeploySteps": { "type": "array", diff --git a/Extension/webpack.config.js b/Extension/webpack.config.js index f36a72fb03..e89d327633 100644 --- a/Extension/webpack.config.js +++ b/Extension/webpack.config.js @@ -45,6 +45,9 @@ const config = { } } }] + },{ + test: /.node$/, + loader: 'node-loader', }] }, optimization: { diff --git a/Extension/yarn.lock b/Extension/yarn.lock index 1b4de971c5..36ef21edde 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -400,6 +400,11 @@ dependencies: "@types/node" "*" +"@types/shell-quote@^1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@types/shell-quote/-/shell-quote-1.7.1.tgz#2d059091214a02c29f003f591032172b2aff77e8" + integrity sha512-SWZ2Nom1pkyXCDohRSrkSKvDh8QOG9RfAsrt5/NsPQC4UQJ55eG0qClA40I+Gkez4KTQ0uDUT8ELRXThf3J5jw== + "@types/tmp@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.1.0.tgz#19cf73a7bcf641965485119726397a096f0049bd" @@ -793,6 +798,14 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + append-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" @@ -1265,6 +1278,21 @@ chokidar@^2.0.0: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -2562,7 +2590,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.3.1: +fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -2629,7 +2657,7 @@ git-config-path@^2.0.0: resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== -glob-parent@^3.1.0, glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^3.1.0, glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3985,6 +4013,13 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-2.0.0.tgz#9109a6d828703fd3e0aa03c1baec12a798071562" + integrity sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q== + dependencies: + loader-utils "^2.0.0" + node-releases@^1.1.71: version "1.1.72" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" @@ -4472,6 +4507,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +posix-getopt@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/posix-getopt/-/posix-getopt-1.2.1.tgz#bc50e67335eb5e4be8d937210b95a211bc26f083" + integrity sha512-BbGTiH8MOWAuc6h5yITkSn9k3HP4+QOCV9t6I5F62OrH7zqTHRo08QNsgELRreTBxcvRhbSpMoUnAx77Dz4yUA== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4621,6 +4661,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -4949,6 +4996,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -5133,6 +5185,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssh-config@^4.1.0: + version "4.1.6" + resolved "https://registry.yarnpkg.com/ssh-config/-/ssh-config-4.1.6.tgz#008eee24f5e5029dc64d50de4a5a7a12342db8b1" + integrity sha512-YdPYn/2afoBonSFoMSvC1FraA/LKKrvy8UvbvAFGJ8gdlKuANvufLLkf8ynF2uq7Tl5+DQBIFyN37//09nAgNQ== + stack-trace@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" From 379d1c8472559b509b0e2e7faf96a76aa6b71a90 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Thu, 1 Sep 2022 18:17:55 -0700 Subject: [PATCH 11/16] Fix ,, in the generated gdb attach lauch.json. (#9819) --- Extension/src/Debugger/configurations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/src/Debugger/configurations.ts b/Extension/src/Debugger/configurations.ts index bbbfed1155..11b61225d7 100644 --- a/Extension/src/Debugger/configurations.ts +++ b/Extension/src/Debugger/configurations.ts @@ -179,7 +179,7 @@ export class MIConfigurations extends Configuration { const name: string = `(${this.MIMode}) ${localize("attach.string", "Attach").replace(/\"/g, "\\\"")}`; const body: string = formatString(`{ -\t${indentJsonString(createAttachString(name, this.miDebugger, this.executable))}, +\t${indentJsonString(createAttachString(name, this.miDebugger, this.executable))} \t"MIMode": "${this.MIMode}"{0}{1} }`, [this.miDebugger === "cppdbg" && os.platform() === "win32" ? `,${os.EOL}\t"miDebuggerPath": "/path/to/gdb"` : "", this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]); From b56711ff6c0baf32365fb2b846649e942b9b3152 Mon Sep 17 00:00:00 2001 From: Jamie Magee Date: Thu, 1 Sep 2022 19:11:22 -0700 Subject: [PATCH 12/16] Add `$schema` to `cgmanifest.json` (#9832) Co-authored-by: Sean McManus --- Extension/cgmanifest.json | 43 ++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/Extension/cgmanifest.json b/Extension/cgmanifest.json index abb16f393f..83de24abe5 100644 --- a/Extension/cgmanifest.json +++ b/Extension/cgmanifest.json @@ -1,24 +1,25 @@ { - "Registrations": [ - { - "Component": { - "Type": "git", - "Git": { - "RepositoryUrl": "https://github.com/llvm/llvm-project", - "CommitHash": "0d44201451f03ba907cdb268ddddfc3fa38a0ebd" - }, - "DevelopmentDependency": true - } + "$schema": "https://json.schemastore.org/component-detection-manifest.json", + "Registrations": [ + { + "Component": { + "Type": "git", + "Git": { + "RepositoryUrl": "https://github.com/llvm/llvm-project", + "CommitHash": "0d44201451f03ba907cdb268ddddfc3fa38a0ebd" }, - { - "Component": { - "Type": "git", - "Git": { - "RepositoryUrl": "https://github.com/lldb-tools/lldb-mi", - "CommitHash": "2388bd74133bc21eac59b2e2bf97f2a30770a315" - } - } + "DevelopmentDependency": true + } + }, + { + "Component": { + "Type": "git", + "Git": { + "RepositoryUrl": "https://github.com/lldb-tools/lldb-mi", + "CommitHash": "2388bd74133bc21eac59b2e2bf97f2a30770a315" } - ], - "Version": 1 -} \ No newline at end of file + } + } + ], + "Version": 1 +} From 38ed24f6a0df49adc6c2926746c794884a990c25 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 2 Sep 2022 15:13:39 -0700 Subject: [PATCH 13/16] Fix format fixes markdown (#9839) * Fix formatFixes mardown description. --- Extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/package.json b/Extension/package.json index 79413a7280..64cab2ed7c 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -431,7 +431,7 @@ }, "C_Cpp.codeAnalysis.clangTidy.codeAction.formatFixes": { "type": "boolean", - "description": "%c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription%", + "markdownDescription": "%c_cpp.configuration.codeAnalysis.clangTidy.codeAction.formatFixes.markdownDescription%", "default": true, "scope": "resource" }, From 2be467ed68b0360371b54c96111f42f1a002178f Mon Sep 17 00:00:00 2001 From: browntarik <111317156+browntarik@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:03:38 -0700 Subject: [PATCH 14/16] add caseSensitiveFileSupport (#9809) * add caseSensitiveFileSupport --- Extension/package.json | 10 +++++++++ Extension/package.nls.json | 1 + Extension/src/LanguageServer/client.ts | 26 +++++++++++++++++++----- Extension/src/LanguageServer/settings.ts | 9 +++++--- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 64cab2ed7c..affe663085 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2662,6 +2662,16 @@ "markdownDescription": "%c_cpp.configuration.suggestSnippets.markdownDescription%", "scope": "resource" }, + "C_Cpp.caseSensitiveFileSupport": { + "type": "string", + "enum": [ + "default", + "enabled" + ], + "default": "default", + "markdownDescription": "%c_cpp.configuration.caseSensitiveFileSupport.markdownDescription%", + "scope": "window" + }, "C_Cpp.enhancedColorization": { "type": "string", "enum": [ diff --git a/Extension/package.nls.json b/Extension/package.nls.json index 10ab54a58f..1f4d576263 100644 --- a/Extension/package.nls.json +++ b/Extension/package.nls.json @@ -226,6 +226,7 @@ "c_cpp.configuration.default.dotConfig.markdownDescription": { "message": "The value to use in a configuration if `dotConfig` is not specified, or the value to insert if `${default}` is present in `dotConfig`.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.experimentalFeatures.description": "Controls whether \"experimental\" features are usable.", "c_cpp.configuration.suggestSnippets.markdownDescription": { "message": "If `true`, snippets are provided by the language server.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, + "c_cpp.configuration.caseSensitiveFileSupport.markdownDescription": { "message": "If set to `default`, the file system of the workspace is assumed to be case insensitive on Windows and case sensitive on macOS or Linux. If set to `enabled`, the file system of the workspace is assumed to be case sensitive on Windows.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.enhancedColorization.markdownDescription": { "message": "If enabled, code is colorized based on IntelliSense. This setting only applies if `#C_Cpp.intelliSenseEngine#` is set to `Default`.", "comment": [ "Markdown text between `` should not be translated or localized (they represent literal text) and the capitalization, spacing, and punctuation (including the ``) should not be altered." ] }, "c_cpp.configuration.codeFolding.description": "If enabled, code folding ranges are provided by the language server.", "c_cpp.configuration.vcpkg.enabled.markdownDescription": { "message": "Enable integration services for the [vcpkg dependency manager](https://aka.ms/vcpkg/).", "comment": [ "Markdown text between () should not be altered: https://en.wikipedia.org/wiki/Markdown" ] }, diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 1a1c2d4a66..42ac4e3ffc 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -32,7 +32,7 @@ import * as util from '../common'; import * as configs from './configurations'; import { CppSettings, getEditorConfigSettings, OtherSettings } from './settings'; import * as telemetry from '../telemetry'; -import { PersistentState, PersistentFolderState } from './persistentState'; +import { PersistentState, PersistentFolderState, PersistentWorkspaceState } from './persistentState'; import { UI, getUI } from './ui'; import { ClientCollection } from './clientCollection'; import { createProtocolFilter } from './protocolFilter'; @@ -47,8 +47,10 @@ import * as os from 'os'; import * as refs from './references'; import * as nls from 'vscode-nls'; import { lookupString, localizedStringCount } from '../nativeStrings'; -import { CodeAnalysisDiagnosticIdentifiersAndUri, RegisterCodeAnalysisNotifications, removeAllCodeAnalysisProblems, - removeCodeAnalysisProblems, RemoveCodeAnalysisProblemsParams } from './codeAnalysis'; +import { + CodeAnalysisDiagnosticIdentifiersAndUri, RegisterCodeAnalysisNotifications, removeAllCodeAnalysisProblems, + removeCodeAnalysisProblems, RemoveCodeAnalysisProblemsParams +} from './codeAnalysis'; import { DebugProtocolParams, getDiagnosticsChannel, getOutputChannelLogger, logDebugProtocol, Logger, logLocalized, showWarning, ShowWarningParams } from '../logger'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); @@ -407,7 +409,6 @@ export interface GenerateDoxygenCommentParams { isCodeAction: boolean; isCursorAboveSignatureLine: boolean; } - export interface GenerateDoxygenCommentResult { contents: string; initPosition: Position; @@ -947,6 +948,8 @@ export class DefaultClient implements Client { } private createLanguageClient(allClients: ClientCollection): LanguageClient { + const currentCaseSensitiveFileSupport: PersistentWorkspaceState = new PersistentWorkspaceState("CPP.currentCaseSensitiveFileSupport", false); + let resetDatabase: boolean = false; const serverModule: string = getLanguageServerFileName(); const exeExists: boolean = fs.existsSync(serverModule); if (!exeExists) { @@ -1201,6 +1204,11 @@ export class DefaultClient implements Client { localizedStrings.push(lookupString(i)); } + if (workspaceSettings.caseSensitiveFileSupport !== currentCaseSensitiveFileSupport.Value) { + resetDatabase = true; + currentCaseSensitiveFileSupport.Value = workspaceSettings.caseSensitiveFileSupport; + } + const clientOptions: LanguageClientOptions = { documentSelector: [ { scheme: 'file', language: 'c' }, @@ -1209,8 +1217,10 @@ export class DefaultClient implements Client { ], initializationOptions: { freeMemory: os.freemem() / 1048576, + resetDatabase: resetDatabase, maxConcurrentThreads: workspaceSettings.maxConcurrentThreads, maxCachedProcesses: workspaceSettings.maxCachedProcesses, + caseSensitiveFileSupport: workspaceSettings.caseSensitiveFileSupport, maxMemory: workspaceSettings.maxMemory, intelliSense: { maxCachedProcesses: workspaceSettings.intelliSenseMaxCachedProcesses, @@ -1566,6 +1576,11 @@ export class DefaultClient implements Client { if (changedSettings["legacyCompilerArgsBehavior"]) { this.configuration.handleConfigurationChange(); } + + if (changedSettings["caseSensitiveFileSupport"] && util.isWindows()) { + util.promptForReloadWindowDueToSettingsChange(); + } + // if addNodeAddonIncludePaths was turned on but no includes have been found yet then 1) presume that nan // or node-addon-api was installed so prompt for reload. if (changedSettings["addNodeAddonIncludePaths"] && settings.addNodeAddonIncludePaths && this.configuration.nodeAddonIncludesFound() === 0) { @@ -3189,7 +3204,8 @@ export class DefaultClient implements Client { if (removeCodeAnalysisProblems(identifiersAndUris)) { // Need to notify the language client of the removed diagnostics so it doesn't re-send them. this.languageClient.sendNotification(RemoveCodeAnalysisProblemsNotification, { - identifiersAndUris: identifiersAndUrisCopy, refreshSquigglesOnSave: refreshSquigglesOnSave }); + identifiersAndUris: identifiersAndUrisCopy, refreshSquigglesOnSave: refreshSquigglesOnSave + }); } } diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 464575a8b1..8502f62b94 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import { CommentPattern } from './languageConfig'; -import { getExtensionFilePath, getCachedClangFormatPath, setCachedClangFormatPath, getCachedClangTidyPath, setCachedClangTidyPath } from '../common'; +import { getExtensionFilePath, getCachedClangFormatPath, setCachedClangFormatPath, getCachedClangTidyPath, setCachedClangTidyPath, isWindows } from '../common'; import * as os from 'os'; import * as which from 'which'; import { execSync } from 'child_process'; @@ -162,7 +162,8 @@ export class CppSettings extends Settings { return path; } - public get maxConcurrentThreads(): number | undefined | null { return super.Section.get("maxConcurrentThreads"); } public get maxMemory(): number | undefined | null { return super.Section.get("maxMemory"); } + public get maxConcurrentThreads(): number | undefined | null { return super.Section.get("maxConcurrentThreads"); } + public get maxMemory(): number | undefined | null { return super.Section.get("maxMemory"); } public get maxCachedProcesses(): number | undefined | null { return super.Section.get("maxCachedProcesses"); } public get intelliSenseMaxCachedProcesses(): number | undefined | null { return super.Section.get("intelliSense.maxCachedProcesses"); } public get intelliSenseMaxMemory(): number | undefined | null { return super.Section.get("intelliSense.maxMemory"); } @@ -253,7 +254,9 @@ export class CppSettings extends Settings { public get defaultCustomConfigurationVariables(): { [key: string]: string } | undefined { return super.Section.get<{ [key: string]: string }>("default.customConfigurationVariables"); } public get useBacktickCommandSubstitution(): boolean | undefined { return super.Section.get("debugger.useBacktickCommandSubstitution"); } public get codeFolding(): boolean { return super.Section.get("codeFolding") === "Enabled"; } - public get legacyCompilerArgsBehavior(): boolean | undefined { return super.Section.get("legacyCompilerArgsBehavior"); } + public get caseSensitiveFileSupport(): boolean { return !isWindows() || super.Section.get("caseSensitiveFileSupport") === "enabled" ; } + + public get legacyCompilerArgsBehavior(): boolean | undefined { return super.Section.get("legacyCompilerArgsBehavior"); } public get inlayHintsAutoDeclarationTypes(): boolean { return super.Section.get("inlayHints.autoDeclarationTypes.enabled") === true; From 3526f5092ca77c96342f57efdf0043605d893f61 Mon Sep 17 00:00:00 2001 From: Elaheh Rashedi Date: Wed, 7 Sep 2022 09:38:08 -0700 Subject: [PATCH 15/16] check if the compiler path and debugger path exist. (#9813) --- .../src/Debugger/configurationProvider.ts | 58 ++++++++++++------- Extension/src/common.ts | 13 +++++ 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 674e164593..6f262a92d4 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -408,9 +408,18 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv // Generating a task is async, therefore we must *await* *all* map(task => config) Promises to resolve. let configs: CppDebugConfiguration[] = []; if (buildTasks.length !== 0) { - configs = await Promise.all(buildTasks.map>(async task => { + configs = (await Promise.all(buildTasks.map>(async task => { const definition: CppBuildTaskDefinition = task.definition as CppBuildTaskDefinition; const compilerPath: string = definition.command; + // Filter out the tasks that has an invalid compiler path. + const compilerPathExists: boolean = path.isAbsolute(compilerPath) ? + // Absolute path, just check if it exists + await util.checkFileExists(compilerPath) : + // Non-absolute. Check on $PATH + ((await util.whichAsync(compilerPath)) !== undefined); + if (!compilerPathExists) { + logger.getOutputChannelLogger().appendLine(localize('compiler.path.not.exists', "Unable to find {0}. {1} task is ignored.", compilerPath, definition.label)); + } const compilerName: string = path.basename(compilerPath); const newConfig: CppDebugConfiguration = { ...defaultTemplateConfig }; // Copy enumerables and properties newConfig.existing = false; @@ -439,20 +448,24 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv const isCl: boolean = compilerName === "cl.exe"; newConfig.cwd = isWindows && !isCl && !process.env.PATH?.includes(path.dirname(compilerPath)) ? path.dirname(compilerPath) : "${fileDirname}"; - return new Promise(resolve => { + return new Promise(async resolve => { if (platformInfo.platform === "darwin") { return resolve(newConfig); } else { let debuggerName: string; if (compilerName.startsWith("clang")) { newConfig.MIMode = "lldb"; - debuggerName = "lldb-mi"; - // Search for clang-8, clang-10, etc. - if ((compilerName !== "clang-cl.exe") && (compilerName !== "clang-cpp.exe")) { - const suffixIndex: number = compilerName.indexOf("-"); - if (suffixIndex !== -1) { - const suffix: string = compilerName.substring(suffixIndex); - debuggerName += suffix; + if (isWindows) { + debuggerName = "lldb"; + } else { + debuggerName = "lldb-mi"; + // Search for clang-8, clang-10, etc. + if ((compilerName !== "clang-cl.exe") && (compilerName !== "clang-cpp.exe")) { + const suffixIndex: number = compilerName.indexOf("-"); + if (suffixIndex !== -1) { + const suffix: string = compilerName.substring(suffixIndex); + debuggerName += suffix; + } } } newConfig.type = DebuggerType.cppdbg; @@ -468,22 +481,27 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv } const compilerDirname: string = path.dirname(compilerPath); const debuggerPath: string = path.join(compilerDirname, debuggerName); - if (isWindows) { + + // Check if debuggerPath exists. + if (await util.checkFileExists(debuggerPath)) { newConfig.miDebuggerPath = debuggerPath; - return resolve(newConfig); + } else if ((await util.whichAsync(debuggerName)) !== undefined) { + // Check if debuggerName exists on $PATH + newConfig.miDebuggerPath = debuggerName; } else { - fs.stat(debuggerPath, (err, stats: fs.Stats) => { - if (!err && stats && stats.isFile()) { - newConfig.miDebuggerPath = debuggerPath; - } else { - newConfig.miDebuggerPath = path.join("/usr", "bin", debuggerName); - } - return resolve(newConfig); - }); + // Try the usr path for non-windows platforms. + const usrDebuggerPath: string = path.join("/usr", "bin", debuggerName); + if (!isWindows && await util.checkFileExists(usrDebuggerPath)) { + newConfig.miDebuggerPath = usrDebuggerPath; + } else { + logger.getOutputChannelLogger().appendLine(localize('debugger.path.not.exists', "Unable to find the {0} debugger. The debug configuration for {1} is ignored.", `\"${debuggerName}\"`, compilerName)); + return resolve(undefined); + } } + return resolve(newConfig); } }); - })); + }))).filter((item): item is CppDebugConfiguration => !!item); } configs.push(defaultTemplateConfig); const existingConfigs: CppDebugConfiguration[] | undefined = this.getLaunchConfigs(folder, type)?.map(config => { diff --git a/Extension/src/common.ts b/Extension/src/common.ts index a0980fdc94..fb1c9519b2 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -4,6 +4,7 @@ * ------------------------------------------------------------------------------------------ */ import * as path from 'path'; +import * as which from 'which'; import * as fs from 'fs'; import * as os from 'os'; import * as child_process from 'child_process'; @@ -1411,3 +1412,15 @@ export interface ISshLocalForwardInfo { localSocket?: string; remoteSocket?: string; } + +export function whichAsync(name: string): Promise { + return new Promise(resolve => { + which(name, (err, resolved) => { + if (err) { + resolve(undefined); + } else { + resolve(resolved); + } + }); + }); +} From 281d04feaf1415f36a435ed00633a12ed0730abb Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Wed, 7 Sep 2022 11:43:16 -0700 Subject: [PATCH 16/16] Update changelog for 1.13.0. (#9859) --- Extension/CHANGELOG.md | 14 ++++++++++++++ Extension/package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index e52e5941bd..51fa228eb8 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,19 @@ # C/C++ for Visual Studio Code Changelog +## Version 1.13.0: September 7, 2022 +### New Features +* SSH Target Selector. [PR #9760](https://github.com/microsoft/vscode-cpptools/pull/9760) +* rsync support in deploySteps. [PR #9808](https://github.com/microsoft/vscode-cpptools/pull/9808) + +### Enhancement +* Add `C_Cpp.caseSensitiveFileSupport` for enabling case sensitive file handling on Windows. [#1994](https://github.com/microsoft/vscode-cpptools/issues/1994) +* Add better build and debug task handling for when a compiler or debugger doesn't exist. [#8836](https://github.com/microsoft/vscode-cpptools/issues/8836) + +### Bug Fixes +* Fix `${workspaceFolder}` not being resolved in `C_Cpp.clang_format_style`. [#9786](https://github.com/microsoft/vscode-cpptools/issues/9786) +* Fix extra comma in the generated the `(gdb) attach` configuration in `launch.json`. [#9818](https://github.com/microsoft/vscode-cpptools/issues/9818) +* Fix include completion sorting extensionless headers (e.g. string) after headers with an extension (e.g. string.h). + ## Version 1.12.4: August 31, 2022 ### Other * Revert changes to telemetry key format. [PR #9822](https://github.com/microsoft/vscode-cpptools/pull/9822) diff --git a/Extension/package.json b/Extension/package.json index affe663085..49f210f42c 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.12.4-main", + "version": "1.13.0-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md",