blob: 2ee13c63c38c1199a33ff305f0d7dda2be24ffeb [file] [log] [blame]
//===-- OptionValueProperties.h ---------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_INTERPRETER_OPTIONVALUEPROPERTIES_H
#define LLDB_INTERPRETER_OPTIONVALUEPROPERTIES_H
#include <vector>
#include "lldb/Core/FormatEntity.h"
#include "lldb/Core/UniqueCStringMap.h"
#include "lldb/Interpreter/OptionValue.h"
#include "lldb/Interpreter/Property.h"
namespace lldb_private {
class Properties;
class OptionValueProperties
: public Cloneable<OptionValueProperties, OptionValue>,
public std::enable_shared_from_this<OptionValueProperties> {
public:
OptionValueProperties() = default;
OptionValueProperties(llvm::StringRef name);
~OptionValueProperties() override = default;
Type GetType() const override { return eTypeProperties; }
void Clear() override;
static lldb::OptionValuePropertiesSP
CreateLocalCopy(const Properties &global_properties);
lldb::OptionValueSP
DeepCopy(const lldb::OptionValueSP &new_parent) const override;
Status
SetValueFromString(llvm::StringRef value,
VarSetOperationType op = eVarSetOperationAssign) override;
void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
uint32_t dump_mask) override;
llvm::json::Value ToJSON(const ExecutionContext *exe_ctx) override;
llvm::StringRef GetName() const override { return m_name; }
virtual Status DumpPropertyValue(const ExecutionContext *exe_ctx,
Stream &strm, llvm::StringRef property_path,
uint32_t dump_mask, bool is_json = false);
virtual void DumpAllDescriptions(CommandInterpreter &interpreter,
Stream &strm) const;
void Apropos(llvm::StringRef keyword,
std::vector<const Property *> &matching_properties) const;
void Initialize(const PropertyDefinitions &setting_definitions);
// Subclass specific functions
// Get the index of a property given its exact name in this property
// collection, "name" can't be a path to a property path that refers to a
// property within a property
virtual size_t GetPropertyIndex(llvm::StringRef name) const;
// Get a property by exact name exists in this property collection, name can
// not be a path to a property path that refers to a property within a
// property
virtual const Property *
GetProperty(llvm::StringRef name,
const ExecutionContext *exe_ctx = nullptr) const;
virtual const Property *
GetPropertyAtIndex(size_t idx,
const ExecutionContext *exe_ctx = nullptr) const {
return ProtectedGetPropertyAtIndex(idx);
}
// Property can be a property path like
// "target.process.extra-startup-command"
virtual const Property *
GetPropertyAtPath(const ExecutionContext *exe_ctx,
llvm::StringRef property_path) const;
virtual lldb::OptionValueSP
GetPropertyValueAtIndex(size_t idx, const ExecutionContext *exe_ctx) const;
virtual lldb::OptionValueSP GetValueForKey(const ExecutionContext *exe_ctx,
llvm::StringRef key) const;
lldb::OptionValueSP GetSubValue(const ExecutionContext *exe_ctx,
llvm::StringRef name,
Status &error) const override;
Status SetSubValue(const ExecutionContext *exe_ctx, VarSetOperationType op,
llvm::StringRef path, llvm::StringRef value) override;
bool
GetPropertyAtIndexAsArgs(size_t idx, Args &args,
const ExecutionContext *exe_ctx = nullptr) const;
bool SetPropertyAtIndexFromArgs(size_t idx, const Args &args,
const ExecutionContext *exe_ctx = nullptr);
OptionValueDictionary *GetPropertyAtIndexAsOptionValueDictionary(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
OptionValueSInt64 *GetPropertyAtIndexAsOptionValueSInt64(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
OptionValueUInt64 *GetPropertyAtIndexAsOptionValueUInt64(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
OptionValueString *GetPropertyAtIndexAsOptionValueString(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
OptionValueFileSpec *GetPropertyAtIndexAsOptionValueFileSpec(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
OptionValuePathMappings *GetPropertyAtIndexAsOptionValuePathMappings(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
OptionValueFileSpecList *GetPropertyAtIndexAsOptionValueFileSpecList(
size_t idx, const ExecutionContext *exe_ctx = nullptr) const;
void AppendProperty(llvm::StringRef name, llvm::StringRef desc,
bool is_global, const lldb::OptionValueSP &value_sp);
lldb::OptionValuePropertiesSP GetSubProperty(const ExecutionContext *exe_ctx,
llvm::StringRef name);
void SetValueChangedCallback(size_t property_idx,
std::function<void()> callback);
template <typename T>
auto GetPropertyAtIndexAs(size_t idx,
const ExecutionContext *exe_ctx = nullptr) const {
if (const Property *property = GetPropertyAtIndex(idx, exe_ctx)) {
if (OptionValue *value = property->GetValue().get())
return value->GetValueAs<T>();
}
if constexpr (std::is_pointer_v<T>)
return T{nullptr};
else
return std::optional<T>{std::nullopt};
}
template <typename T>
bool SetPropertyAtIndex(size_t idx, T t,
const ExecutionContext *exe_ctx = nullptr) const {
if (const Property *property = GetPropertyAtIndex(idx, exe_ctx)) {
if (OptionValue *value = property->GetValue().get()) {
value->SetValueAs(t);
return true;
}
}
return false;
}
protected:
Property *ProtectedGetPropertyAtIndex(size_t idx) {
assert(idx < m_properties.size() && "invalid property index");
return ((idx < m_properties.size()) ? &m_properties[idx] : nullptr);
}
const Property *ProtectedGetPropertyAtIndex(size_t idx) const {
assert(idx < m_properties.size() && "invalid property index");
return ((idx < m_properties.size()) ? &m_properties[idx] : nullptr);
}
std::string m_name;
std::vector<Property> m_properties;
llvm::StringMap<size_t> m_name_to_index;
};
} // namespace lldb_private
#endif // LLDB_INTERPRETER_OPTIONVALUEPROPERTIES_H