<div dir="ltr">Fixed in r187707. Only the clang-tidy binary needs to depend on clangTidyLLVMModule so the linker can pull everything together.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Aug 4, 2013 at 7:11 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@gmail.com" target="_blank">benny.kra@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
On 29.07.2013, at 10:19, Daniel Jasper <<a href="mailto:djasper@google.com">djasper@google.com</a>> wrote:<br>
<br>
> Author: djasper<br>
> Date: Mon Jul 29 03:19:24 2013<br>
> New Revision: 187345<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=187345&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=187345&view=rev</a><br>
> Log:<br>
> Initial architecture for clang-tidy.<br>
><br>
> This is the first version of a possible clang-tidy architecture. The<br>
> purpose of clang-tidy is to detect errors in adhering to common coding<br>
> patterns, e.g. described in the LLVM Coding Standards.<br>
><br>
> This is still heavily in flux.<br>
><br>
> Review: <a href="http://llvm-reviews.chandlerc.com/D884" target="_blank">http://llvm-reviews.chandlerc.com/D884</a><br>
><br>
> Added:<br>
>    clang-tools-extra/trunk/clang-tidy/<br>
>    clang-tools-extra/trunk/clang-tidy/CMakeLists.txt<br>
>    clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp<br>
>    clang-tools-extra/trunk/clang-tidy/ClangTidy.h<br>
>    clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h<br>
>    clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp<br>
>    clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h<br>
>    clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h<br>
>    clang-tools-extra/trunk/clang-tidy/Makefile<br>
>      - copied, changed from r187306, clang-tools-extra/trunk/unittests/Makefile<br>
>    clang-tools-extra/trunk/clang-tidy/google/<br>
>    clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt<br>
>    clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp<br>
>    clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h<br>
>    clang-tools-extra/trunk/clang-tidy/google/Makefile<br>
>      - copied, changed from r187306, clang-tools-extra/trunk/unittests/Makefile<br>
>    clang-tools-extra/trunk/clang-tidy/llvm/<br>
>    clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt<br>
>    clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp<br>
>    clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h<br>
>    clang-tools-extra/trunk/clang-tidy/llvm/Makefile<br>
>      - copied, changed from r187306, clang-tools-extra/trunk/unittests/Makefile<br>
>    clang-tools-extra/trunk/clang-tidy/tool/<br>
>    clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt<br>
>    clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp<br>
>    clang-tools-extra/trunk/clang-tidy/tool/Makefile<br>
>    clang-tools-extra/trunk/test/clang-tidy/<br>
>    clang-tools-extra/trunk/test/clang-tidy/basic.cpp<br>
>    clang-tools-extra/trunk/test/clang-tidy/fix.cpp<br>
>    clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp<br>
>    clang-tools-extra/trunk/unittests/clang-tidy/<br>
>    clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt<br>
>    clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h<br>
>    clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp<br>
>    clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp<br>
>    clang-tools-extra/trunk/unittests/clang-tidy/Makefile<br>
> Modified:<br>
>    clang-tools-extra/trunk/CMakeLists.txt<br>
>    clang-tools-extra/trunk/Makefile<br>
>    clang-tools-extra/trunk/test/CMakeLists.txt<br>
>    clang-tools-extra/trunk/unittests/CMakeLists.txt<br>
>    clang-tools-extra/trunk/unittests/Makefile<br>
><br>
> Modified: clang-tools-extra/trunk/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/CMakeLists.txt (original)<br>
> +++ clang-tools-extra/trunk/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -2,6 +2,7 @@ add_subdirectory(remove-cstr-calls)<br>
> add_subdirectory(tool-template)<br>
> add_subdirectory(cpp11-migrate)<br>
> add_subdirectory(modularize)<br>
> +add_subdirectory(clang-tidy)<br>
><br>
> # Add the common testsuite after all the tools.<br>
> add_subdirectory(test)<br>
><br>
> Modified: clang-tools-extra/trunk/Makefile<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=187345&r1=187344&r2=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=187345&r1=187344&r2=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/Makefile (original)<br>
> +++ clang-tools-extra/trunk/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -12,7 +12,7 @@ CLANG_LEVEL := ../..<br>
> include $(CLANG_LEVEL)/../../Makefile.config<br>
><br>
> PARALLEL_DIRS := remove-cstr-calls tool-template modularize<br>
> -DIRS := cpp11-migrate unittests<br>
> +DIRS := cpp11-migrate clang-tidy unittests<br>
><br>
> include $(CLANG_LEVEL)/Makefile<br>
><br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/CMakeLists.txt?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/CMakeLists.txt?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/CMakeLists.txt (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,23 @@<br>
> +set(LLVM_LINK_COMPONENTS<br>
> +  ${LLVM_TARGETS_TO_BUILD}<br>
> +  asmparser<br>
> +  bitreader<br>
> +  support<br>
> +  mc<br>
> +  )<br>
> +<br>
> +add_clang_library(clangTidy<br>
> +  ClangTidy.cpp<br>
> +  ClangTidyModule.cpp<br>
> +  )<br>
> +target_link_libraries(clangTidy<br>
> +  clangTooling<br>
> +  clangBasic<br>
> +  clangRewriteFrontend<br>
> +  clangTidyLLVMModule<br>
> +  clangTidyGoogleModule<br>
> +  )<br>
<br>
</div></div>This design has dependencies from clangTidyLLVMModule to clangTidy and vice-versa. Are those really standalone libraries?<br>
<br>
- Ben<br>
<div class="HOEnZb"><div class="h5"><br>
> +<br>
> +add_subdirectory(tool)<br>
> +add_subdirectory(llvm)<br>
> +add_subdirectory(google)<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,184 @@<br>
> +//===--- tools/extra/clang-tidy/ClangTidy.cpp - Clang tidy tool -----------===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +///<br>
> +///  \file This file implements a clang-tidy tool.<br>
> +///<br>
> +///  This tool uses the Clang Tooling infrastructure, see<br>
> +///    <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html" target="_blank">http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a><br>
> +///  for details on setting it up with LLVM source tree.<br>
> +///<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#include "ClangTidy.h"<br>
> +#include "ClangTidyDiagnosticConsumer.h"<br>
> +#include "ClangTidyModuleRegistry.h"<br>
> +#include "clang/AST/ASTConsumer.h"<br>
> +#include "clang/AST/ASTContext.h"<br>
> +#include "clang/AST/Decl.h"<br>
> +#include "clang/ASTMatchers/ASTMatchFinder.h"<br>
> +#include "clang/Lex/PPCallbacks.h"<br>
> +#include "clang/Lex/Preprocessor.h"<br>
> +#include "clang/Frontend/ASTConsumers.h"<br>
> +#include "clang/Frontend/CompilerInstance.h"<br>
> +#include "clang/Frontend/FrontendActions.h"<br>
> +#include "clang/Frontend/TextDiagnosticPrinter.h"<br>
> +#include "clang/Rewrite/Frontend/FixItRewriter.h"<br>
> +#include "clang/Rewrite/Frontend/FrontendActions.h"<br>
> +#include "clang/Tooling/Tooling.h"<br>
> +#include "clang/Tooling/Refactoring.h"<br>
> +#include "llvm/Support/Path.h"<br>
> +#include "llvm/Support/Signals.h"<br>
> +#include <vector><br>
> +<br>
> +using namespace clang::ast_matchers;<br>
> +using namespace clang::driver;<br>
> +using namespace clang::tooling;<br>
> +using namespace llvm;<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +namespace {<br>
> +<br>
> +class ClangTidyPPAction : public PreprocessOnlyAction {<br>
> +public:<br>
> +  ClangTidyPPAction(SmallVectorImpl<ClangTidyCheck *> &Checks,<br>
> +                    ClangTidyContext &Context)<br>
> +      : Checks(Checks), Context(Context) {}<br>
> +<br>
> +private:<br>
> +  virtual bool BeginSourceFileAction(CompilerInstance &Compiler,<br>
> +                                     llvm::StringRef file_name) {<br>
> +    Context.setSourceManager(&Compiler.getSourceManager());<br>
> +    for (SmallVectorImpl<ClangTidyCheck *>::iterator I = Checks.begin(),<br>
> +                                                     E = Checks.end();<br>
> +         I != E; ++I)<br>
> +      (*I)->registerPPCallbacks(Compiler);<br>
> +    return true;<br>
> +  }<br>
> +<br>
> +  SmallVectorImpl<ClangTidyCheck *> &Checks;<br>
> +  ClangTidyContext &Context;<br>
> +};<br>
> +<br>
> +class ClangTidyPPActionFactory : public FrontendActionFactory {<br>
> +public:<br>
> +  ClangTidyPPActionFactory(SmallVectorImpl<ClangTidyCheck *> &Checks,<br>
> +                           ClangTidyContext &Context)<br>
> +      : Checks(Checks), Context(Context) {}<br>
> +<br>
> +  virtual FrontendAction *create() {<br>
> +    return new ClangTidyPPAction(Checks, Context);<br>
> +  }<br>
> +<br>
> +private:<br>
> +  SmallVectorImpl<ClangTidyCheck *> &Checks;<br>
> +  ClangTidyContext &Context;<br>
> +};<br>
> +<br>
> +} // namespace<br>
> +<br>
> +ClangTidyError::ClangTidyError(const SourceManager &Sources, SourceLocation Loc,<br>
> +                               StringRef Message,<br>
> +                               const tooling::Replacements &Fix)<br>
> +    : Message(Message), Fix(Fix) {<br>
> +  FilePath = Sources.getFilename(Loc);<br>
> +  FileOffset = Sources.getFileOffset(Loc);<br>
> +}<br>
> +<br>
> +DiagnosticBuilder ClangTidyContext::Diag(SourceLocation Loc,<br>
> +                                         StringRef Message) {<br>
> +  return DiagEngine->Report(<br>
> +      Loc, DiagEngine->getCustomDiagID(DiagnosticsEngine::Warning, Message));<br>
> +}<br>
> +<br>
> +void ClangTidyContext::setDiagnosticsEngine(DiagnosticsEngine *Engine) {<br>
> +  DiagEngine = Engine;<br>
> +}<br>
> +<br>
> +void ClangTidyContext::setSourceManager(SourceManager *SourceMgr) {<br>
> +  DiagEngine->setSourceManager(SourceMgr);<br>
> +}<br>
> +<br>
> +/// \brief Store a \c ClangTidyError.<br>
> +void ClangTidyContext::storeError(const ClangTidyError &Error) {<br>
> +  Errors->push_back(Error);<br>
> +}<br>
> +<br>
> +void ClangTidyCheck::run(const ast_matchers::MatchFinder::MatchResult &Result) {<br>
> +  Context->setSourceManager(Result.SourceManager);<br>
> +  check(Result);<br>
> +}<br>
> +<br>
> +void runClangTidy(StringRef CheckRegexString,<br>
> +                  const tooling::CompilationDatabase &Compilations,<br>
> +                  ArrayRef<std::string> Ranges,<br>
> +                  SmallVectorImpl<ClangTidyError> *Errors) {<br>
> +  // FIXME: Ranges are currently full files. Support selecting specific<br>
> +  // (line-)ranges.<br>
> +  ClangTool Tool(Compilations, Ranges);<br>
> +  clang::tidy::ClangTidyContext Context(Errors);<br>
> +  ClangTidyDiagnosticConsumer DiagConsumer(Context);<br>
> +  ClangTidyCheckFactories CheckFactories;<br>
> +  for (ClangTidyModuleRegistry::iterator I = ClangTidyModuleRegistry::begin(),<br>
> +                                         E = ClangTidyModuleRegistry::end();<br>
> +       I != E; ++I) {<br>
> +    OwningPtr<ClangTidyModule> Module(I->instantiate());<br>
> +    Module->addCheckFactories(CheckFactories);<br>
> +  }<br>
> +<br>
> +  SmallVector<ClangTidyCheck *, 16> Checks;<br>
> +  CheckFactories.createChecks(CheckRegexString, Checks);<br>
> +<br>
> +  MatchFinder Finder;<br>
> +  for (SmallVectorImpl<ClangTidyCheck *>::iterator I = Checks.begin(),<br>
> +                                                   E = Checks.end();<br>
> +       I != E; ++I) {<br>
> +    (*I)->setContext(&Context);<br>
> +    (*I)->registerMatchers(&Finder);<br>
> +  }<br>
> +<br>
> +  Tool.run(new ClangTidyPPActionFactory(Checks, Context));<br>
> +  Tool.run(newFrontendActionFactory(&Finder));<br>
> +}<br>
> +<br>
> +void handleErrors(SmallVectorImpl<ClangTidyError> &Errors, bool Fix) {<br>
> +  FileManager Files((FileSystemOptions()));<br>
> +  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();<br>
> +  DiagnosticConsumer *DiagPrinter =<br>
> +      new TextDiagnosticPrinter(llvm::outs(), &*DiagOpts);<br>
> +  DiagnosticsEngine Diags(IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs),<br>
> +                          &*DiagOpts, DiagPrinter);<br>
> +  DiagPrinter->BeginSourceFile(LangOptions());<br>
> +  SourceManager SourceMgr(Diags, Files);<br>
> +  Rewriter Rewrite(SourceMgr, LangOptions());<br>
> +  for (SmallVectorImpl<ClangTidyError>::iterator I = Errors.begin(),<br>
> +                                                 E = Errors.end();<br>
> +       I != E; ++I) {<br>
> +    const FileEntry *File = Files.getFile(I->FilePath);<br>
> +    FileID ID = SourceMgr.createFileID(File, SourceLocation(), SrcMgr::C_User);<br>
> +    SourceLocation Loc = SourceMgr.getLocForStartOfFile(ID);<br>
> +    Diags.Report(Loc.getLocWithOffset(I->FileOffset),<br>
> +                 Diags.getCustomDiagID(DiagnosticsEngine::Warning, I->Message));<br>
> +    tooling::applyAllReplacements(I->Fix, Rewrite);<br>
> +  }<br>
> +  // FIXME: Run clang-format on changes.<br>
> +  if (Fix)<br>
> +    Rewrite.overwriteChangedFiles();<br>
> +}<br>
> +<br>
> +// This anchor is used to force the linker to link the LLVMModule.<br>
> +extern volatile int LLVMModuleAnchorSource;<br>
> +static int LLVMModuleAnchorDestination = LLVMModuleAnchorSource;<br>
> +<br>
> +// This anchor is used to force the linker to link the GoogleModule.<br>
> +extern volatile int GoogleModuleAnchorSource;<br>
> +static int GoogleModuleAnchorDestination = GoogleModuleAnchorSource;<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/ClangTidy.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/ClangTidy.h (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,161 @@<br>
> +//===--- ClangTidy.h - clang-tidy -------------------------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_H<br>
> +<br>
> +#include "clang/ASTMatchers/ASTMatchFinder.h"<br>
> +#include "clang/Basic/Diagnostic.h"<br>
> +#include "clang/Basic/SourceManager.h"<br>
> +#include "clang/Tooling/Refactoring.h"<br>
> +<br>
> +namespace clang {<br>
> +<br>
> +class CompilerInstance;<br>
> +namespace ast_matchers {<br>
> +class MatchFinder;<br>
> +}<br>
> +namespace tooling {<br>
> +class CompilationDatabase;<br>
> +}<br>
> +<br>
> +namespace tidy {<br>
> +<br>
> +/// \brief A detected error complete with information to display diagnostic and<br>
> +/// automatic fix.<br>
> +///<br>
> +/// This is used as an intermediate format to transport Diagnostics without a<br>
> +/// dependency on a SourceManager.<br>
> +///<br>
> +/// FIXME: Make Diagnostics flexible enough to support this directly.<br>
> +struct ClangTidyError {<br>
> +  ClangTidyError(const SourceManager &Sources, SourceLocation Loc,<br>
> +                 StringRef Message, const tooling::Replacements &Fix);<br>
> +<br>
> +  std::string Message;<br>
> +  unsigned FileOffset;<br>
> +  std::string FilePath;<br>
> +  tooling::Replacements Fix;<br>
> +};<br>
> +<br>
> +/// \brief Every \c ClangTidyCheck reports errors through a \c DiagnosticEngine<br>
> +/// provided by this context.<br>
> +///<br>
> +/// A \c ClangTidyCheck always has access to the active context to report<br>
> +/// warnings like:<br>
> +/// \code<br>
> +/// Context->Diag(Loc, "Single-argument constructors must be explicit")<br>
> +///     << FixItHint::CreateInsertion(Loc, "explicit ");<br>
> +/// \endcode<br>
> +class ClangTidyContext {<br>
> +public:<br>
> +  ClangTidyContext(SmallVectorImpl<ClangTidyError> *Errors) : Errors(Errors) {}<br>
> +<br>
> +  /// \brief Report any errors detected using this method.<br>
> +  ///<br>
> +  /// This is still under heavy development and will likely change towards using<br>
> +  /// tablegen'd diagnostic IDs.<br>
> +  /// FIXME: Figure out a way to manage ID spaces.<br>
> +  DiagnosticBuilder Diag(SourceLocation Loc, StringRef Message);<br>
> +<br>
> +  /// \brief Sets the \c DiagnosticsEngine so that Diagnostics can be generated<br>
> +  /// correctly.<br>
> +  ///<br>
> +  /// This is called from the \c ClangTidyCheck base class.<br>
> +  void setDiagnosticsEngine(DiagnosticsEngine *Engine);<br>
> +<br>
> +  /// \brief Sets the \c SourceManager of the used \c DiagnosticsEngine.<br>
> +  ///<br>
> +  /// This is called from the \c ClangTidyCheck base class.<br>
> +  void setSourceManager(SourceManager *SourceMgr);<br>
> +<br>
> +private:<br>
> +  friend class ClangTidyDiagnosticConsumer; // Calls storeError().<br>
> +<br>
> +  /// \brief Store a \c ClangTidyError.<br>
> +  void storeError(const ClangTidyError &Error);<br>
> +<br>
> +  SmallVectorImpl<ClangTidyError> *Errors;<br>
> +  DiagnosticsEngine *DiagEngine;<br>
> +};<br>
> +<br>
> +/// \brief Base class for all clang-tidy checks.<br>
> +///<br>
> +/// To implement a \c ClangTidyCheck, write a subclass and overwrite some of the<br>
> +/// base class's methods. E.g. to implement a check that validates namespace<br>
> +/// declarations, overwrite \c registerMatchers:<br>
> +///<br>
> +/// \code<br>
> +/// registerMatchers(ast_matchers::MatchFinder *Finder) {<br>
> +///   Finder->addMatcher(namespaceDecl().bind("namespace"), this);<br>
> +/// }<br>
> +/// \endcode<br>
> +///<br>
> +/// and then overwrite \c check(const MatchResult &Result) to do the actual<br>
> +/// check for each match.<br>
> +///<br>
> +/// A new \c ClangTidyCheck instance is created per translation unit.<br>
> +///<br>
> +/// FIXME: Figure out whether carrying information from one TU to another is<br>
> +/// useful/necessary.<br>
> +class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback {<br>
> +public:<br>
> +  virtual ~ClangTidyCheck() {}<br>
> +<br>
> +  /// \brief Overwrite this to register \c PPCallbacks with \c Compiler.<br>
> +  ///<br>
> +  /// This should be used for clang-tidy checks that analyze preprocessor-<br>
> +  /// dependent properties, e.g. the order of include directives.<br>
> +  virtual void registerPPCallbacks(CompilerInstance &Compiler) {}<br>
> +<br>
> +  /// \brief Overwrite this to register ASTMatchers with \p Finder.<br>
> +  ///<br>
> +  /// This should be used by clang-tidy checks that analyze code properties that<br>
> +  /// dependent on AST knowledge.<br>
> +  ///<br>
> +  /// You can register as many matchers as necessary with \p Finder. Usually,<br>
> +  /// "this" will be used as callback, but you can also specify other callback<br>
> +  /// classes. Thereby, different matchers can trigger different callbacks.<br>
> +  ///<br>
> +  /// If you need to merge information between the different matchers, you can<br>
> +  /// store these as members of the derived class. However, note that all<br>
> +  /// matches occur in the order of the AST traversal.<br>
> +  virtual void registerMatchers(ast_matchers::MatchFinder *Finder) {}<br>
> +<br>
> +  /// \brief \c ClangTidyChecks that register ASTMatchers should do the actual<br>
> +  /// work in here.<br>
> +  virtual void check(const ast_matchers::MatchFinder::MatchResult &Result) {}<br>
> +<br>
> +  /// \brief The infrastructure sets the context to \p Ctx with this function.<br>
> +  void setContext(ClangTidyContext *Ctx) { Context = Ctx; }<br>
> +<br>
> +protected:<br>
> +  ClangTidyContext *Context;<br>
> +<br>
> +private:<br>
> +  virtual void run(const ast_matchers::MatchFinder::MatchResult &Result);<br>
> +};<br>
> +<br>
> +/// \brief Run a set of clang-tidy checks on a set of files.<br>
> +void runClangTidy(StringRef CheckRegexString,<br>
> +                  const tooling::CompilationDatabase &Compilations,<br>
> +                  ArrayRef<std::string> Ranges,<br>
> +                  SmallVectorImpl<ClangTidyError> *Errors);<br>
> +<br>
> +// FIXME: This interface will need to be significantly extended to be useful.<br>
> +// FIXME: Implement confidence levels for displaying/fixing errors.<br>
> +//<br>
> +/// \brief Displays the found \p Errors to the users. If \p Fix is true, \p<br>
> +/// Errors containing fixes are automatically applied.<br>
> +void handleErrors(SmallVectorImpl<ClangTidyError> &Errors, bool Fix);<br>
> +<br>
> +} // end namespace tidy<br>
> +} // end namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_H<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,71 @@<br>
> +//===--- ClangTidyDiagnosticConsumer.h - clang-tidy -------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_DIAGNOSTIC_CONSUMER_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_DIAGNOSTIC_CONSUMER_H<br>
> +<br>
> +#include "clang/Basic/Diagnostic.h"<br>
> +#include "clang/Basic/SourceManager.h"<br>
> +#include "clang/Tooling/Refactoring.h"<br>
> +#include "llvm/ADT/SmallString.h"<br>
> +<br>
> +namespace clang {<br>
> +<br>
> +class CompilerInstance;<br>
> +namespace ast_matchers {<br>
> +class MatchFinder;<br>
> +}<br>
> +namespace tooling {<br>
> +class CompilationDatabase;<br>
> +}<br>
> +<br>
> +namespace tidy {<br>
> +<br>
> +/// \brief A diagnostic consumer that turns each \c Diagnostic into a<br>
> +/// \c SourceManager-independent \c ClangTidyError.<br>
> +//<br>
> +// FIXME: If we move away from unit-tests, this can be moved to a private<br>
> +// implementation file.<br>
> +class ClangTidyDiagnosticConsumer : public DiagnosticConsumer {<br>
> +public:<br>
> +  ClangTidyDiagnosticConsumer(ClangTidyContext &Ctx) : Context(Ctx) {<br>
> +    IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();<br>
> +    Diags.reset(new DiagnosticsEngine(<br>
> +        IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), &*DiagOpts, this,<br>
> +        /*ShouldOwnClient=*/false));<br>
> +    Context.setDiagnosticsEngine(Diags.get());<br>
> +  }<br>
> +<br>
> +  // FIXME: The concept of converting between FixItHints and Replacements is<br>
> +  // more generic and should be pulled out into a more useful Diagnostics<br>
> +  // library.<br>
> +  virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,<br>
> +                                const Diagnostic &Info) {<br>
> +    tooling::Replacements Replacements;<br>
> +    SourceManager &SourceMgr = Info.getSourceManager();<br>
> +    for (unsigned i = 0, e = Info.getNumFixItHints(); i != e; ++i) {<br>
> +      Replacements.insert(tooling::Replacement(<br>
> +          SourceMgr, Info.getFixItHint(i).RemoveRange.getBegin(), 0,<br>
> +          Info.getFixItHint(i).CodeToInsert));<br>
> +    }<br>
> +    SmallString<100> Buf;<br>
> +    Info.FormatDiagnostic(Buf);<br>
> +    Context.storeError(<br>
> +        ClangTidyError(SourceMgr, Info.getLocation(), Buf.str(), Replacements));<br>
> +  }<br>
> +<br>
> +private:<br>
> +  ClangTidyContext &Context;<br>
> +  OwningPtr<DiagnosticsEngine> Diags;<br>
> +};<br>
> +<br>
> +} // end namespace tidy<br>
> +} // end namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_DIAGNOSTIC_CONSUMER_H<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,49 @@<br>
> +//===--- tools/extra/clang-tidy/ClangTidyModule.cpp - Clang tidy tool -----===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +///<br>
> +///  \file Implements classes required to build clang-tidy modules.<br>
> +///<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#include "ClangTidyModule.h"<br>
> +#include "llvm/Support/Regex.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +CheckFactoryBase::~CheckFactoryBase() {}<br>
> +<br>
> +ClangTidyCheckFactories::~ClangTidyCheckFactories() {<br>
> +  for (std::map<std::string, CheckFactoryBase *>::iterator<br>
> +           I = Factories.begin(),<br>
> +           E = Factories.end();<br>
> +       I != E; ++I) {<br>
> +    delete I->second;<br>
> +  }<br>
> +}<br>
> +void ClangTidyCheckFactories::addCheckFactory(StringRef Name,<br>
> +                                              CheckFactoryBase *Factory) {<br>
> +<br>
> +  Factories[Name] = Factory;<br>
> +}<br>
> +<br>
> +void ClangTidyCheckFactories::createChecks(<br>
> +    StringRef CheckRegexString, SmallVectorImpl<ClangTidyCheck *> &Checks) {<br>
> +  llvm::Regex CheckRegex(CheckRegexString);<br>
> +  for (std::map<std::string, CheckFactoryBase *>::iterator<br>
> +           I = Factories.begin(),<br>
> +           E = Factories.end();<br>
> +       I != E; ++I) {<br>
> +    if (CheckRegex.match(I->first))<br>
> +      Checks.push_back(I->second->createCheck());<br>
> +  }<br>
> +}<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,98 @@<br>
> +//===--- ClangTidyModule.h - clang-tidy -------------------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_MODULE_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_MODULE_H<br>
> +<br>
> +#include "ClangTidy.h"<br>
> +#include "llvm/ADT/SmallVector.h"<br>
> +#include "llvm/ADT/StringRef.h"<br>
> +#include <utility><br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +/// \brief A factory, that can instantiate a specific clang-tidy check for<br>
> +/// processing a translation unit.<br>
> +///<br>
> +/// In order to register your check with the \c ClangTidyModule, create a<br>
> +/// subclass of \c CheckFactoryBase and implement \c createCheck(). Then, use<br>
> +/// this subclass in \c ClangTidyModule::addCheckFactories().<br>
> +class CheckFactoryBase {<br>
> +public:<br>
> +  virtual ~CheckFactoryBase();<br>
> +  virtual ClangTidyCheck *createCheck() = 0;<br>
> +};<br>
> +<br>
> +/// \brief A subclass of \c CheckFactoryBase that should be used for all<br>
> +/// \c ClangTidyChecks that don't require constructor parameters.<br>
> +///<br>
> +/// For example, if have a clang-tidy check like:<br>
> +/// \code<br>
> +/// class MyTidyCheck : public ClangTidyCheck {<br>
> +///   virtual void registerMatchers(ast_matchers::MatchFinder *Finder) { .. }<br>
> +/// };<br>
> +/// \endcode<br>
> +/// you can register it with:<br>
> +/// \code<br>
> +/// class MyModule : public ClangTidyModule {<br>
> +///   virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) {<br>
> +///     CheckFactories.addCheckFactory(<br>
> +///         "myproject-my-check", new ClangTidyCheckFactory<MyTidyCheck>());<br>
> +///   }<br>
> +/// };<br>
> +/// \endcode<br>
> +template <typename T> class ClangTidyCheckFactory : public CheckFactoryBase {<br>
> +public:<br>
> +  virtual ClangTidyCheck *createCheck() { return new T; }<br>
> +};<br>
> +<br>
> +class ClangTidyCheckFactories;<br>
> +<br>
> +/// \brief A clang-tidy module groups a number of \c ClangTidyChecks and gives<br>
> +/// them a prefixed name.<br>
> +class ClangTidyModule {<br>
> +public:<br>
> +  virtual ~ClangTidyModule() {}<br>
> +<br>
> +  /// \brief Implement this function in order to register all \c CheckFactories<br>
> +  /// belonging to this module.<br>
> +  virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) = 0;<br>
> +};<br>
> +<br>
> +/// \brief A collection of \c ClangTidyCheckFactory instances.<br>
> +///<br>
> +/// All clang-tidy modules register their check factories with an instance of<br>
> +/// this object.<br>
> +class ClangTidyCheckFactories {<br>
> +public:<br>
> +  ClangTidyCheckFactories() {}<br>
> +  ~ClangTidyCheckFactories();<br>
> +<br>
> +  /// \brief Register \p Factory with the name \p Name.<br>
> +  ///<br>
> +  /// The \c ClangTidyCheckFactories object takes ownership of the \p Factory.<br>
> +  void addCheckFactory(StringRef Name, CheckFactoryBase *Factory);<br>
> +<br>
> +  /// \brief Create instances of all checks matching \p CheckRegexString and<br>
> +  /// store them in \p Checks.<br>
> +  ///<br>
> +  /// The caller takes ownership of the return \c ClangTidyChecks.<br>
> +  void createChecks(StringRef CheckRegexString,<br>
> +                    SmallVectorImpl<ClangTidyCheck *> &Checks);<br>
> +<br>
> +private:<br>
> +  StringRef FilterRegex;<br>
> +  std::map<std::string, CheckFactoryBase *> Factories;<br>
> +};<br>
> +<br>
> +} // end namespace tidy<br>
> +} // end namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_MODULE_H<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,24 @@<br>
> +//===--- ClangTidyModuleRegistry.h - clang-tidy -----------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_MODULE_REGISTRY_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_MODULE_REGISTRY_H<br>
> +<br>
> +#include "ClangTidyModule.h"<br>
> +#include "llvm/Support/Registry.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +typedef llvm::Registry<ClangTidyModule> ClangTidyModuleRegistry;<br>
> +<br>
> +} // end namespace tidy<br>
> +} // end namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANG_TIDY_MODULE_REGISTRY_H<br>
><br>
> Copied: clang-tools-extra/trunk/clang-tidy/Makefile (from r187306, clang-tools-extra/trunk/unittests/Makefile)<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/Makefile?p2=clang-tools-extra/trunk/clang-tidy/Makefile&p1=clang-tools-extra/trunk/unittests/Makefile&r1=187306&r2=187345&rev=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/Makefile?p2=clang-tools-extra/trunk/clang-tidy/Makefile&p1=clang-tools-extra/trunk/unittests/Makefile&r1=187306&r2=187345&rev=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/Makefile (original)<br>
> +++ clang-tools-extra/trunk/clang-tidy/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -1,4 +1,4 @@<br>
> -##===- tools/extra/test/Unit/Makefile ----------------------*- Makefile -*-===##<br>
> +##===- tools/extra/clang-tidy/Makefile ----sssss------------*- Makefile -*-===##<br>
> #<br>
> #                     The LLVM Compiler Infrastructure<br>
> #<br>
> @@ -8,8 +8,9 @@<br>
> ##===----------------------------------------------------------------------===##<br>
><br>
> CLANG_LEVEL := ../../..<br>
> +LIBRARYNAME := clangTidy<br>
> include $(CLANG_LEVEL)/../../Makefile.config<br>
><br>
> -PARALLEL_DIRS := cpp11-migrate<br>
> +DIRS = llvm google tool<br>
><br>
> include $(CLANG_LEVEL)/Makefile<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,10 @@<br>
> +set(LLVM_LINK_COMPONENTS support)<br>
> +<br>
> +add_clang_library(clangTidyGoogleModule<br>
> +  GoogleTidyModule.cpp<br>
> +  )<br>
> +target_link_libraries(clangTidyGoogleModule<br>
> +  clangTooling<br>
> +  clangBasic<br>
> +  clangASTMatchers<br>
> +  )<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,61 @@<br>
> +//===--- GoogleTidyModule.cpp - clang-tidy --------------------------------===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#include "GoogleTidyModule.h"<br>
> +#include "../ClangTidy.h"<br>
> +#include "../ClangTidyModule.h"<br>
> +#include "../ClangTidyModuleRegistry.h"<br>
> +#include "clang/AST/ASTContext.h"<br>
> +#include "clang/ASTMatchers/ASTMatchers.h"<br>
> +#include "clang/ASTMatchers/ASTMatchFinder.h"<br>
> +#include "clang/Frontend/CompilerInstance.h"<br>
> +#include "clang/Lex/Preprocessor.h"<br>
> +#include "clang/Lex/PPCallbacks.h"<br>
> +#include "llvm/Support/raw_ostream.h"<br>
> +<br>
> +using namespace clang::ast_matchers;<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +void<br>
> +ExplicitConstructorCheck::registerMatchers(ast_matchers::MatchFinder *Finder) {<br>
> +  Finder->addMatcher(constructorDecl().bind("construct"), this);<br>
> +}<br>
> +<br>
> +void ExplicitConstructorCheck::check(const MatchFinder::MatchResult &Result) {<br>
> +  const CXXConstructorDecl *Ctor =<br>
> +      Result.Nodes.getNodeAs<CXXConstructorDecl>("construct");<br>
> +  if (!Ctor->isExplicit() && !Ctor->isImplicit() && Ctor->getNumParams() >= 1 &&<br>
> +      Ctor->getMinRequiredArguments() <= 1) {<br>
> +    SourceLocation Loc = Ctor->getLocation();<br>
> +    Context->Diag(Loc, "Single-argument constructors must be explicit")<br>
> +        << FixItHint::CreateInsertion(Loc, "explicit ");<br>
> +  }<br>
> +}<br>
> +<br>
> +class GoogleModule : public ClangTidyModule {<br>
> +public:<br>
> +  virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) {<br>
> +    CheckFactories.addCheckFactory(<br>
> +        "google-explicit-constructor",<br>
> +        new ClangTidyCheckFactory<ExplicitConstructorCheck>());<br>
> +  }<br>
> +};<br>
> +<br>
> +// Register the GoogleTidyModule using this statically initialized variable.<br>
> +static ClangTidyModuleRegistry::Add<GoogleModule> X("google-module",<br>
> +                                                    "Adds Google lint checks.");<br>
> +<br>
> +// This anchor is used to force the linker to link in the generated object file<br>
> +// and thus register the GoogleModule.<br>
> +volatile int GoogleModuleAnchorSource = 0;<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,31 @@<br>
> +//===--- GoogleTidyModule.h - clang-tidy ------------------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_GOOGLE_TIDY_MODULE_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_GOOGLE_TIDY_MODULE_H<br>
> +<br>
> +#include "../ClangTidy.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +/// \brief Checks that all single-argument constructors are explicit.<br>
> +///<br>
> +/// see:<br>
> +/// <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Explicit_Constructors" target="_blank">http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Explicit_Constructors</a><br>
> +class ExplicitConstructorCheck : public ClangTidyCheck {<br>
> +public:<br>
> +  virtual void registerMatchers(ast_matchers::MatchFinder *Finder);<br>
> +  virtual void check(const ast_matchers::MatchFinder::MatchResult &Result);<br>
> +};<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_GOOGLE_TIDY_MODULE_H<br>
><br>
> Copied: clang-tools-extra/trunk/clang-tidy/google/Makefile (from r187306, clang-tools-extra/trunk/unittests/Makefile)<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/Makefile?p2=clang-tools-extra/trunk/clang-tidy/google/Makefile&p1=clang-tools-extra/trunk/unittests/Makefile&r1=187306&r2=187345&rev=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/Makefile?p2=clang-tools-extra/trunk/clang-tidy/google/Makefile&p1=clang-tools-extra/trunk/unittests/Makefile&r1=187306&r2=187345&rev=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/Makefile (original)<br>
> +++ clang-tools-extra/trunk/clang-tidy/google/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -1,4 +1,4 @@<br>
> -##===- tools/extra/test/Unit/Makefile ----------------------*- Makefile -*-===##<br>
> +##===- clang-tidy/google/Makefile --------------------------*- Makefile -*-===##<br>
> #<br>
> #                     The LLVM Compiler Infrastructure<br>
> #<br>
> @@ -6,10 +6,7 @@<br>
> # License. See LICENSE.TXT for details.<br>
> #<br>
> ##===----------------------------------------------------------------------===##<br>
> -<br>
> -CLANG_LEVEL := ../../..<br>
> -include $(CLANG_LEVEL)/../../Makefile.config<br>
> -<br>
> -PARALLEL_DIRS := cpp11-migrate<br>
> +CLANG_LEVEL := ../../../..<br>
> +LIBRARYNAME := clangTidyGoogleModule<br>
><br>
> include $(CLANG_LEVEL)/Makefile<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,10 @@<br>
> +set(LLVM_LINK_COMPONENTS support)<br>
> +<br>
> +add_clang_library(clangTidyLLVMModule<br>
> +  LLVMTidyModule.cpp<br>
> +  )<br>
> +target_link_libraries(clangTidyLLVMModule<br>
> +  clangTooling<br>
> +  clangBasic<br>
> +  clangASTMatchers<br>
> +  )<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,104 @@<br>
> +//===--- LLVMTidyModule.cpp - clang-tidy ----------------------------------===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#include "LLVMTidyModule.h"<br>
> +#include "../ClangTidy.h"<br>
> +#include "../ClangTidyModule.h"<br>
> +#include "../ClangTidyModuleRegistry.h"<br>
> +#include "clang/AST/ASTContext.h"<br>
> +#include "clang/ASTMatchers/ASTMatchers.h"<br>
> +#include "clang/ASTMatchers/ASTMatchFinder.h"<br>
> +#include "clang/Frontend/CompilerInstance.h"<br>
> +#include "clang/Lex/Preprocessor.h"<br>
> +#include "clang/Lex/PPCallbacks.h"<br>
> +#include "llvm/Support/raw_ostream.h"<br>
> +<br>
> +using namespace clang::ast_matchers;<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +void<br>
> +NamespaceCommentCheck::registerMatchers(ast_matchers::MatchFinder *Finder) {<br>
> +  Finder->addMatcher(namespaceDecl().bind("namespace"), this);<br>
> +}<br>
> +<br>
> +void NamespaceCommentCheck::check(const MatchFinder::MatchResult &Result) {<br>
> +  const NamespaceDecl *ND = Result.Nodes.getNodeAs<NamespaceDecl>("namespace");<br>
> +  Token Tok;<br>
> +  SourceLocation Loc = ND->getRBraceLoc().getLocWithOffset(1);<br>
> +  while (Lexer::getRawToken(Loc, Tok, *Result.SourceManager,<br>
> +                            Result.Context->getLangOpts())) {<br>
> +    Loc = Loc.getLocWithOffset(1);<br>
> +  }<br>
> +  // FIXME: Check that this namespace is "long".<br>
> +  if (Tok.is(tok::comment)) {<br>
> +    // FIXME: Check comment content.<br>
> +    return;<br>
> +  }<br>
> +  std::string Fix = " // namespace";<br>
> +  if (!ND->isAnonymousNamespace())<br>
> +    Fix = Fix.append(" ").append(ND->getNameAsString());<br>
> +<br>
> +  Context->Diag(ND->getLocation(),<br>
> +                "namespace not terminated with a closing comment")<br>
> +      << FixItHint::CreateInsertion(ND->getRBraceLoc().getLocWithOffset(1),<br>
> +                                    Fix);<br>
> +}<br>
> +<br>
> +namespace {<br>
> +class IncludeOrderPPCallbacks : public PPCallbacks {<br>
> +public:<br>
> +  explicit IncludeOrderPPCallbacks(ClangTidyContext &Context)<br>
> +      : Context(Context) {}<br>
> +<br>
> +  virtual void InclusionDirective(SourceLocation HashLoc,<br>
> +                                  const Token &IncludeTok, StringRef FileName,<br>
> +                                  bool IsAngled, CharSourceRange FilenameRange,<br>
> +                                  const FileEntry *File, StringRef SearchPath,<br>
> +                                  StringRef RelativePath,<br>
> +                                  const Module *Imported) {<br>
> +    // FIXME: This is a dummy implementation to show how to get at preprocessor<br>
> +    // information. Implement a real include order check.<br>
> +    Context.Diag(HashLoc, "This is an include");<br>
> +  }<br>
> +<br>
> +private:<br>
> +  ClangTidyContext &Context;<br>
> +};<br>
> +} // namespace<br>
> +<br>
> +void IncludeOrderCheck::registerPPCallbacks(CompilerInstance &Compiler) {<br>
> +  Compiler.getPreprocessor()<br>
> +      .addPPCallbacks(new IncludeOrderPPCallbacks(*Context));<br>
> +}<br>
> +<br>
> +class LLVMModule : public ClangTidyModule {<br>
> +public:<br>
> +  virtual ~LLVMModule() {}<br>
> +<br>
> +  virtual void addCheckFactories(ClangTidyCheckFactories &CheckFactories) {<br>
> +    CheckFactories.addCheckFactory(<br>
> +        "llvm-include-order", new ClangTidyCheckFactory<IncludeOrderCheck>());<br>
> +    CheckFactories.addCheckFactory(<br>
> +        "llvm-namespace-comment",<br>
> +        new ClangTidyCheckFactory<NamespaceCommentCheck>());<br>
> +  }<br>
> +};<br>
> +<br>
> +// Register the LLVMTidyModule using this statically initialized variable.<br>
> +static ClangTidyModuleRegistry::Add<LLVMModule> X("llvm-module",<br>
> +                                                  "Adds LLVM lint checks.");<br>
> +<br>
> +// This anchor is used to force the linker to link in the generated object file<br>
> +// and thus register the LLVMModule.<br>
> +volatile int LLVMModuleAnchorSource = 0;<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,38 @@<br>
> +//===--- LLVMTidyModule.h - clang-tidy --------------------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_LLVM_TIDY_MODULE_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_LLVM_TIDY_MODULE_H<br>
> +<br>
> +#include "../ClangTidy.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +/// \brief Checks the correct order of \c #includes.<br>
> +///<br>
> +/// see: <a href="http://llvm.org/docs/CodingStandards.html#include-style" target="_blank">http://llvm.org/docs/CodingStandards.html#include-style</a><br>
> +class IncludeOrderCheck : public ClangTidyCheck {<br>
> +public:<br>
> +  virtual void registerPPCallbacks(CompilerInstance &Compiler);<br>
> +};<br>
> +<br>
> +/// \brief Checks that long namespaces have a closing comment.<br>
> +///<br>
> +/// see: <a href="http://llvm.org/docs/CodingStandards.html#namespace-indentation" target="_blank">http://llvm.org/docs/CodingStandards.html#namespace-indentation</a><br>
> +class NamespaceCommentCheck : public ClangTidyCheck {<br>
> +public:<br>
> +  virtual void registerMatchers(ast_matchers::MatchFinder *Finder);<br>
> +  virtual void check(const ast_matchers::MatchFinder::MatchResult &Result);<br>
> +};<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TIDY_LLVM_MODULE_H<br>
><br>
> Copied: clang-tools-extra/trunk/clang-tidy/llvm/Makefile (from r187306, clang-tools-extra/trunk/unittests/Makefile)<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/Makefile?p2=clang-tools-extra/trunk/clang-tidy/llvm/Makefile&p1=clang-tools-extra/trunk/unittests/Makefile&r1=187306&r2=187345&rev=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/llvm/Makefile?p2=clang-tools-extra/trunk/clang-tidy/llvm/Makefile&p1=clang-tools-extra/trunk/unittests/Makefile&r1=187306&r2=187345&rev=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/Makefile (original)<br>
> +++ clang-tools-extra/trunk/clang-tidy/llvm/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -1,4 +1,4 @@<br>
> -##===- tools/extra/test/Unit/Makefile ----------------------*- Makefile -*-===##<br>
> +##===- clang-tidy/llvm/Makefile ----------------------------*- Makefile -*-===##<br>
> #<br>
> #                     The LLVM Compiler Infrastructure<br>
> #<br>
> @@ -6,10 +6,7 @@<br>
> # License. See LICENSE.TXT for details.<br>
> #<br>
> ##===----------------------------------------------------------------------===##<br>
> -<br>
> -CLANG_LEVEL := ../../..<br>
> -include $(CLANG_LEVEL)/../../Makefile.config<br>
> -<br>
> -PARALLEL_DIRS := cpp11-migrate<br>
> +CLANG_LEVEL := ../../../..<br>
> +LIBRARYNAME := clangTidyLLVMModule<br>
><br>
> include $(CLANG_LEVEL)/Makefile<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,18 @@<br>
> +set(LLVM_LINK_COMPONENTS<br>
> +  ${LLVM_TARGETS_TO_BUILD}<br>
> +  asmparser<br>
> +  bitreader<br>
> +  support<br>
> +  mc<br>
> +  )<br>
> +<br>
> +add_clang_executable(clang-tidy<br>
> +  ClangTidyMain.cpp<br>
> +  )<br>
> +target_link_libraries(clang-tidy<br>
> +  clangTidy<br>
> +  )<br>
> +<br>
> +install(TARGETS clang-tidy<br>
> +  RUNTIME DESTINATION bin)<br>
> +<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,56 @@<br>
> +//===--- tools/extra/clang-tidy/ClangTidyMain.cpp - Clang tidy tool -------===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +///<br>
> +///  \file This file implements a clang-tidy tool.<br>
> +///<br>
> +///  This tool uses the Clang Tooling infrastructure, see<br>
> +///    <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html" target="_blank">http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a><br>
> +///  for details on setting it up with LLVM source tree.<br>
> +///<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#include "../ClangTidy.h"<br>
> +#include "clang/Driver/OptTable.h"<br>
> +#include "clang/Driver/Options.h"<br>
> +#include "llvm/Support/CommandLine.h"<br>
> +#include <vector><br>
> +<br>
> +using namespace clang::ast_matchers;<br>
> +using namespace clang::driver;<br>
> +using namespace clang::tooling;<br>
> +using namespace llvm;<br>
> +<br>
> +cl::OptionCategory ClangTidyCategory("clang-tidy options");<br>
> +<br>
> +cl::list<std::string><br>
> +Ranges(cl::Positional, cl::desc("<range0> [... <rangeN>]"), cl::OneOrMore);<br>
> +<br>
> +static cl::opt<std::string> Checks(<br>
> +    "checks",<br>
> +    cl::desc("Regular expression matching the names of the checks to be run."),<br>
> +    cl::init(".*"), cl::cat(ClangTidyCategory));<br>
> +static cl::opt<bool> Fix("fix", cl::desc("Fix detected errors if possible."),<br>
> +                         cl::init(false), cl::cat(ClangTidyCategory));<br>
> +<br>
> +// FIXME: Add option to list name/description of all checks.<br>
> +<br>
> +int main(int argc, const char **argv) {<br>
> +  cl::ParseCommandLineOptions(argc, argv, "TBD\n");<br>
> +  OwningPtr<clang::tooling::CompilationDatabase> Compilations(<br>
> +      FixedCompilationDatabase::loadFromCommandLine(argc, argv));<br>
> +  if (!Compilations)<br>
> +    return 0;<br>
> +  // FIXME: Load other compilation databases.<br>
> +<br>
> +  SmallVector<clang::tidy::ClangTidyError, 16> Errors;<br>
> +  clang::tidy::runClangTidy(Checks, *Compilations, Ranges, &Errors);<br>
> +  clang::tidy::handleErrors(Errors, Fix);<br>
> +<br>
> +  return 0;<br>
> +}<br>
><br>
> Added: clang-tools-extra/trunk/clang-tidy/tool/Makefile<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/Makefile?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/Makefile?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/clang-tidy/tool/Makefile (added)<br>
> +++ clang-tools-extra/trunk/clang-tidy/tool/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,25 @@<br>
> +##===- clang-tidy/tool/Makefile ----------------------------*- Makefile -*-===##<br>
> +#<br>
> +#                     The LLVM Compiler Infrastructure<br>
> +#<br>
> +# This file is distributed under the University of Illinois Open Source<br>
> +# License. See LICENSE.TXT for details.<br>
> +#<br>
> +##===----------------------------------------------------------------------===##<br>
> +<br>
> +CLANG_LEVEL := ../../../..<br>
> +<br>
> +TOOLNAME = clang-tidy<br>
> +<br>
> +# No plugins, optimize startup time.<br>
> +TOOL_NO_EXPORTS = 1<br>
> +<br>
> +include $(CLANG_LEVEL)/../../Makefile.config<br>
> +LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc option<br>
> +USEDLIBS = clangTidy.a clangTidyLLVMModule.a clangTidyGoogleModule.a \<br>
> +        clangFormat.a clangASTMatchers.a clangTooling.a clangFrontend.a \<br>
> +        clangSerialization.a clangDriver.a clangParse.a clangSema.a \<br>
> +        clangAnalysis.a clangRewriteFrontend.a clangRewriteCore.a \<br>
> +        clangEdit.a clangAST.a clangLex.a clangBasic.a<br>
> +<br>
> +include $(CLANG_LEVEL)/Makefile<br>
><br>
> Modified: clang-tools-extra/trunk/test/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/test/CMakeLists.txt (original)<br>
> +++ clang-tools-extra/trunk/test/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -27,7 +27,7 @@ set(CLANG_TOOLS_TEST_DEPS<br>
>   clang clang-headers FileCheck count not<br>
><br>
>   # Individual tools we test.<br>
> -  remove-cstr-calls cpp11-migrate modularize<br>
> +  remove-cstr-calls cpp11-migrate modularize clang-tidy<br>
><br>
>   # Unit tests<br>
>   ExtraToolsUnitTests<br>
><br>
> Added: clang-tools-extra/trunk/test/clang-tidy/basic.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/basic.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/basic.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/test/clang-tidy/basic.cpp (added)<br>
> +++ clang-tools-extra/trunk/test/clang-tidy/basic.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,7 @@<br>
> +// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp<br>
> +// RUN: clang-tidy %t.cpp -- > %t2.cpp<br>
> +// RUN: FileCheck -input-file=%t2.cpp %s<br>
> +<br>
> +namespace i {<br>
> +}<br>
> +// CHECK: warning: namespace not terminated with a closing comment<br>
><br>
> Added: clang-tools-extra/trunk/test/clang-tidy/fix.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/fix.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/fix.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/test/clang-tidy/fix.cpp (added)<br>
> +++ clang-tools-extra/trunk/test/clang-tidy/fix.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,10 @@<br>
> +// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp<br>
> +// RUN: clang-tidy %t.cpp -fix --<br>
> +// RUN: FileCheck -input-file=%t.cpp %s<br>
> +<br>
> +namespace i {<br>
> +}<br>
> +// CHECK: } // namespace i<br>
> +<br>
> +class A { A(int i); };<br>
> +// CHECK: class A { explicit A(int i); };<br>
><br>
> Added: clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp (added)<br>
> +++ clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,10 @@<br>
> +// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp<br>
> +// RUN: clang-tidy %t.cpp -fix -checks=llvm.* --<br>
> +// RUN: FileCheck -input-file=%t.cpp %s<br>
> +<br>
> +namespace i {<br>
> +}<br>
> +// CHECK: } // namespace i<br>
> +<br>
> +class A { A(int i); }; // Not fixing this, because the check is in google-.<br>
> +// CHECK: class A { A(int i); };<br>
><br>
> Modified: clang-tools-extra/trunk/unittests/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/CMakeLists.txt (original)<br>
> +++ clang-tools-extra/trunk/unittests/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -6,3 +6,4 @@ function(add_extra_unittest test_dirname<br>
> endfunction()<br>
><br>
> add_subdirectory(cpp11-migrate)<br>
> +add_subdirectory(clang-tidy)<br>
><br>
> Modified: clang-tools-extra/trunk/unittests/Makefile<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/Makefile?rev=187345&r1=187344&r2=187345&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/Makefile?rev=187345&r1=187344&r2=187345&view=diff</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/Makefile (original)<br>
> +++ clang-tools-extra/trunk/unittests/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -10,6 +10,6 @@<br>
> CLANG_LEVEL := ../../..<br>
> include $(CLANG_LEVEL)/../../Makefile.config<br>
><br>
> -PARALLEL_DIRS := cpp11-migrate<br>
> +PARALLEL_DIRS := cpp11-migrate clang-tidy<br>
><br>
> include $(CLANG_LEVEL)/Makefile<br>
><br>
> Added: clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt (added)<br>
> +++ clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,20 @@<br>
> +set(LLVM_LINK_COMPONENTS<br>
> +  support<br>
> +  )<br>
> +<br>
> +get_filename_component(CLANG_LINT_SOURCE_DIR<br>
> +  ${CMAKE_CURRENT_SOURCE_DIR}/../../clang-tidy REALPATH)<br>
> +include_directories(${CLANG_LINT_SOURCE_DIR})<br>
> +<br>
> +add_extra_unittest(ClangTidyTests<br>
> +  LLVMModuleTest.cpp<br>
> +  GoogleModuleTest.cpp)<br>
> +<br>
> +target_link_libraries(ClangTidyTests<br>
> +  gtest<br>
> +  gtest_main<br>
> +  clangTidy<br>
> +  clangTooling<br>
> +  clangBasic<br>
> +  clangASTMatchers<br>
> +  )<br>
><br>
> Added: clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h (added)<br>
> +++ clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,75 @@<br>
> +//===--- ClangTidyTest.h - clang-tidy ---------------------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H<br>
> +#define LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H<br>
> +<br>
> +#include "ClangTidy.h"<br>
> +#include "ClangTidyDiagnosticConsumer.h"<br>
> +#include "clang/ASTMatchers/ASTMatchFinder.h"<br>
> +#include "clang/Frontend/CompilerInstance.h"<br>
> +#include "clang/Frontend/FrontendActions.h"<br>
> +#include "clang/Tooling/Refactoring.h"<br>
> +#include "clang/Tooling/Tooling.h"<br>
> +#include "gtest/gtest.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +template <typename T> class ClangTidyTest : public ::testing::Test {<br>
> +protected:<br>
> +  ClangTidyTest() : Check(new T), Context(&Errors) {}<br>
> +<br>
> +  std::string runCheckOn(StringRef Code) {<br>
> +    ClangTidyDiagnosticConsumer DiagConsumer(Context);<br>
> +    Check->setContext(&Context);<br>
> +    EXPECT_TRUE(<br>
> +        tooling::runToolOnCode(new TestPPAction(*Check, &Context), Code));<br>
> +    ast_matchers::MatchFinder Finder;<br>
> +    Check->registerMatchers(&Finder);<br>
> +    OwningPtr<tooling::FrontendActionFactory> Factory(<br>
> +        tooling::newFrontendActionFactory(&Finder));<br>
> +    EXPECT_TRUE(tooling::runToolOnCode(Factory->create(), Code));<br>
> +    tooling::Replacements Fixes;<br>
> +    for (SmallVector<ClangTidyError, 16>::const_iterator I = Errors.begin(),<br>
> +                                                         E = Errors.end();<br>
> +         I != E; ++I)<br>
> +      Fixes.insert(I->Fix.begin(), I->Fix.end());<br>
> +    return tooling::applyAllReplacements(Code, Fixes);<br>
> +  }<br>
> +<br>
> +  void expectNoChanges(StringRef Code) { EXPECT_EQ(Code, runCheckOn(Code)); }<br>
> +<br>
> +private:<br>
> +  class TestPPAction : public PreprocessOnlyAction {<br>
> +  public:<br>
> +    TestPPAction(ClangTidyCheck &Check, ClangTidyContext *Context)<br>
> +        : Check(Check), Context(Context) {}<br>
> +<br>
> +  private:<br>
> +    virtual bool BeginSourceFileAction(CompilerInstance &Compiler,<br>
> +                                       llvm::StringRef file_name) {<br>
> +      Context->setSourceManager(&Compiler.getSourceManager());<br>
> +      Check.registerPPCallbacks(Compiler);<br>
> +      return true;<br>
> +    }<br>
> +<br>
> +    ClangTidyCheck &Check;<br>
> +    ClangTidyContext *Context;<br>
> +  };<br>
> +<br>
> +  OwningPtr<ClangTidyCheck> Check;<br>
> +  SmallVector<ClangTidyError, 16> Errors;<br>
> +  ClangTidyContext Context;<br>
> +};<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
> +<br>
> +#endif // LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H<br>
><br>
> Added: clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp (added)<br>
> +++ clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,26 @@<br>
> +#include "ClangTidyTest.h"<br>
> +<br>
> +#include "google/GoogleTidyModule.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +typedef ClangTidyTest<ExplicitConstructorCheck> ExplicitConstructorCheckTest;<br>
> +<br>
> +TEST_F(ExplicitConstructorCheckTest, SingleArgumentConstructorsOnly) {<br>
> +  expectNoChanges("class C { C(); };");<br>
> +  expectNoChanges("class C { C(int i, int j); };");<br>
> +}<br>
> +<br>
> +TEST_F(ExplicitConstructorCheckTest, Basic) {<br>
> +  EXPECT_EQ("class C { explicit C(int i); };",<br>
> +            runCheckOn("class C { C(int i); };"));<br>
> +}<br>
> +<br>
> +TEST_F(ExplicitConstructorCheckTest, DefaultParameters) {<br>
> +  EXPECT_EQ("class C { explicit C(int i, int j = 0); };",<br>
> +            runCheckOn("class C { C(int i, int j = 0); };"));<br>
> +}<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
><br>
> Added: clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp (added)<br>
> +++ clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,15 @@<br>
> +#include "ClangTidyTest.h"<br>
> +<br>
> +#include "llvm/LLVMTidyModule.h"<br>
> +<br>
> +namespace clang {<br>
> +namespace tidy {<br>
> +<br>
> +typedef ClangTidyTest<NamespaceCommentCheck> NamespaceCommentCheckTest;<br>
> +<br>
> +TEST_F(NamespaceCommentCheckTest, Basic) {<br>
> +  EXPECT_EQ("namespace i {\n} // namespace i", runCheckOn("namespace i {\n}"));<br>
> +}<br>
> +<br>
> +} // namespace tidy<br>
> +} // namespace clang<br>
><br>
> Added: clang-tools-extra/trunk/unittests/clang-tidy/Makefile<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/Makefile?rev=187345&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/Makefile?rev=187345&view=auto</a><br>

> ==============================================================================<br>
> --- clang-tools-extra/trunk/unittests/clang-tidy/Makefile (added)<br>
> +++ clang-tools-extra/trunk/unittests/clang-tidy/Makefile Mon Jul 29 03:19:24 2013<br>
> @@ -0,0 +1,24 @@<br>
> +##===- unittests/clang-tidy/Makefile -----------------------*- Makefile -*-===##<br>
> +#<br>
> +#                     The LLVM Compiler Infrastructure<br>
> +#<br>
> +# This file is distributed under the University of Illinois Open Source<br>
> +# License. See LICENSE.TXT for details.<br>
> +#<br>
> +##===----------------------------------------------------------------------===##<br>
> +<br>
> +CLANG_LEVEL = ../../../..<br>
> +include $(CLANG_LEVEL)/../../Makefile.config<br>
> +<br>
> +TESTNAME = ClangTidy<br>
> +LINK_COMPONENTS := asmparser bitreader support MC MCParser option<br>
> +USEDLIBS = clangTidy.a clangTidyLLVMModule.a clangTidyGoogleModule.a \<br>
> +        clangFormat.a clangTooling.a clangFrontend.a clangSerialization.a \<br>
> +        clangDriver.a clangRewriteFrontend.a clangRewriteCore.a \<br>
> +        clangParse.a clangSema.a clangAnalysis.a clangAST.a \<br>
> +        clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a<br>
> +<br>
> +include $(CLANG_LEVEL)/Makefile<br>
> +MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1<br>
> +CPP.Flags += -I$(PROJ_SRC_DIR)/../../clang-tidy<br>
> +include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
</div></div></blockquote></div><br></div>