From a89f99c1e224dd96687d755c3e31d06d3c872bd4 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Wed, 8 Jan 2014 23:30:40 +0000 Subject: [PATCH] Restructured code, no functional changes. Summary: Moved implementation of classes declared in ClangTidyDiagnosticConsumer.h to ClangTidyDiagnosticConsumer.cpp. Added a FIXME note in ClangTidyDiagnosticConsumer::HandleDiagnostic. Reviewers: klimek, djasper Reviewed By: klimek CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D2520 llvm-svn: 198807 --- clang-tools-extra/clang-tidy/CMakeLists.txt | 1 + clang-tools-extra/clang-tidy/ClangTidy.cpp | 32 ----- .../ClangTidyDiagnosticConsumer.cpp | 116 ++++++++++++++++++ .../clang-tidy/ClangTidyDiagnosticConsumer.h | 54 +------- 4 files changed, 122 insertions(+), 81 deletions(-) create mode 100644 clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt index a1610b7e3dfb..b1d32cb66031 100644 --- a/clang-tools-extra/clang-tidy/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS add_clang_library(clangTidy ClangTidy.cpp ClangTidyModule.cpp + ClangTidyDiagnosticConsumer.cpp ) target_link_libraries(clangTidy clangAST diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp index e465c6cbbfd2..bbcd0204f2df 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -174,38 +174,6 @@ bool ChecksFilter::IsCheckEnabled(StringRef Name) { return EnableChecks.match(Name) && !DisableChecks.match(Name); } -ClangTidyMessage::ClangTidyMessage(StringRef Message) : Message(Message) {} - -ClangTidyMessage::ClangTidyMessage(StringRef Message, - const SourceManager &Sources, - SourceLocation Loc) - : Message(Message) { - FilePath = Sources.getFilename(Loc); - FileOffset = Sources.getFileOffset(Loc); -} - -ClangTidyError::ClangTidyError(const ClangTidyMessage &Message) - : Message(Message) {} - -DiagnosticBuilder ClangTidyContext::Diag(SourceLocation Loc, - StringRef Message) { - return DiagEngine->Report( - Loc, DiagEngine->getCustomDiagID(DiagnosticsEngine::Warning, Message)); -} - -void ClangTidyContext::setDiagnosticsEngine(DiagnosticsEngine *Engine) { - DiagEngine = Engine; -} - -void ClangTidyContext::setSourceManager(SourceManager *SourceMgr) { - DiagEngine->setSourceManager(SourceMgr); -} - -/// \brief Store a \c ClangTidyError. -void ClangTidyContext::storeError(const ClangTidyError &Error) { - Errors->push_back(Error); -} - void ClangTidyCheck::run(const ast_matchers::MatchFinder::MatchResult &Result) { Context->setSourceManager(Result.SourceManager); check(Result); diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp new file mode 100644 index 000000000000..c2e6bd8996ec --- /dev/null +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp @@ -0,0 +1,116 @@ +//===--- tools/extra/clang-tidy/ClangTidy.cpp - Clang-tidy DiagnosticConsumer // +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file This file implements clang-tidy DiagnosticConsumer. +/// +/// This tool uses the Clang Tooling infrastructure, see +/// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html +/// for details on setting it up with LLVM source tree. +/// +//===----------------------------------------------------------------------===// + +#include "ClangTidyDiagnosticConsumer.h" + +#include "llvm/ADT/SmallString.h" + +namespace clang { +namespace tidy { + +ClangTidyMessage::ClangTidyMessage(StringRef Message) : Message(Message) {} + +ClangTidyMessage::ClangTidyMessage(StringRef Message, + const SourceManager &Sources, + SourceLocation Loc) + : Message(Message) { + FilePath = Sources.getFilename(Loc); + FileOffset = Sources.getFileOffset(Loc); +} + +ClangTidyError::ClangTidyError(const ClangTidyMessage &Message) + : Message(Message) {} + +DiagnosticBuilder ClangTidyContext::Diag(SourceLocation Loc, + StringRef Message) { + return DiagEngine->Report( + Loc, DiagEngine->getCustomDiagID(DiagnosticsEngine::Warning, Message)); +} + +void ClangTidyContext::setDiagnosticsEngine(DiagnosticsEngine *Engine) { + DiagEngine = Engine; +} + +void ClangTidyContext::setSourceManager(SourceManager *SourceMgr) { + DiagEngine->setSourceManager(SourceMgr); +} + +/// \brief Store a \c ClangTidyError. +void ClangTidyContext::storeError(const ClangTidyError &Error) { + Errors->push_back(Error); +} + +ClangTidyDiagnosticConsumer::ClangTidyDiagnosticConsumer(ClangTidyContext &Ctx) + : Context(Ctx) { + IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); + Diags.reset(new DiagnosticsEngine( + IntrusiveRefCntPtr(new DiagnosticIDs), &*DiagOpts, this, + /*ShouldOwnClient=*/false)); + Context.setDiagnosticsEngine(Diags.get()); +} + +void ClangTidyDiagnosticConsumer::HandleDiagnostic( + DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) { + // FIXME: Demultiplex diagnostics. + // FIXME: Ensure that we don't get notes from user code related to errors + // from non-user code. + if (Diags->getSourceManager().isInSystemHeader(Info.getLocation())) + return; + if (DiagLevel != DiagnosticsEngine::Note) { + Errors.push_back(ClangTidyError(getMessage(Info))); + } else { + assert(!Errors.empty() && + "A diagnostic note can only be appended to a message."); + Errors.back().Notes.push_back(getMessage(Info)); + } + addFixes(Info, Errors.back()); +} + +// Flushes the internal diagnostics buffer to the ClangTidyContext. +void ClangTidyDiagnosticConsumer::finish() { + for (unsigned i = 0, e = Errors.size(); i != e; ++i) { + Context.storeError(Errors[i]); + } + Errors.clear(); +} + +void ClangTidyDiagnosticConsumer::addFixes(const Diagnostic &Info, + ClangTidyError &Error) { + if (!Info.hasSourceManager()) + return; + SourceManager &SourceMgr = Info.getSourceManager(); + tooling::Replacements Replacements; + for (unsigned i = 0, e = Info.getNumFixItHints(); i != e; ++i) { + Error.Fix.insert(tooling::Replacement( + SourceMgr, Info.getFixItHint(i).RemoveRange.getBegin(), 0, + Info.getFixItHint(i).CodeToInsert)); + } +} + +ClangTidyMessage +ClangTidyDiagnosticConsumer::getMessage(const Diagnostic &Info) const { + SmallString<100> Buf; + Info.FormatDiagnostic(Buf); + if (!Info.hasSourceManager()) { + return ClangTidyMessage(Buf.str()); + } + return ClangTidyMessage(Buf.str(), Info.getSourceManager(), + Info.getLocation()); +} + +} // namespace tidy +} // namespace clang diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h index 613e8fb8c579..f8ac6efdf312 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h @@ -13,7 +13,6 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceManager.h" #include "clang/Tooling/Refactoring.h" -#include "llvm/ADT/SmallString.h" namespace clang { @@ -103,63 +102,20 @@ private: // implementation file. class ClangTidyDiagnosticConsumer : public DiagnosticConsumer { public: - ClangTidyDiagnosticConsumer(ClangTidyContext &Ctx) : Context(Ctx) { - IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); - Diags.reset(new DiagnosticsEngine( - IntrusiveRefCntPtr(new DiagnosticIDs), &*DiagOpts, this, - /*ShouldOwnClient=*/false)); - Context.setDiagnosticsEngine(Diags.get()); - } + ClangTidyDiagnosticConsumer(ClangTidyContext &Ctx); // FIXME: The concept of converting between FixItHints and Replacements is // more generic and should be pulled out into a more useful Diagnostics // library. virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, - const Diagnostic &Info) LLVM_OVERRIDE { - // FIXME: Ensure that we don't get notes from user code related to errors - // from non-user code. - if (Diags->getSourceManager().isInSystemHeader(Info.getLocation())) - return; - if (DiagLevel != DiagnosticsEngine::Note) { - Errors.push_back(ClangTidyError(getMessage(Info))); - } else { - assert(!Errors.empty() && - "A diagnostic note can only be appended to a message."); - Errors.back().Notes.push_back(getMessage(Info)); - } - addFixes(Info, Errors.back()); - } + const Diagnostic &Info) LLVM_OVERRIDE; // Flushes the internal diagnostics buffer to the ClangTidyContext. - virtual void finish() LLVM_OVERRIDE { - for (unsigned i = 0, e = Errors.size(); i != e; ++i) { - Context.storeError(Errors[i]); - } - Errors.clear(); - } + virtual void finish() LLVM_OVERRIDE; private: - void addFixes(const Diagnostic &Info, ClangTidyError &Error) { - if (!Info.hasSourceManager()) - return; - SourceManager &SourceMgr = Info.getSourceManager(); - tooling::Replacements Replacements; - for (unsigned i = 0, e = Info.getNumFixItHints(); i != e; ++i) { - Error.Fix.insert(tooling::Replacement( - SourceMgr, Info.getFixItHint(i).RemoveRange.getBegin(), 0, - Info.getFixItHint(i).CodeToInsert)); - } - } - - ClangTidyMessage getMessage(const Diagnostic &Info) const { - SmallString<100> Buf; - Info.FormatDiagnostic(Buf); - if (!Info.hasSourceManager()) { - return ClangTidyMessage(Buf.str()); - } - return ClangTidyMessage(Buf.str(), Info.getSourceManager(), - Info.getLocation()); - } + void addFixes(const Diagnostic &Info, ClangTidyError &Error); + ClangTidyMessage getMessage(const Diagnostic &Info) const; ClangTidyContext &Context; OwningPtr Diags;