//===-- Language.h ---------------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_Language_h_ #define liblldb_Language_h_ // C Includes // C++ Includes #include #include #include #include // Other libraries and framework includes // Project includes #include "lldb/lldb-public.h" #include "lldb/lldb-private.h" #include "lldb/Core/PluginInterface.h" #include "lldb/DataFormatters/DumpValueObjectOptions.h" #include "lldb/DataFormatters/FormatClasses.h" #include "lldb/DataFormatters/StringPrinter.h" namespace lldb_private { class Language : public PluginInterface { public: class TypeScavenger { public: class Result { public: virtual bool IsValid () = 0; virtual bool DumpToStream (Stream& stream, bool print_help_if_available) = 0; virtual ~Result() = default; }; typedef std::set> ResultSet; virtual ~TypeScavenger () = default; size_t Find (ExecutionContextScope *exe_scope, const char *key, ResultSet &results, bool append = true); protected: TypeScavenger () = default; virtual bool Find_Impl (ExecutionContextScope *exe_scope, const char *key, ResultSet &results) = 0; }; enum class FunctionNameRepresentation { eName, eNameWithArgs, eNameWithNoArgs }; ~Language() override; static Language* FindPlugin (lldb::LanguageType language); // return false from callback to stop iterating static void ForEach (std::function callback); virtual lldb::LanguageType GetLanguageType () const = 0; virtual bool IsTopLevelFunction (Function& function); virtual lldb::TypeCategoryImplSP GetFormatters (); virtual HardcodedFormatters::HardcodedFormatFinder GetHardcodedFormats (); virtual HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries (); virtual HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics (); virtual HardcodedFormatters::HardcodedValidatorFinder GetHardcodedValidators (); virtual std::vector GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic); virtual lldb_private::formatters::StringPrinter::EscapingHelper GetStringPrinterEscapingHelper (lldb_private::formatters::StringPrinter::GetPrintableElementType); virtual std::unique_ptr GetTypeScavenger (); // if an individual data formatter can apply to several types and cross a language boundary // it makes sense for individual languages to want to customize the printing of values of that // type by appending proper prefix/suffix information in language-specific ways virtual bool GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint, std::string& prefix, std::string& suffix); // if a language has a custom format for printing variable declarations that it wants LLDB to honor // it should return an appropriate closure here virtual DumpValueObjectOptions::DeclPrintingHelper GetDeclPrintingHelper (); virtual LazyBool IsLogicalTrue (ValueObject& valobj, Error& error); // for a ValueObject of some "reference type", if the value points to the // nil/null object, this method returns true virtual bool IsNilReference (ValueObject& valobj); // for a ValueObject of some "reference type", if the language provides a technique // to decide whether the reference has ever been assigned to some object, this method // will return true if such detection is possible, and if the reference has never been assigned virtual bool IsUninitializedReference (ValueObject& valobj); virtual bool GetFunctionDisplayName (const SymbolContext *sc, const ExecutionContext *exe_ctx, FunctionNameRepresentation representation, Stream& s); virtual void GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s); static void GetDefaultExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s); // These are accessors for general information about the Languages lldb knows about: static lldb::LanguageType GetLanguageTypeFromString (const char *string); static const char * GetNameForLanguageType (lldb::LanguageType language); static void PrintAllLanguages (Stream &s, const char *prefix, const char *suffix); // return false from callback to stop iterating static void ForAllLanguages (std::function callback); static bool LanguageIsCPlusPlus (lldb::LanguageType language); static bool LanguageIsObjC (lldb::LanguageType language); static bool LanguageIsC (lldb::LanguageType language); static bool LanguageIsPascal (lldb::LanguageType language); // return the primary language, so if LanguageIsC(l), return eLanguageTypeC, etc. static lldb::LanguageType GetPrimaryLanguage (lldb::LanguageType language); static void GetLanguagesSupportingTypeSystems (std::set &languages, std::set &languages_for_expressions); static void GetLanguagesSupportingREPLs (std::set &languages); protected: //------------------------------------------------------------------ // Classes that inherit from Language can see and modify these //------------------------------------------------------------------ Language(); private: DISALLOW_COPY_AND_ASSIGN (Language); }; } // namespace lldb_private #endif // liblldb_Language_h_