From 7f1f760645fa63f2ac874620b73d31ffbaf9a040 Mon Sep 17 00:00:00 2001 From: Valerii Koval Date: Wed, 10 Mar 2021 14:54:52 +0200 Subject: [PATCH] Preserve user-specified debug configurations in VSCode integration (#3878) * Preserve user-specified debug configurations in VSCode integration Issue #3824 * Tidy up Python code --- HISTORY.rst | 1 + .../ide/tpls/vscode/.vscode/launch.json.tpl | 130 ++++++++++++------ 2 files changed, 89 insertions(+), 42 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index b7dc1d6a..7ef436f1 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -15,6 +15,7 @@ PlatformIO Core 5 * Fixed an issue with `device monitor `__ when the "send_on_enter" filter didn't send EOL chars (`issue #3787 `_) * Fixed an issue with silent mode when unwanted data is printed to stdout (`issue #3837 `_) * Fixed an issue when code inspection fails with "Bad JSON" (`issue #3790 `_) +* Fixed an issue with overriding user-specified debugging configuration information in VSCode (`issue #3824 `_) 5.1.0 (2021-01-28) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/ide/tpls/vscode/.vscode/launch.json.tpl b/platformio/ide/tpls/vscode/.vscode/launch.json.tpl index 4acea135..e05c7237 100644 --- a/platformio/ide/tpls/vscode/.vscode/launch.json.tpl +++ b/platformio/ide/tpls/vscode/.vscode/launch.json.tpl @@ -1,50 +1,96 @@ -// AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY - -// PIO Unified Debugger -// -// Documentation: https://docs.platformio.org/page/plus/debugging.html -// Configuration: https://docs.platformio.org/page/projectconf/section_env_debug.html - -% from os.path import dirname, join +% import codecs +% import json +% import os +% +% def _escape(text): +% return text.replace('"', '\"') +% end % % def _escape_path(path): % return path.replace('\\\\', '/').replace('\\', '/').replace('"', '\\"') % end % -{ - "version": "0.2.0", - "configurations": [ - { - "type": "platformio-debug", - "request": "launch", - "name": "PIO Debug", - "executable": "{{ _escape_path(prog_path) }}", - "projectEnvName": "{{ env_name }}", - "toolchainBinDir": "{{ _escape_path(dirname(gdb_path)) }}", -% if svd_path: - "svdPath": "{{ _escape_path(svd_path) }}", +% def get_pio_configurations(): +% predebug = { +% "type": "platformio-debug", +% "request": "launch", +% "name": "PIO Debug (skip Pre-Debug)", +% "executable": _escape_path(prog_path), +% "projectEnvName": env_name, +% "toolchainBinDir": _escape_path(os.path.dirname(gdb_path)), +% "internalConsoleOptions": "openOnSessionStart", +% } +% +% if svd_path: +% predebug["svdPath"] = _escape_path(svd_path) +% end +% debug = predebug.copy() +% debug["name"] = "PIO Debug" +% debug["preLaunchTask"] = { +% "type": "PlatformIO", +% "task": ("Pre-Debug (%s)" % env_name) if len(config.envs()) > 1 else "Pre-Debug", +% } +% return [debug, predebug] % end - "preLaunchTask": { - "type": "PlatformIO", -% if len(config.envs()) > 1: - "task": "Pre-Debug ({{ env_name }})" -% else: - "task": "Pre-Debug" +% +% def _remove_comments(lines): +% data = "" +% for line in lines: +% line = line.strip() +% if not line.startswith("//"): +% data += line +% end +% end +% return data % end - }, - "internalConsoleOptions": "openOnSessionStart" - }, - { - "type": "platformio-debug", - "request": "launch", - "name": "PIO Debug (skip Pre-Debug)", - "executable": "{{ _escape_path(prog_path) }}", - "projectEnvName": "{{ env_name }}", - "toolchainBinDir": "{{ _escape_path(dirname(gdb_path)) }}", -% if svd_path: - "svdPath": "{{ _escape_path(svd_path) }}", +% +% def _contains_external_configurations(launch_config): +% return any( +% c.get("type", "") != "platformio-debug" +% for c in launch_config.get("configurations", []) +% ) % end - "internalConsoleOptions": "openOnSessionStart" - } - ] -} \ No newline at end of file +% +% def _remove_pio_configurations(launch_config): +% if "configurations" not in launch_config: +% return launch_config +% end +% +% external_configurations = [ +% config +% for config in launch_config["configurations"] +% if config.get("type", "") != "platformio-debug" +% ] +% +% launch_config["configurations"] = external_configurations +% return launch_config +% end +% +% def get_launch_configuration(): +% launch_config = {"version": "0.2.0", "configurations": []} +% launch_file = os.path.join(project_dir, ".vscode", "launch.json") +% if os.path.isfile(launch_file): +% with codecs.open(launch_file, "r", encoding="utf8") as fp: +% launch_data = _remove_comments(fp.readlines()) +% try: +% prev_config = json.loads(launch_data) +% if _contains_external_configurations(prev_config): +% launch_config = _remove_pio_configurations(prev_config) +% end +% except: +% pass +% end +% end +% end +% launch_config["configurations"].extend(get_pio_configurations()) +% return launch_config +% end +% +// AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY +// +// PIO Unified Debugger +// +// Documentation: https://docs.platformio.org/page/plus/debugging.html +// Configuration: https://docs.platformio.org/page/projectconf/section_env_debug.html + +{{ json.dumps(get_launch_configuration(), indent=4, ensure_ascii=False) }}