//===-- FormatClasses.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_FormatClasses_h_ #define lldb_FormatClasses_h_ #include #include #include #include #include "lldb/DataFormatters/TypeFormat.h" #include "lldb/DataFormatters/TypeSummary.h" #include "lldb/DataFormatters/TypeSynthetic.h" #include "lldb/Symbol/CompilerType.h" #include "lldb/Symbol/Type.h" #include "lldb/lldb-enumerations.h" #include "lldb/lldb-public.h" namespace lldb_private { class HardcodedFormatters { public: template using HardcodedFormatterFinder = std::function; template using HardcodedFormatterFinders = std::vector>; typedef HardcodedFormatterFinders HardcodedFormatFinder; typedef HardcodedFormatterFinders HardcodedSummaryFinder; typedef HardcodedFormatterFinders HardcodedSyntheticFinder; }; class FormattersMatchCandidate { public: FormattersMatchCandidate(ConstString name, uint32_t reason, bool strip_ptr, bool strip_ref, bool strip_tydef) : m_type_name(name), m_reason(reason), m_stripped_pointer(strip_ptr), m_stripped_reference(strip_ref), m_stripped_typedef(strip_tydef) {} ~FormattersMatchCandidate() = default; ConstString GetTypeName() const { return m_type_name; } uint32_t GetReason() const { return m_reason; } bool DidStripPointer() const { return m_stripped_pointer; } bool DidStripReference() const { return m_stripped_reference; } bool DidStripTypedef() const { return m_stripped_typedef; } template bool IsMatch(const std::shared_ptr &formatter_sp) const { if (!formatter_sp) return false; if (formatter_sp->Cascades() == false && DidStripTypedef()) return false; if (formatter_sp->SkipsPointers() && DidStripPointer()) return false; if (formatter_sp->SkipsReferences() && DidStripReference()) return false; return true; } private: ConstString m_type_name; uint32_t m_reason; bool m_stripped_pointer; bool m_stripped_reference; bool m_stripped_typedef; }; typedef std::vector FormattersMatchVector; typedef std::vector CandidateLanguagesVector; class FormattersMatchData { public: FormattersMatchData(ValueObject &, lldb::DynamicValueType); FormattersMatchVector GetMatchesVector(); ConstString GetTypeForCache(); CandidateLanguagesVector GetCandidateLanguages(); ValueObject &GetValueObject(); lldb::DynamicValueType GetDynamicValueType(); private: ValueObject &m_valobj; lldb::DynamicValueType m_dynamic_value_type; std::pair m_formatters_match_vector; ConstString m_type_for_cache; CandidateLanguagesVector m_candidate_languages; }; class TypeNameSpecifierImpl { public: TypeNameSpecifierImpl() : m_is_regex(false), m_type() {} TypeNameSpecifierImpl(llvm::StringRef name, bool is_regex) : m_is_regex(is_regex), m_type() { m_type.m_type_name = name; } // if constructing with a given type, is_regex cannot be true since we are // giving an exact type to match TypeNameSpecifierImpl(lldb::TypeSP type) : m_is_regex(false), m_type() { if (type) { m_type.m_type_name = type->GetName().GetStringRef(); m_type.m_compiler_type = type->GetForwardCompilerType(); } } TypeNameSpecifierImpl(CompilerType type) : m_is_regex(false), m_type() { if (type.IsValid()) { m_type.m_type_name.assign(type.GetConstTypeName().GetCString()); m_type.m_compiler_type = type; } } const char *GetName() { if (m_type.m_type_name.size()) return m_type.m_type_name.c_str(); return nullptr; } CompilerType GetCompilerType() { if (m_type.m_compiler_type.IsValid()) return m_type.m_compiler_type; return CompilerType(); } bool IsRegex() { return m_is_regex; } private: bool m_is_regex; // TODO: Replace this with TypeAndOrName. struct TypeOrName { std::string m_type_name; CompilerType m_compiler_type; }; TypeOrName m_type; private: DISALLOW_COPY_AND_ASSIGN(TypeNameSpecifierImpl); }; } // namespace lldb_private #endif // lldb_FormatClasses_h_