blob: a2d4f8137a0542a1498126c0a7b807a29ad746eb [file] [log] [blame]
//===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_ClangExternalASTSourceCallbacks_h_
#define liblldb_ClangExternalASTSourceCallbacks_h_
#include <stdint.h>
#include "clang/AST/CharUnits.h"
#include "llvm/ADT/DenseMap.h"
#include "lldb/Core/ClangForward.h"
#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
#include "lldb/Symbol/CompilerType.h"
#include "lldb/lldb-enumerations.h"
namespace lldb_private {
class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon {
public:
typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton,
clang::ObjCInterfaceDecl *);
typedef void (*FindExternalVisibleDeclsByNameCallback)(
void *baton, const clang::DeclContext *DC, clang::DeclarationName Name,
llvm::SmallVectorImpl<clang::NamedDecl *> *results);
typedef bool (*LayoutRecordTypeCallback)(
void *baton, 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);
ClangExternalASTSourceCallbacks(
CompleteTagDeclCallback tag_decl_callback,
CompleteObjCInterfaceDeclCallback objc_decl_callback,
FindExternalVisibleDeclsByNameCallback find_by_name_callback,
LayoutRecordTypeCallback layout_record_type_callback,
void *callback_baton)
: m_callback_tag_decl(tag_decl_callback),
m_callback_objc_decl(objc_decl_callback),
m_callback_find_by_name(find_by_name_callback),
m_callback_layout_record_type(layout_record_type_callback),
m_callback_baton(callback_baton) {}
// clang::ExternalASTSource
clang::Decl *GetExternalDecl(uint32_t ID) override {
// This method only needs to be implemented if the AST source ever passes
// back decl sets as VisibleDeclaration objects.
return nullptr;
}
clang::Stmt *GetExternalDeclStmt(uint64_t Offset) override {
// This operation is meant to be used via a LazyOffsetPtr. It only needs
// to be implemented if the AST source uses methods like
// FunctionDecl::setLazyBody when building decls.
return nullptr;
}
clang::Selector GetExternalSelector(uint32_t ID) override {
// This operation only needs to be implemented if the AST source returns
// non-zero for GetNumKnownSelectors().
return clang::Selector();
}
uint32_t GetNumExternalSelectors() override { return 0; }
clang::CXXBaseSpecifier *
GetExternalCXXBaseSpecifiers(uint64_t Offset) override {
return nullptr;
}
virtual void MaterializeVisibleDecls(const clang::DeclContext *decl_ctx) {}
void FindExternalLexicalDecls(
const clang::DeclContext *DC,
llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
llvm::SmallVectorImpl<clang::Decl *> &Result) override;
bool
FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx,
clang::DeclarationName decl_name) override;
void CompleteType(clang::TagDecl *tag_decl) override;
void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
bool 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) override;
void SetExternalSourceCallbacks(
CompleteTagDeclCallback tag_decl_callback,
CompleteObjCInterfaceDeclCallback objc_decl_callback,
FindExternalVisibleDeclsByNameCallback find_by_name_callback,
LayoutRecordTypeCallback layout_record_type_callback,
void *callback_baton) {
m_callback_tag_decl = tag_decl_callback;
m_callback_objc_decl = objc_decl_callback;
m_callback_find_by_name = find_by_name_callback;
m_callback_layout_record_type = layout_record_type_callback;
m_callback_baton = callback_baton;
}
void RemoveExternalSourceCallbacks(void *callback_baton) {
if (callback_baton == m_callback_baton) {
m_callback_tag_decl = nullptr;
m_callback_objc_decl = nullptr;
m_callback_find_by_name = nullptr;
m_callback_layout_record_type = nullptr;
}
}
protected:
// Classes that inherit from ClangExternalASTSourceCallbacks can see and
// modify these
CompleteTagDeclCallback m_callback_tag_decl;
CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
FindExternalVisibleDeclsByNameCallback m_callback_find_by_name;
LayoutRecordTypeCallback m_callback_layout_record_type;
void *m_callback_baton;
};
} // namespace lldb_private
#endif // liblldb_ClangExternalASTSourceCallbacks_h_