295
295
'build/include' ,
296
296
'build/include_subdir' ,
297
297
'build/include_alpha' ,
298
+ 'build/include_inline' ,
298
299
'build/include_order' ,
299
300
'build/include_what_you_use' ,
300
301
'build/namespaces_headers' ,
310
311
'readability/constructors' ,
311
312
'readability/fn_size' ,
312
313
'readability/inheritance' ,
314
+ 'readability/pointer_notation' ,
313
315
'readability/multiline_comment' ,
314
316
'readability/multiline_string' ,
315
317
'readability/namespace' ,
316
318
'readability/nolint' ,
317
319
'readability/nul' ,
320
+ 'readability/null_usage' ,
318
321
'readability/strings' ,
319
322
'readability/todo' ,
320
323
'readability/utf8' ,
334
337
'runtime/string' ,
335
338
'runtime/threadsafe_fn' ,
336
339
'runtime/vlog' ,
340
+ 'runtime/v8_persistent' ,
337
341
'whitespace/blank_line' ,
338
342
'whitespace/braces' ,
339
343
'whitespace/comma' ,
842
846
'Missing space after ,' : r's/,\([^ ]\)/, \1/g' ,
843
847
}
844
848
849
+ _NULL_TOKEN_PATTERN = re .compile (r'\bNULL\b' )
850
+
851
+ _V8_PERSISTENT_PATTERN = re .compile (r'\bv8::Persistent\b' )
852
+
853
+ _RIGHT_LEANING_POINTER_PATTERN = re .compile (r'[^=|(,\s><);&?:}]'
854
+ r'(?<!(sizeof|return))'
855
+ r'\s\*[a-zA-Z_][0-9a-zA-Z_]*' )
856
+
845
857
_regexp_compile_cache = {}
846
858
847
859
# {str, set(int)}: a map from error categories to sets of linenumbers
@@ -1082,10 +1094,11 @@ class _IncludeState(object):
1082
1094
# needs to move backwards, CheckNextIncludeOrder will raise an error.
1083
1095
_INITIAL_SECTION = 0
1084
1096
_MY_H_SECTION = 1
1085
- _C_SECTION = 2
1086
- _CPP_SECTION = 3
1087
- _OTHER_SYS_SECTION = 4
1088
- _OTHER_H_SECTION = 5
1097
+ _OTHER_H_SECTION = 2
1098
+ _OTHER_SYS_SECTION = 3
1099
+ _C_SECTION = 4
1100
+ _CPP_SECTION = 5
1101
+
1089
1102
1090
1103
_TYPE_NAMES = {
1091
1104
_C_SYS_HEADER : 'C system header' ,
@@ -2520,6 +2533,21 @@ def CheckForBadCharacters(filename, lines, error):
2520
2533
error (filename , linenum , 'readability/nul' , 5 , 'Line contains NUL byte.' )
2521
2534
2522
2535
2536
+ def CheckInlineHeader (filename , include_state , error ):
2537
+ """Logs an error if both a header and its inline variant are included."""
2538
+
2539
+ all_headers = dict (item for sublist in include_state .include_list
2540
+ for item in sublist )
2541
+ bad_headers = set ('%s.h' % name [:- 6 ] for name in all_headers .keys ()
2542
+ if name .endswith ('-inl.h' ))
2543
+ bad_headers &= set (all_headers .keys ())
2544
+
2545
+ for name in bad_headers :
2546
+ err = '%s includes both %s and %s-inl.h' % (filename , name , name )
2547
+ linenum = all_headers [name ]
2548
+ error (filename , linenum , 'build/include_inline' , 5 , err )
2549
+
2550
+
2523
2551
def CheckForNewlineAtEOF (filename , lines , error ):
2524
2552
"""Logs an error if there is no newline char at the end of the file.
2525
2553
@@ -3543,7 +3571,7 @@ def CheckForFunctionLengths(filename, clean_lines, linenum,
3543
3571
"""Reports for long function bodies.
3544
3572
3545
3573
For an overview why this is done, see:
3546
- https://google-styleguide.googlecode.com/svn/trunk/ cppguide.xml #Write_Short_Functions
3574
+ https://google.github.io/styleguide/ cppguide.html #Write_Short_Functions
3547
3575
3548
3576
Uses a simplistic algorithm assuming other style guidelines
3549
3577
(especially spacing) are followed.
@@ -4769,6 +4797,71 @@ def CheckAltTokens(filename, clean_lines, linenum, error):
4769
4797
'Use operator %s instead of %s' % (
4770
4798
_ALT_TOKEN_REPLACEMENT [match .group (1 )], match .group (1 )))
4771
4799
4800
+ def CheckNullTokens (filename , clean_lines , linenum , error ):
4801
+ """Check NULL usage.
4802
+
4803
+ Args:
4804
+ filename: The name of the current file.
4805
+ clean_lines: A CleansedLines instance containing the file.
4806
+ linenum: The number of the line to check.
4807
+ error: The function to call with any errors found.
4808
+ """
4809
+ line = clean_lines .elided [linenum ]
4810
+
4811
+ # Avoid preprocessor lines
4812
+ if Match (r'^\s*#' , line ):
4813
+ return
4814
+
4815
+ if line .find ('/*' ) >= 0 or line .find ('*/' ) >= 0 :
4816
+ return
4817
+
4818
+ for match in _NULL_TOKEN_PATTERN .finditer (line ):
4819
+ error (filename , linenum , 'readability/null_usage' , 2 ,
4820
+ 'Use nullptr instead of NULL' )
4821
+
4822
+ def CheckV8PersistentTokens (filename , clean_lines , linenum , error ):
4823
+ """Check v8::Persistent usage.
4824
+
4825
+ Args:
4826
+ filename: The name of the current file.
4827
+ clean_lines: A CleansedLines instance containing the file.
4828
+ linenum: The number of the line to check.
4829
+ error: The function to call with any errors found.
4830
+ """
4831
+ line = clean_lines .elided [linenum ]
4832
+
4833
+ # Avoid preprocessor lines
4834
+ if Match (r'^\s*#' , line ):
4835
+ return
4836
+
4837
+ if line .find ('/*' ) >= 0 or line .find ('*/' ) >= 0 :
4838
+ return
4839
+
4840
+ for match in _V8_PERSISTENT_PATTERN .finditer (line ):
4841
+ error (filename , linenum , 'runtime/v8_persistent' , 2 ,
4842
+ 'Use v8::Global instead of v8::Persistent' )
4843
+
4844
+ def CheckLeftLeaningPointer (filename , clean_lines , linenum , error ):
4845
+ """Check for left-leaning pointer placement.
4846
+
4847
+ Args:
4848
+ filename: The name of the current file.
4849
+ clean_lines: A CleansedLines instance containing the file.
4850
+ linenum: The number of the line to check.
4851
+ error: The function to call with any errors found.
4852
+ """
4853
+ line = clean_lines .elided [linenum ]
4854
+
4855
+ # Avoid preprocessor lines
4856
+ if Match (r'^\s*#' , line ):
4857
+ return
4858
+
4859
+ if '/*' in line or '*/' in line :
4860
+ return
4861
+
4862
+ for match in _RIGHT_LEANING_POINTER_PATTERN .finditer (line ):
4863
+ error (filename , linenum , 'readability/pointer_notation' , 2 ,
4864
+ 'Use left leaning pointer instead of right leaning' )
4772
4865
4773
4866
def GetLineWidth (line ):
4774
4867
"""Determines the width of the line in column positions.
@@ -4923,6 +5016,9 @@ def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,
4923
5016
CheckSpacingForFunctionCall (filename , clean_lines , linenum , error )
4924
5017
CheckCheck (filename , clean_lines , linenum , error )
4925
5018
CheckAltTokens (filename , clean_lines , linenum , error )
5019
+ CheckNullTokens (filename , clean_lines , linenum , error )
5020
+ CheckV8PersistentTokens (filename , clean_lines , linenum , error )
5021
+ CheckLeftLeaningPointer (filename , clean_lines , linenum , error )
4926
5022
classinfo = nesting_state .InnermostClass ()
4927
5023
if classinfo :
4928
5024
CheckSectionSpacing (filename , clean_lines , classinfo , linenum , error )
@@ -5108,11 +5204,10 @@ def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
5108
5204
include_state .include_list [- 1 ].append ((include , linenum ))
5109
5205
5110
5206
# We want to ensure that headers appear in the right order:
5111
- # 1) for foo.cc, foo.h (preferred location)
5112
- # 2) c system files
5113
- # 3) cpp system files
5114
- # 4) for foo.cc, foo.h (deprecated location)
5115
- # 5) other google headers
5207
+ # 1) for foo.cc, foo.h
5208
+ # 2) other project headers
5209
+ # 3) c system files
5210
+ # 4) cpp system files
5116
5211
#
5117
5212
# We classify each include statement as one of those 5 types
5118
5213
# using a number of techniques. The include_state object keeps
@@ -5375,7 +5470,7 @@ def CheckLanguage(filename, clean_lines, linenum, file_extension,
5375
5470
and line [- 1 ] != '\\ ' ):
5376
5471
error (filename , linenum , 'build/namespaces_headers' , 4 ,
5377
5472
'Do not use unnamed namespaces in header files. See '
5378
- 'https://google-styleguide.googlecode.com/svn/trunk/ cppguide.xml #Namespaces'
5473
+ 'https://google.github.io/styleguide/ cppguide.html #Namespaces'
5379
5474
' for more information.' )
5380
5475
5381
5476
@@ -6497,6 +6592,8 @@ def ProcessFileData(filename, file_extension, lines, error,
6497
6592
6498
6593
CheckForNewlineAtEOF (filename , lines , error )
6499
6594
6595
+ CheckInlineHeader (filename , include_state , error )
6596
+
6500
6597
def ProcessConfigOverrides (filename ):
6501
6598
""" Loads the configuration files and processes the config overrides.
6502
6599
@@ -6515,7 +6612,7 @@ def ProcessConfigOverrides(filename):
6515
6612
if not base_name :
6516
6613
break # Reached the root directory.
6517
6614
6518
- cfg_file = os .path .join (abs_path , "CPPLINT.cfg " )
6615
+ cfg_file = os .path .join (abs_path , ".cpplint " )
6519
6616
abs_filename = abs_path
6520
6617
if not os .path .isfile (cfg_file ):
6521
6618
continue
@@ -6897,4 +6994,3 @@ def main():
6897
6994
6898
6995
if __name__ == '__main__' :
6899
6996
main ()
6900
-
0 commit comments