From 948062a592f9153dece886165e7c9365fa13715f Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 21 Sep 2009 03:03:22 +0000 Subject: [PATCH] Add Diagnostic to Indexer, and have it keep its own FileManager instead of taking an external reference (which was leaked in the case of the CIndex library). llvm-svn: 82429 --- clang/include/clang/Index/Indexer.h | 15 +++++++++++---- clang/tools/CIndex/CIndex.cpp | 3 ++- clang/tools/index-test/index-test.cpp | 11 +++++------ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Index/Indexer.h b/clang/include/clang/Index/Indexer.h index 7bb48f2b757a..8b1d2dd38bff 100644 --- a/clang/include/clang/Index/Indexer.h +++ b/clang/include/clang/Index/Indexer.h @@ -14,6 +14,7 @@ #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" @@ -37,12 +38,16 @@ public: typedef std::map MapTy; typedef std::map 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); @@ -54,7 +59,9 @@ public: private: Program &Prog; - FileManager &FileMgr; + TextDiagnosticBuffer DiagClient; + Diagnostic Diags; + FileManager FileMgr; MapTy Map; CtxTUMapTy CtxTUMap; diff --git a/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp index b2fca60a6f7c..55bcd9330ada 100644 --- a/clang/tools/CIndex/CIndex.cpp +++ b/clang/tools/CIndex/CIndex.cpp @@ -187,7 +187,8 @@ extern "C" { CXIndex clang_createIndex() { - return new Indexer(*new Program(), *new FileManager()); + // FIXME: Program is leaked. + return new Indexer(*new Program()); } void clang_disposeIndex(CXIndex CIdx) diff --git a/clang/tools/index-test/index-test.cpp b/clang/tools/index-test/index-test.cpp index 2010434b7b51..a0546bfcd8e3 100644 --- a/clang/tools/index-test/index-test.cpp +++ b/clang/tools/index-test/index-test.cpp @@ -211,10 +211,8 @@ int main(int argc, char **argv) { 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 TUnits; // If no input was specified, read from stdin. @@ -227,7 +225,8 @@ int main(int argc, char **argv) { std::string ErrMsg; llvm::OwningPtr 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; @@ -245,7 +244,7 @@ int main(int argc, char **argv) { 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; @@ -254,7 +253,7 @@ int main(int argc, char **argv) { // 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 "