clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
185 lines
6.6 KiB
C++
185 lines
6.6 KiB
C++
//===-- 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
|