mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 00:46:45 +08:00
[clang-tidy] Add --use-color command line option and UseColor option to control colors in diagnostics
This patch adds `--use-color` command line option and `UseColor` option to clang-tidy to control colors in diagnostics. With these options, users can force colorful output. This is useful when using clang-tidy with parallelization command line tools (like ninja and GNU parallel), as they often pipe clang-tidy's standard output and make the colors disappear. Reviewed By: njames93 Differential Revision: https://reviews.llvm.org/D79477
This commit is contained in:
@@ -106,7 +106,8 @@ public:
|
||||
DiagPrinter),
|
||||
SourceMgr(Diags, Files), Context(Context), ApplyFixes(ApplyFixes),
|
||||
TotalFixes(0), AppliedFixes(0), WarningsAsErrors(0) {
|
||||
DiagOpts->ShowColors = llvm::sys::Process::StandardOutHasColors();
|
||||
DiagOpts->ShowColors = Context.getOptions().UseColor.getValueOr(
|
||||
llvm::sys::Process::StandardOutHasColors());
|
||||
DiagPrinter->BeginSourceFile(LangOpts);
|
||||
}
|
||||
|
||||
|
||||
@@ -96,6 +96,7 @@ template <> struct MappingTraits<ClangTidyOptions> {
|
||||
IO.mapOptional("ExtraArgs", Options.ExtraArgs);
|
||||
IO.mapOptional("ExtraArgsBefore", Options.ExtraArgsBefore);
|
||||
IO.mapOptional("InheritParentConfig", Options.InheritParentConfig);
|
||||
IO.mapOptional("UseColor", Options.UseColor);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -154,6 +155,7 @@ ClangTidyOptions ClangTidyOptions::mergeWith(const ClangTidyOptions &Other,
|
||||
overrideValue(Result.SystemHeaders, Other.SystemHeaders);
|
||||
overrideValue(Result.FormatStyle, Other.FormatStyle);
|
||||
overrideValue(Result.User, Other.User);
|
||||
overrideValue(Result.UseColor, Other.UseColor);
|
||||
mergeVectors(Result.ExtraArgs, Other.ExtraArgs);
|
||||
mergeVectors(Result.ExtraArgsBefore, Other.ExtraArgsBefore);
|
||||
|
||||
|
||||
@@ -126,6 +126,9 @@ struct ClangTidyOptions {
|
||||
/// apply this config file on top of the parent one. If false or missing,
|
||||
/// only this configuration file will be used.
|
||||
llvm::Optional<bool> InheritParentConfig;
|
||||
|
||||
/// Use colors in diagnostics. If missing, it will be auto detected.
|
||||
llvm::Optional<bool> UseColor;
|
||||
};
|
||||
|
||||
/// Abstract interface for retrieving various ClangTidy options.
|
||||
|
||||
@@ -230,6 +230,15 @@ over the real file system.
|
||||
cl::value_desc("filename"),
|
||||
cl::cat(ClangTidyCategory));
|
||||
|
||||
static cl::opt<bool> UseColor("use-color", cl::desc(R"(
|
||||
Use colors in diagnostics. If not set, colors
|
||||
will be used if the terminal connected to
|
||||
standard output supports colors.
|
||||
This option overrides the 'UseColor' option in
|
||||
.clang-tidy file, if any.
|
||||
)"),
|
||||
cl::init(false), cl::cat(ClangTidyCategory));
|
||||
|
||||
namespace clang {
|
||||
namespace tidy {
|
||||
|
||||
@@ -292,6 +301,8 @@ static std::unique_ptr<ClangTidyOptionsProvider> createOptionsProvider(
|
||||
OverrideOptions.SystemHeaders = SystemHeaders;
|
||||
if (FormatStyle.getNumOccurrences() > 0)
|
||||
OverrideOptions.FormatStyle = FormatStyle;
|
||||
if (UseColor.getNumOccurrences() > 0)
|
||||
OverrideOptions.UseColor = UseColor;
|
||||
|
||||
if (!Config.empty()) {
|
||||
if (llvm::ErrorOr<ClangTidyOptions> ParsedConfig =
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
// RUN: clang-tidy -dump-config | FileCheck %s
|
||||
// RUN: clang-tidy -dump-config -use-color | FileCheck -check-prefix=CHECK-CONFIG-COLOR %s
|
||||
// RUN: clang-tidy -dump-config -use-color=false | FileCheck -check-prefix=CHECK-CONFIG-NO-COLOR %s
|
||||
// RUN: clang-tidy -config='UseColor: true' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-COLOR %s
|
||||
// RUN: clang-tidy -config='UseColor: false' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-NO-COLOR %s
|
||||
// RUN: clang-tidy -help | FileCheck -check-prefix=CHECK-OPT-PRESENT %s
|
||||
|
||||
// REQUIRES: ansi-escape-sequences
|
||||
// RUN: clang-tidy -checks='-*, modernize-use-override' -extra-arg=-std=c++11 -use-color=false %s | FileCheck -check-prefix=CHECK-NO-COLOR %s
|
||||
// RUN: clang-tidy -checks='-*, modernize-use-override' -extra-arg=-std=c++11 %s | FileCheck -check-prefix=CHECK-NO-COLOR %s
|
||||
// RUN: clang-tidy -checks='-*, modernize-use-override' -extra-arg=-std=c++11 -use-color %s | FileCheck -check-prefix=CHECK-COLOR %s
|
||||
|
||||
// CHECK-NOT: UseColor
|
||||
// CHECK-CONFIG-NO-COLOR: UseColor: false
|
||||
// CHECK-CONFIG-COLOR: UseColor: true
|
||||
// CHECK-OPT-PRESENT: --use-color
|
||||
|
||||
class Base {
|
||||
public:
|
||||
virtual ~Base() = 0;
|
||||
};
|
||||
|
||||
class Delivered : public Base {
|
||||
public:
|
||||
virtual ~Delivered() = default;
|
||||
// CHECK-NO-COLOR: warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]
|
||||
// CHECK-COLOR: {{.\[0;1;35m}}warning: {{.\[0m}}{{.\[1m}}prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]
|
||||
};
|
||||
@@ -76,6 +76,7 @@ TEST(ParseConfiguration, MergeConfigurations) {
|
||||
User: user1
|
||||
ExtraArgs: ['arg1', 'arg2']
|
||||
ExtraArgsBefore: ['arg-before1', 'arg-before2']
|
||||
UseColor: false
|
||||
)");
|
||||
ASSERT_TRUE(!!Options1);
|
||||
llvm::ErrorOr<ClangTidyOptions> Options2 = parseConfiguration(R"(
|
||||
@@ -85,6 +86,7 @@ TEST(ParseConfiguration, MergeConfigurations) {
|
||||
User: user2
|
||||
ExtraArgs: ['arg3', 'arg4']
|
||||
ExtraArgsBefore: ['arg-before3', 'arg-before4']
|
||||
UseColor: true
|
||||
)");
|
||||
ASSERT_TRUE(!!Options2);
|
||||
ClangTidyOptions Options = Options1->mergeWith(*Options2, 0);
|
||||
@@ -98,6 +100,8 @@ TEST(ParseConfiguration, MergeConfigurations) {
|
||||
EXPECT_EQ("arg-before1,arg-before2,arg-before3,arg-before4",
|
||||
llvm::join(Options.ExtraArgsBefore->begin(),
|
||||
Options.ExtraArgsBefore->end(), ","));
|
||||
ASSERT_TRUE(Options.UseColor.hasValue());
|
||||
EXPECT_TRUE(*Options.UseColor);
|
||||
}
|
||||
|
||||
class TestCheck : public ClangTidyCheck {
|
||||
|
||||
Reference in New Issue
Block a user