From fc0622155fa61349698a8fd0053773c37d9f7ac4 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 19 Oct 2009 21:44:57 +0000 Subject: [PATCH] The constructor for ASTUnit now takes a DiagnosticClient*, allowing uses of ASTUnit to specify alternate DiagnosticClients. To match this API, ASTUnit::LoadFromPCHFile() now takes a corresponding DiagnosticClient* argument as well. The DiagnosticClient object is destroyed when the ASTUnit object is destroyed. The CIndex library now uses this API to create a 'IgnoreDiagnosticsClient' that simply silences diagnostics when using the clang_createTranslationUnitFromSourceFile() function. This fixes . This API can change in the future as we add more flexibility for clients. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84539 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/ASTUnit.h | 7 +++++-- lib/Frontend/ASTUnit.cpp | 13 +++++++++---- tools/CIndex/CIndex.cpp | 12 +++++++++++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 9a0ede6ca3..9573777b5f 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -35,7 +35,6 @@ namespace clang { /// \brief Utility class for loading a ASTContext from a PCH file. /// class ASTUnit { - TextDiagnosticBuffer DiagClient; Diagnostic Diags; FileManager FileMgr; @@ -56,6 +55,7 @@ class ASTUnit { ASTUnit(); public: + ASTUnit(DiagnosticClient *diagClient = NULL); ~ASTUnit(); const SourceManager &getSourceManager() const { return SourceMgr; } @@ -84,7 +84,9 @@ public: /// /// \param Filename - The PCH file to load. /// - /// \param Diags - The Diagnostic implementation to use. + /// \param diagClient - The diagnostics client to use. Specify NULL + /// to use a default client that emits warnings/errors to standard error. + /// The ASTUnit objects takes ownership of this object. /// /// \param FileMgr - The FileManager to use. /// @@ -94,6 +96,7 @@ public: /// \returns - The initialized ASTUnit or null if the PCH failed to load. static ASTUnit *LoadFromPCHFile(const std::string &Filename, std::string *ErrMsg = 0, + DiagnosticClient *diagClient = NULL, bool OnlyLocalDecls = false, bool UseBumpAllocator = false); }; diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index a7a62fb93a..c0415bf550 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -25,12 +25,15 @@ using namespace clang; -ASTUnit::ASTUnit() : tempFile(false) { - Diags.setClient(&DiagClient); +ASTUnit::ASTUnit(DiagnosticClient *diagClient) : tempFile(false) { + Diags.setClient(diagClient ? diagClient : new TextDiagnosticBuffer()); } ASTUnit::~ASTUnit() { if (tempFile) llvm::sys::Path(getPCHFileName()).eraseFromDisk(); + + // The ASTUnit object owns the DiagnosticClient. + delete Diags.getClient(); } namespace { @@ -92,9 +95,10 @@ const std::string &ASTUnit::getPCHFileName() { ASTUnit *ASTUnit::LoadFromPCHFile(const std::string &Filename, std::string *ErrMsg, + DiagnosticClient *diagClient, bool OnlyLocalDecls, bool UseBumpAllocator) { - llvm::OwningPtr AST(new ASTUnit()); + llvm::OwningPtr AST(new ASTUnit(diagClient)); AST->OnlyLocalDecls = OnlyLocalDecls; AST->HeaderInfo.reset(new HeaderSearch(AST->getFileManager())); @@ -109,7 +113,8 @@ ASTUnit *ASTUnit::LoadFromPCHFile(const std::string &Filename, llvm::OwningPtr Reader; llvm::OwningPtr Source; - Reader.reset(new PCHReader(AST->getSourceManager(), AST->getFileManager(), AST->Diags)); + Reader.reset(new PCHReader(AST->getSourceManager(), AST->getFileManager(), + AST->Diags)); Reader->setListener(new PCHInfoCollector(LangInfo, HeaderInfo, TargetTriple, Predefines, Counter)); diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 9bc3c70b0e..3f3fc8c3d3 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -23,9 +23,11 @@ #include "clang/Basic/SourceManager.h" #include "clang/Frontend/ASTUnit.h" #include "llvm/Config/config.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/System/Path.h" #include "llvm/System/Program.h" + #include #include @@ -40,7 +42,6 @@ using namespace clang; using namespace idx; namespace { - static enum CXCursorKind TranslateDeclRefExpr(DeclRefExpr *DRE) { NamedDecl *D = DRE->getDecl(); @@ -89,6 +90,14 @@ public: } }; #endif + +/// IgnoreDiagnosticsClient - A DiagnosticsClient that just ignores emitted +/// warnings and errors. +class VISIBILITY_HIDDEN IgnoreDiagnosticsClient : public DiagnosticClient { +public: + virtual ~IgnoreDiagnosticsClient() {} + virtual void HandleDiagnostic(Diagnostic::Level, const DiagnosticInfo &) {} +}; // Translation Unit Visitor. class TUVisitor : public DeclVisitor { @@ -349,6 +358,7 @@ CXTranslationUnit clang_createTranslationUnit( std::string ErrMsg; return ASTUnit::LoadFromPCHFile(astName, &ErrMsg, + new IgnoreDiagnosticsClient(), CXXIdx->getOnlyLocalDecls(), /* UseBumpAllocator = */ true); } -- 2.40.0