Skip to content

Commit 3383004

Browse files
zeyi2localspook
andauthored
[clang-tidy] Support comments in WarningsAsErrors (#171816)
Closes #171792 --------- Co-authored-by: Victor Chernyakin <chernyakin.victor.j@outlook.com>
1 parent c05a3ac commit 3383004

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

clang-tools-extra/clang-tidy/ClangTidyOptions.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,13 @@ template <> struct MappingTraits<ClangTidyOptions::CustomCheckValue> {
178178
}
179179
};
180180

181-
struct ChecksVariant {
181+
struct GlobListVariant {
182182
std::optional<std::string> AsString;
183183
std::optional<std::vector<std::string>> AsVector;
184184
};
185185

186-
template <> void yamlize(IO &IO, ChecksVariant &Val, bool, EmptyContext &Ctx) {
186+
template <>
187+
void yamlize(IO &IO, GlobListVariant &Val, bool, EmptyContext &Ctx) {
187188
if (!IO.outputting()) {
188189
// Special case for reading from YAML
189190
// Must support reading from both a string or a list
@@ -200,25 +201,26 @@ template <> void yamlize(IO &IO, ChecksVariant &Val, bool, EmptyContext &Ctx) {
200201
}
201202
}
202203

203-
static void mapChecks(IO &IO, std::optional<std::string> &Checks) {
204+
static void mapGlobList(IO &IO, std::optional<std::string> &GlobList,
205+
StringRef Key) {
204206
if (IO.outputting()) {
205207
// Output always a string
206-
IO.mapOptional("Checks", Checks);
208+
IO.mapOptional(Key, GlobList);
207209
} else {
208210
// Input as either a string or a list
209-
ChecksVariant ChecksAsVariant;
210-
IO.mapOptional("Checks", ChecksAsVariant);
211-
if (ChecksAsVariant.AsString)
212-
Checks = ChecksAsVariant.AsString;
213-
else if (ChecksAsVariant.AsVector)
214-
Checks = llvm::join(*ChecksAsVariant.AsVector, ",");
211+
GlobListVariant GlobListAsVariant;
212+
IO.mapOptional(Key, GlobListAsVariant);
213+
if (GlobListAsVariant.AsString)
214+
GlobList = GlobListAsVariant.AsString;
215+
else if (GlobListAsVariant.AsVector)
216+
GlobList = llvm::join(*GlobListAsVariant.AsVector, ",");
215217
}
216218
}
217219

218220
template <> struct MappingTraits<ClangTidyOptions> {
219221
static void mapping(IO &IO, ClangTidyOptions &Options) {
220-
mapChecks(IO, Options.Checks);
221-
IO.mapOptional("WarningsAsErrors", Options.WarningsAsErrors);
222+
mapGlobList(IO, Options.Checks, "Checks");
223+
mapGlobList(IO, Options.WarningsAsErrors, "WarningsAsErrors");
222224
IO.mapOptional("HeaderFileExtensions", Options.HeaderFileExtensions);
223225
IO.mapOptional("ImplementationFileExtensions",
224226
Options.ImplementationFileExtensions);

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ Improvements to clang-tidy
196196
moved to the ``fuchsia`` module instead. The ``zircon`` module will be removed
197197
in the 24th release.
198198

199+
- Improved :program:`clang-tidy` configuration parsing by allowing the same list
200+
syntax in `WarningsAsErrors` as in `Checks`.
201+
199202
New checks
200203
^^^^^^^^^^
201204

clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,37 @@ TEST(ParseConfiguration, ChecksSeparatedByNewlines) {
107107
EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n", *Options->Checks);
108108
}
109109

110+
TEST(ParseConfiguration, WarningsAsErrorsSeparatedByNewlines) {
111+
const auto MemoryBuffer = llvm::MemoryBufferRef("WarningsAsErrors: |\n"
112+
" -*,misc-*\n"
113+
" llvm-*\n"
114+
" -clang-*,\n"
115+
" google-*",
116+
"Options");
117+
118+
const auto Options = parseConfiguration(MemoryBuffer);
119+
120+
EXPECT_TRUE(!!Options);
121+
EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n",
122+
*Options->WarningsAsErrors);
123+
}
124+
125+
TEST(ParseConfiguration, WarningsAsErrorsAsList) {
126+
const auto MemoryBuffer = llvm::MemoryBufferRef("WarningsAsErrors: [\n"
127+
" '-*',\n"
128+
" 'misc-*',\n"
129+
" 'llvm-*',\n"
130+
" '-clang-*',\n"
131+
" 'google-*'\n"
132+
"]",
133+
"Options");
134+
135+
const auto Options = parseConfiguration(MemoryBuffer);
136+
137+
EXPECT_TRUE(!!Options);
138+
EXPECT_EQ("-*,misc-*,llvm-*,-clang-*,google-*", *Options->WarningsAsErrors);
139+
}
140+
110141
TEST(ParseConfiguration, MergeConfigurations) {
111142
llvm::ErrorOr<ClangTidyOptions> Options1 =
112143
parseConfiguration(llvm::MemoryBufferRef(R"(

0 commit comments

Comments
 (0)