amiro-os / tools / cpplint / python / cpplint.py @ e545e620
History | View | Annotate | Download (236.226 KB)
| 1 |
#!/usr/bin/env python
|
|---|---|
| 2 |
#
|
| 3 |
# Copyright (c) 2009 Google Inc. All rights reserved.
|
| 4 |
#
|
| 5 |
# Redistribution and use in source and binary forms, with or without
|
| 6 |
# modification, are permitted provided that the following conditions are
|
| 7 |
# met:
|
| 8 |
#
|
| 9 |
# * Redistributions of source code must retain the above copyright
|
| 10 |
# notice, this list of conditions and the following disclaimer.
|
| 11 |
# * Redistributions in binary form must reproduce the above
|
| 12 |
# copyright notice, this list of conditions and the following disclaimer
|
| 13 |
# in the documentation and/or other materials provided with the
|
| 14 |
# distribution.
|
| 15 |
# * Neither the name of Google Inc. nor the names of its
|
| 16 |
# contributors may be used to endorse or promote products derived from
|
| 17 |
# this software without specific prior written permission.
|
| 18 |
#
|
| 19 |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| 20 |
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| 21 |
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| 22 |
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| 23 |
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 24 |
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| 25 |
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| 26 |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| 27 |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| 28 |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 29 |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| 30 |
|
| 31 |
"""Does google-lint on c++ files.
|
| 32 |
|
| 33 |
The goal of this script is to identify places in the code that *may*
|
| 34 |
be in non-compliance with google style. It does not attempt to fix
|
| 35 |
up these problems -- the point is to educate. It does also not
|
| 36 |
attempt to find all problems, or to ensure that everything it does
|
| 37 |
find is legitimately a problem.
|
| 38 |
|
| 39 |
In particular, we can get very confused by /* and // inside strings!
|
| 40 |
We do a small hack, which is to ignore //'s with "'s after them on the
|
| 41 |
same line, but it is far from perfect (in either direction).
|
| 42 |
"""
|
| 43 |
|
| 44 |
import codecs |
| 45 |
import copy |
| 46 |
import getopt |
| 47 |
import math # for log |
| 48 |
import os |
| 49 |
import re |
| 50 |
import sre_compile |
| 51 |
import string |
| 52 |
import sys |
| 53 |
import unicodedata |
| 54 |
|
| 55 |
|
| 56 |
_USAGE = """
|
| 57 |
Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
|
| 58 |
[--counting=total|toplevel|detailed] [--root=subdir]
|
| 59 |
[--linelength=digits]
|
| 60 |
<file> [file] ...
|
| 61 |
|
| 62 |
The style guidelines this tries to follow are those in
|
| 63 |
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
|
| 64 |
|
| 65 |
Every problem is given a confidence score from 1-5, with 5 meaning we are
|
| 66 |
certain of the problem, and 1 meaning it could be a legitimate construct.
|
| 67 |
This will miss some errors, and is not a substitute for a code review.
|
| 68 |
|
| 69 |
To suppress false-positive errors of a certain category, add a
|
| 70 |
'NOLINT(category)' comment to the line. NOLINT or NOLINT(*)
|
| 71 |
suppresses errors of all categories on that line.
|
| 72 |
|
| 73 |
The files passed in will be linted; at least one file must be provided.
|
| 74 |
Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the
|
| 75 |
extensions with the --extensions flag.
|
| 76 |
|
| 77 |
Flags:
|
| 78 |
|
| 79 |
output=vs7
|
| 80 |
By default, the output is formatted to ease emacs parsing. Visual Studio
|
| 81 |
compatible output (vs7) may also be used. Other formats are unsupported.
|
| 82 |
|
| 83 |
verbose=#
|
| 84 |
Specify a number 0-5 to restrict errors to certain verbosity levels.
|
| 85 |
|
| 86 |
filter=-x,+y,...
|
| 87 |
Specify a comma-separated list of category-filters to apply: only
|
| 88 |
error messages whose category names pass the filters will be printed.
|
| 89 |
(Category names are printed with the message and look like
|
| 90 |
"[whitespace/indent]".) Filters are evaluated left to right.
|
| 91 |
"-FOO" and "FOO" means "do not print categories that start with FOO".
|
| 92 |
"+FOO" means "do print categories that start with FOO".
|
| 93 |
|
| 94 |
Examples: --filter=-whitespace,+whitespace/braces
|
| 95 |
--filter=whitespace,runtime/printf,+runtime/printf_format
|
| 96 |
--filter=-,+build/include_what_you_use
|
| 97 |
|
| 98 |
To see a list of all the categories used in cpplint, pass no arg:
|
| 99 |
--filter=
|
| 100 |
|
| 101 |
counting=total|toplevel|detailed
|
| 102 |
The total number of errors found is always printed. If
|
| 103 |
'toplevel' is provided, then the count of errors in each of
|
| 104 |
the top-level categories like 'build' and 'whitespace' will
|
| 105 |
also be printed. If 'detailed' is provided, then a count
|
| 106 |
is provided for each category like 'build/class'.
|
| 107 |
|
| 108 |
root=subdir
|
| 109 |
The root directory used for deriving header guard CPP variable.
|
| 110 |
By default, the header guard CPP variable is calculated as the relative
|
| 111 |
path to the directory that contains .git, .hg, or .svn. When this flag
|
| 112 |
is specified, the relative path is calculated from the specified
|
| 113 |
directory. If the specified directory does not exist, this flag is
|
| 114 |
ignored.
|
| 115 |
|
| 116 |
Examples:
|
| 117 |
Assuming that src/.git exists, the header guard CPP variables for
|
| 118 |
src/chrome/browser/ui/browser.h are:
|
| 119 |
|
| 120 |
No flag => CHROME_BROWSER_UI_BROWSER_H_
|
| 121 |
--root=chrome => BROWSER_UI_BROWSER_H_
|
| 122 |
--root=chrome/browser => UI_BROWSER_H_
|
| 123 |
|
| 124 |
linelength=digits
|
| 125 |
This is the allowed line length for the project. The default value is
|
| 126 |
80 characters.
|
| 127 |
|
| 128 |
Examples:
|
| 129 |
--linelength=120
|
| 130 |
|
| 131 |
extensions=extension,extension,...
|
| 132 |
The allowed file extensions that cpplint will check
|
| 133 |
|
| 134 |
Examples:
|
| 135 |
--extensions=hpp,cpp
|
| 136 |
|
| 137 |
cpplint.py supports per-directory configurations specified in CPPLINT.cfg
|
| 138 |
files. CPPLINT.cfg file can contain a number of key=value pairs.
|
| 139 |
Currently the following options are supported:
|
| 140 |
|
| 141 |
set noparent
|
| 142 |
filter=+filter1,-filter2,...
|
| 143 |
exclude_files=regex
|
| 144 |
linelength=80
|
| 145 |
|
| 146 |
"set noparent" option prevents cpplint from traversing directory tree
|
| 147 |
upwards looking for more .cfg files in parent directories. This option
|
| 148 |
is usually placed in the top-level project directory.
|
| 149 |
|
| 150 |
The "filter" option is similar in function to --filter flag. It specifies
|
| 151 |
message filters in addition to the |_DEFAULT_FILTERS| and those specified
|
| 152 |
through --filter command-line flag.
|
| 153 |
|
| 154 |
"exclude_files" allows to specify a regular expression to be matched against
|
| 155 |
a file name. If the expression matches, the file is skipped and not run
|
| 156 |
through liner.
|
| 157 |
|
| 158 |
"linelength" allows to specify the allowed line length for the project.
|
| 159 |
|
| 160 |
CPPLINT.cfg has an effect on files in the same directory and all
|
| 161 |
sub-directories, unless overridden by a nested configuration file.
|
| 162 |
|
| 163 |
Example file:
|
| 164 |
filter=-build/include_order,+build/include_alpha
|
| 165 |
exclude_files=.*\.cc
|
| 166 |
|
| 167 |
The above example disables build/include_order warning and enables
|
| 168 |
build/include_alpha as well as excludes all .cc from being
|
| 169 |
processed by linter, in the current directory (where the .cfg
|
| 170 |
file is located) and all sub-directories.
|
| 171 |
"""
|
| 172 |
|
| 173 |
# We categorize each error message we print. Here are the categories.
|
| 174 |
# We want an explicit list so we can list them all in cpplint --filter=.
|
| 175 |
# If you add a new error message with a new category, add it to the list
|
| 176 |
# here! cpplint_unittest.py should tell you if you forget to do this.
|
| 177 |
_ERROR_CATEGORIES = [ |
| 178 |
'build/class',
|
| 179 |
'build/c++11',
|
| 180 |
'build/deprecated',
|
| 181 |
'build/endif_comment',
|
| 182 |
'build/explicit_make_pair',
|
| 183 |
'build/forward_decl',
|
| 184 |
'build/header_guard',
|
| 185 |
'build/include',
|
| 186 |
'build/include_alpha',
|
| 187 |
'build/include_order',
|
| 188 |
'build/include_what_you_use',
|
| 189 |
'build/namespaces',
|
| 190 |
'build/printf_format',
|
| 191 |
'build/storage_class',
|
| 192 |
'legal/copyright',
|
| 193 |
'readability/alt_tokens',
|
| 194 |
'readability/braces',
|
| 195 |
'readability/casting',
|
| 196 |
'readability/check',
|
| 197 |
'readability/constructors',
|
| 198 |
'readability/fn_size',
|
| 199 |
'readability/function',
|
| 200 |
'readability/inheritance',
|
| 201 |
'readability/multiline_comment',
|
| 202 |
'readability/multiline_string',
|
| 203 |
'readability/namespace',
|
| 204 |
'readability/nolint',
|
| 205 |
'readability/nul',
|
| 206 |
'readability/strings',
|
| 207 |
'readability/todo',
|
| 208 |
'readability/utf8',
|
| 209 |
'runtime/arrays',
|
| 210 |
'runtime/casting',
|
| 211 |
'runtime/explicit',
|
| 212 |
'runtime/int',
|
| 213 |
'runtime/init',
|
| 214 |
'runtime/invalid_increment',
|
| 215 |
'runtime/member_string_references',
|
| 216 |
'runtime/memset',
|
| 217 |
'runtime/indentation_namespace',
|
| 218 |
'runtime/operator',
|
| 219 |
'runtime/printf',
|
| 220 |
'runtime/printf_format',
|
| 221 |
'runtime/references',
|
| 222 |
'runtime/string',
|
| 223 |
'runtime/threadsafe_fn',
|
| 224 |
'runtime/vlog',
|
| 225 |
'whitespace/blank_line',
|
| 226 |
'whitespace/braces',
|
| 227 |
'whitespace/comma',
|
| 228 |
'whitespace/comments',
|
| 229 |
'whitespace/empty_conditional_body',
|
| 230 |
'whitespace/empty_loop_body',
|
| 231 |
'whitespace/end_of_line',
|
| 232 |
'whitespace/ending_newline',
|
| 233 |
'whitespace/forcolon',
|
| 234 |
'whitespace/indent',
|
| 235 |
'whitespace/line_length',
|
| 236 |
'whitespace/newline',
|
| 237 |
'whitespace/operators',
|
| 238 |
'whitespace/parens',
|
| 239 |
'whitespace/semicolon',
|
| 240 |
'whitespace/tab',
|
| 241 |
'whitespace/todo',
|
| 242 |
] |
| 243 |
|
| 244 |
# These error categories are no longer enforced by cpplint, but for backwards-
|
| 245 |
# compatibility they may still appear in NOLINT comments.
|
| 246 |
_LEGACY_ERROR_CATEGORIES = [ |
| 247 |
'readability/streams',
|
| 248 |
] |
| 249 |
|
| 250 |
# The default state of the category filter. This is overridden by the --filter=
|
| 251 |
# flag. By default all errors are on, so only add here categories that should be
|
| 252 |
# off by default (i.e., categories that must be enabled by the --filter= flags).
|
| 253 |
# All entries here should start with a '-' or '+', as in the --filter= flag.
|
| 254 |
_DEFAULT_FILTERS = ['-build/include_alpha']
|
| 255 |
|
| 256 |
# We used to check for high-bit characters, but after much discussion we
|
| 257 |
# decided those were OK, as long as they were in UTF-8 and didn't represent
|
| 258 |
# hard-coded international strings, which belong in a separate i18n file.
|
| 259 |
|
| 260 |
# C++ headers
|
| 261 |
_CPP_HEADERS = frozenset([
|
| 262 |
# Legacy
|
| 263 |
'algobase.h',
|
| 264 |
'algo.h',
|
| 265 |
'alloc.h',
|
| 266 |
'builtinbuf.h',
|
| 267 |
'bvector.h',
|
| 268 |
'complex.h',
|
| 269 |
'defalloc.h',
|
| 270 |
'deque.h',
|
| 271 |
'editbuf.h',
|
| 272 |
'fstream.h',
|
| 273 |
'function.h',
|
| 274 |
'hash_ma |