[clang-tools-extra] r219212 - Make clang-tidy's runCheckOnCode actually use the DiagnosticConsumer.

Alexander Kornienko alexfh at google.com
Wed Oct 8 02:34:02 PDT 2014


On Tue, Oct 7, 2014 at 7:49 PM, Manuel Klimek <klimek at google.com> wrote:

> Author: klimek
> Date: Tue Oct  7 10:49:36 2014
> New Revision: 219212
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219212&view=rev
> Log:
> 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.
>
> Modified:
>     clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h
>     clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp
>
> Modified: 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=219212&r1=219211&r2=219212&view=diff
>
> ==============================================================================
> --- clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h (original)
> +++ clang-tools-extra/trunk/unittests/clang-tidy/ClangTidyTest.h Tue Oct
> 7 10:49:36 2014
> @@ -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<ASTConsumer> 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 <typename T>
> @@ -50,19 +52,25 @@ std::string runCheckOnCode(StringRef Cod
>        ClangTidyGlobalOptions(), Options));
>    ClangTidyDiagnosticConsumer DiagConsumer(Context);
>    T Check("test-check", &Context);
> -  std::vector<std::string> 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<tooling::FrontendActionFactory> Factory(
> -      tooling::newFrontendActionFactory(&Finder));
> -  if (!tooling::runToolOnCodeWithArgs(Factory->create(), Code, ArgCXX11,
> -                                      Filename))
> +
> +  std::vector<std::string> 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<FileManager> files(
>

Please capitalize "files". Also, why do we use llvm::IntrusiveRefCntPtr
rather than std::unique_ptr? (I guess there's a reason, but I don't see it.)


> +      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);
>

Maybe Invocation.mapVirtualFile(Filename.str(), Code)?


> +  Invocation.setDiagnosticConsumer(&DiagConsumer);
> +  if (!Invocation.run())
>      return "";
> +
>    DiagConsumer.finish();
>    tooling::Replacements Fixes;
>    for (const ClangTidyError &Error : Context.getErrors())
>
> Modified: 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=219212&r1=219211&r2=219212&view=diff
>
> ==============================================================================
> --- clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp
> (original)
> +++ clang-tools-extra/trunk/unittests/clang-tidy/LLVMModuleTest.cpp Tue
> Oct  7 10:49:36 2014
> @@ -114,7 +114,7 @@ TEST(LLVMHeaderGuardCheckTest, FixHeader
>                                           "LLVM_ADT_FOO_H\n#endif \\ \n// "
>                                           "LLVM_ADT_FOO_H\n",
>                                           "include/llvm/ADT/foo.h",
> -                                         /*ExpectedWarnings=*/0));
> +                                         /*ExpectedWarnings=*/1));
>

What kind of warning started appearing here? About unknown escape sequence?

"ExpectedWarnings" doesn't help much =\ I'll change this to actual warning
messages some day.


>
>    EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif  /* "
>              "LLVM_ADT_FOO_H\\ \n FOO */",
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141008/46a3600b/attachment.html>


More information about the cfe-commits mailing list