[commit: ghc] master: arc-linters: Add linting of #ifdef x and #if defined x (0ecd7fa)
git at git.haskell.org
git at git.haskell.org
Wed Apr 12 18:53:32 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/0ecd7fae57cfe0849b5efcce1ec14df9bbd3292e/ghc
>---------------------------------------------------------------
commit 0ecd7fae57cfe0849b5efcce1ec14df9bbd3292e
Author: Ben Gamari <bgamari.foss at gmail.com>
Date: Wed Apr 12 14:10:01 2017 -0400
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
>---------------------------------------------------------------
0ecd7fae57cfe0849b5efcce1ec14df9bbd3292e
.arc-linters/check-cpp.py | 77 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 61 insertions(+), 16 deletions(-)
diff --git a/.arc-linters/check-cpp.py b/.arc-linters/check-cpp.py
index d81e58b..7115488 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))
More information about the ghc-commits
mailing list