forked from OSchip/llvm-project
[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:
parent
be2588fa7f
commit
d1013b44e3
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 --
|
Loading…
Reference in New Issue