diff options
Diffstat (limited to 'WebKitTools/Scripts/modules/cpp_style.py')
-rw-r--r-- | WebKitTools/Scripts/modules/cpp_style.py | 85 |
1 files changed, 30 insertions, 55 deletions
diff --git a/WebKitTools/Scripts/modules/cpp_style.py b/WebKitTools/Scripts/modules/cpp_style.py index 0c9dfa0..485b07c 100644 --- a/WebKitTools/Scripts/modules/cpp_style.py +++ b/WebKitTools/Scripts/modules/cpp_style.py @@ -1533,16 +1533,15 @@ def check_spacing(filename, clean_lines, line_number, error): # Don't try to do spacing checks for operator methods line = re.sub(r'operator(==|!=|<|<<|<=|>=|>>|>)\(', 'operator\(', line) - - # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". - # Otherwise not. Note we only check for non-spaces on *both* sides; - # sometimes people put non-spaces on one side when aligning ='s among - # many lines (not that this is behavior that I approve of...) - if search(r'[\w.]=[\w.]', line) and not search(r'\b(if|while) ', line): + # Don't try to do spacing checks for #include statements at minimum it + # messes up checks for spacing around / + if match(r'\s*#\s*include', line): + return + if search(r'[\w.]=[\w.]', line): error(filename, line_number, 'whitespace/operators', 4, 'Missing spaces around =') - # FIXME: It's not ok to have spaces around binary operators like + - * / . + # FIXME: It's not ok to have spaces around binary operators like . # You should always have whitespace around binary operators. # Alas, we can't test < or > because they're legitimately used sans spaces @@ -1559,12 +1558,6 @@ def check_spacing(filename, clean_lines, line_number, error): if matched: error(filename, line_number, 'whitespace/operators', 3, 'Missing spaces around %s' % matched.group(1)) - # We allow no-spaces around << and >> when used like this: 10<<20, but - # not otherwise (particularly, not when used as streams) - matched = search(r'[^0-9\s](<<|>>)[^0-9\s=]', line) - if matched: - error(filename, line_number, 'whitespace/operators', 3, - 'Missing spaces around %s' % matched.group(1)) # There shouldn't be space around unary operators matched = search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line) @@ -1699,50 +1692,32 @@ def check_namespace_indentation(filename, clean_lines, line_number, file_extensi if not namespace_match: return - namespace_indentation = namespace_match.group('namespace_indentation') - - is_header_file = file_extension == 'h' - is_implementation_file = not is_header_file + current_indentation_level = len(namespace_match.group('namespace_indentation')) + if current_indentation_level > 0: + error(filename, line_number, 'whitespace/indent', 4, + 'namespace should never be indented.') + return + looking_for_semicolon = False; line_offset = 0 - - if is_header_file: - inner_indentation = namespace_indentation + ' ' * 4 - - for current_line in clean_lines.raw_lines[line_number + 1:]: - line_offset += 1 - - # Skip not only empty lines but also those with preprocessor directives. - # Goto labels don't occur in header files, so no need to check for those. - if current_line.strip() == '' or current_line.startswith('#'): - continue - - if not current_line.startswith(inner_indentation): - # If something unindented was discovered, make sure it's a closing brace. - if not current_line.startswith(namespace_indentation + '}'): + in_preprocessor_directive = False; + for current_line in clean_lines.elided[line_number + 1:]: + line_offset += 1 + if not current_line.strip(): + continue + if not current_indentation_level: + if not (in_preprocessor_directive or looking_for_semicolon): + if not match(r'\S', current_line): error(filename, line_number + line_offset, 'whitespace/indent', 4, - 'In a header, code inside a namespace should be indented.') - break - - if is_implementation_file: - for current_line in clean_lines.raw_lines[line_number + 1:]: - line_offset += 1 - - # Skip not only empty lines but also those with (goto) labels. - # The goto label regexp accepts spaces or the beginning of a - # comment (if anything) after the initial colon. - if current_line.strip() == '' or match(r'\w+\s*:([\s\/].*)?$', current_line): - continue - - remaining_line = current_line[len(namespace_indentation):] - if not match(r'\S', remaining_line): - error(filename, line_number + line_offset, 'whitespace/indent', 4, - 'In an implementation file, code inside a namespace should not be indented.') - - # Just check the first non-empty line in any case, because - # otherwise we would need to count opened and closed braces, - # which is obviously a lot more complicated. - break - + 'Code inside a namespace should not be indented.') + if in_preprocessor_directive or (current_line.strip()[0] == '#'): # This takes care of preprocessor directive syntax. + in_preprocessor_directive = current_line[-1] == '\\' + else: + looking_for_semicolon = ((current_line.find(';') == -1) and (current_line.strip()[-1] != '}')) or (current_line[-1] == '\\') + else: + looking_for_semicolon = False; # If we have a brace we may not need a semicolon. + current_indentation_level += current_line.count('{') - current_line.count('}') + if current_indentation_level < 0: + break; def check_using_std(filename, clean_lines, line_number, error): """Looks for 'using std::foo;' statements which should be replaced with 'using namespace std;'. |