123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /* 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
|