Skip to content

Commit

Permalink
tools: refloat 7 Node.js patches to cpplint.py
Browse files Browse the repository at this point in the history
Cherry-pick 12c8b4d
Original commit message:
    This commit is a suggestion for adding a rule for NULL usages in the
    code base. This will currently report a number of errors which could be
    ignored using // NOLINT (readability/null_usage)

    PR-URL: #17373
    Reviewed-By: Jon Moss <[email protected]>
    Reviewed-By: Anna Henningsen <[email protected]>
    Reviewed-By: Timothy Gu <[email protected]>
    Reviewed-By: Colin Ihrig <[email protected]>
    Reviewed-By: Michael Dawson <[email protected]>
    Reviewed-By: Sakthipriyan Vairamani <[email protected]>
    Reviewed-By: Tobias Nießen <[email protected]>

Refs: 12c8b4d

Cherry-pick fc81e80
Original commit message:

    Update cpplint.py to check for inline headers when the corresponding
    header is already included.

    PR-URL: #21521
    Reviewed-By: Ben Noordhuis <[email protected]>
    Reviewed-By: James M Snell <[email protected]>

Refs: fc81e80

Cherry-pick cbc3dd9
Original commit message:

    src, tools: add check for left leaning pointers

    This commit adds a rule to cpplint to check that pointers in the code
    base lean to the left and not right, and also fixes the violations
    reported.

    PR-URL: #21010
    Reviewed-By: Ben Noordhuis <[email protected]>
    Reviewed-By: Anna Henningsen <[email protected]>
    Reviewed-By: Ruben Bridgewater <[email protected]>
    Reviewed-By: James M Snell <[email protected]>

Refs: cbc3dd9

Cherry-pick 9029981
Original commit message:

    tools: fix cpplint.py header rules

    THIS COMMIT SHOULD GO WITH THE NEXT. IT WILL FIND NEW LINT.

    PR-URL: #26306
    Reviewed-By: Gireesh Punathil <[email protected]>

Refs: 9029981

Cherry-pick 0a25ace
Original commit message:

    tools: move cpplint configuration to .cpplint

    PR-URL: #27098
    Reviewed-By: Joyee Cheung <[email protected]>
    Reviewed-By: Daniel Bevenius <[email protected]>

Refs: 0a25ace

Cherry-pick afa9a72
Original commit message:

    tools: refloat update link to google styleguide for cpplint

    This commit updates two old links to Google's C++ styleguide which
    currently result in a 404 when accessed.

    PR-URL: #30876
    Reviewed-By: Michaël Zasso <[email protected]>
    Reviewed-By: David Carlier <[email protected]>
    Reviewed-By: Colin Ihrig <[email protected]>
    Reviewed-By: Richard Lau <[email protected]>
    Reviewed-By: Rich Trott <[email protected]>

Refs: afa9a72

Cherry-pick e23bf8f
Original commit message:

    tools,src: refloat forbid usage of v8::Persistent

    `v8::Persistent` comes with the surprising catch that it requires
    manual cleanup. `v8::Global` doesn’t, making it easier to use,
    and additionally provides move semantics. New code should always
    use `v8::Global`.

    PR-URL: #31018
    Reviewed-By: Colin Ihrig <[email protected]>
    Reviewed-By: Richard Lau <[email protected]>
    Reviewed-By: James M Snell <[email protected]>
    Reviewed-By: David Carlier <[email protected]>
    Reviewed-By: Rich Trott <[email protected]>
    Reviewed-By: Gus Caplan <[email protected]>
    Reviewed-By: Joyee Cheung <[email protected]>
    Reviewed-By: Ben Noordhuis <[email protected]>
    Reviewed-By: Stephen Belanger <[email protected]>

PR-URL: #35569
Reviewed-By: Richard Lau <[email protected]>
Reviewed-By: Daijiro Wachi <[email protected]>
Reviewed-By: Jiawen Geng <[email protected]>
  • Loading branch information
Trott authored and MylesBorins committed Nov 16, 2020
1 parent 1173efc commit adf4f90
Showing 1 changed file with 109 additions and 13 deletions.
122 changes: 109 additions & 13 deletions tools/cpplint.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@
'build/include',
'build/include_subdir',
'build/include_alpha',
'build/include_inline',
'build/include_order',
'build/include_what_you_use',
'build/namespaces_literals',
Expand All @@ -294,11 +295,13 @@
'readability/constructors',
'readability/fn_size',
'readability/inheritance',
'readability/pointer_notation',
'readability/multiline_comment',
'readability/multiline_string',
'readability/namespace',
'readability/nolint',
'readability/nul',
'readability/null_usage',
'readability/strings',
'readability/todo',
'readability/utf8',
Expand All @@ -318,6 +321,7 @@
'runtime/string',
'runtime/threadsafe_fn',
'runtime/vlog',
'runtime/v8_persistent',
'whitespace/blank_line',
'whitespace/braces',
'whitespace/comma',
Expand Down Expand Up @@ -622,6 +626,14 @@
# Match string that indicates we're working on a Linux Kernel file.
_SEARCH_KERNEL_FILE = re.compile(r'\b(?:LINT_KERNEL_FILE)')

_NULL_TOKEN_PATTERN = re.compile(r'\bNULL\b')

_V8_PERSISTENT_PATTERN = re.compile(r'\bv8::Persistent\b')

_RIGHT_LEANING_POINTER_PATTERN = re.compile(r'[^=|(,\s><);&?:}]'
r'(?<!(sizeof|return))'
r'\s\*[a-zA-Z_][0-9a-zA-Z_]*')

_regexp_compile_cache = {}

# {str, set(int)}: a map from error categories to sets of linenumbers
Expand All @@ -641,7 +653,7 @@
# Files to exclude from linting. This is set by the --exclude flag.
_excludes = None

# Whether to supress PrintInfo messages
# Whether to suppress PrintInfo messages
_quiet = False

# The allowed line length of files.
Expand Down Expand Up @@ -850,9 +862,9 @@ class _IncludeState(object):
# needs to move backwards, CheckNextIncludeOrder will raise an error.
_INITIAL_SECTION = 0
_MY_H_SECTION = 1
_C_SECTION = 2
_CPP_SECTION = 3
_OTHER_H_SECTION = 4
_OTHER_H_SECTION = 2
_C_SECTION = 3
_CPP_SECTION = 4

_TYPE_NAMES = {
_C_SYS_HEADER: 'C system header',
Expand All @@ -864,9 +876,9 @@ class _IncludeState(object):
_SECTION_NAMES = {
_INITIAL_SECTION: "... nothing. (This can't be an error.)",
_MY_H_SECTION: 'a header this file implements',
_OTHER_H_SECTION: 'other header',
_C_SECTION: 'C system header',
_CPP_SECTION: 'C++ system header',
_OTHER_H_SECTION: 'other header',
}

def __init__(self):
Expand Down Expand Up @@ -2262,6 +2274,21 @@ def CheckForBadCharacters(filename, lines, error):
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_inline', 5, err)


def CheckForNewlineAtEOF(filename, lines, error):
"""Logs an error if there is no newline char at the end of the file.
Expand Down Expand Up @@ -3285,7 +3312,7 @@ def CheckForFunctionLengths(filename, clean_lines, linenum,
"""Reports for long function bodies.
For an overview why this is done, see:
https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions
https://google.github.io/styleguide/cppguide.html#Write_Short_Functions
Uses a simplistic algorithm assuming other style guidelines
(especially spacing) are followed.
Expand Down Expand Up @@ -4511,6 +4538,71 @@ def CheckAltTokens(filename, clean_lines, linenum, error):
'Use operator %s instead of %s' % (
_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 CheckV8PersistentTokens(filename, clean_lines, linenum, error):
"""Check v8::Persistent 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 _V8_PERSISTENT_PATTERN.finditer(line):
error(filename, linenum, 'runtime/v8_persistent', 2,
'Use v8::Global instead of v8::Persistent')

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):
"""Determines the width of the line in column positions.
Expand Down Expand Up @@ -4665,6 +4757,9 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,
CheckSpacingForFunctionCall(filename, clean_lines, linenum, error)
CheckCheck(filename, clean_lines, linenum, error)
CheckAltTokens(filename, clean_lines, linenum, error)
CheckNullTokens(filename, clean_lines, linenum, error)
CheckV8PersistentTokens(filename, clean_lines, linenum, error)
CheckLeftLeaningPointer(filename, clean_lines, linenum, error)
classinfo = nesting_state.InnermostClass()
if classinfo:
CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error)
Expand Down Expand Up @@ -4841,11 +4936,10 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
include_state.include_list[-1].append((include, linenum))

# We want to ensure that headers appear in the right order:
# 1) for foo.cc, foo.h (preferred location)
# 2) c system files
# 3) cpp system files
# 4) for foo.cc, foo.h (deprecated location)
# 5) other google headers
# 1) for foo.cc, foo.h
# 2) other project headers
# 3) c system files
# 4) cpp system files
#
# We classify each include statement as one of those 5 types
# using a number of techniques. The include_state object keeps
Expand Down Expand Up @@ -5108,7 +5202,7 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension,
and line[-1] != '\\'):
error(filename, linenum, 'build/namespaces', 4,
'Do not use unnamed namespaces in header files. See '
'https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces'
'https://google.github.io/styleguide/cppguide.html#Namespaces'
' for more information.')


Expand Down Expand Up @@ -6230,6 +6324,8 @@ def ProcessFileData(filename, file_extension, lines, error,

CheckForNewlineAtEOF(filename, lines, error)

CheckInlineHeader(filename, include_state, error)

def ProcessConfigOverrides(filename):
""" Loads the configuration files and processes the config overrides.
Expand All @@ -6248,7 +6344,7 @@ def ProcessConfigOverrides(filename):
if not base_name:
break # Reached the root directory.

cfg_file = os.path.join(abs_path, "CPPLINT.cfg")
cfg_file = os.path.join(abs_path, ".cpplint")
abs_filename = abs_path
if not os.path.isfile(cfg_file):
continue
Expand Down

0 comments on commit adf4f90

Please sign in to comment.