#ifndef LLVM_CLANG_INDEX_INDEXER_H
#define LLVM_CLANG_INDEX_INDEXER_H
+#include "clang/Frontend/TextDiagnosticBuffer.h"
#include "clang/Index/IndexProvider.h"
#include "clang/Index/Entity.h"
#include "clang/Index/GlobalSelector.h"
typedef std::map<Entity, TUSetTy> MapTy;
typedef std::map<GlobalSelector, TUSetTy> SelMapTy;
- explicit Indexer(Program &prog, FileManager &FM) :
- Prog(prog), FileMgr(FM) { }
+ explicit Indexer(Program &prog) :
+ Prog(prog), Diags(&DiagClient) { }
Program &getProgram() const { return Prog; }
- FileManager &getFileManager() const { return FileMgr; }
+ Diagnostic &getDiagnostics() { return Diags; }
+ const Diagnostic &getDiagnostics() const { return Diags; }
+
+ FileManager &getFileManager() { return FileMgr; }
+ const FileManager &getFileManager() const { return FileMgr; }
/// \brief Find all Entities and map them to the given translation unit.
void IndexAST(TranslationUnit *TU);
private:
Program &Prog;
- FileManager &FileMgr;
+ TextDiagnosticBuffer DiagClient;
+ Diagnostic Diags;
+ FileManager FileMgr;
MapTy Map;
CtxTUMapTy CtxTUMap;
CXIndex clang_createIndex()
{
- return new Indexer(*new Program(), *new FileManager());
+ // FIXME: Program is leaked.
+ return new Indexer(*new Program());
}
void clang_disposeIndex(CXIndex CIdx)
llvm::cl::ParseCommandLineOptions(argc, argv,
"LLVM 'Clang' Indexing Test Bed: http://clang.llvm.org\n");
- FileManager FileMgr;
-
Program Prog;
- Indexer Idxer(Prog, FileMgr);
+ Indexer Idxer(Prog);
llvm::SmallVector<TUnit*, 4> TUnits;
// If no input was specified, read from stdin.
std::string ErrMsg;
llvm::OwningPtr<ASTUnit> AST;
- AST.reset(ASTUnit::LoadFromPCHFile(InFile, FileMgr, &ErrMsg));
+ AST.reset(ASTUnit::LoadFromPCHFile(InFile, Idxer.getFileManager(),
+ &ErrMsg));
if (!AST) {
llvm::errs() << "[" << InFile << "] Error: " << ErrMsg << '\n';
return 1;
if (!PointAtLocation.empty()) {
const std::string &Filename = PointAtLocation[0].FileName;
- const FileEntry *File = FileMgr.getFile(Filename);
+ const FileEntry *File = Idxer.getFileManager().getFile(Filename);
if (File == 0) {
llvm::errs() << "File '" << Filename << "' does not exist\n";
return 1;
// Safety check. Using an out-of-date AST file will only lead to crashes
// or incorrect results.
// FIXME: Check all the source files that make up the AST file.
- const FileEntry *ASTFile = FileMgr.getFile(FirstFile);
+ const FileEntry *ASTFile = Idxer.getFileManager().getFile(FirstFile);
if (File->getModificationTime() > ASTFile->getModificationTime()) {
llvm::errs() << "[" << FirstFile << "] Error: " <<
"Pointing at a source file which was modified after creating "