| OLD | NEW |
| 1 #!/usr/bin/python2.4 | 1 #!/usr/bin/python2.4 |
| 2 # | 2 # |
| 3 # Copyright (c) 2009 Google Inc. All rights reserved. | 3 # Copyright (c) 2009 Google Inc. All rights reserved. |
| 4 # | 4 # |
| 5 # Redistribution and use in source and binary forms, with or without | 5 # Redistribution and use in source and binary forms, with or without |
| 6 # modification, are permitted provided that the following conditions are | 6 # modification, are permitted provided that the following conditions are |
| 7 # met: | 7 # met: |
| 8 # | 8 # |
| 9 # * Redistributions of source code must retain the above copyright | 9 # * Redistributions of source code must retain the above copyright |
| 10 # notice, this list of conditions and the following disclaimer. | 10 # notice, this list of conditions and the following disclaimer. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 [--counting=total|toplevel|detailed] | 95 [--counting=total|toplevel|detailed] |
| 96 <file> [file] ... | 96 <file> [file] ... |
| 97 | 97 |
| 98 The style guidelines this tries to follow are those in | 98 The style guidelines this tries to follow are those in |
| 99 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml | 99 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml |
| 100 | 100 |
| 101 Every problem is given a confidence score from 1-5, with 5 meaning we are | 101 Every problem is given a confidence score from 1-5, with 5 meaning we are |
| 102 certain of the problem, and 1 meaning it could be a legitimate construct. | 102 certain of the problem, and 1 meaning it could be a legitimate construct. |
| 103 This will miss some errors, and is not a substitute for a code review. | 103 This will miss some errors, and is not a substitute for a code review. |
| 104 | 104 |
| 105 To prevent specific lines from being linted, add a '// NOLINT' comment to the | 105 To suppress false-positive errors of a certain category, add a |
| 106 end of the line. | 106 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*) |
| 107 suppresses errors of all categories on that line. |
| 107 | 108 |
| 108 The files passed in will be linted; at least one file must be provided. | 109 The files passed in will be linted; at least one file must be provided. |
| 109 Linted extensions are .cc, .cpp, and .h. Other file types will be ignored. | 110 Linted extensions are .cc, .cpp, and .h. Other file types will be ignored. |
| 110 | 111 |
| 111 Flags: | 112 Flags: |
| 112 | 113 |
| 113 output=vs7 | 114 output=vs7 |
| 114 By default, the output is formatted to ease emacs parsing. Visual Studio | 115 By default, the output is formatted to ease emacs parsing. Visual Studio |
| 115 compatible output (vs7) may also be used. Other formats are unsupported. | 116 compatible output (vs7) may also be used. Other formats are unsupported. |
| 116 | 117 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 138 the top-level categories like 'build' and 'whitespace' will | 139 the top-level categories like 'build' and 'whitespace' will |
| 139 also be printed. If 'detailed' is provided, then a count | 140 also be printed. If 'detailed' is provided, then a count |
| 140 is provided for each category like 'build/class'. | 141 is provided for each category like 'build/class'. |
| 141 """ | 142 """ |
| 142 | 143 |
| 143 # We categorize each error message we print. Here are the categories. | 144 # We categorize each error message we print. Here are the categories. |
| 144 # We want an explicit list so we can list them all in cpplint --filter=. | 145 # We want an explicit list so we can list them all in cpplint --filter=. |
| 145 # If you add a new error message with a new category, add it to the list | 146 # If you add a new error message with a new category, add it to the list |
| 146 # here! cpplint_unittest.py should tell you if you forget to do this. | 147 # here! cpplint_unittest.py should tell you if you forget to do this. |
| 147 # \ used for clearer layout -- pylint: disable-msg=C6013 | 148 # \ used for clearer layout -- pylint: disable-msg=C6013 |
| 148 _ERROR_CATEGORIES = '''\ | 149 _ERROR_CATEGORIES = [ |
| 149 build/class | 150 'build/class', |
| 150 build/deprecated | 151 'build/deprecated', |
| 151 build/endif_comment | 152 'build/endif_comment', |
| 152 build/forward_decl | 153 'build/forward_decl', |
| 153 build/header_guard | 154 'build/header_guard', |
| 154 build/include | 155 'build/include', |
| 155 build/include_alpha | 156 'build/include_alpha', |
| 156 build/include_order | 157 'build/include_order', |
| 157 build/include_what_you_use | 158 'build/include_what_you_use', |
| 158 build/namespaces | 159 'build/namespaces', |
| 159 build/printf_format | 160 'build/printf_format', |
| 160 build/storage_class | 161 'build/storage_class', |
| 161 legal/copyright | 162 'legal/copyright', |
| 162 readability/braces | 163 'readability/braces', |
| 163 readability/casting | 164 'readability/casting', |
| 164 readability/check | 165 'readability/check', |
| 165 readability/constructors | 166 'readability/constructors', |
| 166 readability/fn_size | 167 'readability/fn_size', |
| 167 readability/function | 168 'readability/function', |
| 168 readability/multiline_comment | 169 'readability/multiline_comment', |
| 169 readability/multiline_string | 170 'readability/multiline_string', |
| 170 readability/streams | 171 'readability/nolint', |
| 171 readability/todo | 172 'readability/streams', |
| 172 readability/utf8 | 173 'readability/todo', |
| 173 runtime/arrays | 174 'readability/utf8', |
| 174 runtime/casting | 175 'runtime/arrays', |
| 175 runtime/explicit | 176 'runtime/casting', |
| 176 runtime/int | 177 'runtime/explicit', |
| 177 runtime/init | 178 'runtime/int', |
| 178 runtime/invalid_increment | 179 'runtime/init', |
| 179 runtime/member_string_references | 180 'runtime/invalid_increment', |
| 180 runtime/memset | 181 'runtime/member_string_references', |
| 181 runtime/operator | 182 'runtime/memset', |
| 182 runtime/printf | 183 'runtime/operator', |
| 183 runtime/printf_format | 184 'runtime/printf', |
| 184 runtime/references | 185 'runtime/printf_format', |
| 185 runtime/rtti | 186 'runtime/references', |
| 186 runtime/sizeof | 187 'runtime/rtti', |
| 187 runtime/string | 188 'runtime/sizeof', |
| 188 runtime/threadsafe_fn | 189 'runtime/string', |
| 189 runtime/virtual | 190 'runtime/threadsafe_fn', |
| 190 whitespace/blank_line | 191 'runtime/virtual', |
| 191 whitespace/braces | 192 'whitespace/blank_line', |
| 192 whitespace/comma | 193 'whitespace/braces', |
| 193 whitespace/comments | 194 'whitespace/comma', |
| 194 whitespace/end_of_line | 195 'whitespace/comments', |
| 195 whitespace/ending_newline | 196 'whitespace/end_of_line', |
| 196 whitespace/indent | 197 'whitespace/ending_newline', |
| 197 whitespace/labels | 198 'whitespace/indent', |
| 198 whitespace/line_length | 199 'whitespace/labels', |
| 199 whitespace/newline | 200 'whitespace/line_length', |
| 200 whitespace/operators | 201 'whitespace/newline', |
| 201 whitespace/parens | 202 'whitespace/operators', |
| 202 whitespace/semicolon | 203 'whitespace/parens', |
| 203 whitespace/tab | 204 'whitespace/semicolon', |
| 204 whitespace/todo | 205 'whitespace/tab', |
| 205 ''' | 206 'whitespace/todo' |
| 207 ] |
| 206 | 208 |
| 207 # The default state of the category filter. This is overrided by the --filter= | 209 # The default state of the category filter. This is overrided by the --filter= |
| 208 # flag. By default all errors are on, so only add here categories that should be | 210 # flag. By default all errors are on, so only add here categories that should be |
| 209 # off by default (i.e., categories that must be enabled by the --filter= flags). | 211 # off by default (i.e., categories that must be enabled by the --filter= flags). |
| 210 # All entries here should start with a '-' or '+', as in the --filter= flag. | 212 # All entries here should start with a '-' or '+', as in the --filter= flag. |
| 211 _DEFAULT_FILTERS = [ '-build/include_alpha' ] | 213 _DEFAULT_FILTERS = [ '-build/include_alpha' ] |
| 212 | 214 |
| 213 # We used to check for high-bit characters, but after much discussion we | 215 # We used to check for high-bit characters, but after much discussion we |
| 214 # decided those were OK, as long as they were in UTF-8 and didn't represent | 216 # decided those were OK, as long as they were in UTF-8 and didn't represent |
| 215 # hard-coded international strings, which belong in a seperate i18n file. | 217 # hard-coded international strings, which belong in a seperate i18n file. |
| 216 | 218 |
| 217 # Headers that we consider STL headers. | 219 # Headers that we consider STL headers. |
| 218 _STL_HEADERS = frozenset([ | 220 _STL_HEADERS = frozenset([ |
| 219 'algobase.h', 'algorithm', 'alloc.h', 'bitset', 'deque', 'exception', | 221 'algobase.h', 'algorithm', 'alloc.h', 'bitset', 'deque', 'exception', |
| 220 'function.h', 'functional', 'hash_map', 'hash_map.h', 'hash_set', | 222 'function.h', 'functional', 'hash_map', 'hash_map.h', 'hash_set', |
| 221 'hash_set.h', 'iterator', 'list', 'list.h', 'map', 'memory', 'pair.h', | 223 'hash_set.h', 'iterator', 'list', 'list.h', 'map', 'memory', 'new', |
| 222 'pthread_alloc', 'queue', 'set', 'set.h', 'sstream', 'stack', | 224 'pair.h', 'pthread_alloc', 'queue', 'set', 'set.h', 'sstream', 'stack', |
| 223 'stl_alloc.h', 'stl_relops.h', 'type_traits.h', | 225 'stl_alloc.h', 'stl_relops.h', 'type_traits.h', |
| 224 'utility', 'vector', 'vector.h', | 226 'utility', 'vector', 'vector.h', |
| 225 ]) | 227 ]) |
| 226 | 228 |
| 227 | 229 |
| 228 # Non-STL C++ system headers. | 230 # Non-STL C++ system headers. |
| 229 _CPP_HEADERS = frozenset([ | 231 _CPP_HEADERS = frozenset([ |
| 230 'algo.h', 'builtinbuf.h', 'bvector.h', 'cassert', 'cctype', | 232 'algo.h', 'builtinbuf.h', 'bvector.h', 'cassert', 'cctype', |
| 231 'cerrno', 'cfloat', 'ciso646', 'climits', 'clocale', 'cmath', | 233 'cerrno', 'cfloat', 'ciso646', 'climits', 'clocale', 'cmath', |
| 232 'complex', 'complex.h', 'csetjmp', 'csignal', 'cstdarg', 'cstddef', | 234 'complex', 'complex.h', 'csetjmp', 'csignal', 'cstdarg', 'cstddef', |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 # _IncludeState.CheckNextIncludeOrder(). | 282 # _IncludeState.CheckNextIncludeOrder(). |
| 281 _C_SYS_HEADER = 1 | 283 _C_SYS_HEADER = 1 |
| 282 _CPP_SYS_HEADER = 2 | 284 _CPP_SYS_HEADER = 2 |
| 283 _LIKELY_MY_HEADER = 3 | 285 _LIKELY_MY_HEADER = 3 |
| 284 _POSSIBLE_MY_HEADER = 4 | 286 _POSSIBLE_MY_HEADER = 4 |
| 285 _OTHER_HEADER = 5 | 287 _OTHER_HEADER = 5 |
| 286 | 288 |
| 287 | 289 |
| 288 _regexp_compile_cache = {} | 290 _regexp_compile_cache = {} |
| 289 | 291 |
| 292 # Finds occurrences of NOLINT or NOLINT(...). |
| 293 _RE_SUPPRESSION = re.compile(r'\bNOLINT\b(\([^)]*\))?') |
| 294 |
| 295 # {str, set(int)}: a map from error categories to sets of linenumbers |
| 296 # on which those errors are expected and should be suppressed. |
| 297 _error_suppressions = {} |
| 298 |
| 299 def ParseNolintSuppressions(filename, raw_line, linenum, error): |
| 300 """Updates the global list of error-suppressions. |
| 301 |
| 302 Parses any NOLINT comments on the current line, updating the global |
| 303 error_suppressions store. Reports an error if the NOLINT comment |
| 304 was malformed. |
| 305 |
| 306 Args: |
| 307 filename: str, the name of the input file. |
| 308 raw_line: str, the line of input text, with comments. |
| 309 linenum: int, the number of the current line. |
| 310 error: function, an error handler. |
| 311 """ |
| 312 # FIXME(adonovan): "NOLINT(" is misparsed as NOLINT(*). |
| 313 m = _RE_SUPPRESSION.search(raw_line) |
| 314 if m: |
| 315 category = m.group(1) |
| 316 if category in (None, '(*)'): # => "suppress all" |
| 317 _error_suppressions.setdefault(None, set()).add(linenum) |
| 318 else: |
| 319 if category.startswith('(') and category.endswith(')'): |
| 320 category = category[1:-1] |
| 321 if category in _ERROR_CATEGORIES: |
| 322 _error_suppressions.setdefault(category, set()).add(linenum) |
| 323 else: |
| 324 error(filename, linenum, 'readability/nolint', 5, |
| 325 'Unknown NOLINT error category: %s' % category) |
| 326 |
| 327 |
| 328 def ResetNolintSuppressions(): |
| 329 "Resets the set of NOLINT suppressions to empty." |
| 330 _error_suppressions.clear() |
| 331 |
| 332 |
| 333 def IsErrorSuppressedByNolint(category, linenum): |
| 334 """Returns true if the specified error category is suppressed on this line. |
| 335 |
| 336 Consults the global error_suppressions map populated by |
| 337 ParseNolintSuppressions/ResetNolintSuppressions. |
| 338 |
| 339 Args: |
| 340 category: str, the category of the error. |
| 341 linenum: int, the current line number. |
| 342 Returns: |
| 343 bool, True iff the error should be suppressed due to a NOLINT comment. |
| 344 """ |
| 345 return (linenum in _error_suppressions.get(category, set()) or |
| 346 linenum in _error_suppressions.get(None, set())) |
| 290 | 347 |
| 291 def Match(pattern, s): | 348 def Match(pattern, s): |
| 292 """Matches the string with the pattern, caching the compiled regexp.""" | 349 """Matches the string with the pattern, caching the compiled regexp.""" |
| 293 # The regexp compilation caching is inlined in both Match and Search for | 350 # The regexp compilation caching is inlined in both Match and Search for |
| 294 # performance reasons; factoring it out into a separate function turns out | 351 # performance reasons; factoring it out into a separate function turns out |
| 295 # to be noticeably expensive. | 352 # to be noticeably expensive. |
| 296 if not pattern in _regexp_compile_cache: | 353 if not pattern in _regexp_compile_cache: |
| 297 _regexp_compile_cache[pattern] = sre_compile.compile(pattern) | 354 _regexp_compile_cache[pattern] = sre_compile.compile(pattern) |
| 298 return _regexp_compile_cache[pattern].match(s) | 355 return _regexp_compile_cache[pattern].match(s) |
| 299 | 356 |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 # up the directory tree for the top of the SVN checkout | 705 # up the directory tree for the top of the SVN checkout |
| 649 root_dir = project_dir | 706 root_dir = project_dir |
| 650 one_up_dir = os.path.dirname(root_dir) | 707 one_up_dir = os.path.dirname(root_dir) |
| 651 while os.path.exists(os.path.join(one_up_dir, ".svn")): | 708 while os.path.exists(os.path.join(one_up_dir, ".svn")): |
| 652 root_dir = os.path.dirname(root_dir) | 709 root_dir = os.path.dirname(root_dir) |
| 653 one_up_dir = os.path.dirname(one_up_dir) | 710 one_up_dir = os.path.dirname(one_up_dir) |
| 654 | 711 |
| 655 prefix = os.path.commonprefix([root_dir, project_dir]) | 712 prefix = os.path.commonprefix([root_dir, project_dir]) |
| 656 return fullname[len(prefix) + 1:] | 713 return fullname[len(prefix) + 1:] |
| 657 | 714 |
| 658 # Not SVN? Try to find a git top level directory by searching up from the | 715 # Not SVN? Try to find a git or hg top level directory by searching up |
| 659 # current path. | 716 # from the current path. |
| 660 root_dir = os.path.dirname(fullname) | 717 root_dir = os.path.dirname(fullname) |
| 661 while (root_dir != os.path.dirname(root_dir) and | 718 while (root_dir != os.path.dirname(root_dir) and |
| 662 not os.path.exists(os.path.join(root_dir, ".git"))): | 719 not os.path.exists(os.path.join(root_dir, ".git")) and |
| 720 not os.path.exists(os.path.join(root_dir, ".hg"))): |
| 663 root_dir = os.path.dirname(root_dir) | 721 root_dir = os.path.dirname(root_dir) |
| 664 if os.path.exists(os.path.join(root_dir, ".git")): | 722 |
| 665 prefix = os.path.commonprefix([root_dir, project_dir]) | 723 if (os.path.exists(os.path.join(root_dir, ".git")) or |
| 666 return fullname[len(prefix) + 1:] | 724 os.path.exists(os.path.join(root_dir, ".hg"))): |
| 725 prefix = os.path.commonprefix([root_dir, project_dir]) |
| 726 return fullname[len(prefix) + 1:] |
| 667 | 727 |
| 668 # Don't know what to do; header guard warnings may be wrong... | 728 # Don't know what to do; header guard warnings may be wrong... |
| 669 return fullname | 729 return fullname |
| 670 | 730 |
| 671 def Split(self): | 731 def Split(self): |
| 672 """Splits the file into the directory, basename, and extension. | 732 """Splits the file into the directory, basename, and extension. |
| 673 | 733 |
| 674 For 'chrome/browser/browser.cc', Split() would | 734 For 'chrome/browser/browser.cc', Split() would |
| 675 return ('chrome/browser', 'browser', '.cc') | 735 return ('chrome/browser', 'browser', '.cc') |
| 676 | 736 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 692 | 752 |
| 693 def NoExtension(self): | 753 def NoExtension(self): |
| 694 """File has no source file extension.""" | 754 """File has no source file extension.""" |
| 695 return '/'.join(self.Split()[0:2]) | 755 return '/'.join(self.Split()[0:2]) |
| 696 | 756 |
| 697 def IsSource(self): | 757 def IsSource(self): |
| 698 """File has a source file extension.""" | 758 """File has a source file extension.""" |
| 699 return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') | 759 return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx') |
| 700 | 760 |
| 701 | 761 |
| 702 def _ShouldPrintError(category, confidence): | 762 def _ShouldPrintError(category, confidence, linenum): |
| 703 """Returns true iff confidence >= verbose, and category passes filter.""" | 763 """Returns true iff confidence >= verbose, category passes |
| 704 # There are two ways we might decide not to print an error message: | 764 filter and is not NOLINT-suppressed.""" |
| 765 |
| 766 # There are three ways we might decide not to print an error message: |
| 767 # a "NOLINT(category)" comment appears in the source, |
| 705 # the verbosity level isn't high enough, or the filters filter it out. | 768 # the verbosity level isn't high enough, or the filters filter it out. |
| 769 if IsErrorSuppressedByNolint(category, linenum): |
| 770 return False |
| 706 if confidence < _cpplint_state.verbose_level: | 771 if confidence < _cpplint_state.verbose_level: |
| 707 return False | 772 return False |
| 708 | 773 |
| 709 is_filtered = False | 774 is_filtered = False |
| 710 for one_filter in _Filters(): | 775 for one_filter in _Filters(): |
| 711 if one_filter.startswith('-'): | 776 if one_filter.startswith('-'): |
| 712 if category.startswith(one_filter[1:]): | 777 if category.startswith(one_filter[1:]): |
| 713 is_filtered = True | 778 is_filtered = True |
| 714 elif one_filter.startswith('+'): | 779 elif one_filter.startswith('+'): |
| 715 if category.startswith(one_filter[1:]): | 780 if category.startswith(one_filter[1:]): |
| 716 is_filtered = False | 781 is_filtered = False |
| 717 else: | 782 else: |
| 718 assert False # should have been checked for in SetFilter. | 783 assert False # should have been checked for in SetFilter. |
| 719 if is_filtered: | 784 if is_filtered: |
| 720 return False | 785 return False |
| 721 | 786 |
| 722 return True | 787 return True |
| 723 | 788 |
| 724 | 789 |
| 725 def Error(filename, linenum, category, confidence, message): | 790 def Error(filename, linenum, category, confidence, message): |
| 726 """Logs the fact we've found a lint error. | 791 """Logs the fact we've found a lint error. |
| 727 | 792 |
| 728 We log where the error was found, and also our confidence in the error, | 793 We log where the error was found, and also our confidence in the error, |
| 729 that is, how certain we are this is a legitimate style regression, and | 794 that is, how certain we are this is a legitimate style regression, and |
| 730 not a misidentification or a use that's sometimes justified. | 795 not a misidentification or a use that's sometimes justified. |
| 731 | 796 |
| 797 False positives can be suppressed by the use of |
| 798 "cpplint(category)" comments on the offending line. These are |
| 799 parsed into _error_suppressions. |
| 800 |
| 732 Args: | 801 Args: |
| 733 filename: The name of the file containing the error. | 802 filename: The name of the file containing the error. |
| 734 linenum: The number of the line containing the error. | 803 linenum: The number of the line containing the error. |
| 735 category: A string used to describe the "category" this bug | 804 category: A string used to describe the "category" this bug |
| 736 falls under: "whitespace", say, or "runtime". Categories | 805 falls under: "whitespace", say, or "runtime". Categories |
| 737 may have a hierarchy separated by slashes: "whitespace/indent". | 806 may have a hierarchy separated by slashes: "whitespace/indent". |
| 738 confidence: A number from 1-5 representing a confidence score for | 807 confidence: A number from 1-5 representing a confidence score for |
| 739 the error, with 5 meaning that we are certain of the problem, | 808 the error, with 5 meaning that we are certain of the problem, |
| 740 and 1 meaning that it could be a legitimate construct. | 809 and 1 meaning that it could be a legitimate construct. |
| 741 message: The error message. | 810 message: The error message. |
| 742 """ | 811 """ |
| 743 # There are two ways we might decide not to print an error message: | 812 if _ShouldPrintError(category, confidence, linenum): |
| 744 # the verbosity level isn't high enough, or the filters filter it out. | |
| 745 if _ShouldPrintError(category, confidence): | |
| 746 _cpplint_state.IncrementErrorCount(category) | 813 _cpplint_state.IncrementErrorCount(category) |
| 747 if _cpplint_state.output_format == 'vs7': | 814 if _cpplint_state.output_format == 'vs7': |
| 748 sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( | 815 sys.stderr.write('%s(%s): %s [%s] [%d]\n' % ( |
| 749 filename, linenum, message, category, confidence)) | 816 filename, linenum, message, category, confidence)) |
| 750 else: | 817 else: |
| 751 sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( | 818 sys.stderr.write('%s:%s: %s [%s] [%d]\n' % ( |
| 752 filename, linenum, message, category, confidence)) | 819 filename, linenum, message, category, confidence)) |
| 753 | 820 |
| 754 | 821 |
| 755 # Matches standard C++ escape esequences per 2.13.2.3 of the C++ standard. | 822 # Matches standard C++ escape esequences per 2.13.2.3 of the C++ standard. |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 | 1020 |
| 954 Args: | 1021 Args: |
| 955 filename: The name of a C++ header file. | 1022 filename: The name of a C++ header file. |
| 956 | 1023 |
| 957 Returns: | 1024 Returns: |
| 958 The CPP variable that should be used as a header guard in the | 1025 The CPP variable that should be used as a header guard in the |
| 959 named file. | 1026 named file. |
| 960 | 1027 |
| 961 """ | 1028 """ |
| 962 | 1029 |
| 1030 # Restores original filename in case that cpplint is invoked from Emacs's |
| 1031 # flymake. |
| 1032 filename = re.sub(r'_flymake\.h$', '.h', filename) |
| 1033 |
| 963 fileinfo = FileInfo(filename) | 1034 fileinfo = FileInfo(filename) |
| 964 return re.sub(r'[-./\s]', '_', fileinfo.RepositoryName()).upper() + '_' | 1035 return re.sub(r'[-./\s]', '_', fileinfo.RepositoryName()).upper() + '_' |
| 965 | 1036 |
| 966 | 1037 |
| 967 def CheckForHeaderGuard(filename, lines, error): | 1038 def CheckForHeaderGuard(filename, lines, error): |
| 968 """Checks that the file contains a header guard. | 1039 """Checks that the file contains a header guard. |
| 969 | 1040 |
| 970 Logs an error if no #ifndef header guard is present. For other | 1041 Logs an error if no #ifndef header guard is present. For other |
| 971 headers, checks that the full pathname is used. | 1042 headers, checks that the full pathname is used. |
| 972 | 1043 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 999 endif_linenum = linenum | 1070 endif_linenum = linenum |
| 1000 | 1071 |
| 1001 if not ifndef or not define or ifndef != define: | 1072 if not ifndef or not define or ifndef != define: |
| 1002 error(filename, 0, 'build/header_guard', 5, | 1073 error(filename, 0, 'build/header_guard', 5, |
| 1003 'No #ifndef header guard found, suggested CPP variable is: %s' % | 1074 'No #ifndef header guard found, suggested CPP variable is: %s' % |
| 1004 cppvar) | 1075 cppvar) |
| 1005 return | 1076 return |
| 1006 | 1077 |
| 1007 # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ | 1078 # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ |
| 1008 # for backward compatibility. | 1079 # for backward compatibility. |
| 1009 if ifndef != cppvar and not Search(r'\bNOLINT\b', lines[ifndef_linenum]): | 1080 if ifndef != cppvar: |
| 1010 error_level = 0 | 1081 error_level = 0 |
| 1011 if ifndef != cppvar + '_': | 1082 if ifndef != cppvar + '_': |
| 1012 error_level = 5 | 1083 error_level = 5 |
| 1013 | 1084 |
| 1085 ParseNolintSuppressions(filename, lines[ifndef_linenum], ifndef_linenum, |
| 1086 error) |
| 1014 error(filename, ifndef_linenum, 'build/header_guard', error_level, | 1087 error(filename, ifndef_linenum, 'build/header_guard', error_level, |
| 1015 '#ifndef header guard has wrong style, please use: %s' % cppvar) | 1088 '#ifndef header guard has wrong style, please use: %s' % cppvar) |
| 1016 | 1089 |
| 1017 if (endif != ('#endif // %s' % cppvar) and | 1090 if endif != ('#endif // %s' % cppvar): |
| 1018 not Search(r'\bNOLINT\b', lines[endif_linenum])): | |
| 1019 error_level = 0 | 1091 error_level = 0 |
| 1020 if endif != ('#endif // %s' % (cppvar + '_')): | 1092 if endif != ('#endif // %s' % (cppvar + '_')): |
| 1021 error_level = 5 | 1093 error_level = 5 |
| 1022 | 1094 |
| 1095 ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum, |
| 1096 error) |
| 1023 error(filename, endif_linenum, 'build/header_guard', error_level, | 1097 error(filename, endif_linenum, 'build/header_guard', error_level, |
| 1024 '#endif line should be "#endif // %s"' % cppvar) | 1098 '#endif line should be "#endif // %s"' % cppvar) |
| 1025 | 1099 |
| 1026 | 1100 |
| 1027 def CheckForUnicodeReplacementCharacters(filename, lines, error): | 1101 def CheckForUnicodeReplacementCharacters(filename, lines, error): |
| 1028 """Logs an error for each line containing Unicode replacement characters. | 1102 """Logs an error for each line containing Unicode replacement characters. |
| 1029 | 1103 |
| 1030 These indicate that either the file contained invalid UTF-8 (likely) | 1104 These indicate that either the file contained invalid UTF-8 (likely) |
| 1031 or Unicode replacement characters (which it shouldn't). Note that | 1105 or Unicode replacement characters (which it shouldn't). Note that |
| 1032 it's possible for this to throw off line numbering if the invalid | 1106 it's possible for this to throw off line numbering if the invalid |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 function += parameter_regexp.group(1) | 1584 function += parameter_regexp.group(1) |
| 1511 else: | 1585 else: |
| 1512 function += '()' | 1586 function += '()' |
| 1513 function_state.Begin(function) | 1587 function_state.Begin(function) |
| 1514 break | 1588 break |
| 1515 if not body_found: | 1589 if not body_found: |
| 1516 # No body for the function (or evidence of a non-function) was found. | 1590 # No body for the function (or evidence of a non-function) was found. |
| 1517 error(filename, linenum, 'readability/fn_size', 5, | 1591 error(filename, linenum, 'readability/fn_size', 5, |
| 1518 'Lint failed to find start of function body.') | 1592 'Lint failed to find start of function body.') |
| 1519 elif Match(r'^\}\s*$', line): # function end | 1593 elif Match(r'^\}\s*$', line): # function end |
| 1520 if not Search(r'\bNOLINT\b', raw_line): | 1594 function_state.Check(error, filename, linenum) |
| 1521 function_state.Check(error, filename, linenum) | |
| 1522 function_state.End() | 1595 function_state.End() |
| 1523 elif not Match(r'^\s*$', line): | 1596 elif not Match(r'^\s*$', line): |
| 1524 function_state.Count() # Count non-blank/non-comment lines. | 1597 function_state.Count() # Count non-blank/non-comment lines. |
| 1525 | 1598 |
| 1526 | 1599 |
| 1527 _RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') | 1600 _RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?') |
| 1528 | 1601 |
| 1529 | 1602 |
| 1530 def CheckComment(comment, filename, linenum, error): | 1603 def CheckComment(comment, filename, linenum, error): |
| 1531 """Checks for common mistakes in TODO comments. | 1604 """Checks for common mistakes in TODO comments. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 (commentpos >= 2 and | 1729 (commentpos >= 2 and |
| 1657 line[commentpos-2] not in string.whitespace))): | 1730 line[commentpos-2] not in string.whitespace))): |
| 1658 error(filename, linenum, 'whitespace/comments', 2, | 1731 error(filename, linenum, 'whitespace/comments', 2, |
| 1659 'At least two spaces is best between code and comments') | 1732 'At least two spaces is best between code and comments') |
| 1660 # There should always be a space between the // and the comment | 1733 # There should always be a space between the // and the comment |
| 1661 commentend = commentpos + 2 | 1734 commentend = commentpos + 2 |
| 1662 if commentend < len(line) and not line[commentend] == ' ': | 1735 if commentend < len(line) and not line[commentend] == ' ': |
| 1663 # but some lines are exceptions -- e.g. if they're big | 1736 # but some lines are exceptions -- e.g. if they're big |
| 1664 # comment delimiters like: | 1737 # comment delimiters like: |
| 1665 # //---------------------------------------------------------- | 1738 # //---------------------------------------------------------- |
| 1739 # or are an empty C++ style Doxygen comment, like: |
| 1740 # /// |
| 1666 # or they begin with multiple slashes followed by a space: | 1741 # or they begin with multiple slashes followed by a space: |
| 1667 # //////// Header comment | 1742 # //////// Header comment |
| 1668 match = (Search(r'[=/-]{4,}\s*$', line[commentend:]) or | 1743 match = (Search(r'[=/-]{4,}\s*$', line[commentend:]) or |
| 1744 Search(r'^/$', line[commentend:]) or |
| 1669 Search(r'^/+ ', line[commentend:])) | 1745 Search(r'^/+ ', line[commentend:])) |
| 1670 if not match: | 1746 if not match: |
| 1671 error(filename, linenum, 'whitespace/comments', 4, | 1747 error(filename, linenum, 'whitespace/comments', 4, |
| 1672 'Should have a space between // and comment') | 1748 'Should have a space between // and comment') |
| 1673 CheckComment(line[commentpos:], filename, linenum, error) | 1749 CheckComment(line[commentpos:], filename, linenum, error) |
| 1674 | 1750 |
| 1675 line = clean_lines.elided[linenum] # get rid of comments and strings | 1751 line = clean_lines.elided[linenum] # get rid of comments and strings |
| 1676 | 1752 |
| 1677 # Don't try to do spacing checks for operator methods | 1753 # Don't try to do spacing checks for operator methods |
| 1678 line = re.sub(r'operator(==|!=|<|<<|<=|>=|>>|>)\(', 'operator\(', line) | 1754 line = re.sub(r'operator(==|!=|<|<<|<=|>=|>>|>)\(', 'operator\(', line) |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2018 elif ((initial_spaces == 1 or initial_spaces == 3) and | 2094 elif ((initial_spaces == 1 or initial_spaces == 3) and |
| 2019 not Match(r'\s*\w+\s*:\s*$', cleansed_line)): | 2095 not Match(r'\s*\w+\s*:\s*$', cleansed_line)): |
| 2020 error(filename, linenum, 'whitespace/indent', 3, | 2096 error(filename, linenum, 'whitespace/indent', 3, |
| 2021 'Weird number of spaces at line-start. ' | 2097 'Weird number of spaces at line-start. ' |
| 2022 'Are you using a 2-space indent?') | 2098 'Are you using a 2-space indent?') |
| 2023 # Labels should always be indented at least one space. | 2099 # Labels should always be indented at least one space. |
| 2024 elif not initial_spaces and line[:2] != '//' and Search(r'[^:]:\s*$', | 2100 elif not initial_spaces and line[:2] != '//' and Search(r'[^:]:\s*$', |
| 2025 line): | 2101 line): |
| 2026 error(filename, linenum, 'whitespace/labels', 4, | 2102 error(filename, linenum, 'whitespace/labels', 4, |
| 2027 'Labels should always be indented at least one space. ' | 2103 'Labels should always be indented at least one space. ' |
| 2028 'If this is a member-initializer list in a constructor, ' | 2104 'If this is a member-initializer list in a constructor or ' |
| 2029 'the colon should be on the line after the definition header.') | 2105 'the base class list in a class definition, the colon should ' |
| 2106 'be on the following line.') |
| 2107 |
| 2030 | 2108 |
| 2031 # Check if the line is a header guard. | 2109 # Check if the line is a header guard. |
| 2032 is_header_guard = False | 2110 is_header_guard = False |
| 2033 if file_extension == 'h': | 2111 if file_extension == 'h': |
| 2034 cppvar = GetHeaderGuardCPPVariable(filename) | 2112 cppvar = GetHeaderGuardCPPVariable(filename) |
| 2035 if (line.startswith('#ifndef %s' % cppvar) or | 2113 if (line.startswith('#ifndef %s' % cppvar) or |
| 2036 line.startswith('#define %s' % cppvar) or | 2114 line.startswith('#define %s' % cppvar) or |
| 2037 line.startswith('#endif // %s' % cppvar)): | 2115 line.startswith('#endif // %s' % cppvar)): |
| 2038 is_header_guard = True | 2116 is_header_guard = True |
| 2039 # #include lines and header guards can be long, since there's no clean way to | 2117 # #include lines and header guards can be long, since there's no clean way to |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2392 error(filename, linenum, 'runtime/int', 4, | 2470 error(filename, linenum, 'runtime/int', 4, |
| 2393 'Use "unsigned short" for ports, not "short"') | 2471 'Use "unsigned short" for ports, not "short"') |
| 2394 else: | 2472 else: |
| 2395 match = Search(r'\b(short|long(?! +double)|long long)\b', line) | 2473 match = Search(r'\b(short|long(?! +double)|long long)\b', line) |
| 2396 if match: | 2474 if match: |
| 2397 error(filename, linenum, 'runtime/int', 4, | 2475 error(filename, linenum, 'runtime/int', 4, |
| 2398 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) | 2476 'Use int16/int64/etc, rather than the C type %s' % match.group(1)) |
| 2399 | 2477 |
| 2400 # When snprintf is used, the second argument shouldn't be a literal. | 2478 # When snprintf is used, the second argument shouldn't be a literal. |
| 2401 match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) | 2479 match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line) |
| 2402 if match: | 2480 if match and match.group(2) != '0': |
| 2481 # If 2nd arg is zero, snprintf is used to calculate size. |
| 2403 error(filename, linenum, 'runtime/printf', 3, | 2482 error(filename, linenum, 'runtime/printf', 3, |
| 2404 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' | 2483 'If you can, use sizeof(%s) instead of %s as the 2nd arg ' |
| 2405 'to snprintf.' % (match.group(1), match.group(2))) | 2484 'to snprintf.' % (match.group(1), match.group(2))) |
| 2406 | 2485 |
| 2407 # Check if some verboten C functions are being used. | 2486 # Check if some verboten C functions are being used. |
| 2408 if Search(r'\bsprintf\b', line): | 2487 if Search(r'\bsprintf\b', line): |
| 2409 error(filename, linenum, 'runtime/printf', 5, | 2488 error(filename, linenum, 'runtime/printf', 5, |
| 2410 'Never use sprintf. Use snprintf instead.') | 2489 'Never use sprintf. Use snprintf instead.') |
| 2411 match = Search(r'\b(strcpy|strcat)\b', line) | 2490 match = Search(r'\b(strcpy|strcat)\b', line) |
| 2412 if match: | 2491 if match: |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2741 """ | 2820 """ |
| 2742 required = {} # A map of header name to linenumber and the template entity. | 2821 required = {} # A map of header name to linenumber and the template entity. |
| 2743 # Example of required: { '<functional>': (1219, 'less<>') } | 2822 # Example of required: { '<functional>': (1219, 'less<>') } |
| 2744 | 2823 |
| 2745 for linenum in xrange(clean_lines.NumLines()): | 2824 for linenum in xrange(clean_lines.NumLines()): |
| 2746 line = clean_lines.elided[linenum] | 2825 line = clean_lines.elided[linenum] |
| 2747 if not line or line[0] == '#': | 2826 if not line or line[0] == '#': |
| 2748 continue | 2827 continue |
| 2749 | 2828 |
| 2750 # String is special -- it is a non-templatized type in STL. | 2829 # String is special -- it is a non-templatized type in STL. |
| 2751 if _RE_PATTERN_STRING.search(line): | 2830 m = _RE_PATTERN_STRING.search(line) |
| 2752 required['<string>'] = (linenum, 'string') | 2831 if m: |
| 2832 # Don't warn about strings in non-STL namespaces: |
| 2833 # (We check only the first match per line; good enough.) |
| 2834 prefix = line[:m.start()] |
| 2835 if prefix.endswith('std::') or not prefix.endswith('::'): |
| 2836 required['<string>'] = (linenum, 'string') |
| 2753 | 2837 |
| 2754 for pattern, template, header in _re_pattern_algorithm_header: | 2838 for pattern, template, header in _re_pattern_algorithm_header: |
| 2755 if pattern.search(line): | 2839 if pattern.search(line): |
| 2756 required[header] = (linenum, template) | 2840 required[header] = (linenum, template) |
| 2757 | 2841 |
| 2758 # The following function is just a speed up, no semantics are changed. | 2842 # The following function is just a speed up, no semantics are changed. |
| 2759 if not '<' in line: # Reduces the cpu time usage by skipping lines. | 2843 if not '<' in line: # Reduces the cpu time usage by skipping lines. |
| 2760 continue | 2844 continue |
| 2761 | 2845 |
| 2762 for pattern, template, header in _re_pattern_templates: | 2846 for pattern, template, header in _re_pattern_templates: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2774 # Use the absolute path so that matching works properly. | 2858 # Use the absolute path so that matching works properly. |
| 2775 abs_filename = os.path.abspath(filename) | 2859 abs_filename = os.path.abspath(filename) |
| 2776 | 2860 |
| 2777 # For Emacs's flymake. | 2861 # For Emacs's flymake. |
| 2778 # If cpplint is invoked from Emacs's flymake, a temporary file is generated | 2862 # If cpplint is invoked from Emacs's flymake, a temporary file is generated |
| 2779 # by flymake and that file name might end with '_flymake.cc'. In that case, | 2863 # by flymake and that file name might end with '_flymake.cc'. In that case, |
| 2780 # restore original file name here so that the corresponding header file can be | 2864 # restore original file name here so that the corresponding header file can be |
| 2781 # found. | 2865 # found. |
| 2782 # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' | 2866 # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h' |
| 2783 # instead of 'foo_flymake.h' | 2867 # instead of 'foo_flymake.h' |
| 2784 emacs_flymake_suffix = '_flymake.cc' | 2868 abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename) |
| 2785 if abs_filename.endswith(emacs_flymake_suffix): | |
| 2786 abs_filename = abs_filename[:-len(emacs_flymake_suffix)] + '.cc' | |
| 2787 | 2869 |
| 2788 # include_state is modified during iteration, so we iterate over a copy of | 2870 # include_state is modified during iteration, so we iterate over a copy of |
| 2789 # the keys. | 2871 # the keys. |
| 2790 for header in include_state.keys(): #NOLINT | 2872 for header in include_state.keys(): #NOLINT |
| 2791 (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) | 2873 (same_module, common_path) = FilesBelongToSameModule(abs_filename, header) |
| 2792 fullpath = common_path + header | 2874 fullpath = common_path + header |
| 2793 if same_module and UpdateIncludeState(fullpath, include_state, io): | 2875 if same_module and UpdateIncludeState(fullpath, include_state, io): |
| 2794 header_found = True | 2876 header_found = True |
| 2795 | 2877 |
| 2796 # If we can't find the header file for a .cc, assume it's because we don't | 2878 # If we can't find the header file for a .cc, assume it's because we don't |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2827 line: Number of line being processed. | 2909 line: Number of line being processed. |
| 2828 include_state: An _IncludeState instance in which the headers are inserted. | 2910 include_state: An _IncludeState instance in which the headers are inserted. |
| 2829 function_state: A _FunctionState instance which counts function lines, etc. | 2911 function_state: A _FunctionState instance which counts function lines, etc. |
| 2830 class_state: A _ClassState instance which maintains information about | 2912 class_state: A _ClassState instance which maintains information about |
| 2831 the current stack of nested class declarations being parsed. | 2913 the current stack of nested class declarations being parsed. |
| 2832 error: A callable to which errors are reported, which takes 4 arguments: | 2914 error: A callable to which errors are reported, which takes 4 arguments: |
| 2833 filename, line number, error level, and message | 2915 filename, line number, error level, and message |
| 2834 | 2916 |
| 2835 """ | 2917 """ |
| 2836 raw_lines = clean_lines.raw_lines | 2918 raw_lines = clean_lines.raw_lines |
| 2919 ParseNolintSuppressions(filename, raw_lines[line], line, error) |
| 2837 CheckForFunctionLengths(filename, clean_lines, line, function_state, error) | 2920 CheckForFunctionLengths(filename, clean_lines, line, function_state, error) |
| 2838 if Search(r'\bNOLINT\b', raw_lines[line]): # ignore nolint lines | |
| 2839 return | |
| 2840 CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) | 2921 CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) |
| 2841 CheckStyle(filename, clean_lines, line, file_extension, error) | 2922 CheckStyle(filename, clean_lines, line, file_extension, error) |
| 2842 CheckLanguage(filename, clean_lines, line, file_extension, include_state, | 2923 CheckLanguage(filename, clean_lines, line, file_extension, include_state, |
| 2843 error) | 2924 error) |
| 2844 CheckForNonStandardConstructs(filename, clean_lines, line, | 2925 CheckForNonStandardConstructs(filename, clean_lines, line, |
| 2845 class_state, error) | 2926 class_state, error) |
| 2846 CheckPosixThreading(filename, clean_lines, line, error) | 2927 CheckPosixThreading(filename, clean_lines, line, error) |
| 2847 CheckInvalidIncrement(filename, clean_lines, line, error) | 2928 CheckInvalidIncrement(filename, clean_lines, line, error) |
| 2848 | 2929 |
| 2849 | 2930 |
| 2850 def ProcessFileData(filename, file_extension, lines, error): | 2931 def ProcessFileData(filename, file_extension, lines, error): |
| 2851 """Performs lint checks and reports any errors to the given error function. | 2932 """Performs lint checks and reports any errors to the given error function. |
| 2852 | 2933 |
| 2853 Args: | 2934 Args: |
| 2854 filename: Filename of the file that is being processed. | 2935 filename: Filename of the file that is being processed. |
| 2855 file_extension: The extension (dot not included) of the file. | 2936 file_extension: The extension (dot not included) of the file. |
| 2856 lines: An array of strings, each representing a line of the file, with the | 2937 lines: An array of strings, each representing a line of the file, with the |
| 2857 last element being empty if the file is termined with a newline. | 2938 last element being empty if the file is termined with a newline. |
| 2858 error: A callable to which errors are reported, which takes 4 arguments: | 2939 error: A callable to which errors are reported, which takes 4 arguments: |
| 2859 """ | 2940 """ |
| 2860 lines = (['// marker so line numbers and indices both start at 1'] + lines + | 2941 lines = (['// marker so line numbers and indices both start at 1'] + lines + |
| 2861 ['// marker so line numbers end in a known way']) | 2942 ['// marker so line numbers end in a known way']) |
| 2862 | 2943 |
| 2863 include_state = _IncludeState() | 2944 include_state = _IncludeState() |
| 2864 function_state = _FunctionState() | 2945 function_state = _FunctionState() |
| 2865 class_state = _ClassState() | 2946 class_state = _ClassState() |
| 2866 | 2947 |
| 2948 ResetNolintSuppressions() |
| 2949 |
| 2867 CheckForCopyright(filename, lines, error) | 2950 CheckForCopyright(filename, lines, error) |
| 2868 | 2951 |
| 2869 if file_extension == 'h': | 2952 if file_extension == 'h': |
| 2870 CheckForHeaderGuard(filename, lines, error) | 2953 CheckForHeaderGuard(filename, lines, error) |
| 2871 | 2954 |
| 2872 RemoveMultiLineComments(filename, lines, error) | 2955 RemoveMultiLineComments(filename, lines, error) |
| 2873 clean_lines = CleansedLines(lines) | 2956 clean_lines = CleansedLines(lines) |
| 2874 for line in xrange(clean_lines.NumLines()): | 2957 for line in xrange(clean_lines.NumLines()): |
| 2875 ProcessLine(filename, file_extension, clean_lines, line, | 2958 ProcessLine(filename, file_extension, clean_lines, line, |
| 2876 include_state, function_state, class_state, error) | 2959 include_state, function_state, class_state, error) |
| 2877 class_state.CheckFinished(filename, error) | 2960 class_state.CheckFinished(filename, error) |
| 2878 | 2961 |
| 2879 CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) | 2962 CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) |
| 2880 | 2963 |
| 2881 # We check here rather than inside ProcessLine so that we see raw | 2964 # We check here rather than inside ProcessLine so that we see raw |
| 2882 # lines rather than "cleaned" lines. | 2965 # lines rather than "cleaned" lines. |
| 2883 CheckForUnicodeReplacementCharacters(filename, lines, error) | 2966 CheckForUnicodeReplacementCharacters(filename, lines, error) |
| 2884 | 2967 |
| 2885 CheckForNewlineAtEOF(filename, lines, error) | 2968 CheckForNewlineAtEOF(filename, lines, error) |
| 2886 | 2969 |
| 2887 | |
| 2888 def ProcessFile(filename, vlevel): | 2970 def ProcessFile(filename, vlevel): |
| 2889 """Does google-lint on a single file. | 2971 """Does google-lint on a single file. |
| 2890 | 2972 |
| 2891 Args: | 2973 Args: |
| 2892 filename: The name of the file to parse. | 2974 filename: The name of the file to parse. |
| 2893 | 2975 |
| 2894 vlevel: The level of errors to report. Every error of confidence | 2976 vlevel: The level of errors to report. Every error of confidence |
| 2895 >= verbose_level will be reported. 0 is a good default. | 2977 >= verbose_level will be reported. 0 is a good default. |
| 2896 """ | 2978 """ |
| 2897 | 2979 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2959 sys.exit('\nFATAL ERROR: ' + message) | 3041 sys.exit('\nFATAL ERROR: ' + message) |
| 2960 else: | 3042 else: |
| 2961 sys.exit(1) | 3043 sys.exit(1) |
| 2962 | 3044 |
| 2963 | 3045 |
| 2964 def PrintCategories(): | 3046 def PrintCategories(): |
| 2965 """Prints a list of all the error-categories used by error messages. | 3047 """Prints a list of all the error-categories used by error messages. |
| 2966 | 3048 |
| 2967 These are the categories used to filter messages via --filter. | 3049 These are the categories used to filter messages via --filter. |
| 2968 """ | 3050 """ |
| 2969 sys.stderr.write(_ERROR_CATEGORIES) | 3051 sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES)) |
| 2970 sys.exit(0) | 3052 sys.exit(0) |
| 2971 | 3053 |
| 2972 | 3054 |
| 2973 def ParseArguments(args): | 3055 def ParseArguments(args): |
| 2974 """Parses the command line arguments. | 3056 """Parses the command line arguments. |
| 2975 | 3057 |
| 2976 This may set the output format and verbosity level as side-effects. | 3058 This may set the output format and verbosity level as side-effects. |
| 2977 | 3059 |
| 2978 Args: | 3060 Args: |
| 2979 args: The command line arguments: | 3061 args: The command line arguments: |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3035 _cpplint_state.ResetErrorCounts() | 3117 _cpplint_state.ResetErrorCounts() |
| 3036 for filename in filenames: | 3118 for filename in filenames: |
| 3037 ProcessFile(filename, _cpplint_state.verbose_level) | 3119 ProcessFile(filename, _cpplint_state.verbose_level) |
| 3038 _cpplint_state.PrintErrorCounts() | 3120 _cpplint_state.PrintErrorCounts() |
| 3039 | 3121 |
| 3040 sys.exit(_cpplint_state.error_count > 0) | 3122 sys.exit(_cpplint_state.error_count > 0) |
| 3041 | 3123 |
| 3042 | 3124 |
| 3043 if __name__ == '__main__': | 3125 if __name__ == '__main__': |
| 3044 main() | 3126 main() |
| OLD | NEW |