tools: refloat Node.js patches to cpplint.py
* Preserve 3 node-core checks
* Preserve patch to `FileInfo.RepositoryName`
* Remove TAP to logfile (unused)
PR-URL: https://github.com/nodejs/node/pull/25771
Fixes: https://github.com/nodejs/node/issues/25760
Refs: 3d8f6f876d/cpplint.py
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
3dca9e0a57
commit
4d193008d7
138
tools/cpplint.py
vendored
138
tools/cpplint.py
vendored
@ -122,7 +122,7 @@ Syntax: cpplint.py [--verbose=#] [--output=emacs|eclipse|vs7|junit]
|
|||||||
likely to be false positives.
|
likely to be false positives.
|
||||||
|
|
||||||
quiet
|
quiet
|
||||||
Supress output other than linting errors, such as information about
|
Suppress output other than linting errors, such as information about
|
||||||
which files have been processed and excluded.
|
which files have been processed and excluded.
|
||||||
|
|
||||||
filter=-x,+y,...
|
filter=-x,+y,...
|
||||||
@ -298,11 +298,13 @@ _ERROR_CATEGORIES = [
|
|||||||
'readability/constructors',
|
'readability/constructors',
|
||||||
'readability/fn_size',
|
'readability/fn_size',
|
||||||
'readability/inheritance',
|
'readability/inheritance',
|
||||||
|
'readability/pointer_notation',
|
||||||
'readability/multiline_comment',
|
'readability/multiline_comment',
|
||||||
'readability/multiline_string',
|
'readability/multiline_string',
|
||||||
'readability/namespace',
|
'readability/namespace',
|
||||||
'readability/nolint',
|
'readability/nolint',
|
||||||
'readability/nul',
|
'readability/nul',
|
||||||
|
'readability/null_usage',
|
||||||
'readability/strings',
|
'readability/strings',
|
||||||
'readability/todo',
|
'readability/todo',
|
||||||
'readability/utf8',
|
'readability/utf8',
|
||||||
@ -353,7 +355,11 @@ _LEGACY_ERROR_CATEGORIES = [
|
|||||||
# flag. By default all errors are on, so only add here categories that should be
|
# flag. By default all errors are on, so only add here categories that should be
|
||||||
# off by default (i.e., categories that must be enabled by the --filter= flags).
|
# off by default (i.e., categories that must be enabled by the --filter= flags).
|
||||||
# All entries here should start with a '-' or '+', as in the --filter= flag.
|
# All entries here should start with a '-' or '+', as in the --filter= flag.
|
||||||
_DEFAULT_FILTERS = ['-build/include_alpha']
|
_DEFAULT_FILTERS = [
|
||||||
|
'-build/include',
|
||||||
|
'-build/include_subdir',
|
||||||
|
'-legal/copyright',
|
||||||
|
]
|
||||||
|
|
||||||
# The default list of categories suppressed for C (not C++) files.
|
# The default list of categories suppressed for C (not C++) files.
|
||||||
_DEFAULT_C_SUPPRESSED_CATEGORIES = [
|
_DEFAULT_C_SUPPRESSED_CATEGORIES = [
|
||||||
@ -626,6 +632,12 @@ _SEARCH_C_FILE = re.compile(r'\b(?:LINT_C_FILE|'
|
|||||||
# Match string that indicates we're working on a Linux Kernel file.
|
# Match string that indicates we're working on a Linux Kernel file.
|
||||||
_SEARCH_KERNEL_FILE = re.compile(r'\b(?:LINT_KERNEL_FILE)')
|
_SEARCH_KERNEL_FILE = re.compile(r'\b(?:LINT_KERNEL_FILE)')
|
||||||
|
|
||||||
|
_NULL_TOKEN_PATTERN = re.compile(r'\bNULL\b')
|
||||||
|
|
||||||
|
_RIGHT_LEANING_POINTER_PATTERN = re.compile(r'[^=|(,\s><);&?:}]'
|
||||||
|
r'(?<!(sizeof|return))'
|
||||||
|
r'\s\*[a-zA-z_][0-9a-zA-z_]*')
|
||||||
|
|
||||||
_regexp_compile_cache = {}
|
_regexp_compile_cache = {}
|
||||||
|
|
||||||
# {str, set(int)}: a map from error categories to sets of linenumbers
|
# {str, set(int)}: a map from error categories to sets of linenumbers
|
||||||
@ -644,7 +656,7 @@ _repository = None
|
|||||||
# Files to exclude from linting. This is set by the --exclude flag.
|
# Files to exclude from linting. This is set by the --exclude flag.
|
||||||
_excludes = None
|
_excludes = None
|
||||||
|
|
||||||
# Whether to supress PrintInfo messages
|
# Whether to suppress PrintInfo messages
|
||||||
_quiet = False
|
_quiet = False
|
||||||
|
|
||||||
# The allowed line length of files.
|
# The allowed line length of files.
|
||||||
@ -1284,54 +1296,12 @@ class FileInfo(object):
|
|||||||
locations won't see bogus errors.
|
locations won't see bogus errors.
|
||||||
"""
|
"""
|
||||||
fullname = self.FullName()
|
fullname = self.FullName()
|
||||||
|
# XXX(bnoordhuis) Expects that cpplint.py lives in the tools/ directory.
|
||||||
if os.path.exists(fullname):
|
toplevel = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')).replace('\\', '/')
|
||||||
project_dir = os.path.dirname(fullname)
|
toplevel = unicode_escape_decode(toplevel)
|
||||||
|
prefix = os.path.commonprefix([fullname, toplevel])
|
||||||
# If the user specified a repository path, it exists, and the file is
|
return fullname[len(prefix) + 1:]
|
||||||
# contained in it, use the specified repository path
|
# End Node.js patch
|
||||||
if _repository:
|
|
||||||
repo = FileInfo(_repository).FullName()
|
|
||||||
root_dir = project_dir
|
|
||||||
while os.path.exists(root_dir):
|
|
||||||
# allow case insensitive compare on Windows
|
|
||||||
if os.path.normcase(root_dir) == os.path.normcase(repo):
|
|
||||||
return os.path.relpath(fullname, root_dir).replace('\\', '/')
|
|
||||||
one_up_dir = os.path.dirname(root_dir)
|
|
||||||
if one_up_dir == root_dir:
|
|
||||||
break
|
|
||||||
root_dir = one_up_dir
|
|
||||||
|
|
||||||
if os.path.exists(os.path.join(project_dir, ".svn")):
|
|
||||||
# If there's a .svn file in the current directory, we recursively look
|
|
||||||
# up the directory tree for the top of the SVN checkout
|
|
||||||
root_dir = project_dir
|
|
||||||
one_up_dir = os.path.dirname(root_dir)
|
|
||||||
while os.path.exists(os.path.join(one_up_dir, ".svn")):
|
|
||||||
root_dir = os.path.dirname(root_dir)
|
|
||||||
one_up_dir = os.path.dirname(one_up_dir)
|
|
||||||
|
|
||||||
prefix = os.path.commonprefix([root_dir, project_dir])
|
|
||||||
return fullname[len(prefix) + 1:]
|
|
||||||
|
|
||||||
# Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by
|
|
||||||
# searching up from the current path.
|
|
||||||
root_dir = current_dir = os.path.dirname(fullname)
|
|
||||||
while current_dir != os.path.dirname(current_dir):
|
|
||||||
if (os.path.exists(os.path.join(current_dir, ".git")) or
|
|
||||||
os.path.exists(os.path.join(current_dir, ".hg")) or
|
|
||||||
os.path.exists(os.path.join(current_dir, ".svn"))):
|
|
||||||
root_dir = current_dir
|
|
||||||
current_dir = os.path.dirname(current_dir)
|
|
||||||
|
|
||||||
if (os.path.exists(os.path.join(root_dir, ".git")) or
|
|
||||||
os.path.exists(os.path.join(root_dir, ".hg")) or
|
|
||||||
os.path.exists(os.path.join(root_dir, ".svn"))):
|
|
||||||
prefix = os.path.commonprefix([root_dir, project_dir])
|
|
||||||
return fullname[len(prefix) + 1:]
|
|
||||||
|
|
||||||
# Don't know what to do; header guard warnings may be wrong...
|
|
||||||
return fullname
|
|
||||||
|
|
||||||
def Split(self):
|
def Split(self):
|
||||||
"""Splits the file into the directory, basename, and extension.
|
"""Splits the file into the directory, basename, and extension.
|
||||||
@ -2148,6 +2118,21 @@ def CheckForBadCharacters(filename, lines, error):
|
|||||||
error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.')
|
error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.')
|
||||||
|
|
||||||
|
|
||||||
|
def CheckInlineHeader(filename, include_state, error):
|
||||||
|
"""Logs an error if both a header and its inline variant are included."""
|
||||||
|
|
||||||
|
all_headers = dict(item for sublist in include_state.include_list
|
||||||
|
for item in sublist)
|
||||||
|
bad_headers = set('%s.h' % name[:-6] for name in all_headers.keys()
|
||||||
|
if name.endswith('-inl.h'))
|
||||||
|
bad_headers &= set(all_headers.keys())
|
||||||
|
|
||||||
|
for name in bad_headers:
|
||||||
|
err = '%s includes both %s and %s-inl.h' % (filename, name, name)
|
||||||
|
linenum = all_headers[name]
|
||||||
|
error(filename, linenum, 'build/include', 5, err)
|
||||||
|
|
||||||
|
|
||||||
def CheckForNewlineAtEOF(filename, lines, error):
|
def CheckForNewlineAtEOF(filename, lines, error):
|
||||||
"""Logs an error if there is no newline char at the end of the file.
|
"""Logs an error if there is no newline char at the end of the file.
|
||||||
|
|
||||||
@ -4425,6 +4410,49 @@ def CheckAltTokens(filename, clean_lines, linenum, error):
|
|||||||
'Use operator %s instead of %s' % (
|
'Use operator %s instead of %s' % (
|
||||||
_ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1)))
|
_ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1)))
|
||||||
|
|
||||||
|
def CheckNullTokens(filename, clean_lines, linenum, error):
|
||||||
|
"""Check NULL usage.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filename: The name of the current file.
|
||||||
|
clean_lines: A CleansedLines instance containing the file.
|
||||||
|
linenum: The number of the line to check.
|
||||||
|
error: The function to call with any errors found.
|
||||||
|
"""
|
||||||
|
line = clean_lines.elided[linenum]
|
||||||
|
|
||||||
|
# Avoid preprocessor lines
|
||||||
|
if Match(r'^\s*#', line):
|
||||||
|
return
|
||||||
|
|
||||||
|
if line.find('/*') >= 0 or line.find('*/') >= 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
for match in _NULL_TOKEN_PATTERN.finditer(line):
|
||||||
|
error(filename, linenum, 'readability/null_usage', 2,
|
||||||
|
'Use nullptr instead of NULL')
|
||||||
|
|
||||||
|
def CheckLeftLeaningPointer(filename, clean_lines, linenum, error):
|
||||||
|
"""Check for left-leaning pointer placement.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filename: The name of the current file.
|
||||||
|
clean_lines: A CleansedLines instance containing the file.
|
||||||
|
linenum: The number of the line to check.
|
||||||
|
error: The function to call with any errors found.
|
||||||
|
"""
|
||||||
|
line = clean_lines.elided[linenum]
|
||||||
|
|
||||||
|
# Avoid preprocessor lines
|
||||||
|
if Match(r'^\s*#', line):
|
||||||
|
return
|
||||||
|
|
||||||
|
if '/*' in line or '*/' in line:
|
||||||
|
return
|
||||||
|
|
||||||
|
for match in _RIGHT_LEANING_POINTER_PATTERN.finditer(line):
|
||||||
|
error(filename, linenum, 'readability/pointer_notation', 2,
|
||||||
|
'Use left leaning pointer instead of right leaning')
|
||||||
|
|
||||||
def GetLineWidth(line):
|
def GetLineWidth(line):
|
||||||
"""Determines the width of the line in column positions.
|
"""Determines the width of the line in column positions.
|
||||||
@ -4477,6 +4505,10 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,
|
|||||||
error(filename, linenum, 'whitespace/tab', 1,
|
error(filename, linenum, 'whitespace/tab', 1,
|
||||||
'Tab found; better to use spaces')
|
'Tab found; better to use spaces')
|
||||||
|
|
||||||
|
if line.find('template<') != -1:
|
||||||
|
error(filename, linenum, 'whitespace/template', 1,
|
||||||
|
'Leave a single space after template, as in `template <...>`')
|
||||||
|
|
||||||
# One or three blank spaces at the beginning of the line is weird; it's
|
# One or three blank spaces at the beginning of the line is weird; it's
|
||||||
# hard to reconcile that with 2-space indents.
|
# hard to reconcile that with 2-space indents.
|
||||||
# NOTE: here are the conditions rob pike used for his tests. Mine aren't
|
# NOTE: here are the conditions rob pike used for his tests. Mine aren't
|
||||||
@ -4570,6 +4602,8 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,
|
|||||||
CheckSpacingForFunctionCall(filename, clean_lines, linenum, error)
|
CheckSpacingForFunctionCall(filename, clean_lines, linenum, error)
|
||||||
CheckCheck(filename, clean_lines, linenum, error)
|
CheckCheck(filename, clean_lines, linenum, error)
|
||||||
CheckAltTokens(filename, clean_lines, linenum, error)
|
CheckAltTokens(filename, clean_lines, linenum, error)
|
||||||
|
CheckNullTokens(filename, clean_lines, linenum, error)
|
||||||
|
CheckLeftLeaningPointer(filename, clean_lines, linenum, error)
|
||||||
classinfo = nesting_state.InnermostClass()
|
classinfo = nesting_state.InnermostClass()
|
||||||
if classinfo:
|
if classinfo:
|
||||||
CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error)
|
CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error)
|
||||||
@ -6112,6 +6146,8 @@ def ProcessFileData(filename, file_extension, lines, error,
|
|||||||
|
|
||||||
CheckForNewlineAtEOF(filename, lines, error)
|
CheckForNewlineAtEOF(filename, lines, error)
|
||||||
|
|
||||||
|
CheckInlineHeader(filename, include_state, error)
|
||||||
|
|
||||||
def ProcessConfigOverrides(filename):
|
def ProcessConfigOverrides(filename):
|
||||||
""" Loads the configuration files and processes the config overrides.
|
""" Loads the configuration files and processes the config overrides.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user