[clang-tools-extra] r187345 - Initial architecture for clang-tidy.

Daniel Jasper djasper at google.com
Mon Jul 29 01:19:25 PDT 2013


Author: djasper
Date: Mon Jul 29 03:19:24 2013
New Revision: 187345

URL: http://llvm.org/viewvc/llvm-project?rev=187345&view=rev
Log:
Initial architecture for clang-tidy.

This is the first version of a possible clang-tidy architecture. The
purpose of clang-tidy is to detect errors in adhering to common coding
patterns, e.g. described in the LLVM Coding Standards.

This is still heavily in flux.

Review: http://llvm-reviews.chandlerc.com/D884

Added:
    clang-tools-extra/trunk/clang-tidy/
    clang-tools-extra/trunk/clang-tidy/CMakeLists.txt
    clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp
    clang-tools-extra/trunk/clang-tidy/ClangTidy.h
    clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h
    clang-tools-extra/trunk/clang-tidy/ClangTidyModule.cpp
    clang-tools-extra/trunk/clang-tidy/ClangTidyModule.h
    clang-tools-extra/trunk/clang-tidy/ClangTidyModuleRegistry.h
    clang-tools-extra/trunk/clang-tidy/Makefile
      - copied, changed from r187306, clang-tools-extra/trunk/unittests/Makefile
    clang-tools-extra/trunk/clang-tidy/google/
    clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt
    clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp
    clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.h
    clang-tools-extra/trunk/clang-tidy/google/Makefile
      - copied, changed from r187306, clang-tools-extra/trunk/unittests/Makefile
    clang-tools-extra/trunk/clang-tidy/llvm/
    clang-tools-extra/trunk/clang-tidy/llvm/CMakeLists.txt
    clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.cpp
    clang-tools-extra/trunk/clang-tidy/llvm/LLVMTidyModule.h
    clang-tools-extra/trunk/clang-tidy/llvm/Makefile
      - copied, changed from r187306, clang-tools-extra/trunk/unittests/Makefile
    clang-tools-extra/trunk/clang-tidy/tool/
    clang-tools-extra/trunk/clang-tidy/tool/CMakeLists.txt
    clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp
    clang-tools-extra/trunk/clang-tidy/tool/Makefile
    clang-tools-extra/trunk/test/clang-tidy/
    clang-tools-extra/trunk/test/clang-tidy/basic.cpp
    clang-tools-extra/trunk/test/clang-tidy/fix.cpp
    clang-tools-extra/trunk/test/clang-tidy/select-checks.cpp
    clang-tools-extra/trunk/unittests/clang-tidy/
    clang-tools-extra/trunk/unittests/clang-tidy/CMakeLists.txt
    clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h
    clang-tools-extra/trunk/unittests/clang-tidy/GoogleModuleTest.cpp
    clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp
    clang-tools-extra/trunk/unittests/clang-tidy/Makefile
Modified:
    clang-tools-extra/trunk/CMakeLists.txt
    clang-tools-extra/trunk/Makefile
    clang-tools-extra/trunk/test/CMakeLists.txt
    clang-tools-extra/trunk/unittests/CMakeLists.txt
    clang-tools-extra/trunk/unittests/Makefile

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

Modified: clang-tools-extra/trunk/Makefile
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=187345&r1=187344&r2=187345&view=diff
==============================================================================
--- clang-tools-extra/trunk/Makefile (original)
+++ clang-tools-extra/trunk/Makefile Mon Jul 29 03:19:24 2013
@@ -12,7 +12,7 @@ CLANG_LEVEL := ../..
 include $(CLANG_LEVEL)/../../Makefile.config
 
 PARALLEL_DIRS := remove-cstr-calls tool-template modularize
-DIRS := cpp11-migrate unittests
+DIRS := cpp11-migrate clang-tidy unittests
 
 include $(CLANG_LEVEL)/Makefile
 

Added: clang-tools-extra/trunk/clang-tidy/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/CMakeLists.txt?rev=187345&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/CMakeLists.txt (added)
+++ clang-tools-extra/trunk/clang-tidy/CMakeLists.txt Mon Jul 29 03:19:24 2013
@@ -0,0 +1,23 @@
+set(LLVM_LINK_COMPONENTS
+  ${LLVM_TARGETS_TO_BUILD}
+  asmparser
+  bitreader
+  support
+  mc
+  )
+
+add_clang_library(clangTidy
+  ClangTidy.cpp
+  ClangTidyModule.cpp
+  )
+target_link_libraries(clangTidy
+  clangTooling
+  clangBasic
+  clangRewriteFrontend
+  clangTidyLLVMModule
+  clangTidyGoogleModule
+  )
+
+add_subdirectory(tool)
+add_subdirectory(llvm)
+add_subdirectory(google)

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

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

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

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

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

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

Copied: clang-tools-extra/trunk/clang-tidy/Makefile (from r187306, clang-tools-extra/trunk/unittests/Makefile)
URL: 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
==============================================================================
--- clang-tools-extra/trunk/unittests/Makefile (original)
+++ clang-tools-extra/trunk/clang-tidy/Makefile Mon Jul 29 03:19:24 2013
@@ -1,4 +1,4 @@
-##===- tools/extra/test/Unit/Makefile ----------------------*- Makefile -*-===##
+##===- tools/extra/clang-tidy/Makefile ----sssss------------*- Makefile -*-===##
 #
 #                     The LLVM Compiler Infrastructure
 #
@@ -8,8 +8,9 @@
 ##===----------------------------------------------------------------------===##
 
 CLANG_LEVEL := ../../..
+LIBRARYNAME := clangTidy
 include $(CLANG_LEVEL)/../../Makefile.config
 
-PARALLEL_DIRS := cpp11-migrate
+DIRS = llvm google tool
 
 include $(CLANG_LEVEL)/Makefile

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

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

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

Copied: clang-tools-extra/trunk/clang-tidy/google/Makefile (from r187306, clang-tools-extra/trunk/unittests/Makefile)
URL: 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
==============================================================================
--- clang-tools-extra/trunk/unittests/Makefile (original)
+++ clang-tools-extra/trunk/clang-tidy/google/Makefile Mon Jul 29 03:19:24 2013
@@ -1,4 +1,4 @@
-##===- tools/extra/test/Unit/Makefile ----------------------*- Makefile -*-===##
+##===- clang-tidy/google/Makefile --------------------------*- Makefile -*-===##
 #
 #                     The LLVM Compiler Infrastructure
 #
@@ -6,10 +6,7 @@
 # License. See LICENSE.TXT for details.
 #
 ##===----------------------------------------------------------------------===##
-
-CLANG_LEVEL := ../../..
-include $(CLANG_LEVEL)/../../Makefile.config
-
-PARALLEL_DIRS := cpp11-migrate
+CLANG_LEVEL := ../../../..
+LIBRARYNAME := clangTidyGoogleModule
 
 include $(CLANG_LEVEL)/Makefile

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

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

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

Copied: clang-tools-extra/trunk/clang-tidy/llvm/Makefile (from r187306, clang-tools-extra/trunk/unittests/Makefile)
URL: 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
==============================================================================
--- clang-tools-extra/trunk/unittests/Makefile (original)
+++ clang-tools-extra/trunk/clang-tidy/llvm/Makefile Mon Jul 29 03:19:24 2013
@@ -1,4 +1,4 @@
-##===- tools/extra/test/Unit/Makefile ----------------------*- Makefile -*-===##
+##===- clang-tidy/llvm/Makefile ----------------------------*- Makefile -*-===##
 #
 #                     The LLVM Compiler Infrastructure
 #
@@ -6,10 +6,7 @@
 # License. See LICENSE.TXT for details.
 #
 ##===----------------------------------------------------------------------===##
-
-CLANG_LEVEL := ../../..
-include $(CLANG_LEVEL)/../../Makefile.config
-
-PARALLEL_DIRS := cpp11-migrate
+CLANG_LEVEL := ../../../..
+LIBRARYNAME := clangTidyLLVMModule
 
 include $(CLANG_LEVEL)/Makefile

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

Added: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=187345&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (added)
+++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Mon Jul 29 03:19:24 2013
@@ -0,0 +1,56 @@
+//===--- tools/extra/clang-tidy/ClangTidyMain.cpp - Clang tidy tool -------===//
+//
+//                     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 a clang-tidy tool.
+///
+///  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 "../ClangTidy.h"
+#include "clang/Driver/OptTable.h"
+#include "clang/Driver/Options.h"
+#include "llvm/Support/CommandLine.h"
+#include <vector>
+
+using namespace clang::ast_matchers;
+using namespace clang::driver;
+using namespace clang::tooling;
+using namespace llvm;
+
+cl::OptionCategory ClangTidyCategory("clang-tidy options");
+
+cl::list<std::string>
+Ranges(cl::Positional, cl::desc("<range0> [... <rangeN>]"), cl::OneOrMore);
+
+static cl::opt<std::string> Checks(
+    "checks",
+    cl::desc("Regular expression matching the names of the checks to be run."),
+    cl::init(".*"), cl::cat(ClangTidyCategory));
+static cl::opt<bool> Fix("fix", cl::desc("Fix detected errors if possible."),
+                         cl::init(false), cl::cat(ClangTidyCategory));
+
+// FIXME: Add option to list name/description of all checks.
+
+int main(int argc, const char **argv) {
+  cl::ParseCommandLineOptions(argc, argv, "TBD\n");
+  OwningPtr<clang::tooling::CompilationDatabase> Compilations(
+      FixedCompilationDatabase::loadFromCommandLine(argc, argv));
+  if (!Compilations)
+    return 0;
+  // FIXME: Load other compilation databases.
+
+  SmallVector<clang::tidy::ClangTidyError, 16> Errors;
+  clang::tidy::runClangTidy(Checks, *Compilations, Ranges, &Errors);
+  clang::tidy::handleErrors(Errors, Fix);
+
+  return 0;
+}

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

Modified: clang-tools-extra/trunk/test/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=187345&r1=187344&r2=187345&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/test/CMakeLists.txt Mon Jul 29 03:19:24 2013
@@ -27,7 +27,7 @@ set(CLANG_TOOLS_TEST_DEPS
   clang clang-headers FileCheck count not
 
   # Individual tools we test.
-  remove-cstr-calls cpp11-migrate modularize
+  remove-cstr-calls cpp11-migrate modularize clang-tidy
 
   # Unit tests
   ExtraToolsUnitTests

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

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

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

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

Modified: clang-tools-extra/trunk/unittests/Makefile
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/Makefile?rev=187345&r1=187344&r2=187345&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/Makefile (original)
+++ clang-tools-extra/trunk/unittests/Makefile Mon Jul 29 03:19:24 2013
@@ -10,6 +10,6 @@
 CLANG_LEVEL := ../../..
 include $(CLANG_LEVEL)/../../Makefile.config
 
-PARALLEL_DIRS := cpp11-migrate
+PARALLEL_DIRS := cpp11-migrate clang-tidy
 
 include $(CLANG_LEVEL)/Makefile

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

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

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

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

Added: clang-tools-extra/trunk/unittests/clang-tidy/Makefile
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-tidy/Makefile?rev=187345&view=auto
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-tidy/Makefile (added)
+++ clang-tools-extra/trunk/unittests/clang-tidy/Makefile Mon Jul 29 03:19:24 2013
@@ -0,0 +1,24 @@
+##===- unittests/clang-tidy/Makefile -----------------------*- Makefile -*-===##
+#
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+CLANG_LEVEL = ../../../..
+include $(CLANG_LEVEL)/../../Makefile.config
+
+TESTNAME = ClangTidy
+LINK_COMPONENTS := asmparser bitreader support MC MCParser option
+USEDLIBS = clangTidy.a clangTidyLLVMModule.a clangTidyGoogleModule.a \
+	   clangFormat.a clangTooling.a clangFrontend.a clangSerialization.a \
+	   clangDriver.a clangRewriteFrontend.a clangRewriteCore.a \
+	   clangParse.a clangSema.a clangAnalysis.a clangAST.a \
+	   clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a
+
+include $(CLANG_LEVEL)/Makefile
+MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1
+CPP.Flags += -I$(PROJ_SRC_DIR)/../../clang-tidy
+include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest





More information about the cfe-commits mailing list