blob: a840ad99a2edef24f0f3262f899db778013b006c [file] [log] [blame]
//===-- ClangASTSource.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_ClangASTSource_h_
#define liblldb_ClangASTSource_h_
#include <set>
#include "clang/Basic/IdentifierTable.h"
#include "clang/AST/ExternalASTSource.h"
namespace lldb_private {
class ClangExpressionDeclMap;
//----------------------------------------------------------------------
/// @class ClangASTSource ClangASTSource.h "lldb/Expression/ClangASTSource.h"
/// @brief Provider for named objects defined in the debug info for Clang
///
/// As Clang parses an expression, it may encounter names that are not
/// defined inside the expression, including variables, functions, and
/// types. Clang knows the name it is looking for, but nothing else.
/// The ExternalSemaSource class provides Decls (VarDecl, FunDecl, TypeDecl)
/// to Clang for these names, consulting the ClangExpressionDeclMap to do
/// the actual lookups.
//----------------------------------------------------------------------
class ClangASTSource : public clang::ExternalASTSource
{
public:
//------------------------------------------------------------------
/// Constructor
///
/// Initializes class variabes.
///
/// @param[in] context
/// A reference to the AST context provided by the parser.
///
/// @param[in] declMap
/// A reference to the LLDB object that handles entity lookup.
//------------------------------------------------------------------
ClangASTSource (clang::ASTContext &context,
ClangExpressionDeclMap &decl_map) :
m_ast_context (context),
m_decl_map (decl_map),
m_active_lookups ()
{
}
//------------------------------------------------------------------
/// Destructor
//------------------------------------------------------------------
~ClangASTSource();
//------------------------------------------------------------------
/// Interface stub that returns NULL.
//------------------------------------------------------------------
virtual clang::Decl *
GetExternalDecl(uint32_t)
{
// These are only required for AST source that want to lazily load
// the declarations (or parts thereof) that they return.
return NULL;
}
//------------------------------------------------------------------
/// Interface stub that returns NULL.
//------------------------------------------------------------------
virtual clang::Stmt *
GetExternalDeclStmt(uint64_t)
{
// These are only required for AST source that want to lazily load
// the declarations (or parts thereof) that they return.
return NULL;
}
//------------------------------------------------------------------
/// Interface stub that returns an undifferentiated Selector.
//------------------------------------------------------------------
virtual clang::Selector
GetExternalSelector(uint32_t)
{
// These are also optional, although it might help with ObjC
// debugging if we have respectable signatures. But a more
// efficient interface (that didn't require scanning all files
// for method signatures!) might help.
return clang::Selector();
}
//------------------------------------------------------------------
/// Interface stub that returns 0.
//------------------------------------------------------------------
virtual uint32_t
GetNumExternalSelectors()
{
// These are also optional, although it might help with ObjC
// debugging if we have respectable signatures. But a more
// efficient interface (that didn't require scanning all files
// for method signatures!) might help.
return 0;
}
//------------------------------------------------------------------
/// Interface stub that returns NULL.
//------------------------------------------------------------------
virtual clang::CXXBaseSpecifier *
GetExternalCXXBaseSpecifiers(uint64_t Offset)
{
return NULL;
}
//------------------------------------------------------------------
/// Look up all Decls that match a particular name. Only handles
/// Identifiers. Passes the request on to DeclMap, and calls
/// SetExternalVisibleDeclsForName with the result.
///
/// @param[in] DC
/// The DeclContext to register the found Decls in.
///
/// @param[in] Name
/// The name to find entries for.
///
/// @return
/// Whatever SetExternalVisibleDeclsForName returns.
//------------------------------------------------------------------
virtual clang::DeclContextLookupResult
FindExternalVisibleDeclsByName (const clang::DeclContext *DC,
clang::DeclarationName Name);
//------------------------------------------------------------------
/// Interface stub.
//------------------------------------------------------------------
virtual void
MaterializeVisibleDecls (const clang::DeclContext *DC);
//------------------------------------------------------------------
/// Interface stub that returns true.
//------------------------------------------------------------------
virtual bool
FindExternalLexicalDecls (const clang::DeclContext *DC,
bool (*isKindWeWant)(clang::Decl::Kind),
llvm::SmallVectorImpl<clang::Decl*> &Decls);
virtual void
CompleteType (clang::TagDecl *Tag);
virtual void
CompleteType (clang::ObjCInterfaceDecl *Class);
//------------------------------------------------------------------
/// Called on entering a translation unit. Tells Clang by calling
/// setHasExternalVisibleStorage() and setHasExternalLexicalStorage()
/// that this object has something to say about undefined names.
///
/// @param[in] ASTConsumer
/// Unused.
//------------------------------------------------------------------
void StartTranslationUnit (clang::ASTConsumer *Consumer);
protected:
friend struct NameSearchContext;
clang::ASTContext &m_ast_context; ///< The parser's AST context, for copying types into
ClangExpressionDeclMap &m_decl_map; ///< The object that looks up named entities in LLDB
std::set<const char *> m_active_lookups;
};
//----------------------------------------------------------------------
/// @class NameSearchContext ClangASTSource.h "lldb/Expression/ClangASTSource.h"
/// @brief Container for all objects relevant to a single name lookup
///
/// LLDB needs to create Decls for entities it finds. This class communicates
/// what name is being searched for and provides helper functions to construct
/// Decls given appropriate type information.
//----------------------------------------------------------------------
struct NameSearchContext {
ClangASTSource &m_ast_source; ///< The AST source making the request
llvm::SmallVectorImpl<clang::NamedDecl*> &m_decls; ///< The list of declarations already constructed
const clang::DeclarationName &m_decl_name; ///< The name being looked for
const clang::DeclContext *m_decl_context; ///< The DeclContext to put declarations into
//------------------------------------------------------------------
/// Constructor
///
/// Initializes class variables.
///
/// @param[in] astSource
/// A reference to the AST source making a request.
///
/// @param[in] decls
/// A reference to a list into which new Decls will be placed. This
/// list is typically empty when the function is called.
///
/// @param[in] name
/// The name being searched for (always an Identifier).
///
/// @param[in] dc
/// The DeclContext to register Decls in.
//------------------------------------------------------------------
NameSearchContext (ClangASTSource &astSource,
llvm::SmallVectorImpl<clang::NamedDecl*> &decls,
clang::DeclarationName &name,
const clang::DeclContext *dc) :
m_ast_source(astSource),
m_decls(decls),
m_decl_name(name),
m_decl_context(dc) {}
//------------------------------------------------------------------
/// Return the AST context for the current search. Useful when copying
/// types.
//------------------------------------------------------------------
clang::ASTContext *GetASTContext();
//------------------------------------------------------------------
/// Create a VarDecl with the name being searched for and the provided
/// type and register it in the right places.
///
/// @param[in] type
/// The opaque QualType for the VarDecl being registered.
//------------------------------------------------------------------
clang::NamedDecl *AddVarDecl(void *type);
//------------------------------------------------------------------
/// Create a FunDecl with the name being searched for and the provided
/// type and register it in the right places.
///
/// @param[in] type
/// The opaque QualType for the FunDecl being registered.
//------------------------------------------------------------------
clang::NamedDecl *AddFunDecl(void *type);
//------------------------------------------------------------------
/// Create a FunDecl with the name being searched for and generic
/// type (i.e. intptr_t NAME_GOES_HERE(...)) and register it in the
/// right places.
//------------------------------------------------------------------
clang::NamedDecl *AddGenericFunDecl();
//------------------------------------------------------------------
/// Create a TypeDecl with the name being searched for and the provided
/// type and register it in the right places.
///
/// @param[in] type
/// The opaque QualType for the TypeDecl being registered.
//------------------------------------------------------------------
clang::NamedDecl *AddTypeDecl(void *type);
};
}
#endif