From 0ecd7fae57cfe0849b5efcce1ec14df9bbd3292e Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 12 Apr 2017 14:10:01 -0400 Subject: arc-linters: Add linting of #ifdef x and #if defined x Reviewers: austin, erikd Reviewed By: erikd Subscribers: rwbarton, thomie, erikd Differential Revision: https://phabricator.haskell.org/D3423 --- .arc-linters/check-cpp.py | 77 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 16 deletions(-) (limited to '.arc-linters') diff --git a/.arc-linters/check-cpp.py b/.arc-linters/check-cpp.py index d81e58b024..71154883bd 100755 --- a/.arc-linters/check-cpp.py +++ b/.arc-linters/check-cpp.py @@ -23,19 +23,64 @@ logger = logging.getLogger() #setup_logging(logger) logger.debug(sys.argv) -path = sys.argv[1] -warnings = [] -r = re.compile(br'ASSERT\s+\(') -if os.path.isfile(path): - with open(path, 'rb') as f: - for lineno, line in enumerate(f): - if r.search(line): - warning = { - 'severity': 'warning', - 'message': 'CPP macros should not have a space between the macro name and their argument list', - 'line': lineno+1, - } - warnings.append(warning) - -logger.debug(warnings) -print(json.dumps(warnings)) +def add_warning(severity, message, line): + entry = { + 'severity': severity, + 'message': message, + 'line': line + } + warnings.append(entry) + +class Linter(object): + def __init__(self): + self.warnings = [] + + def add_warning(self, **entry): + self.warnings.append(entry) + + def lint(self, path): + pass + +class LineLinter(Linter): + def lint(self, path): + if os.path.isfile(path): + with open(path, 'rb') as f: + for lineno, line in enumerate(f): + self.lint_line(lineno+1, line) + + def lint_line(self, lineno, line): + pass + +class RegexpLinter(LineLinter): + def __init__(self, regex, **warning): + LineLinter.__init__(self) + self.re = re.compile(regex) + self.warning = warning + + def lint_line(self, lineno, line): + if self.re.search(line): + warning = { + 'line': lineno, + } + warning.update(self.warning) + self.add_warning(**warning) + +linters = [ + RegexpLinter(br'ASSERT\s+\(', + message='CPP macros should not have a space between the macro name and their argument list'), + RegexpLinter(br'#ifdef\s+', + message='`#if defined(x)` is preferred to `#ifdef x`'), + RegexpLinter(br'#if\s+defined\s+', + message='`#if defined(x)` is preferred to `#if defined x`'), +] + +if __name__ == '__main__': + path = sys.argv[1] + for linter in linters: + linter.lint(path) + + warnings = [warning + for linter in linters + for warning in linter.warnings] + logger.debug(warnings) + print(json.dumps(warnings)) -- cgit v1.2.1