Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 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 1648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1659 named file. | 1659 named file. |
| 1660 | 1660 |
| 1661 """ | 1661 """ |
| 1662 | 1662 |
| 1663 # Restores original filename in case that cpplint is invoked from Emacs's | 1663 # Restores original filename in case that cpplint is invoked from Emacs's |
| 1664 # flymake. | 1664 # flymake. |
| 1665 filename = re.sub(r'_flymake\.h$', '.h', filename) | 1665 filename = re.sub(r'_flymake\.h$', '.h', filename) |
| 1666 filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) | 1666 filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename) |
| 1667 # Replace 'c++' with 'cpp'. | 1667 # Replace 'c++' with 'cpp'. |
| 1668 filename = filename.replace('C++', 'cpp').replace('c++', 'cpp') | 1668 filename = filename.replace('C++', 'cpp').replace('c++', 'cpp') |
| 1669 | 1669 |
| 1670 fileinfo = FileInfo(filename) | 1670 fileinfo = FileInfo(filename) |
| 1671 file_path_from_root = fileinfo.RepositoryName() | 1671 file_path_from_root = fileinfo.RepositoryName() |
| 1672 if _root: | 1672 if _root: |
| 1673 file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) | 1673 file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root) |
| 1674 return re.sub(r'[^a-zA-Z0-9]', '_', file_path_from_root).upper() + '_' | 1674 return re.sub(r'[^a-zA-Z0-9]', '_', file_path_from_root).upper() + '_' |
| 1675 | 1675 |
| 1676 | 1676 |
| 1677 def CheckForHeaderGuard(filename, clean_lines, error): | 1677 def CheckForHeaderGuard(filename, clean_lines, error): |
| 1678 """Checks that the file contains a header guard. | 1678 """Checks that the file contains a header guard. |
| 1679 | 1679 |
| (...skipping 3107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4787 return | 4787 return |
| 4788 | 4788 |
| 4789 # Reset include state across preprocessor directives. This is meant | 4789 # Reset include state across preprocessor directives. This is meant |
| 4790 # to silence warnings for conditional includes. | 4790 # to silence warnings for conditional includes. |
| 4791 match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line) | 4791 match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line) |
| 4792 if match: | 4792 if match: |
| 4793 include_state.ResetSection(match.group(1)) | 4793 include_state.ResetSection(match.group(1)) |
| 4794 | 4794 |
| 4795 # Make Windows paths like Unix. | 4795 # Make Windows paths like Unix. |
| 4796 fullname = os.path.abspath(filename).replace('\\', '/') | 4796 fullname = os.path.abspath(filename).replace('\\', '/') |
| 4797 | 4797 |
| 4798 # Perform other checks now that we are sure that this is not an include line | 4798 # Perform other checks now that we are sure that this is not an include line |
| 4799 CheckCasts(filename, clean_lines, linenum, error) | 4799 CheckCasts(filename, clean_lines, linenum, error) |
| 4800 CheckGlobalStatic(filename, clean_lines, linenum, error) | 4800 CheckGlobalStatic(filename, clean_lines, linenum, error) |
| 4801 CheckPrintf(filename, clean_lines, linenum, error) | 4801 CheckPrintf(filename, clean_lines, linenum, error) |
| 4802 | 4802 |
| 4803 if file_extension == 'h': | 4803 if file_extension == 'h': |
| 4804 # TODO(unknown): check that 1-arg constructors are explicit. | 4804 # TODO(unknown): check that 1-arg constructors are explicit. |
| 4805 # How to tell it's a constructor? | 4805 # How to tell it's a constructor? |
| 4806 # (handled in CheckForNonStandardConstructs for now) | 4806 # (handled in CheckForNonStandardConstructs for now) |
| 4807 # TODO(unknown): check that classes declare or disable copy/assign | 4807 # TODO(unknown): check that classes declare or disable copy/assign |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5491 ('<utility>', ('pair',)), | 5491 ('<utility>', ('pair',)), |
| 5492 ('<vector>', ('vector',)), | 5492 ('<vector>', ('vector',)), |
| 5493 | 5493 |
| 5494 # gcc extensions. | 5494 # gcc extensions. |
| 5495 # Note: std::hash is their hash, ::hash is our hash | 5495 # Note: std::hash is their hash, ::hash is our hash |
| 5496 ('<hash_map>', ('hash_map', 'hash_multimap',)), | 5496 ('<hash_map>', ('hash_map', 'hash_multimap',)), |
| 5497 ('<hash_set>', ('hash_set', 'hash_multiset',)), | 5497 ('<hash_set>', ('hash_set', 'hash_multiset',)), |
| 5498 ('<slist>', ('slist',)), | 5498 ('<slist>', ('slist',)), |
| 5499 ) | 5499 ) |
| 5500 | 5500 |
| 5501 _HEADERS_MAYBE_TEMPLATES = ( | |
| 5502 ('<algorithm>', ('copy', 'max', 'min', 'min_element', 'sort', | |
| 5503 'transform', | |
| 5504 )), | |
| 5505 ('<utility>', ('swap',)), | |
| 5506 ) | |
| 5507 | |
| 5501 _RE_PATTERN_STRING = re.compile(r'\bstring\b') | 5508 _RE_PATTERN_STRING = re.compile(r'\bstring\b') |
| 5502 | 5509 |
| 5503 _re_pattern_algorithm_header = [] | 5510 _RE_PATTERN_HEADERS_MAYBE_TEMPLATES = [] |
|
Dirk Pranke
2016/02/05 20:40:38
this isn't a constant, so I wouldn't use all-caps
skym
2016/02/05 20:52:58
Done.
| |
| 5504 for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap', | 5511 for _header, _templates in _HEADERS_MAYBE_TEMPLATES: |
| 5505 'transform'): | 5512 for _template in _templates: |
| 5506 # Match max<type>(..., ...), max(..., ...), but not foo->max, foo.max or | 5513 # Match max<type>(..., ...), max(..., ...), but not foo->max, foo.max or |
| 5507 # type::max(). | 5514 # type::max(). |
| 5508 _re_pattern_algorithm_header.append( | 5515 _RE_PATTERN_HEADERS_MAYBE_TEMPLATES.append( |
| 5509 (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), | 5516 (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'), |
| 5510 _template, | 5517 _template, |
| 5511 '<algorithm>')) | 5518 _header)) |
| 5512 | 5519 |
| 5520 # Other scripts may reach in and modify this pattern. | |
| 5513 _re_pattern_templates = [] | 5521 _re_pattern_templates = [] |
| 5514 for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: | 5522 for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: |
| 5515 for _template in _templates: | 5523 for _template in _templates: |
| 5516 _re_pattern_templates.append( | 5524 _re_pattern_templates.append( |
| 5517 (re.compile(r'(\<|\b)' + _template + r'\s*\<'), | 5525 (re.compile(r'(\<|\b)' + _template + r'\s*\<'), |
| 5518 _template + '<>', | 5526 _template + '<>', |
| 5519 _header)) | 5527 _header)) |
| 5520 | 5528 |
| 5521 | 5529 |
| 5522 def FilesBelongToSameModule(filename_cc, filename_h): | 5530 def FilesBelongToSameModule(filename_cc, filename_h): |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5629 | 5637 |
| 5630 # String is special -- it is a non-templatized type in STL. | 5638 # String is special -- it is a non-templatized type in STL. |
| 5631 matched = _RE_PATTERN_STRING.search(line) | 5639 matched = _RE_PATTERN_STRING.search(line) |
| 5632 if matched: | 5640 if matched: |
| 5633 # Don't warn about strings in non-STL namespaces: | 5641 # Don't warn about strings in non-STL namespaces: |
| 5634 # (We check only the first match per line; good enough.) | 5642 # (We check only the first match per line; good enough.) |
| 5635 prefix = line[:matched.start()] | 5643 prefix = line[:matched.start()] |
| 5636 if prefix.endswith('std::') or not prefix.endswith('::'): | 5644 if prefix.endswith('std::') or not prefix.endswith('::'): |
| 5637 required['<string>'] = (linenum, 'string') | 5645 required['<string>'] = (linenum, 'string') |
| 5638 | 5646 |
| 5639 for pattern, template, header in _re_pattern_algorithm_header: | 5647 for pattern, template, header in _RE_PATTERN_HEADERS_MAYBE_TEMPLATES: |
| 5640 if pattern.search(line): | 5648 if pattern.search(line): |
| 5641 required[header] = (linenum, template) | 5649 required[header] = (linenum, template) |
| 5642 | 5650 |
| 5643 # The following function is just a speed up, no semantics are changed. | 5651 # The following function is just a speed up, no semantics are changed. |
| 5644 if not '<' in line: # Reduces the cpu time usage by skipping lines. | 5652 if not '<' in line: # Reduces the cpu time usage by skipping lines. |
| 5645 continue | 5653 continue |
| 5646 | 5654 |
| 5647 for pattern, template, header in _re_pattern_templates: | 5655 for pattern, template, header in _re_pattern_templates: |
| 5648 if pattern.search(line): | 5656 if pattern.search(line): |
| 5649 required[header] = (linenum, template) | 5657 required[header] = (linenum, template) |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6027 CheckForHeaderGuard(filename, clean_lines, error) | 6035 CheckForHeaderGuard(filename, clean_lines, error) |
| 6028 | 6036 |
| 6029 for line in xrange(clean_lines.NumLines()): | 6037 for line in xrange(clean_lines.NumLines()): |
| 6030 ProcessLine(filename, file_extension, clean_lines, line, | 6038 ProcessLine(filename, file_extension, clean_lines, line, |
| 6031 include_state, function_state, nesting_state, error, | 6039 include_state, function_state, nesting_state, error, |
| 6032 extra_check_functions) | 6040 extra_check_functions) |
| 6033 FlagCxx11Features(filename, clean_lines, line, error) | 6041 FlagCxx11Features(filename, clean_lines, line, error) |
| 6034 nesting_state.CheckCompletedBlocks(filename, error) | 6042 nesting_state.CheckCompletedBlocks(filename, error) |
| 6035 | 6043 |
| 6036 CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) | 6044 CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) |
| 6037 | 6045 |
| 6038 # Check that the .cc file has included its header if it exists. | 6046 # Check that the .cc file has included its header if it exists. |
| 6039 if file_extension == 'cc': | 6047 if file_extension == 'cc': |
| 6040 CheckHeaderFileIncluded(filename, include_state, error) | 6048 CheckHeaderFileIncluded(filename, include_state, error) |
| 6041 | 6049 |
| 6042 # We check here rather than inside ProcessLine so that we see raw | 6050 # We check here rather than inside ProcessLine so that we see raw |
| 6043 # lines rather than "cleaned" lines. | 6051 # lines rather than "cleaned" lines. |
| 6044 CheckForBadCharacters(filename, lines, error) | 6052 CheckForBadCharacters(filename, lines, error) |
| 6045 | 6053 |
| 6046 CheckForNewlineAtEOF(filename, lines, error) | 6054 CheckForNewlineAtEOF(filename, lines, error) |
| 6047 | 6055 |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6314 _cpplint_state.ResetErrorCounts() | 6322 _cpplint_state.ResetErrorCounts() |
| 6315 for filename in filenames: | 6323 for filename in filenames: |
| 6316 ProcessFile(filename, _cpplint_state.verbose_level) | 6324 ProcessFile(filename, _cpplint_state.verbose_level) |
| 6317 _cpplint_state.PrintErrorCounts() | 6325 _cpplint_state.PrintErrorCounts() |
| 6318 | 6326 |
| 6319 sys.exit(_cpplint_state.error_count > 0) | 6327 sys.exit(_cpplint_state.error_count > 0) |
| 6320 | 6328 |
| 6321 | 6329 |
| 6322 if __name__ == '__main__': | 6330 if __name__ == '__main__': |
| 6323 main() | 6331 main() |
| OLD | NEW |