diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-10-19 21:44:57 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-10-19 21:44:57 +0000 |
commit | fc0622155fa61349698a8fd0053773c37d9f7ac4 (patch) | |
tree | 3cc6127faf1ce917fdea316e3f8b3c8edfa9bce9 | |
parent | 8621d01b253e3f36976d75dd999bdc0f21d9e5d9 (diff) |
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
<rdar://problem/7312058>. 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
-rw-r--r-- | include/clang/Frontend/ASTUnit.h | 7 | ||||
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 13 | ||||
-rw-r--r-- | 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<ASTUnit> AST(new ASTUnit()); + llvm::OwningPtr<ASTUnit> 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<PCHReader> Reader; llvm::OwningPtr<ExternalASTSource> 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 <cstdio> #include <vector> @@ -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<TUVisitor> { @@ -349,6 +358,7 @@ CXTranslationUnit clang_createTranslationUnit( std::string ErrMsg; return ASTUnit::LoadFromPCHFile(astName, &ErrMsg, + new IgnoreDiagnosticsClient(), CXXIdx->getOnlyLocalDecls(), /* UseBumpAllocator = */ true); } |