blob: 710568058f5feacd4da453ca33ce2047109447de [file] [log] [blame]
//===- IndexingContext.h - Higher level API functions ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "Index_Internal.h"
#include "CXCursor.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclGroup.h"
#include "llvm/ADT/DenseMap.h"
namespace clang {
class FileEntry;
class ObjCPropertyDecl;
namespace cxindex {
class IndexingContext;
class IndexingContext {
ASTContext *Ctx;
CXClientData ClientData;
IndexerCallbacks &CB;
unsigned IndexOptions;
CXTranslationUnit CXTU;
typedef llvm::DenseMap<const FileEntry *, CXIdxFile> FileMapTy;
typedef llvm::DenseMap<const NamedDecl *, CXIdxEntity> EntityMapTy;
typedef llvm::DenseMap<const void *, CXIdxMacro> MacroMapTy;
typedef llvm::DenseMap<const DeclContext *, CXIdxContainer> ContainerMapTy;
FileMapTy FileMap;
EntityMapTy EntityMap;
MacroMapTy MacroMap;
ContainerMapTy ContainerMap;
SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
llvm::SmallString<256> StrScratch;
class StrAdapter {
llvm::SmallString<256> &Scratch;
public:
StrAdapter(IndexingContext *indexCtx)
: Scratch(indexCtx->StrScratch) {}
~StrAdapter() { Scratch.clear(); }
const char *toCStr(StringRef Str);
unsigned getCurSize() const { return Scratch.size(); }
const char *getCStr(unsigned CharIndex) {
Scratch.push_back('\0');
return Scratch.data() + CharIndex;
}
SmallVectorImpl<char> &getBuffer() { return Scratch; }
};
public:
IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
unsigned indexOptions, CXTranslationUnit cxTU)
: Ctx(0), ClientData(clientData), CB(indexCallbacks),
IndexOptions(indexOptions), CXTU(cxTU) { }
ASTContext &getASTContext() const { return *Ctx; }
void setASTContext(ASTContext &ctx);
void ppIncludedFile(SourceLocation hashLoc,
StringRef filename, const FileEntry *File,
bool isImport, bool isAngled);
void ppMacroDefined(SourceLocation Loc, StringRef Name,
SourceLocation DefBegin, unsigned Length,
const void *OpaqueMacro);
void ppMacroUndefined(SourceLocation Loc, StringRef Name,
const void *OpaqueMacro);
void ppMacroExpanded(SourceLocation Loc, StringRef Name,
const void *OpaqueMacro);
void invokeStartedTranslationUnit();
void invokeFinishedTranslationUnit();
void indexDecl(const Decl *D);
void indexTagDecl(const TagDecl *D);
void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
const DeclContext *DC = 0);
void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
const DeclContext *DC);
void indexDeclContext(const DeclContext *DC);
void indexBody(const Stmt *S, const DeclContext *DC);
void handleDiagnostic(const StoredDiagnostic &StoredDiag);
void handleFunction(const FunctionDecl *FD);
void handleVar(const VarDecl *D);
void handleField(const FieldDecl *D);
void handleEnumerator(const EnumConstantDecl *D);
void handleTagDecl(const TagDecl *D);
void handleTypedef(const TypedefDecl *D);
void handleObjCInterface(const ObjCInterfaceDecl *D);
void defineObjCInterface(const ObjCInterfaceDecl *D);
void handleObjCProtocol(const ObjCProtocolDecl *D);
void handleObjCCategory(const ObjCCategoryDecl *D);
void handleObjCMethod(const ObjCMethodDecl *D);
void handleObjCProperty(const ObjCPropertyDecl *D);
void handleReference(const NamedDecl *D, SourceLocation Loc,
const NamedDecl *Parent,
const DeclContext *DC,
const Expr *E = 0);
void invokeStartedTagTypeDefinition(const TagDecl *D);
void invokeStartedStatementBody(const NamedDecl *D, const DeclContext *DC);
void invokeStartedObjCContainer(const ObjCContainerDecl *D);
void invokeEndedContainer(const DeclContext *DC);
bool isNotFromSourceFile(SourceLocation Loc) const;
void indexTUDeclsInObjCContainer();
void indexDeclGroupRef(DeclGroupRef DG);
void addTUDeclInObjCContainer(DeclGroupRef DG) {
TUDeclsInObjCContainer.push_back(DG);
}
void translateLoc(SourceLocation Loc, CXIdxFile *indexFile, CXFile *file,
unsigned *line, unsigned *column, unsigned *offset);
private:
void addEntityInMap(const NamedDecl *D, CXIdxEntity entity);
void addContainerInMap(const DeclContext *DC, CXIdxContainer container);
CXIdxEntity getIndexEntity(const NamedDecl *D);
const NamedDecl *getEntityDecl(const NamedDecl *D) const;
CXIdxContainer getIndexContainer(const NamedDecl *D) const {
return getIndexContainerForDC(D->getDeclContext());
}
const DeclContext *getScopedContext(const DeclContext *DC) const;
CXIdxContainer getIndexContainerForDC(const DeclContext *DC) const;
CXIdxFile getIndexFile(const FileEntry *File);
CXIdxLoc getIndexLoc(SourceLocation Loc) const;
void getIndexedEntityInfo(const NamedDecl *D,
CXIdxIndexedEntityInfo &IdxEntityInfo,
CXIdxEntityInfo &EntityInfo,
CXIdxIndexedDeclInfo &IdxDeclInfo,
StrAdapter &SA);
void getIndexedDeclInfo(const NamedDecl *D,
CXIdxIndexedDeclInfo &IdxDeclInfo);
void getIndexedRedeclInfo(const NamedDecl *D,
CXIdxIndexedRedeclInfo &RedeclInfo,
CXIdxIndexedDeclInfo &IdxDeclInfo);
void getContainerInfo(const NamedDecl *D,
CXIdxContainerInfo &ContainerInfo);
void getEntityInfo(const NamedDecl *D,
CXIdxEntityInfo &EntityInfo,
StrAdapter &SA);
CXCursor getCursor(const NamedDecl *D) {
return cxcursor::MakeCXCursor(const_cast<NamedDecl*>(D), CXTU);
}
CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
};
}} // end clang::cxindex