xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- ClangExternalASTSourceCallbacks.cpp -------------------------------===//
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 #include "Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h"
10dda28197Spatrick #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
11dda28197Spatrick 
12dda28197Spatrick #include "clang/AST/Decl.h"
13dda28197Spatrick #include "clang/AST/DeclObjC.h"
14*f6aab3d8Srobert #include <optional>
15dda28197Spatrick 
16dda28197Spatrick using namespace lldb_private;
17dda28197Spatrick 
18dda28197Spatrick char ClangExternalASTSourceCallbacks::ID;
19dda28197Spatrick 
CompleteType(clang::TagDecl * tag_decl)20dda28197Spatrick void ClangExternalASTSourceCallbacks::CompleteType(clang::TagDecl *tag_decl) {
21dda28197Spatrick   m_ast.CompleteTagDecl(tag_decl);
22dda28197Spatrick }
23dda28197Spatrick 
CompleteType(clang::ObjCInterfaceDecl * objc_decl)24dda28197Spatrick void ClangExternalASTSourceCallbacks::CompleteType(
25dda28197Spatrick     clang::ObjCInterfaceDecl *objc_decl) {
26dda28197Spatrick   m_ast.CompleteObjCInterfaceDecl(objc_decl);
27dda28197Spatrick }
28dda28197Spatrick 
layoutRecordType(const clang::RecordDecl * Record,uint64_t & Size,uint64_t & Alignment,llvm::DenseMap<const clang::FieldDecl *,uint64_t> & FieldOffsets,llvm::DenseMap<const clang::CXXRecordDecl *,clang::CharUnits> & BaseOffsets,llvm::DenseMap<const clang::CXXRecordDecl *,clang::CharUnits> & VirtualBaseOffsets)29dda28197Spatrick bool ClangExternalASTSourceCallbacks::layoutRecordType(
30dda28197Spatrick     const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
31dda28197Spatrick     llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
32dda28197Spatrick     llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
33dda28197Spatrick     llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
34dda28197Spatrick         &VirtualBaseOffsets) {
35dda28197Spatrick   return m_ast.LayoutRecordType(Record, Size, Alignment, FieldOffsets,
36dda28197Spatrick                                 BaseOffsets, VirtualBaseOffsets);
37dda28197Spatrick }
38dda28197Spatrick 
FindExternalLexicalDecls(const clang::DeclContext * decl_ctx,llvm::function_ref<bool (clang::Decl::Kind)> IsKindWeWant,llvm::SmallVectorImpl<clang::Decl * > & decls)39dda28197Spatrick void ClangExternalASTSourceCallbacks::FindExternalLexicalDecls(
40dda28197Spatrick     const clang::DeclContext *decl_ctx,
41dda28197Spatrick     llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
42dda28197Spatrick     llvm::SmallVectorImpl<clang::Decl *> &decls) {
43dda28197Spatrick   if (decl_ctx) {
44dda28197Spatrick     clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(
45dda28197Spatrick         const_cast<clang::DeclContext *>(decl_ctx));
46dda28197Spatrick     if (tag_decl)
47dda28197Spatrick       CompleteType(tag_decl);
48dda28197Spatrick   }
49dda28197Spatrick }
50dda28197Spatrick 
FindExternalVisibleDeclsByName(const clang::DeclContext * DC,clang::DeclarationName Name)51dda28197Spatrick bool ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(
52dda28197Spatrick     const clang::DeclContext *DC, clang::DeclarationName Name) {
53dda28197Spatrick   llvm::SmallVector<clang::NamedDecl *, 4> decls;
54dda28197Spatrick   // Objective-C methods are not added into the LookupPtr when they originate
55dda28197Spatrick   // from an external source. SetExternalVisibleDeclsForName() adds them.
56dda28197Spatrick   if (auto *oid = llvm::dyn_cast<clang::ObjCInterfaceDecl>(DC)) {
57dda28197Spatrick     clang::ObjCContainerDecl::method_range noload_methods(oid->noload_decls());
58dda28197Spatrick     for (auto *omd : noload_methods)
59dda28197Spatrick       if (omd->getDeclName() == Name)
60dda28197Spatrick         decls.push_back(omd);
61dda28197Spatrick   }
62dda28197Spatrick   return !SetExternalVisibleDeclsForName(DC, Name, decls).empty();
63dda28197Spatrick }
64dda28197Spatrick 
65dda28197Spatrick OptionalClangModuleID
RegisterModule(clang::Module * module)66dda28197Spatrick ClangExternalASTSourceCallbacks::RegisterModule(clang::Module *module) {
67dda28197Spatrick   m_modules.push_back(module);
68dda28197Spatrick   unsigned id = m_modules.size();
69dda28197Spatrick   m_ids.insert({module, id});
70dda28197Spatrick   return OptionalClangModuleID(id);
71dda28197Spatrick }
72dda28197Spatrick 
73*f6aab3d8Srobert std::optional<clang::ASTSourceDescriptor>
getSourceDescriptor(unsigned id)74dda28197Spatrick ClangExternalASTSourceCallbacks::getSourceDescriptor(unsigned id) {
75dda28197Spatrick   if (clang::Module *module = getModule(id))
76dda28197Spatrick     return {*module};
77dda28197Spatrick   return {};
78dda28197Spatrick }
79dda28197Spatrick 
getModule(unsigned id)80dda28197Spatrick clang::Module *ClangExternalASTSourceCallbacks::getModule(unsigned id) {
81dda28197Spatrick   if (id && id <= m_modules.size())
82dda28197Spatrick     return m_modules[id - 1];
83dda28197Spatrick   return nullptr;
84dda28197Spatrick }
85dda28197Spatrick 
86dda28197Spatrick OptionalClangModuleID
GetIDForModule(clang::Module * module)87dda28197Spatrick ClangExternalASTSourceCallbacks::GetIDForModule(clang::Module *module) {
88dda28197Spatrick   return OptionalClangModuleID(m_ids[module]);
89dda28197Spatrick }
90