|
Packit |
2035a7 |
#!/usr/bin/env python
|
|
Packit |
2035a7 |
#
|
|
Packit |
2035a7 |
# cppcheck addon for naming conventions
|
|
Packit |
2035a7 |
#
|
|
Packit |
2035a7 |
# Example usage (variable name must start with lowercase, function name must start with uppercase):
|
|
Packit |
2035a7 |
# $ cppcheck --dump path-to-src/
|
|
Packit |
2035a7 |
# $ python addons/naming.py --var='[a-z].*' --function='[A-Z].*' path-to-src/*.dump
|
|
Packit |
2035a7 |
#
|
|
Packit |
2035a7 |
|
|
Packit |
2035a7 |
import cppcheckdata
|
|
Packit |
2035a7 |
import sys
|
|
Packit |
2035a7 |
import re
|
|
Packit |
2035a7 |
|
|
Packit |
2035a7 |
RE_VARNAME = None
|
|
Packit |
2035a7 |
RE_FUNCTIONNAME = None
|
|
Packit |
2035a7 |
for arg in sys.argv[1:]:
|
|
Packit |
2035a7 |
if arg[:6] == '--var=':
|
|
Packit |
2035a7 |
RE_VARNAME = arg[6:]
|
|
Packit |
2035a7 |
elif arg[:11] == '--function=':
|
|
Packit |
2035a7 |
RE_FUNCTIONNAME = arg[11:]
|
|
Packit |
2035a7 |
|
|
Packit |
2035a7 |
|
|
Packit |
2035a7 |
def reportError(token, severity, msg):
|
|
Packit |
2035a7 |
sys.stderr.write(
|
|
Packit |
2035a7 |
'[' + token.file + ':' + str(token.linenr) + '] (' + severity + ') naming.py: ' + msg + '\n')
|
|
Packit |
2035a7 |
|
|
Packit |
2035a7 |
for arg in sys.argv[1:]:
|
|
Packit |
2035a7 |
if not arg[-5:] == '.dump':
|
|
Packit |
2035a7 |
continue
|
|
Packit |
2035a7 |
print('Checking ' + arg + '...')
|
|
Packit |
2035a7 |
data = cppcheckdata.parsedump(arg)
|
|
Packit |
2035a7 |
for cfg in data.configurations:
|
|
Packit |
2035a7 |
if len(data.configurations) > 1:
|
|
Packit |
2035a7 |
print('Checking ' + arg + ', config "' + cfg.name + '"...')
|
|
Packit |
2035a7 |
if RE_VARNAME:
|
|
Packit |
2035a7 |
for var in cfg.variables:
|
|
Packit |
2035a7 |
res = re.match(RE_VARNAME, var.nameToken.str)
|
|
Packit |
2035a7 |
if not res:
|
|
Packit |
2035a7 |
reportError(var.typeStartToken, 'style', 'Variable ' +
|
|
Packit |
2035a7 |
var.nameToken.str + ' violates naming convention')
|
|
Packit |
2035a7 |
if RE_FUNCTIONNAME:
|
|
Packit |
2035a7 |
for scope in cfg.scopes:
|
|
Packit |
2035a7 |
if scope.type == 'Function':
|
|
Packit |
2035a7 |
res = re.match(RE_FUNCTIONNAME, scope.className)
|
|
Packit |
2035a7 |
if not res:
|
|
Packit |
2035a7 |
reportError(
|
|
Packit |
2035a7 |
scope.classStart, 'style', 'Function ' + scope.className + ' violates naming convention')
|