1//===-- FormatClasses.h -----------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_DATAFORMATTERS_FORMATCLASSES_H
10#define LLDB_DATAFORMATTERS_FORMATCLASSES_H
11
12#include <functional>
13#include <memory>
14#include <string>
15#include <vector>
16
17#include "lldb/DataFormatters/TypeFormat.h"
18#include "lldb/DataFormatters/TypeSummary.h"
19#include "lldb/DataFormatters/TypeSynthetic.h"
20#include "lldb/Symbol/CompilerType.h"
21#include "lldb/Symbol/Type.h"
22#include "lldb/lldb-enumerations.h"
23#include "lldb/lldb-public.h"
24
25namespace lldb_private {
26
27class HardcodedFormatters {
28public:
29 template <typename FormatterType>
30 using HardcodedFormatterFinder =
31 std::function<typename FormatterType::SharedPointer(
32 lldb_private::ValueObject &, lldb::DynamicValueType,
33 FormatManager &)>;
34
35 template <typename FormatterType>
36 using HardcodedFormatterFinders =
37 std::vector<HardcodedFormatterFinder<FormatterType>>;
38
39 typedef HardcodedFormatterFinders<TypeFormatImpl> HardcodedFormatFinder;
40 typedef HardcodedFormatterFinders<TypeSummaryImpl> HardcodedSummaryFinder;
41 typedef HardcodedFormatterFinders<SyntheticChildren> HardcodedSyntheticFinder;
42};
43
44class FormattersMatchCandidate {
45public:
46 FormattersMatchCandidate(ConstString name, bool strip_ptr,
47 bool strip_ref, bool strip_tydef)
48 : m_type_name(name), m_stripped_pointer(strip_ptr),
49 m_stripped_reference(strip_ref), m_stripped_typedef(strip_tydef) {}
50
51 ~FormattersMatchCandidate() = default;
52
53 ConstString GetTypeName() const { return m_type_name; }
54
55 bool DidStripPointer() const { return m_stripped_pointer; }
56
57 bool DidStripReference() const { return m_stripped_reference; }
58
59 bool DidStripTypedef() const { return m_stripped_typedef; }
60
61 template <class Formatter>
62 bool IsMatch(const std::shared_ptr<Formatter> &formatter_sp) const {
63 if (!formatter_sp)
64 return false;
65 if (formatter_sp->Cascades() == false && DidStripTypedef())
66 return false;
67 if (formatter_sp->SkipsPointers() && DidStripPointer())
68 return false;
69 if (formatter_sp->SkipsReferences() && DidStripReference())
70 return false;
71 return true;
72 }
73
74private:
75 ConstString m_type_name;
76 bool m_stripped_pointer;
77 bool m_stripped_reference;
78 bool m_stripped_typedef;
79};
80
81typedef std::vector<FormattersMatchCandidate> FormattersMatchVector;
82typedef std::vector<lldb::LanguageType> CandidateLanguagesVector;
83
84class FormattersMatchData {
85public:
86 FormattersMatchData(ValueObject &, lldb::DynamicValueType);
87
88 FormattersMatchVector GetMatchesVector();
89
90 ConstString GetTypeForCache();
91
92 CandidateLanguagesVector GetCandidateLanguages();
93
94 ValueObject &GetValueObject();
95
96 lldb::DynamicValueType GetDynamicValueType();
97
98private:
99 ValueObject &m_valobj;
100 lldb::DynamicValueType m_dynamic_value_type;
101 std::pair<FormattersMatchVector, bool> m_formatters_match_vector;
102 ConstString m_type_for_cache;
103 CandidateLanguagesVector m_candidate_languages;
104};
105
106class TypeNameSpecifierImpl {
107public:
108 TypeNameSpecifierImpl() : m_is_regex(false), m_type() {}
109
110 TypeNameSpecifierImpl(llvm::StringRef name, bool is_regex)
111 : m_is_regex(is_regex), m_type() {
112 m_type.m_type_name = std::string(name);
113 }
114
115 // if constructing with a given type, is_regex cannot be true since we are
116 // giving an exact type to match
117 TypeNameSpecifierImpl(lldb::TypeSP type) : m_is_regex(false), m_type() {
118 if (type) {
119 m_type.m_type_name = std::string(type->GetName().GetStringRef());
120 m_type.m_compiler_type = type->GetForwardCompilerType();
121 }
122 }
123
124 TypeNameSpecifierImpl(CompilerType type) : m_is_regex(false), m_type() {
125 if (type.IsValid()) {
126 m_type.m_type_name.assign(type.GetTypeName().GetCString());
127 m_type.m_compiler_type = type;
128 }
129 }
130
131 const char *GetName() {
132 if (m_type.m_type_name.size())
133 return m_type.m_type_name.c_str();
134 return nullptr;
135 }
136
137 CompilerType GetCompilerType() {
138 if (m_type.m_compiler_type.IsValid())
139 return m_type.m_compiler_type;
140 return CompilerType();
141 }
142
143 bool IsRegex() { return m_is_regex; }
144
145private:
146 bool m_is_regex;
147 // TODO: Replace this with TypeAndOrName.
148 struct TypeOrName {
149 std::string m_type_name;
150 CompilerType m_compiler_type;
151 };
152 TypeOrName m_type;
153
154 TypeNameSpecifierImpl(const TypeNameSpecifierImpl &) = delete;
155 const TypeNameSpecifierImpl &
156 operator=(const TypeNameSpecifierImpl &) = delete;
157};
158
159} // namespace lldb_private
160
161#endif // LLDB_DATAFORMATTERS_FORMATCLASSES_H
162