From 0551065cd179740a54e20fea6d854e543c0dd5bd Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Tue, 7 Oct 2014 15:49:36 +0000 Subject: [PATCH] Make clang-tidy's runCheckOnCode actually use the DiagnosticConsumer. A precondition of that was to run both the preprocessor checks and AST checks from the same FrontendAction, otherwise we'd have needed to duplicate all involved objects in order to not have any references to a deleted source manager. llvm-svn: 219212 --- .../unittests/clang-tidy/ClangTidyTest.h | 44 +++++++++++-------- .../unittests/clang-tidy/LLVMModuleTest.cpp | 2 +- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h b/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h index 181e6c209e8f..c1149c8ea46c 100644 --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h @@ -22,21 +22,23 @@ namespace clang { namespace tidy { namespace test { -class TestPPAction : public PreprocessOnlyAction { +class TestClangTidyAction : public ASTFrontendAction { public: - TestPPAction(ClangTidyCheck &Check, ClangTidyContext *Context) - : Check(Check), Context(Context) {} + TestClangTidyAction(ClangTidyCheck &Check, ast_matchers::MatchFinder &Finder, + ClangTidyContext &Context) + : Check(Check), Finder(Finder), Context(Context) {} private: - bool BeginSourceFileAction(CompilerInstance &Compiler, - llvm::StringRef file_name) override { - Context->setSourceManager(&Compiler.getSourceManager()); + std::unique_ptr CreateASTConsumer(CompilerInstance &Compiler, + StringRef File) override { + Context.setSourceManager(&Compiler.getSourceManager()); Check.registerPPCallbacks(Compiler); - return true; + return Finder.newASTConsumer(); } ClangTidyCheck &Check; - ClangTidyContext *Context; + ast_matchers::MatchFinder &Finder; + ClangTidyContext &Context; }; template @@ -50,19 +52,25 @@ std::string runCheckOnCode(StringRef Code, ClangTidyGlobalOptions(), Options)); ClangTidyDiagnosticConsumer DiagConsumer(Context); T Check("test-check", &Context); - std::vector ArgCXX11(1, "-std=c++11"); - ArgCXX11.insert(ArgCXX11.end(), ExtraArgs.begin(), ExtraArgs.end()); - - if (!tooling::runToolOnCodeWithArgs(new TestPPAction(Check, &Context), Code, - ArgCXX11, Filename)) - return ""; ast_matchers::MatchFinder Finder; Check.registerMatchers(&Finder); - std::unique_ptr Factory( - tooling::newFrontendActionFactory(&Finder)); - if (!tooling::runToolOnCodeWithArgs(Factory->create(), Code, ArgCXX11, - Filename)) + + std::vector ArgCXX11(1, "clang-tidy"); + ArgCXX11.push_back("-fsyntax-only"); + ArgCXX11.push_back("-std=c++11"); + ArgCXX11.insert(ArgCXX11.end(), ExtraArgs.begin(), ExtraArgs.end()); + ArgCXX11.push_back(Filename.str()); + llvm::IntrusiveRefCntPtr files( + new FileManager(FileSystemOptions())); + tooling::ToolInvocation Invocation( + ArgCXX11, new TestClangTidyAction(Check, Finder, Context), files.get()); + SmallString<16> FileNameStorage; + StringRef FileNameRef = Filename.toNullTerminatedStringRef(FileNameStorage); + Invocation.mapVirtualFile(FileNameRef, Code); + Invocation.setDiagnosticConsumer(&DiagConsumer); + if (!Invocation.run()) return ""; + DiagConsumer.finish(); tooling::Replacements Fixes; for (const ClangTidyError &Error : Context.getErrors()) diff --git a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp index a9afb820271e..00e9034456b6 100644 --- a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp @@ -114,7 +114,7 @@ TEST(LLVMHeaderGuardCheckTest, FixHeaderGuards) { "LLVM_ADT_FOO_H\n#endif \\ \n// " "LLVM_ADT_FOO_H\n", "include/llvm/ADT/foo.h", - /*ExpectedWarnings=*/0)); + /*ExpectedWarnings=*/1)); EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif /* " "LLVM_ADT_FOO_H\\ \n FOO */",