Add support for `NOLINTBEGIN` ... `NOLINTEND` comments
authorSalman Javed <mail@salmanjaved.org>
Tue, 28 Sep 2021 11:52:12 +0000 (07:52 -0400)
committerAaron Ballman <aaron@aaronballman.com>
Tue, 28 Sep 2021 11:53:23 +0000 (07:53 -0400)
commitc0687e1984a82925918c874b7bb68ad34c32aed0
tree8c72d06c90aa9c9ec96098674f607e7497ab83ee
parente2f6290e06be63149af770197b772248369ac038
Add support for `NOLINTBEGIN` ... `NOLINTEND` comments

Add support for NOLINTBEGIN ... NOLINTEND comments to suppress
clang-tidy warnings over multiple lines. All lines between the "begin"
and "end" markers are suppressed.

Example:

// NOLINTBEGIN(some-check)
<Code with warnings to be suppressed, line 1>
<Code with warnings to be suppressed, line 2>
<Code with warnings to be suppressed, line 3>
// NOLINTEND(some-check)
Follows similar syntax as the NOLINT and NOLINTNEXTLINE comments
that are already implemented, i.e. allows multiple checks to be provided
in parentheses; suppresses all checks if the parentheses are omitted,
etc.

If the comments are misused, e.g. using a NOLINTBEGIN but not
terminating it with a NOLINTEND, a clang-tidy-nolint diagnostic
message pointing to the misuse is generated.

As part of implementing this feature, the following bugs were fixed in
existing code:

IsNOLINTFound(): IsNOLINTFound("NOLINT", Str) returns true when Str is
"NOLINTNEXTLINE". This is because the textual search finds NOLINT as
the stem of NOLINTNEXTLINE.

LineIsMarkedWithNOLINT(): NOLINTNEXTLINEs on the very first line of a
file are ignored. This is due to rsplit('\n\').second returning a blank
string when there are no more newline chars to split on.
18 files changed:
clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/index.rst
clang-tools-extra/test/clang-tidy/infrastructure/Inputs/nolintbeginend/error_in_include.inc [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/Inputs/nolintbeginend/nolint_in_include.inc [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolint.cpp
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-begin-at-eof.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-begin-global-end-specific.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-begin-specific-end-global.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-begin-without-end.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-end-at-sof.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-end-without-begin.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-mismatched-check-names.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-mismatched-delims.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend-typo-in-check-name.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintbeginend.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/infrastructure/nolintnextline.cpp