Add support for `NOLINTBEGIN` ... `NOLINTEND` comments to suppress clang-tidy warnings over multiple lines. All lines between the "begin" and "end" markers are suppressed.
<Code with warnings to be suppressed, line 1>
<Code with warnings to be suppressed, line 2>
<Code with warnings to be suppressed, line 3>
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 due to the way the textual search is done and the fact that `NOLINT` is the stem of `NOLINTNEXTLINE`.
- `LineIsMarkedWithNOLINT()`: `NOLINTNEXTLINE`s 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.