[clang-tidy] Add support for NOLINTNEXTLINE.

Reviewers: alexfh

Subscribers: JDevlieghere, cfe-commits

Differential Revision: https://reviews.llvm.org/D29899

llvm-svn: 295049
This commit is contained in:
Benjamin Kramer 2017-02-14 12:47:56 +00:00
parent be2588fa7f
commit d1013b44e3
2 changed files with 62 additions and 0 deletions

View File

@ -272,6 +272,7 @@ static bool LineIsMarkedWithNOLINT(SourceManager &SM, SourceLocation Loc) {
if (Invalid)
return false;
// Check if there's a NOLINT on this line.
const char *P = CharacterData;
while (*P != '\0' && *P != '\r' && *P != '\n')
++P;
@ -279,6 +280,34 @@ static bool LineIsMarkedWithNOLINT(SourceManager &SM, SourceLocation Loc) {
// FIXME: Handle /\bNOLINT\b(\([^)]*\))?/ as cpplint.py does.
if (RestOfLine.find("NOLINT") != StringRef::npos)
return true;
// Check if there's a NOLINTNEXTLINE on the previous line.
const char *BufBegin =
SM.getCharacterData(SM.getLocForStartOfFile(SM.getFileID(Loc)), &Invalid);
if (Invalid || P == BufBegin)
return false;
// Scan backwards over the current line.
P = CharacterData;
while (P != BufBegin && *P != '\n')
--P;
// If we reached the begin of the file there is no line before it.
if (P == BufBegin)
return false;
// Skip over the newline.
--P;
const char *LineEnd = P;
// Now we're on the previous line. Skip to the beginning of it.
while (P != BufBegin && *P != '\n')
--P;
RestOfLine = StringRef(P, LineEnd - P + 1);
if (RestOfLine.find("NOLINTNEXTLINE") != StringRef::npos)
return true;
return false;
}

View File

@ -0,0 +1,33 @@
class A { A(int i); };
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: single-argument constructors must be marked explicit
// NOLINTNEXTLINE
class B { B(int i); };
// NOLINTNEXTLINE(we-dont-care-about-categories-yet)
class C { C(int i); };
// NOLINTNEXTLINE
class D { D(int i); };
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: single-argument constructors must be marked explicit
// NOLINTNEXTLINE
//
class E { E(int i); };
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: single-argument constructors must be marked explicit
#define MACRO(X) class X { X(int i); };
MACRO(F)
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: single-argument constructors must be marked explicit
// NOLINTNEXTLINE
MACRO(G)
#define MACRO_NOARG class H { H(int i); };
// NOLINTNEXTLINE
MACRO_NOARG
// CHECK-MESSAGES: Suppressed 4 warnings (4 NOLINT)
// RUN: %check_clang_tidy %s google-explicit-constructor %t --