forked from OSchip/llvm-project
206 lines
6.2 KiB
C++
206 lines
6.2 KiB
C++
//===- 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,
|
|
CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
|
|
|
|
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
|