diff options
author | Glen Chung <kuchung@microsoft.com> | 2023-03-16 00:50:08 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-05-30 13:46:12 (GMT) |
commit | a9a592f96e6498da302f8e968be1db0ad3c32123 (patch) | |
tree | 0d75f16ee2eae99b1a3f063e575b3f5f8f2ee931 /Source/cmDebuggerVariables.cxx | |
parent | b0d1ddb7234950374977b83f8dbded806c15b356 (diff) | |
download | CMake-a9a592f96e6498da302f8e968be1db0ad3c32123.zip CMake-a9a592f96e6498da302f8e968be1db0ad3c32123.tar.gz CMake-a9a592f96e6498da302f8e968be1db0ad3c32123.tar.bz2 |
cmake: Add debugger
- Depends on cppdap and jsoncpp.
- Add --debugger argument to enable the Debugger.
- Add --debugger-pipe argument for DAP traffics over named pipes.
- Support breakpoints by filenames and line numbers.
- Support exception breakpoints.
- Call stack shows filenames and line numbers.
- Show Cache Variables.
- Show the state of currently defined targets,
tests and directories with their properties.
- Add cmakeVersion to DAP initialize response.
- Include unit tests.
Co-authored-by: Ben McMorran <bemcmorr@microsoft.com>
Diffstat (limited to 'Source/cmDebuggerVariables.cxx')
-rw-r--r-- | Source/cmDebuggerVariables.cxx | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/Source/cmDebuggerVariables.cxx b/Source/cmDebuggerVariables.cxx new file mode 100644 index 0000000..40fe41f --- /dev/null +++ b/Source/cmDebuggerVariables.cxx @@ -0,0 +1,133 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ + +#include "cmDebuggerVariables.h" + +#include <algorithm> +#include <vector> + +#include <cm3p/cppdap/optional.h> +#include <cm3p/cppdap/protocol.h> +#include <cm3p/cppdap/types.h> + +#include "cmDebuggerVariablesManager.h" + +namespace cmDebugger { + +namespace { +const dap::VariablePresentationHint PrivatePropertyHint = { {}, + "property", + {}, + "private" }; +const dap::VariablePresentationHint PrivateDataHint = { {}, + "data", + {}, + "private" }; +} + +std::atomic<int64_t> cmDebuggerVariables::NextId(1); + +cmDebuggerVariables::cmDebuggerVariables( + std::shared_ptr<cmDebuggerVariablesManager> variablesManager, + std::string name, bool supportsVariableType) + : Id(NextId.fetch_add(1)) + , Name(std::move(name)) + , SupportsVariableType(supportsVariableType) + , VariablesManager(std::move(variablesManager)) +{ + VariablesManager->RegisterHandler( + Id, [this](dap::VariablesRequest const& request) { + (void)request; + return this->HandleVariablesRequest(); + }); +} + +cmDebuggerVariables::cmDebuggerVariables( + std::shared_ptr<cmDebuggerVariablesManager> variablesManager, + std::string name, bool supportsVariableType, + std::function<std::vector<cmDebuggerVariableEntry>()> getKeyValuesFunction) + : Id(NextId.fetch_add(1)) + , Name(std::move(name)) + , GetKeyValuesFunction(std::move(getKeyValuesFunction)) + , SupportsVariableType(supportsVariableType) + , VariablesManager(std::move(variablesManager)) +{ + VariablesManager->RegisterHandler( + Id, [this](dap::VariablesRequest const& request) { + (void)request; + return this->HandleVariablesRequest(); + }); +} + +void cmDebuggerVariables::AddSubVariables( + std::shared_ptr<cmDebuggerVariables> const& variables) +{ + if (variables != nullptr) { + SubVariables.emplace_back(variables); + } +} + +dap::array<dap::Variable> cmDebuggerVariables::HandleVariablesRequest() +{ + dap::array<dap::Variable> variables; + + if (GetKeyValuesFunction != nullptr) { + auto values = GetKeyValuesFunction(); + for (auto const& entry : values) { + if (IgnoreEmptyStringEntries && entry.Type == "string" && + entry.Value.empty()) { + continue; + } + variables.push_back(dap::Variable{ {}, + {}, + {}, + entry.Name, + {}, + PrivateDataHint, + entry.Type, + entry.Value, + 0 }); + } + } + + EnumerateSubVariablesIfAny(variables); + + if (EnableSorting) { + std::sort(variables.begin(), variables.end(), + [](dap::Variable const& a, dap::Variable const& b) { + return a.name < b.name; + }); + } + return variables; +} + +void cmDebuggerVariables::EnumerateSubVariablesIfAny( + dap::array<dap::Variable>& toBeReturned) const +{ + dap::array<dap::Variable> ret; + for (auto const& variables : SubVariables) { + toBeReturned.emplace_back( + dap::Variable{ {}, + {}, + {}, + variables->GetName(), + {}, + PrivatePropertyHint, + SupportsVariableType ? "collection" : nullptr, + variables->GetValue(), + variables->GetId() }); + } +} + +void cmDebuggerVariables::ClearSubVariables() +{ + SubVariables.clear(); +} + +cmDebuggerVariables::~cmDebuggerVariables() +{ + ClearSubVariables(); + VariablesManager->UnregisterHandler(Id); +} + +} // namespace cmDebugger |