[clang-tools-extra] r219212 - Make clang-tidy's runCheckOnCode actually use the DiagnosticConsumer.
Manuel Klimek
klimek at google.com
Wed Oct 8 02:45:41 PDT 2014
On Wed Oct 08 2014 at 11:34:02 AM Alexander Kornienko <alexfh at google.com>
wrote:
> 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".
>
Willdo.
> Also, why do we use llvm::IntrusiveRefCntPtr rather than std::unique_ptr?
> (I guess there's a reason, but I don't see it.)
>
This is the same code as in Tooling. I'd like to share that again at some
point, but didn't see a good way to resolve this now - if you have ideas,
I'm all ears.
>
>
>> + 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)?
>
Yea, you're right - since this is for testing, we can always copy. Again, I
think the right way is to make the interface with tooling simpler to use.
>
>
>> + 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?
>
Space between \ and EOL. I'm still confused why this warning didn't trigger
go through, but the others did...
>
> "ExpectedWarnings" doesn't help much =\ I'll change this to actual warning
> messages some day.
>
Oh yes - I had to add print statements to figure out what's going on at all
- which was a rather annoying experience ;)
>
>
>>
>> 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/72fdf0e2/attachment.html>
More information about the cfe-commits
mailing list