Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp.py

Issue 2667423006: blink: Remove include ordering checks, clang-format does this now. (Closed)
Patch Set: feedback Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 # 2 #
3 # Copyright (C) 2009, 2010, 2012 Google Inc. All rights reserved. 3 # Copyright (C) 2009, 2010, 2012 Google Inc. All rights reserved.
4 # Copyright (C) 2009 Torch Mobile Inc. 4 # Copyright (C) 2009 Torch Mobile Inc.
5 # Copyright (C) 2009 Apple Inc. All rights reserved. 5 # Copyright (C) 2009 Apple Inc. All rights reserved.
6 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org) 6 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
7 # 7 #
8 # Redistribution and use in source and binary forms, with or without 8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions are 9 # modification, are permitted provided that the following conditions are
10 # met: 10 # met:
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 ['ASSERT', 'DCHECK or its variants'], 111 ['ASSERT', 'DCHECK or its variants'],
112 ['ASSERT_UNUSED', 'DCHECK or its variants'], 112 ['ASSERT_UNUSED', 'DCHECK or its variants'],
113 ['ASSERT_NOT_REACHED', 'NOTREACHED'], 113 ['ASSERT_NOT_REACHED', 'NOTREACHED'],
114 ['WTF_LOG', 'DVLOG'] 114 ['WTF_LOG', 'DVLOG']
115 ] 115 ]
116 116
117 # These constants define types of headers for use with 117 # These constants define types of headers for use with
118 # _IncludeState.check_next_include_order(). 118 # _IncludeState.check_next_include_order().
119 _PRIMARY_HEADER = 0 119 _PRIMARY_HEADER = 0
120 _OTHER_HEADER = 1 120 _OTHER_HEADER = 1
121 _MOC_HEADER = 2
122 121
123 122
124 # The regexp compilation caching is inlined in all regexp functions for 123 # The regexp compilation caching is inlined in all regexp functions for
125 # performance reasons; factoring it out into a separate function turns out 124 # performance reasons; factoring it out into a separate function turns out
126 # to be noticeably expensive. 125 # to be noticeably expensive.
127 _regexp_compile_cache = {} 126 _regexp_compile_cache = {}
128 127
129 128
130 def match(pattern, s): 129 def match(pattern, s):
131 """Matches the string with the pattern, caching the compiled regexp.""" 130 """Matches the string with the pattern, caching the compiled regexp."""
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 """ 299 """
301 # self._section will move monotonically through this set. If it ever 300 # self._section will move monotonically through this set. If it ever
302 # needs to move backwards, check_next_include_order will raise an error. 301 # needs to move backwards, check_next_include_order will raise an error.
303 _INITIAL_SECTION = 0 302 _INITIAL_SECTION = 0
304 _PRIMARY_SECTION = 1 303 _PRIMARY_SECTION = 1
305 _OTHER_SECTION = 2 304 _OTHER_SECTION = 2
306 305
307 _TYPE_NAMES = { 306 _TYPE_NAMES = {
308 _PRIMARY_HEADER: 'header this file implements', 307 _PRIMARY_HEADER: 'header this file implements',
309 _OTHER_HEADER: 'other header', 308 _OTHER_HEADER: 'other header',
310 _MOC_HEADER: 'moc file',
311 } 309 }
312 _SECTION_NAMES = { 310 _SECTION_NAMES = {
313 _INITIAL_SECTION: "... nothing.", 311 _INITIAL_SECTION: "... nothing.",
314 _PRIMARY_SECTION: 'a header this file implements.', 312 _PRIMARY_SECTION: 'a header this file implements.',
315 _OTHER_SECTION: 'other header.', 313 _OTHER_SECTION: 'other header.',
316 } 314 }
317 315
318 def __init__(self): 316 def __init__(self):
319 dict.__init__(self) 317 dict.__init__(self)
320 self._section = self._INITIAL_SECTION 318 self._section = self._INITIAL_SECTION
(...skipping 12 matching lines...) Expand all
333 Args: 331 Args:
334 header_type: One of the _XXX_HEADER constants defined above. 332 header_type: One of the _XXX_HEADER constants defined above.
335 file_is_header: Whether the file that owns this _IncludeState is itsel f a header 333 file_is_header: Whether the file that owns this _IncludeState is itsel f a header
336 334
337 Returns: 335 Returns:
338 The empty string if the header is in the right order, or an 336 The empty string if the header is in the right order, or an
339 error message describing what's wrong. 337 error message describing what's wrong.
340 """ 338 """
341 if header_type == _PRIMARY_HEADER and file_is_header: 339 if header_type == _PRIMARY_HEADER and file_is_header:
342 return 'Header file should not contain itself.' 340 return 'Header file should not contain itself.'
343 if header_type == _MOC_HEADER:
344 return ''
345 341
346 error_message = '' 342 error_message = ''
347 if self._section != self._OTHER_SECTION: 343 if self._section != self._OTHER_SECTION:
348 before_error_message = ('Found %s before %s' % 344 before_error_message = ('Found %s before %s' %
349 (self._TYPE_NAMES[header_type], 345 (self._TYPE_NAMES[header_type],
350 self._SECTION_NAMES[self._section + 1])) 346 self._SECTION_NAMES[self._section + 1]))
351 after_error_message = ('Found %s after %s' % 347 after_error_message = ('Found %s after %s' %
352 (self._TYPE_NAMES[header_type], 348 (self._TYPE_NAMES[header_type],
353 self._SECTION_NAMES[self._section])) 349 self._SECTION_NAMES[self._section]))
354 350
(...skipping 2077 matching lines...) Expand 10 before | Expand all | Expand 10 after
2432 check_braces(clean_lines, line_number, error) 2428 check_braces(clean_lines, line_number, error)
2433 check_exit_statement_simplifications(clean_lines, line_number, error) 2429 check_exit_statement_simplifications(clean_lines, line_number, error)
2434 check_spacing(file_extension, clean_lines, line_number, error) 2430 check_spacing(file_extension, clean_lines, line_number, error)
2435 check_check(clean_lines, line_number, error) 2431 check_check(clean_lines, line_number, error)
2436 check_deprecated_macros(clean_lines, line_number, error) 2432 check_deprecated_macros(clean_lines, line_number, error)
2437 check_for_comparisons_to_boolean(clean_lines, line_number, error) 2433 check_for_comparisons_to_boolean(clean_lines, line_number, error)
2438 check_for_null(clean_lines, line_number, file_state, error) 2434 check_for_null(clean_lines, line_number, file_state, error)
2439 check_enum_casing(clean_lines, line_number, enum_state, error) 2435 check_enum_casing(clean_lines, line_number, enum_state, error)
2440 2436
2441 2437
2442 _RE_PATTERN_INCLUDE_NEW_STYLE = re.compile(r'#include +"[^/]+\.h"')
2443 _RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') 2438 _RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$')
2444 # Matches the first component of a filename delimited by -s and _s. That is: 2439 # Matches the first component of a filename delimited by -s and _s. That is:
2445 # _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' 2440 # _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo'
2446 # _RE_FIRST_COMPONENT.match('foo.cpp').group(0) == 'foo' 2441 # _RE_FIRST_COMPONENT.match('foo.cpp').group(0) == 'foo'
2447 # _RE_FIRST_COMPONENT.match('foo-bar_baz.cpp').group(0) == 'foo' 2442 # _RE_FIRST_COMPONENT.match('foo-bar_baz.cpp').group(0) == 'foo'
2448 # _RE_FIRST_COMPONENT.match('foo_bar-baz.cpp').group(0) == 'foo' 2443 # _RE_FIRST_COMPONENT.match('foo_bar-baz.cpp').group(0) == 'foo'
2449 _RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+') 2444 _RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+')
2450 2445
2451 2446
2452 def _drop_common_suffixes(filename): 2447 def _drop_common_suffixes(filename):
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2498 # If it is a system header we know it is classified as _OTHER_HEADER. 2493 # If it is a system header we know it is classified as _OTHER_HEADER.
2499 if is_system and not include.startswith('public/'): 2494 if is_system and not include.startswith('public/'):
2500 return _OTHER_HEADER 2495 return _OTHER_HEADER
2501 2496
2502 # There cannot be primary includes in header files themselves. Only an 2497 # There cannot be primary includes in header files themselves. Only an
2503 # include exactly matches the header filename will be is flagged as 2498 # include exactly matches the header filename will be is flagged as
2504 # primary, so that it triggers the "don't include yourself" check. 2499 # primary, so that it triggers the "don't include yourself" check.
2505 if filename.endswith('.h') and filename != include: 2500 if filename.endswith('.h') and filename != include:
2506 return _OTHER_HEADER 2501 return _OTHER_HEADER
2507 2502
2508 # Qt's moc files do not follow the naming and ordering rules, so they should be skipped
2509 if include.startswith('moc_') and include.endswith('.cpp'):
2510 return _MOC_HEADER
2511
2512 if include.endswith('.moc'):
2513 return _MOC_HEADER
2514
2515 # If the target file basename starts with the include we're checking 2503 # If the target file basename starts with the include we're checking
2516 # then we consider it the primary header. 2504 # then we consider it the primary header.
2517 target_base = FileInfo(filename).base_name() 2505 target_base = FileInfo(filename).base_name()
2518 include_base = FileInfo(include).base_name() 2506 include_base = FileInfo(include).base_name()
2519 2507
2520 # If we haven't encountered a primary header, then be lenient in checking. 2508 # If we haven't encountered a primary header, then be lenient in checking.
2521 if not include_state.visited_primary_section(): 2509 if not include_state.visited_primary_section():
2522 if target_base.find(include_base) != -1: 2510 if target_base.find(include_base) != -1:
2523 return _PRIMARY_HEADER 2511 return _PRIMARY_HEADER
2524 # Qt private APIs use _p.h suffix.
2525 if include_base.find(target_base) != -1 and include_base.endswith('_p'):
2526 return _PRIMARY_HEADER
2527 2512
2528 # If we already encountered a primary header, perform a strict comparison. 2513 # If we already encountered a primary header, perform a strict comparison.
2529 # In case the two filename bases are the same then the above lenient check 2514 # In case the two filename bases are the same then the above lenient check
2530 # probably was a false positive. 2515 # probably was a false positive.
2531 elif include_state.visited_primary_section() and target_base == include_base : 2516 elif include_state.visited_primary_section() and target_base == include_base :
2532 if include == "ResourceHandleWin.h":
2533 # FIXME: Thus far, we've only seen one example of these, but if we
2534 # start to see more, please consider generalizing this check
2535 # somehow.
2536 return _OTHER_HEADER
2537 return _PRIMARY_HEADER 2517 return _PRIMARY_HEADER
2538 2518
2539 return _OTHER_HEADER 2519 return _OTHER_HEADER
2540 2520
2541 2521
2542 def _does_primary_header_exist(filename): 2522 def _does_primary_header_exist(filename):
2543 """Return a primary header file name for a file, or empty string 2523 """Return a primary header file name for a file, or empty string
2544 if the file is not source file or primary header does not exist. 2524 if the file is not source file or primary header does not exist.
2545 """ 2525 """
2546 fileinfo = FileInfo(filename) 2526 fileinfo = FileInfo(filename)
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2619 file_extension == "h" , 2599 file_extension == "h" ,
2620 primary_header_exists ) 2600 primary_header_exists )
2621 2601
2622 # Check to make sure we have a blank line after primary header. 2602 # Check to make sure we have a blank line after primary header.
2623 if not error_message and header_type == _PRIMARY_HEADER: 2603 if not error_message and header_type == _PRIMARY_HEADER:
2624 next_line = clean_lines.raw_lines[line_number + 1] 2604 next_line = clean_lines.raw_lines[line_number + 1]
2625 if not is_blank_line(next_line): 2605 if not is_blank_line(next_line):
2626 error(line_number, 'build/include_order', 4, 2606 error(line_number, 'build/include_order', 4,
2627 'You should add a blank line after implementation file\'s own header.') 2607 'You should add a blank line after implementation file\'s own header.')
2628 2608
2629 # Check to make sure all headers besides the primary header are
2630 # alphabetically sorted. Skip Qt's moc files.
2631 if not error_message and header_type == _OTHER_HEADER:
2632 previous_line_number = line_number - 1
2633 previous_line = clean_lines.lines[previous_line_number]
2634 previous_match = _RE_PATTERN_INCLUDE.search(previous_line)
2635 while (not previous_match and previous_line_number > 0
2636 and not search(r'\A(#if|#ifdef|#ifndef|#else|#elif|#endif)', prev ious_line)):
2637 previous_line_number -= 1
2638 previous_line = clean_lines.lines[previous_line_number]
2639 previous_match = _RE_PATTERN_INCLUDE.search(previous_line)
2640 if previous_match:
2641 previous_header_type = include_state.header_types[previous_line_numb er]
2642 if previous_header_type == _OTHER_HEADER and previous_line.strip() > line.strip():
2643 # This type of error is potentially a problem with this line or the previous one,
2644 # so if the error is filtered for one line, report it for the ne xt. This is so that
2645 # we properly handle patches, for which only modified lines prod uce errors.
2646 if not error(line_number - 1, 'build/include_order', 4, 'Alphabe tical sorting problem.'):
2647 error(line_number, 'build/include_order', 4, 'Alphabetical s orting problem.')
2648
2649 if error_message: 2609 if error_message:
2650 if file_extension == 'h': 2610 if file_extension == 'h':
2651 error(line_number, 'build/include_order', 4, 2611 error(line_number, 'build/include_order', 4,
2652 '%s Should be: alphabetically sorted.' % 2612 '%s Should be: alphabetically sorted.' %
2653 error_message) 2613 error_message)
2654 else: 2614 else:
2655 error(line_number, 'build/include_order', 4, 2615 error(line_number, 'build/include_order', 4,
2656 '%s Should be: primary header, blank line, and then alphabetic ally sorted.' % 2616 '%s Should be: primary header, blank line, and then alphabetic ally sorted.' %
2657 error_message) 2617 error_message)
2658 2618
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
3637 3597
3638 def check(self, lines): 3598 def check(self, lines):
3639 _process_lines(self.file_path, self.file_extension, lines, 3599 _process_lines(self.file_path, self.file_extension, lines,
3640 self.handle_style_error, self.min_confidence) 3600 self.handle_style_error, self.min_confidence)
3641 3601
3642 3602
3643 # FIXME: Remove this function (requires refactoring unit tests). 3603 # FIXME: Remove this function (requires refactoring unit tests).
3644 def process_file_data(filename, file_extension, lines, error, min_confidence, fs =None): 3604 def process_file_data(filename, file_extension, lines, error, min_confidence, fs =None):
3645 checker = CppChecker(filename, file_extension, error, min_confidence, fs) 3605 checker = CppChecker(filename, file_extension, error, min_confidence, fs)
3646 checker.check(lines) 3606 checker.check(lines)
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698