summaryrefslogtreecommitdiffstats
path: root/PRESUBMIT.py
diff options
context:
space:
mode:
authormarja@chromium.org <marja@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-06 16:38:43 +0000
committermarja@chromium.org <marja@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-06 16:38:43 +0000
commitac294a1800342deca5407ef4ebe12016f3ce6be3 (patch)
treef021ebef766a9a845e460a286888112aab4e6013 /PRESUBMIT.py
parent4aec5d3d6520115c2f7626cb7337f4b69e63018f (diff)
downloadchromium_src-ac294a1800342deca5407ef4ebe12016f3ce6be3.zip
chromium_src-ac294a1800342deca5407ef4ebe12016f3ce6be3.tar.gz
chromium_src-ac294a1800342deca5407ef4ebe12016f3ce6be3.tar.bz2
PRESUBMIT #include check enhancements.
1) Handle #define and #undef the same way as #if etc. See e.g., https://codereview.chromium.org/11363222/diff/10015/chrome/browser/history/history_unittest.cc line 545. 2) Also headers can have the special first include, not only sources. See e.g., net/disk_cache/storage_block-inl.h. NOTRY=true BUG=NONE Review URL: https://chromiumcodereview.appspot.com/11441035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171511 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'PRESUBMIT.py')
-rw-r--r--PRESUBMIT.py55
1 files changed, 26 insertions, 29 deletions
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index f16d273..252b836 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -542,7 +542,7 @@ def _CheckIncludeOrderForScope(scope, input_api, file_path, changed_linenums):
return warnings
-def _CheckIncludeOrderInFile(input_api, f, is_source, changed_linenums):
+def _CheckIncludeOrderInFile(input_api, f, changed_linenums):
"""Checks the #include order for the given file f."""
system_include_pattern = input_api.re.compile(r'\s*#include \<.*')
@@ -550,34 +550,34 @@ def _CheckIncludeOrderInFile(input_api, f, is_source, changed_linenums):
# often need to appear in a specific order.
excluded_include_pattern = input_api.re.compile(r'\s*#include \<.*/.*')
custom_include_pattern = input_api.re.compile(r'\s*#include "(?P<FILE>.*)"')
- if_pattern = input_api.re.compile(r'\s*#\s*(if|elif|else|endif).*')
+ if_pattern = (
+ input_api.re.compile(r'\s*#\s*(if|elif|else|endif|define|undef).*'))
contents = f.NewContents()
warnings = []
line_num = 0
- # Handle the special first include for source files. If the header file is
- # some/path/file.h, the corresponding source file can be some/path/file.cc,
- # some/other/path/file.cc, some/path/file_platform.cc etc. It's also possible
- # that no special first include exists.
- if is_source:
- for line in contents:
- line_num += 1
- if system_include_pattern.match(line):
+ # Handle the special first include. If the first include file is
+ # some/path/file.h, the corresponding including file can be some/path/file.cc,
+ # some/other/path/file.cc, some/path/file_platform.cc, some/path/file-suffix.h
+ # etc. It's also possible that no special first include exists.
+ for line in contents:
+ line_num += 1
+ if system_include_pattern.match(line):
+ # No special first include -> process the line again along with normal
+ # includes.
+ line_num -= 1
+ break
+ match = custom_include_pattern.match(line)
+ if match:
+ match_dict = match.groupdict()
+ header_basename = input_api.os_path.basename(
+ match_dict['FILE']).replace('.h', '')
+ if header_basename not in input_api.os_path.basename(f.LocalPath()):
# No special first include -> process the line again along with normal
# includes.
line_num -= 1
- break
- match = custom_include_pattern.match(line)
- if match:
- match_dict = match.groupdict()
- header_basename = input_api.os_path.basename(
- match_dict['FILE']).replace('.h', '')
- if header_basename not in input_api.os_path.basename(f.LocalPath()):
- # No special first include -> process the line again along with normal
- # includes.
- line_num -= 1
- break
+ break
# Split into scopes: Each region between #if and #endif is its own scope.
scopes = []
@@ -607,18 +607,15 @@ def _CheckIncludeOrder(input_api, output_api):
3. C++ system files in alphabetical order
4. Project's .h files in alphabetical order
- Each region between #if and #endif follows these rules separately.
+ Each region separated by #if, #elif, #else, #endif, #define and #undef follows
+ these rules separately.
"""
warnings = []
for f in input_api.AffectedFiles():
- changed_linenums = set([line_num for line_num, _ in f.ChangedContents()])
- if f.LocalPath().endswith('.cc'):
- warnings.extend(_CheckIncludeOrderInFile(input_api, f, True,
- changed_linenums))
- elif f.LocalPath().endswith('.h'):
- warnings.extend(_CheckIncludeOrderInFile(input_api, f, False,
- changed_linenums))
+ if f.LocalPath().endswith(('.cc', '.h')):
+ changed_linenums = set(line_num for line_num, _ in f.ChangedContents())
+ warnings.extend(_CheckIncludeOrderInFile(input_api, f, changed_linenums))
results = []
if warnings: