1061da546Spatrick //===-- CPlusPlusLanguage.h -------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSLANGUAGE_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSLANGUAGE_H 11061da546Spatrick 12061da546Spatrick #include <set> 13061da546Spatrick #include <vector> 14061da546Spatrick 15061da546Spatrick #include "llvm/ADT/StringRef.h" 16061da546Spatrick 17061da546Spatrick #include "Plugins/Language/ClangCommon/ClangHighlighter.h" 18061da546Spatrick #include "lldb/Target/Language.h" 19061da546Spatrick #include "lldb/Utility/ConstString.h" 20061da546Spatrick #include "lldb/lldb-private.h" 21061da546Spatrick 22061da546Spatrick namespace lldb_private { 23061da546Spatrick 24061da546Spatrick class CPlusPlusLanguage : public Language { 25061da546Spatrick ClangHighlighter m_highlighter; 26061da546Spatrick 27061da546Spatrick public: 28061da546Spatrick class MethodName { 29061da546Spatrick public: MethodName()30061da546Spatrick MethodName() 31be691f3bSpatrick : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers() {} 32061da546Spatrick MethodName(ConstString s)33061da546Spatrick MethodName(ConstString s) 34061da546Spatrick : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(), 35061da546Spatrick m_parsed(false), m_parse_error(false) {} 36061da546Spatrick 37061da546Spatrick void Clear(); 38061da546Spatrick IsValid()39061da546Spatrick bool IsValid() { 40061da546Spatrick if (!m_parsed) 41061da546Spatrick Parse(); 42061da546Spatrick if (m_parse_error) 43061da546Spatrick return false; 44061da546Spatrick return (bool)m_full; 45061da546Spatrick } 46061da546Spatrick GetFullName()47061da546Spatrick ConstString GetFullName() const { return m_full; } 48061da546Spatrick 49061da546Spatrick std::string GetScopeQualifiedName(); 50061da546Spatrick 51061da546Spatrick llvm::StringRef GetBasename(); 52061da546Spatrick 53061da546Spatrick llvm::StringRef GetContext(); 54061da546Spatrick 55061da546Spatrick llvm::StringRef GetArguments(); 56061da546Spatrick 57061da546Spatrick llvm::StringRef GetQualifiers(); 58061da546Spatrick 59*f6aab3d8Srobert /// Returns the methods return-type. 60*f6aab3d8Srobert /// 61*f6aab3d8Srobert /// Currently returns an empty llvm::StringRef 62*f6aab3d8Srobert /// if the return-type is a function pointer. 63*f6aab3d8Srobert llvm::StringRef GetReturnType(); 64*f6aab3d8Srobert 65*f6aab3d8Srobert bool ContainsPath(llvm::StringRef path); 66*f6aab3d8Srobert 67*f6aab3d8Srobert private: 68*f6aab3d8Srobert /// Returns the Basename of this method without a template parameter 69*f6aab3d8Srobert /// list, if any. 70*f6aab3d8Srobert /// 71*f6aab3d8Srobert // Examples: 72*f6aab3d8Srobert // 73*f6aab3d8Srobert // +--------------------------------+---------+ 74*f6aab3d8Srobert // | MethodName | Returns | 75*f6aab3d8Srobert // +--------------------------------+---------+ 76*f6aab3d8Srobert // | void func() | func | 77*f6aab3d8Srobert // | void func<int>() | func | 78*f6aab3d8Srobert // | void func<std::vector<int>>() | func | 79*f6aab3d8Srobert // +--------------------------------+---------+ 80*f6aab3d8Srobert llvm::StringRef GetBasenameNoTemplateParameters(); 81*f6aab3d8Srobert 82061da546Spatrick protected: 83061da546Spatrick void Parse(); 84061da546Spatrick bool TrySimplifiedParse(); 85061da546Spatrick 86061da546Spatrick ConstString m_full; // Full name: 87*f6aab3d8Srobert // "size_t lldb::SBTarget::GetBreakpointAtIndex(unsigned 88*f6aab3d8Srobert // int) const" 89061da546Spatrick llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex" 90061da546Spatrick llvm::StringRef m_context; // Decl context: "lldb::SBTarget" 91061da546Spatrick llvm::StringRef m_arguments; // Arguments: "(unsigned int)" 92061da546Spatrick llvm::StringRef m_qualifiers; // Qualifiers: "const" 93*f6aab3d8Srobert llvm::StringRef m_return_type; // Return type: "size_t" 94be691f3bSpatrick bool m_parsed = false; 95be691f3bSpatrick bool m_parse_error = false; 96061da546Spatrick }; 97061da546Spatrick 98061da546Spatrick CPlusPlusLanguage() = default; 99061da546Spatrick 100061da546Spatrick ~CPlusPlusLanguage() override = default; 101061da546Spatrick GetLanguageType()102061da546Spatrick lldb::LanguageType GetLanguageType() const override { 103061da546Spatrick return lldb::eLanguageTypeC_plus_plus; 104061da546Spatrick } 105061da546Spatrick 106061da546Spatrick std::unique_ptr<TypeScavenger> GetTypeScavenger() override; 107061da546Spatrick lldb::TypeCategoryImplSP GetFormatters() override; 108061da546Spatrick 109061da546Spatrick HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; 110061da546Spatrick 111061da546Spatrick HardcodedFormatters::HardcodedSyntheticFinder 112061da546Spatrick GetHardcodedSynthetics() override; 113061da546Spatrick 114be691f3bSpatrick bool IsNilReference(ValueObject &valobj) override; 115be691f3bSpatrick GetNilReferenceSummaryString()116be691f3bSpatrick llvm::StringRef GetNilReferenceSummaryString() override { return "nullptr"; } 117be691f3bSpatrick 118061da546Spatrick bool IsSourceFile(llvm::StringRef file_path) const override; 119061da546Spatrick GetHighlighter()120061da546Spatrick const Highlighter *GetHighlighter() const override { return &m_highlighter; } 121061da546Spatrick 122061da546Spatrick // Static Functions 123061da546Spatrick static void Initialize(); 124061da546Spatrick 125061da546Spatrick static void Terminate(); 126061da546Spatrick 127061da546Spatrick static lldb_private::Language *CreateInstance(lldb::LanguageType language); 128061da546Spatrick GetPluginNameStatic()129*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "cplusplus"; } 130061da546Spatrick 131be691f3bSpatrick bool SymbolNameFitsToLanguage(Mangled mangled) const override; 132be691f3bSpatrick 133*f6aab3d8Srobert bool DemangledNameContainsPath(llvm::StringRef path, 134*f6aab3d8Srobert ConstString demangled) const override; 135*f6aab3d8Srobert 136*f6aab3d8Srobert ConstString 137*f6aab3d8Srobert GetDemangledFunctionNameWithoutArguments(Mangled mangled) const override; 138*f6aab3d8Srobert 139*f6aab3d8Srobert bool GetFunctionDisplayName(const SymbolContext *sc, 140*f6aab3d8Srobert const ExecutionContext *exe_ctx, 141*f6aab3d8Srobert FunctionNameRepresentation representation, 142*f6aab3d8Srobert Stream &s) override; 143*f6aab3d8Srobert 144061da546Spatrick static bool IsCPPMangledName(llvm::StringRef name); 145061da546Spatrick 146061da546Spatrick // Extract C++ context and identifier from a string using heuristic matching 147061da546Spatrick // (as opposed to 148061da546Spatrick // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name 149061da546Spatrick // with parens and arguments. 150061da546Spatrick // If the name is a lone C identifier (e.g. C) or a qualified C identifier 151061da546Spatrick // (e.g. A::B::C) it will return true, 152061da546Spatrick // and identifier will be the identifier (C and C respectively) and the 153061da546Spatrick // context will be "" and "A::B" respectively. 154061da546Spatrick // If the name fails the heuristic matching for a qualified or unqualified 155061da546Spatrick // C/C++ identifier, then it will return false 156061da546Spatrick // and identifier and context will be unchanged. 157061da546Spatrick 158061da546Spatrick static bool ExtractContextAndIdentifier(const char *name, 159061da546Spatrick llvm::StringRef &context, 160061da546Spatrick llvm::StringRef &identifier); 161061da546Spatrick 162*f6aab3d8Srobert std::vector<ConstString> 163*f6aab3d8Srobert GenerateAlternateFunctionManglings(const ConstString mangled) const override; 164*f6aab3d8Srobert 165*f6aab3d8Srobert ConstString FindBestAlternateFunctionMangledName( 166*f6aab3d8Srobert const Mangled mangled, const SymbolContext &sym_ctx) const override; 167061da546Spatrick 168061da546Spatrick // PluginInterface protocol GetPluginName()169*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 170061da546Spatrick }; 171061da546Spatrick 172061da546Spatrick } // namespace lldb_private 173061da546Spatrick 174dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSLANGUAGE_H 175