blob: a9c68d4a939e30353c19521c1f299d85bd52a381 [file] [log] [blame]
Daniel Jasperd07c8402013-07-29 08:19:24 +00001//===--- ClangTidyTest.h - clang-tidy ---------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H
11#define LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H
12
13#include "ClangTidy.h"
14#include "ClangTidyDiagnosticConsumer.h"
15#include "clang/ASTMatchers/ASTMatchFinder.h"
16#include "clang/Frontend/CompilerInstance.h"
17#include "clang/Frontend/FrontendActions.h"
18#include "clang/Tooling/Refactoring.h"
19#include "clang/Tooling/Tooling.h"
Daniel Jasperd07c8402013-07-29 08:19:24 +000020
21namespace clang {
22namespace tidy {
Alexander Kornienko09887162014-02-27 14:28:02 +000023namespace test {
Daniel Jasperd07c8402013-07-29 08:19:24 +000024
Alexander Kornienko09887162014-02-27 14:28:02 +000025class TestPPAction : public PreprocessOnlyAction {
26public:
27 TestPPAction(ClangTidyCheck &Check, ClangTidyContext *Context)
28 : Check(Check), Context(Context) {}
Daniel Jasperd07c8402013-07-29 08:19:24 +000029
30private:
Alexander Kornienko09887162014-02-27 14:28:02 +000031 bool BeginSourceFileAction(CompilerInstance &Compiler,
Craig Toppera3dbe842014-03-02 10:20:11 +000032 llvm::StringRef file_name) override {
Alexander Kornienko09887162014-02-27 14:28:02 +000033 Context->setSourceManager(&Compiler.getSourceManager());
34 Check.registerPPCallbacks(Compiler);
35 return true;
36 }
Daniel Jasperd07c8402013-07-29 08:19:24 +000037
Alexander Kornienko09887162014-02-27 14:28:02 +000038 ClangTidyCheck &Check;
39 ClangTidyContext *Context;
Daniel Jasperd07c8402013-07-29 08:19:24 +000040};
41
Alexander Kornienko9eb8c922014-04-08 12:27:49 +000042template <typename T>
43std::string runCheckOnCode(StringRef Code,
Benjamin Kramer6318f762014-08-12 12:12:54 +000044 std::vector<ClangTidyError> *Errors = nullptr,
45 const Twine &Filename = "input.cc",
46 ArrayRef<std::string> ExtraArgs = None) {
Alexander Kornienko09887162014-02-27 14:28:02 +000047 T Check;
Alexander Kornienkoa4695222014-06-05 13:31:45 +000048 ClangTidyContext Context(
49 new DefaultOptionsProvider(ClangTidyGlobalOptions(), ClangTidyOptions()));
Alexander Kornienko09887162014-02-27 14:28:02 +000050 ClangTidyDiagnosticConsumer DiagConsumer(Context);
51 Check.setContext(&Context);
NAKAMURA Takumif5cebd22014-03-20 10:52:51 +000052 std::vector<std::string> ArgCXX11(1, "-std=c++11");
Benjamin Kramer6318f762014-08-12 12:12:54 +000053 ArgCXX11.insert(ArgCXX11.end(), ExtraArgs.begin(), ExtraArgs.end());
Alexander Kornienko09887162014-02-27 14:28:02 +000054
Alexander Kornienkof9a7b462014-03-19 12:48:22 +000055 if (!tooling::runToolOnCodeWithArgs(new TestPPAction(Check, &Context), Code,
Benjamin Kramer6318f762014-08-12 12:12:54 +000056 ArgCXX11, Filename))
Alexander Kornienko09887162014-02-27 14:28:02 +000057 return "";
58 ast_matchers::MatchFinder Finder;
59 Check.registerMatchers(&Finder);
Ahmed Charles6a2dc5c2014-03-09 09:24:40 +000060 std::unique_ptr<tooling::FrontendActionFactory> Factory(
Alexander Kornienko09887162014-02-27 14:28:02 +000061 tooling::newFrontendActionFactory(&Finder));
Benjamin Kramer6318f762014-08-12 12:12:54 +000062 if (!tooling::runToolOnCodeWithArgs(Factory->create(), Code, ArgCXX11,
63 Filename))
Alexander Kornienko09887162014-02-27 14:28:02 +000064 return "";
65 DiagConsumer.finish();
66 tooling::Replacements Fixes;
Alexander Kornienko826b5ad2014-05-09 12:24:09 +000067 for (const ClangTidyError &Error : Context.getErrors())
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000068 Fixes.insert(Error.Fix.begin(), Error.Fix.end());
Alexander Kornienko826b5ad2014-05-09 12:24:09 +000069 if (Errors)
70 *Errors = Context.getErrors();
Alexander Kornienko09887162014-02-27 14:28:02 +000071 return tooling::applyAllReplacements(Code, Fixes);
72}
73
74} // namespace test
Daniel Jasperd07c8402013-07-29 08:19:24 +000075} // namespace tidy
76} // namespace clang
77
78#endif // LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H