1dda28197Spatrick //===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===// 2dda28197Spatrick // 3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information. 5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dda28197Spatrick // 7dda28197Spatrick //===----------------------------------------------------------------------===// 8dda28197Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXTERNALASTSOURCECALLBACKS_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXTERNALASTSOURCECALLBACKS_H 11dda28197Spatrick 12dda28197Spatrick #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" 13dda28197Spatrick #include "clang/Basic/Module.h" 14*f6aab3d8Srobert #include <optional> 15dda28197Spatrick 16dda28197Spatrick namespace lldb_private { 17dda28197Spatrick 18dda28197Spatrick class ClangExternalASTSourceCallbacks : public clang::ExternalASTSource { 19dda28197Spatrick /// LLVM RTTI support. 20dda28197Spatrick static char ID; 21dda28197Spatrick 22dda28197Spatrick public: 23dda28197Spatrick /// LLVM RTTI support. isA(const void * ClassID)24dda28197Spatrick bool isA(const void *ClassID) const override { return ClassID == &ID; } classof(const clang::ExternalASTSource * s)25dda28197Spatrick static bool classof(const clang::ExternalASTSource *s) { return s->isA(&ID); } 26dda28197Spatrick ClangExternalASTSourceCallbacks(TypeSystemClang & ast)27dda28197Spatrick ClangExternalASTSourceCallbacks(TypeSystemClang &ast) : m_ast(ast) {} 28dda28197Spatrick 29dda28197Spatrick void FindExternalLexicalDecls( 30dda28197Spatrick const clang::DeclContext *DC, 31dda28197Spatrick llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant, 32dda28197Spatrick llvm::SmallVectorImpl<clang::Decl *> &Result) override; 33dda28197Spatrick 34dda28197Spatrick bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, 35dda28197Spatrick clang::DeclarationName Name) override; 36dda28197Spatrick 37dda28197Spatrick void CompleteType(clang::TagDecl *tag_decl) override; 38dda28197Spatrick 39dda28197Spatrick void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override; 40dda28197Spatrick 41dda28197Spatrick bool layoutRecordType( 42dda28197Spatrick const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, 43dda28197Spatrick llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets, 44dda28197Spatrick llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 45dda28197Spatrick &BaseOffsets, 46dda28197Spatrick llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 47dda28197Spatrick &VirtualBaseOffsets) override; 48dda28197Spatrick GetTypeSystem()49dda28197Spatrick TypeSystemClang &GetTypeSystem() const { return m_ast; } 50dda28197Spatrick 51dda28197Spatrick /// Module-related methods. 52dda28197Spatrick /// \{ 53*f6aab3d8Srobert std::optional<clang::ASTSourceDescriptor> 54dda28197Spatrick getSourceDescriptor(unsigned ID) override; 55dda28197Spatrick clang::Module *getModule(unsigned ID) override; 56dda28197Spatrick OptionalClangModuleID RegisterModule(clang::Module *module); 57dda28197Spatrick OptionalClangModuleID GetIDForModule(clang::Module *module); 58dda28197Spatrick /// \} 59dda28197Spatrick private: 60dda28197Spatrick TypeSystemClang &m_ast; 61dda28197Spatrick std::vector<clang::Module *> m_modules; 62dda28197Spatrick llvm::DenseMap<clang::Module *, unsigned> m_ids; 63dda28197Spatrick }; 64dda28197Spatrick 65dda28197Spatrick } // namespace lldb_private 66dda28197Spatrick 67dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXTERNALASTSOURCECALLBACKS_H 68