Blame addons/naming.py

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')