Skip to content

Commit cfadd82

Browse files
Trottdanielleadams
authored andcommitted
tools: refloat 7 Node.js patches to cpplint.py
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 <me@jonathanmoss.me> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> 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 <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com> 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 <info@bnoordhuis.nl> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> 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 <gpunathi@in.ibm.com> Refs: 9029981 Cherry-pick 0a25ace Original commit message: tools: move cpplint configuration to .cpplint PR-URL: #27098 Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com> 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 <targos@protonmail.com> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Rich Trott <rtrott@gmail.com> 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 <cjihrig@gmail.com> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: David Carlier <devnexen@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Stephen Belanger <admin@stephenbelanger.com> PR-URL: #35569 Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> PR-URL: #35719 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> PR-URL: #35866 PR-URL: #36213 Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
1 parent 03e8aaf commit cfadd82

File tree

1 file changed

+110
-13
lines changed

1 file changed

+110
-13
lines changed

tools/cpplint.py

+110-13
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@
295295
'build/include',
296296
'build/include_subdir',
297297
'build/include_alpha',
298+
'build/include_inline',
298299
'build/include_order',
299300
'build/include_what_you_use',
300301
'build/namespaces_headers',
@@ -310,11 +311,13 @@
310311
'readability/constructors',
311312
'readability/fn_size',
312313
'readability/inheritance',
314+
'readability/pointer_notation',
313315
'readability/multiline_comment',
314316
'readability/multiline_string',
315317
'readability/namespace',
316318
'readability/nolint',
317319
'readability/nul',
320+
'readability/null_usage',
318321
'readability/strings',
319322
'readability/todo',
320323
'readability/utf8',
@@ -334,6 +337,7 @@
334337
'runtime/string',
335338
'runtime/threadsafe_fn',
336339
'runtime/vlog',
340+
'runtime/v8_persistent',
337341
'whitespace/blank_line',
338342
'whitespace/braces',
339343
'whitespace/comma',
@@ -835,6 +839,14 @@
835839
'Missing space after ,': r's/,\([^ ]\)/, \1/g',
836840
}
837841

842+
_NULL_TOKEN_PATTERN = re.compile(r'\bNULL\b')
843+
844+
_V8_PERSISTENT_PATTERN = re.compile(r'\bv8::Persistent\b')
845+
846+
_RIGHT_LEANING_POINTER_PATTERN = re.compile(r'[^=|(,\s><);&?:}]'
847+
r'(?<!(sizeof|return))'
848+
r'\s\*[a-zA-Z_][0-9a-zA-Z_]*')
849+
838850
_regexp_compile_cache = {}
839851

840852
# {str, set(int)}: a map from error categories to sets of linenumbers
@@ -854,7 +866,7 @@
854866
# Files to exclude from linting. This is set by the --exclude flag.
855867
_excludes = None
856868

857-
# Whether to supress PrintInfo messages
869+
# Whether to suppress PrintInfo messages
858870
_quiet = False
859871

860872
# The allowed line length of files.
@@ -1075,10 +1087,11 @@ class _IncludeState(object):
10751087
# needs to move backwards, CheckNextIncludeOrder will raise an error.
10761088
_INITIAL_SECTION = 0
10771089
_MY_H_SECTION = 1
1078-
_C_SECTION = 2
1079-
_CPP_SECTION = 3
1080-
_OTHER_SYS_SECTION = 4
1081-
_OTHER_H_SECTION = 5
1090+
_OTHER_H_SECTION = 2
1091+
_OTHER_SYS_SECTION = 3
1092+
_C_SECTION = 4
1093+
_CPP_SECTION = 5
1094+
10821095

10831096
_TYPE_NAMES = {
10841097
_C_SYS_HEADER: 'C system header',
@@ -2511,6 +2524,21 @@ def CheckForBadCharacters(filename, lines, error):
25112524
error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.')
25122525

25132526

2527+
def CheckInlineHeader(filename, include_state, error):
2528+
"""Logs an error if both a header and its inline variant are included."""
2529+
2530+
all_headers = dict(item for sublist in include_state.include_list
2531+
for item in sublist)
2532+
bad_headers = set('%s.h' % name[:-6] for name in all_headers.keys()
2533+
if name.endswith('-inl.h'))
2534+
bad_headers &= set(all_headers.keys())
2535+
2536+
for name in bad_headers:
2537+
err = '%s includes both %s and %s-inl.h' % (filename, name, name)
2538+
linenum = all_headers[name]
2539+
error(filename, linenum, 'build/include_inline', 5, err)
2540+
2541+
25142542
def CheckForNewlineAtEOF(filename, lines, error):
25152543
"""Logs an error if there is no newline char at the end of the file.
25162544
@@ -3534,7 +3562,7 @@ def CheckForFunctionLengths(filename, clean_lines, linenum,
35343562
"""Reports for long function bodies.
35353563
35363564
For an overview why this is done, see:
3537-
https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions
3565+
https://google.github.io/styleguide/cppguide.html#Write_Short_Functions
35383566
35393567
Uses a simplistic algorithm assuming other style guidelines
35403568
(especially spacing) are followed.
@@ -4760,6 +4788,71 @@ def CheckAltTokens(filename, clean_lines, linenum, error):
47604788
'Use operator %s instead of %s' % (
47614789
_ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1)))
47624790

4791+
def CheckNullTokens(filename, clean_lines, linenum, error):
4792+
"""Check NULL usage.
4793+
4794+
Args:
4795+
filename: The name of the current file.
4796+
clean_lines: A CleansedLines instance containing the file.
4797+
linenum: The number of the line to check.
4798+
error: The function to call with any errors found.
4799+
"""
4800+
line = clean_lines.elided[linenum]
4801+
4802+
# Avoid preprocessor lines
4803+
if Match(r'^\s*#', line):
4804+
return
4805+
4806+
if line.find('/*') >= 0 or line.find('*/') >= 0:
4807+
return
4808+
4809+
for match in _NULL_TOKEN_PATTERN.finditer(line):
4810+
error(filename, linenum, 'readability/null_usage', 2,
4811+
'Use nullptr instead of NULL')
4812+
4813+
def CheckV8PersistentTokens(filename, clean_lines, linenum, error):
4814+
"""Check v8::Persistent usage.
4815+
4816+
Args:
4817+
filename: The name of the current file.
4818+
clean_lines: A CleansedLines instance containing the file.
4819+
linenum: The number of the line to check.
4820+
error: The function to call with any errors found.
4821+
"""
4822+
line = clean_lines.elided[linenum]
4823+
4824+
# Avoid preprocessor lines
4825+
if Match(r'^\s*#', line):
4826+
return
4827+
4828+
if line.find('/*') >= 0 or line.find('*/') >= 0:
4829+
return
4830+
4831+
for match in _V8_PERSISTENT_PATTERN.finditer(line):
4832+
error(filename, linenum, 'runtime/v8_persistent', 2,
4833+
'Use v8::Global instead of v8::Persistent')
4834+
4835+
def CheckLeftLeaningPointer(filename, clean_lines, linenum, error):
4836+
"""Check for left-leaning pointer placement.
4837+
4838+
Args:
4839+
filename: The name of the current file.
4840+
clean_lines: A CleansedLines instance containing the file.
4841+
linenum: The number of the line to check.
4842+
error: The function to call with any errors found.
4843+
"""
4844+
line = clean_lines.elided[linenum]
4845+
4846+
# Avoid preprocessor lines
4847+
if Match(r'^\s*#', line):
4848+
return
4849+
4850+
if '/*' in line or '*/' in line:
4851+
return
4852+
4853+
for match in _RIGHT_LEANING_POINTER_PATTERN.finditer(line):
4854+
error(filename, linenum, 'readability/pointer_notation', 2,
4855+
'Use left leaning pointer instead of right leaning')
47634856

47644857
def GetLineWidth(line):
47654858
"""Determines the width of the line in column positions.
@@ -4914,6 +5007,9 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,
49145007
CheckSpacingForFunctionCall(filename, clean_lines, linenum, error)
49155008
CheckCheck(filename, clean_lines, linenum, error)
49165009
CheckAltTokens(filename, clean_lines, linenum, error)
5010+
CheckNullTokens(filename, clean_lines, linenum, error)
5011+
CheckV8PersistentTokens(filename, clean_lines, linenum, error)
5012+
CheckLeftLeaningPointer(filename, clean_lines, linenum, error)
49175013
classinfo = nesting_state.InnermostClass()
49185014
if classinfo:
49195015
CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error)
@@ -5099,11 +5195,10 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
50995195
include_state.include_list[-1].append((include, linenum))
51005196

51015197
# We want to ensure that headers appear in the right order:
5102-
# 1) for foo.cc, foo.h (preferred location)
5103-
# 2) c system files
5104-
# 3) cpp system files
5105-
# 4) for foo.cc, foo.h (deprecated location)
5106-
# 5) other google headers
5198+
# 1) for foo.cc, foo.h
5199+
# 2) other project headers
5200+
# 3) c system files
5201+
# 4) cpp system files
51075202
#
51085203
# We classify each include statement as one of those 5 types
51095204
# using a number of techniques. The include_state object keeps
@@ -5366,7 +5461,7 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension,
53665461
and line[-1] != '\\'):
53675462
error(filename, linenum, 'build/namespaces_headers', 4,
53685463
'Do not use unnamed namespaces in header files. See '
5369-
'https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces'
5464+
'https://google.github.io/styleguide/cppguide.html#Namespaces'
53705465
' for more information.')
53715466

53725467

@@ -6488,6 +6583,8 @@ def ProcessFileData(filename, file_extension, lines, error,
64886583

64896584
CheckForNewlineAtEOF(filename, lines, error)
64906585

6586+
CheckInlineHeader(filename, include_state, error)
6587+
64916588
def ProcessConfigOverrides(filename):
64926589
""" Loads the configuration files and processes the config overrides.
64936590
@@ -6506,7 +6603,7 @@ def ProcessConfigOverrides(filename):
65066603
if not base_name:
65076604
break # Reached the root directory.
65086605

6509-
cfg_file = os.path.join(abs_path, "CPPLINT.cfg")
6606+
cfg_file = os.path.join(abs_path, ".cpplint")
65106607
abs_filename = abs_path
65116608
if not os.path.isfile(cfg_file):
65126609
continue

0 commit comments

Comments
 (0)