//===-- 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 #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, public std::enable_shared_from_this { 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 &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 callback); template 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(); } if constexpr (std::is_pointer_v) return T{nullptr}; else return std::optional{std::nullopt}; } template 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 m_properties; llvm::StringMap m_name_to_index; }; } // namespace lldb_private #endif // LLDB_INTERPRETER_OPTIONVALUEPROPERTIES_H