CPlusPlusLanguage.h revision 360784
1218885Sdim//===-- CPlusPlusLanguage.h -------------------------------------*- C++ -*-===//
2218885Sdim//
3218885Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4218885Sdim// See https://llvm.org/LICENSE.txt for license information.
5218885Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6218885Sdim//
7218885Sdim//===----------------------------------------------------------------------===//
8218885Sdim
9218885Sdim#ifndef liblldb_CPlusPlusLanguage_h_
10218885Sdim#define liblldb_CPlusPlusLanguage_h_
11218885Sdim
12218885Sdim#include <set>
13218885Sdim#include <vector>
14218885Sdim
15218885Sdim#include "llvm/ADT/StringRef.h"
16218885Sdim
17218885Sdim#include "Plugins/Language/ClangCommon/ClangHighlighter.h"
18218885Sdim#include "lldb/Target/Language.h"
19218885Sdim#include "lldb/Utility/ConstString.h"
20218885Sdim#include "lldb/lldb-private.h"
21218885Sdim
22218885Sdimnamespace lldb_private {
23218885Sdim
24218885Sdimclass CPlusPlusLanguage : public Language {
25218885Sdim  ClangHighlighter m_highlighter;
26218885Sdim
27218885Sdimpublic:
28218885Sdim  class MethodName {
29218885Sdim  public:
30218885Sdim    MethodName()
31218885Sdim        : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers(),
32218885Sdim          m_parsed(false), m_parse_error(false) {}
33218885Sdim
34218885Sdim    MethodName(ConstString s)
35218885Sdim        : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(),
36218885Sdim          m_parsed(false), m_parse_error(false) {}
37218885Sdim
38218885Sdim    void Clear();
39218885Sdim
40218885Sdim    bool IsValid() {
41218885Sdim      if (!m_parsed)
42218885Sdim        Parse();
43218885Sdim      if (m_parse_error)
44218885Sdim        return false;
45218885Sdim      return (bool)m_full;
46218885Sdim    }
47218885Sdim
48218885Sdim    ConstString GetFullName() const { return m_full; }
49218885Sdim
50218885Sdim    std::string GetScopeQualifiedName();
51218885Sdim
52218885Sdim    llvm::StringRef GetBasename();
53218885Sdim
54218885Sdim    llvm::StringRef GetContext();
55218885Sdim
56218885Sdim    llvm::StringRef GetArguments();
57218885Sdim
58218885Sdim    llvm::StringRef GetQualifiers();
59218885Sdim
60218885Sdim  protected:
61218885Sdim    void Parse();
62218885Sdim    bool TrySimplifiedParse();
63218885Sdim
64218885Sdim    ConstString m_full; // Full name:
65218885Sdim                        // "lldb::SBTarget::GetBreakpointAtIndex(unsigned int)
66218885Sdim                        // const"
67218885Sdim    llvm::StringRef m_basename;   // Basename:     "GetBreakpointAtIndex"
68218885Sdim    llvm::StringRef m_context;    // Decl context: "lldb::SBTarget"
69218885Sdim    llvm::StringRef m_arguments;  // Arguments:    "(unsigned int)"
70218885Sdim    llvm::StringRef m_qualifiers; // Qualifiers:   "const"
71218885Sdim    bool m_parsed;
72218885Sdim    bool m_parse_error;
73218885Sdim  };
74218885Sdim
75218885Sdim  CPlusPlusLanguage() = default;
76218885Sdim
77218885Sdim  ~CPlusPlusLanguage() override = default;
78218885Sdim
79218885Sdim  lldb::LanguageType GetLanguageType() const override {
80218885Sdim    return lldb::eLanguageTypeC_plus_plus;
81218885Sdim  }
82218885Sdim
83218885Sdim  std::unique_ptr<TypeScavenger> GetTypeScavenger() override;
84218885Sdim  lldb::TypeCategoryImplSP GetFormatters() override;
85218885Sdim
86218885Sdim  HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override;
87218885Sdim
88218885Sdim  HardcodedFormatters::HardcodedSyntheticFinder
89218885Sdim  GetHardcodedSynthetics() override;
90218885Sdim
91218885Sdim  bool IsSourceFile(llvm::StringRef file_path) const override;
92218885Sdim
93218885Sdim  const Highlighter *GetHighlighter() const override { return &m_highlighter; }
94218885Sdim
95218885Sdim  // Static Functions
96218885Sdim  static void Initialize();
97218885Sdim
98218885Sdim  static void Terminate();
99218885Sdim
100218885Sdim  static lldb_private::Language *CreateInstance(lldb::LanguageType language);
101218885Sdim
102249423Sdim  static lldb_private::ConstString GetPluginNameStatic();
103218885Sdim
104218885Sdim  static bool IsCPPMangledName(llvm::StringRef name);
105218885Sdim
106218885Sdim  // Extract C++ context and identifier from a string using heuristic matching
107218885Sdim  // (as opposed to
108218885Sdim  // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name
109218885Sdim  // with parens and arguments.
110218885Sdim  // If the name is a lone C identifier (e.g. C) or a qualified C identifier
111218885Sdim  // (e.g. A::B::C) it will return true,
112218885Sdim  // and identifier will be the identifier (C and C respectively) and the
113218885Sdim  // context will be "" and "A::B" respectively.
114218885Sdim  // If the name fails the heuristic matching for a qualified or unqualified
115218885Sdim  // C/C++ identifier, then it will return false
116218885Sdim  // and identifier and context will be unchanged.
117218885Sdim
118218885Sdim  static bool ExtractContextAndIdentifier(const char *name,
119218885Sdim                                          llvm::StringRef &context,
120218885Sdim                                          llvm::StringRef &identifier);
121218885Sdim
122218885Sdim  // Given a mangled function name, calculates some alternative manglings since
123218885Sdim  // the compiler mangling may not line up with the symbol we are expecting
124218885Sdim  static uint32_t
125218885Sdim  FindAlternateFunctionManglings(const ConstString mangled,
126218885Sdim                                 std::set<ConstString> &candidates);
127218885Sdim
128218885Sdim  // PluginInterface protocol
129218885Sdim  ConstString GetPluginName() override;
130218885Sdim
131218885Sdim  uint32_t GetPluginVersion() override;
132218885Sdim};
133218885Sdim
134218885Sdim} // namespace lldb_private
135218885Sdim
136218885Sdim#endif // liblldb_CPlusPlusLanguage_h_
137218885Sdim