blob: c1149c8ea46ca2db2b81c0ed5f066e0b8be6c006 [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
Manuel Klimek05510652014-10-07 15:49:36 +000025class TestClangTidyAction : public ASTFrontendAction {
Alexander Kornienko09887162014-02-27 14:28:02 +000026public:
Manuel Klimek05510652014-10-07 15:49:36 +000027 TestClangTidyAction(ClangTidyCheck &Check, ast_matchers::MatchFinder &Finder,
28 ClangTidyContext &Context)
29 : Check(Check), Finder(Finder), Context(Context) {}
Daniel Jasperd07c8402013-07-29 08:19:24 +000030
31private:
Manuel Klimek05510652014-10-07 15:49:36 +000032 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &Compiler,
33 StringRef File) override {
34 Context.setSourceManager(&Compiler.getSourceManager());
Alexander Kornienko09887162014-02-27 14:28:02 +000035 Check.registerPPCallbacks(Compiler);
Manuel Klimek05510652014-10-07 15:49:36 +000036 return Finder.newASTConsumer();
Alexander Kornienko09887162014-02-27 14:28:02 +000037 }
Daniel Jasperd07c8402013-07-29 08:19:24 +000038
Alexander Kornienko09887162014-02-27 14:28:02 +000039 ClangTidyCheck &Check;
Manuel Klimek05510652014-10-07 15:49:36 +000040 ast_matchers::MatchFinder &Finder;
41 ClangTidyContext &Context;
Daniel Jasperd07c8402013-07-29 08:19:24 +000042};
43
Alexander Kornienko9eb8c922014-04-08 12:27:49 +000044template <typename T>
45std::string runCheckOnCode(StringRef Code,
Benjamin Kramer6318f762014-08-12 12:12:54 +000046 std::vector<ClangTidyError> *Errors = nullptr,
47 const Twine &Filename = "input.cc",
48 ArrayRef<std::string> ExtraArgs = None) {
Alexander Kornienkod53d2682014-09-04 14:23:36 +000049 ClangTidyOptions Options;
50 Options.Checks = "*";
51 ClangTidyContext Context(llvm::make_unique<DefaultOptionsProvider>(
52 ClangTidyGlobalOptions(), Options));
Alexander Kornienko09887162014-02-27 14:28:02 +000053 ClangTidyDiagnosticConsumer DiagConsumer(Context);
Alexander Kornienko6e0cbc82014-09-12 08:53:36 +000054 T Check("test-check", &Context);
Alexander Kornienko09887162014-02-27 14:28:02 +000055 ast_matchers::MatchFinder Finder;
56 Check.registerMatchers(&Finder);
Manuel Klimek05510652014-10-07 15:49:36 +000057
58 std::vector<std::string> ArgCXX11(1, "clang-tidy");
59 ArgCXX11.push_back("-fsyntax-only");
60 ArgCXX11.push_back("-std=c++11");
61 ArgCXX11.insert(ArgCXX11.end(), ExtraArgs.begin(), ExtraArgs.end());
62 ArgCXX11.push_back(Filename.str());
63 llvm::IntrusiveRefCntPtr<FileManager> files(
64 new FileManager(FileSystemOptions()));
65 tooling::ToolInvocation Invocation(
66 ArgCXX11, new TestClangTidyAction(Check, Finder, Context), files.get());
67 SmallString<16> FileNameStorage;
68 StringRef FileNameRef = Filename.toNullTerminatedStringRef(FileNameStorage);
69 Invocation.mapVirtualFile(FileNameRef, Code);
70 Invocation.setDiagnosticConsumer(&DiagConsumer);
71 if (!Invocation.run())
Alexander Kornienko09887162014-02-27 14:28:02 +000072 return "";
Manuel Klimek05510652014-10-07 15:49:36 +000073
Alexander Kornienko09887162014-02-27 14:28:02 +000074 DiagConsumer.finish();
75 tooling::Replacements Fixes;
Alexander Kornienko826b5ad2014-05-09 12:24:09 +000076 for (const ClangTidyError &Error : Context.getErrors())
Alexander Kornienko33a9bcc2014-04-29 15:20:10 +000077 Fixes.insert(Error.Fix.begin(), Error.Fix.end());
Alexander Kornienko826b5ad2014-05-09 12:24:09 +000078 if (Errors)
79 *Errors = Context.getErrors();
Alexander Kornienko09887162014-02-27 14:28:02 +000080 return tooling::applyAllReplacements(Code, Fixes);
81}
82
83} // namespace test
Daniel Jasperd07c8402013-07-29 08:19:24 +000084} // namespace tidy
85} // namespace clang
86
87#endif // LLVM_CLANG_TOOLS_EXTRA_UNITTESTS_CLANG_TIDY_CLANG_TIDY_TEST_H