From: Olivier Goffart Date: Tue, 30 Aug 2016 17:42:29 +0000 (+0000) Subject: Fix colored diagnostics from tools X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9270b6d0ae634e0a9d7460971f891ba8ed3917a7;p=clang Fix colored diagnostics from tools r271042 changed the way the diagnostic arguments are parsed. It assumes that the diagnostics options were already parsed by the "Driver". For tools using clang::Tooling, the diagnostics argument were not parsed. Differential Revision: https://reviews.llvm.org/D23837 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280118 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp index 96118713b0..162a4914de 100644 --- a/lib/Tooling/Tooling.cpp +++ b/lib/Tooling/Tooling.cpp @@ -15,6 +15,7 @@ #include "clang/Tooling/Tooling.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" +#include "clang/Driver/Options.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" #include "clang/Frontend/ASTUnit.h" @@ -26,6 +27,7 @@ #include "clang/Tooling/CompilationDatabase.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Config/llvm-config.h" +#include "llvm/Option/ArgList.h" #include "llvm/Option/Option.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" @@ -241,6 +243,12 @@ bool ToolInvocation::run() { Argv.push_back(Str.c_str()); const char *const BinaryName = Argv[0]; IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); + unsigned MissingArgIndex, MissingArgCount; + llvm::opt::InputArgList ParsedArgs = + driver::createDriverOptTable()->ParseArgs( + ArrayRef(Argv).slice(1), MissingArgIndex, + MissingArgCount); + ParseDiagnosticArgs(*DiagOpts, ParsedArgs); TextDiagnosticPrinter DiagnosticPrinter( llvm::errs(), &*DiagOpts); DiagnosticsEngine Diagnostics( diff --git a/unittests/Tooling/ToolingTest.cpp b/unittests/Tooling/ToolingTest.cpp index 82ee6020a8..68b5ed2105 100644 --- a/unittests/Tooling/ToolingTest.cpp +++ b/unittests/Tooling/ToolingTest.cpp @@ -332,6 +332,44 @@ TEST(runToolOnCodeWithArgs, TestNoDepFile) { EXPECT_FALSE(llvm::sys::fs::remove(DepFilePath.str())); } +struct CheckColoredDiagnosticsAction : public clang::ASTFrontendAction { + CheckColoredDiagnosticsAction(bool ShouldShowColor) + : ShouldShowColor(ShouldShowColor) {} + std::unique_ptr CreateASTConsumer(CompilerInstance &Compiler, + StringRef) override { + if (Compiler.getDiagnosticOpts().ShowColors != ShouldShowColor) + Compiler.getDiagnostics().Report( + Compiler.getDiagnostics().getCustomDiagID( + DiagnosticsEngine::Fatal, + "getDiagnosticOpts().ShowColors != ShouldShowColor")); + return llvm::make_unique(); + } + +private: + bool ShouldShowColor = true; +}; + +TEST(runToolOnCodeWithArgs, DiagnosticsColor) { + + EXPECT_TRUE(runToolOnCodeWithArgs(new CheckColoredDiagnosticsAction(true), "", + {"-fcolor-diagnostics"})); + EXPECT_TRUE(runToolOnCodeWithArgs(new CheckColoredDiagnosticsAction(false), + "", {"-fno-color-diagnostics"})); + EXPECT_TRUE( + runToolOnCodeWithArgs(new CheckColoredDiagnosticsAction(true), "", + {"-fno-color-diagnostics", "-fcolor-diagnostics"})); + EXPECT_TRUE( + runToolOnCodeWithArgs(new CheckColoredDiagnosticsAction(false), "", + {"-fcolor-diagnostics", "-fno-color-diagnostics"})); + EXPECT_TRUE(runToolOnCodeWithArgs( + new CheckColoredDiagnosticsAction(true), "", + {"-fno-color-diagnostics", "-fdiagnostics-color=always"})); + + // Check that this test would fail if ShowColors is not what it should. + EXPECT_FALSE(runToolOnCodeWithArgs(new CheckColoredDiagnosticsAction(false), + "", {"-fcolor-diagnostics"})); +} + TEST(ClangToolTest, ArgumentAdjusters) { FixedCompilationDatabase Compilations("/", std::vector());