]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/lldb/Target/Language.h
Vendor import of lldb trunk r257626:
[FreeBSD/FreeBSD.git] / include / lldb / Target / Language.h
1 //===-- Language.h ---------------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_Language_h_
11 #define liblldb_Language_h_
12
13 // C Includes
14 // C++ Includes
15 #include <functional>
16 #include <memory>
17 #include <set>
18 #include <vector>
19
20 // Other libraries and framework includes
21 // Project includes
22 #include "lldb/lldb-public.h"
23 #include "lldb/lldb-private.h"
24 #include "lldb/Core/PluginInterface.h"
25 #include "lldb/DataFormatters/DumpValueObjectOptions.h"
26 #include "lldb/DataFormatters/FormatClasses.h"
27 #include "lldb/DataFormatters/StringPrinter.h"
28
29 namespace lldb_private {
30     
31 class Language :
32 public PluginInterface
33 {
34 public:
35     class TypeScavenger
36     {
37     public:
38         class Result
39         {
40         public:
41             virtual bool
42             IsValid () = 0;
43             
44             virtual bool
45             DumpToStream (Stream& stream,
46                           bool print_help_if_available) = 0;
47             
48             virtual ~Result() = default;
49         };
50         
51         typedef std::set<std::unique_ptr<Result>> ResultSet;
52         
53         virtual ~TypeScavenger () = default;
54         
55         size_t
56         Find (ExecutionContextScope *exe_scope,
57               const char *key,
58               ResultSet &results,
59               bool append = true);
60         
61     protected:
62         TypeScavenger () = default;
63         
64         virtual bool
65         Find_Impl (ExecutionContextScope *exe_scope,
66                    const char *key,
67                    ResultSet &results) = 0;
68     };
69     
70     enum class FunctionNameRepresentation
71     {
72         eName,
73         eNameWithArgs,
74         eNameWithNoArgs
75     };
76
77     ~Language() override;
78     
79     static Language*
80     FindPlugin (lldb::LanguageType language);
81     
82     // return false from callback to stop iterating
83     static void
84     ForEach (std::function<bool(Language*)> callback);
85     
86     virtual lldb::LanguageType
87     GetLanguageType () const = 0;
88     
89     virtual bool
90     IsTopLevelFunction (Function& function);
91     
92     virtual lldb::TypeCategoryImplSP
93     GetFormatters ();
94     
95     virtual HardcodedFormatters::HardcodedFormatFinder
96     GetHardcodedFormats ();
97     
98     virtual HardcodedFormatters::HardcodedSummaryFinder
99     GetHardcodedSummaries ();
100
101     virtual HardcodedFormatters::HardcodedSyntheticFinder
102     GetHardcodedSynthetics ();
103     
104     virtual HardcodedFormatters::HardcodedValidatorFinder
105     GetHardcodedValidators ();
106
107     virtual std::vector<ConstString>
108     GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic);
109
110     virtual lldb_private::formatters::StringPrinter::EscapingHelper
111     GetStringPrinterEscapingHelper (lldb_private::formatters::StringPrinter::GetPrintableElementType);
112     
113     virtual std::unique_ptr<TypeScavenger>
114     GetTypeScavenger ();
115     
116     // if an individual data formatter can apply to several types and cross a language boundary
117     // it makes sense for individual languages to want to customize the printing of values of that
118     // type by appending proper prefix/suffix information in language-specific ways
119     virtual bool
120     GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint,
121                               std::string& prefix, std::string& suffix);
122     
123     // if a language has a custom format for printing variable declarations that it wants LLDB to honor
124     // it should return an appropriate closure here
125     virtual DumpValueObjectOptions::DeclPrintingHelper
126     GetDeclPrintingHelper ();
127     
128     virtual LazyBool
129     IsLogicalTrue (ValueObject& valobj,
130                    Error& error);
131     
132     // for a ValueObject of some "reference type", if the value points to the
133     // nil/null object, this method returns true
134     virtual bool
135     IsNilReference (ValueObject& valobj);
136     
137     // for a ValueObject of some "reference type", if the language provides a technique
138     // to decide whether the reference has ever been assigned to some object, this method
139     // will return true if such detection is possible, and if the reference has never been assigned
140     virtual bool
141     IsUninitializedReference (ValueObject& valobj);
142     
143     virtual bool
144     GetFunctionDisplayName (const SymbolContext *sc,
145                             const ExecutionContext *exe_ctx,
146                             FunctionNameRepresentation representation,
147                             Stream& s);
148     
149     virtual void
150     GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s);
151     
152     static void
153     GetDefaultExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s);
154     
155     // These are accessors for general information about the Languages lldb knows about:
156     
157     static lldb::LanguageType
158     GetLanguageTypeFromString (const char *string);
159     
160     static const char *
161     GetNameForLanguageType (lldb::LanguageType language);
162
163     static void
164     PrintAllLanguages (Stream &s, const char *prefix, const char *suffix);
165         
166     // return false from callback to stop iterating
167     static void
168     ForAllLanguages (std::function<bool(lldb::LanguageType)> callback);
169
170     static bool
171     LanguageIsCPlusPlus (lldb::LanguageType language);
172     
173     static bool
174     LanguageIsObjC (lldb::LanguageType language);
175     
176     static bool
177     LanguageIsC (lldb::LanguageType language);
178     
179     static bool
180     LanguageIsPascal (lldb::LanguageType language);
181     
182     // return the primary language, so if LanguageIsC(l), return eLanguageTypeC, etc.
183     static lldb::LanguageType
184     GetPrimaryLanguage (lldb::LanguageType language);
185
186     static void
187     GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,
188                                        std::set<lldb::LanguageType> &languages_for_expressions);
189
190     static void
191     GetLanguagesSupportingREPLs (std::set<lldb::LanguageType> &languages);
192     
193 protected:
194     //------------------------------------------------------------------
195     // Classes that inherit from Language can see and modify these
196     //------------------------------------------------------------------
197     
198     Language();
199 private:
200     
201     DISALLOW_COPY_AND_ASSIGN (Language);
202 };
203     
204 } // namespace lldb_private
205
206 #endif // liblldb_Language_h_