Browse Source

cpplint: make lint rules closer to node's source

* Support C-style header guards (/* comments */)
* Support `class NODE_EXTERN something`
* Support `}  // extern "C"` closures
* Ignore header order
* Ignore `long/short` usage (because of OpenSSL's API)
v0.11.5-release
Fedor Indutny 12 years ago
parent
commit
3c6b5d5df1
  1. 31
      tools/cpplint.py

31
tools/cpplint.py

@ -1087,9 +1087,11 @@ def CheckForHeaderGuard(filename, lines, error):
error(filename, ifndef_linenum, 'build/header_guard', error_level, error(filename, ifndef_linenum, 'build/header_guard', error_level,
'#ifndef header guard has wrong style, please use: %s' % cppvar) '#ifndef header guard has wrong style, please use: %s' % cppvar)
if endif != ('#endif // %s' % cppvar): if (endif != ('#endif // %s' % cppvar) and
endif != ('#endif /* %s */' % cppvar)):
error_level = 0 error_level = 0
if endif != ('#endif // %s' % (cppvar + '_')): if (endif != ('#endif // %s' % (cppvar + '_')) and
endif != ('#endif /* %s */' % (cppvar + '_'))):
error_level = 5 error_level = 5
ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum, ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum,
@ -1380,7 +1382,8 @@ def CheckForNonStandardConstructs(filename, clean_lines, linenum,
classinfo_stack = class_state.classinfo_stack classinfo_stack = class_state.classinfo_stack
# Look for a class declaration # Look for a class declaration
class_decl_match = Match( class_decl_match = Match(
r'\s*(template\s*<[\w\s<>,:]*>\s*)?(class|struct)\s+(\w+(::\w+)*)', line) r'\s*(template\s*<[\w\s<>,:]*>\s*)?(class|struct)\s+' +
r'(?:NODE_EXTERN\s+)?(\w+(::\w+)*)', line)
if class_decl_match: if class_decl_match:
classinfo_stack.append(_ClassInfo(class_decl_match.group(3), linenum)) classinfo_stack.append(_ClassInfo(class_decl_match.group(3), linenum))
@ -1711,6 +1714,7 @@ def CheckSpacing(filename, clean_lines, linenum, error):
if (next_line if (next_line
and Match(r'\s*}', next_line) and Match(r'\s*}', next_line)
and next_line.find('namespace') == -1 and next_line.find('namespace') == -1
and next_line.find('extern') == -1
and next_line.find('} else ') == -1): and next_line.find('} else ') == -1):
error(filename, linenum, 'whitespace/blank_line', 3, error(filename, linenum, 'whitespace/blank_line', 3,
'Blank line at the end of a code block. Is this needed?') 'Blank line at the end of a code block. Is this needed?')
@ -2112,7 +2116,8 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, error):
cppvar = GetHeaderGuardCPPVariable(filename) cppvar = GetHeaderGuardCPPVariable(filename)
if (line.startswith('#ifndef %s' % cppvar) or if (line.startswith('#ifndef %s' % cppvar) or
line.startswith('#define %s' % cppvar) or line.startswith('#define %s' % cppvar) or
line.startswith('#endif // %s' % cppvar)): line.startswith('#endif // %s' % cppvar) or
line.startswith('#endif /* %s */' % cppvar)):
is_header_guard = True is_header_guard = True
# #include lines and header guards can be long, since there's no clean way to # #include lines and header guards can be long, since there's no clean way to
# split them. # split them.
@ -2307,10 +2312,10 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
# lower type after that. # lower type after that.
error_message = include_state.CheckNextIncludeOrder( error_message = include_state.CheckNextIncludeOrder(
_ClassifyInclude(fileinfo, include, is_system)) _ClassifyInclude(fileinfo, include, is_system))
if error_message: # if error_message:
error(filename, linenum, 'build/include_order', 4, # error(filename, linenum, 'build/include_order', 4,
'%s. Should be: %s.h, c system, c++ system, other.' % # '%s. Should be: %s.h, c system, c++ system, other.' %
(error_message, fileinfo.BaseName())) # (error_message, fileinfo.BaseName()))
if not include_state.IsInAlphabeticalOrder(include): if not include_state.IsInAlphabeticalOrder(include):
error(filename, linenum, 'build/include_alpha', 4, error(filename, linenum, 'build/include_alpha', 4,
'Include "%s" not in alphabetical order' % include) 'Include "%s" not in alphabetical order' % include)
@ -2464,11 +2469,11 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension, include_state,
if not Search(r'\bunsigned short port\b', line): if not Search(r'\bunsigned short port\b', line):
error(filename, linenum, 'runtime/int', 4, error(filename, linenum, 'runtime/int', 4,
'Use "unsigned short" for ports, not "short"') 'Use "unsigned short" for ports, not "short"')
else: # else:
match = Search(r'\b(short|long(?! +double)|long long)\b', line) # match = Search(r'\b(short|long(?! +double)|long long)\b', line)
if match: # if match:
error(filename, linenum, 'runtime/int', 4, # error(filename, linenum, 'runtime/int', 4,
'Use int16/int64/etc, rather than the C type %s' % match.group(1)) # 'Use int16/int64/etc, rather than the C type %s' % match.group(1))
# When snprintf is used, the second argument shouldn't be a literal. # When snprintf is used, the second argument shouldn't be a literal.
match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line)

Loading…
Cancel
Save