From ca44d7f40afa39b40cfa2ac85521a65d1743ef7a Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 19 Nov 2018 09:08:28 +0100 Subject: [PATCH] Detect mixed usage of spaces and tabs. 2018-11-19 Martin Liska * check_GNU_style_lib.py: Detect mixed usage of spaces and tabs. From-SVN: r266261 --- contrib/ChangeLog | 5 +++++ contrib/check_GNU_style_lib.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/contrib/ChangeLog b/contrib/ChangeLog index 8984c1901e2..64dcdfcb76a 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,8 @@ +2018-11-19 Martin Liska + + * check_GNU_style_lib.py: Detect mixed usage + of spaces and tabs. + 2018-11-14 Rainer Orth * gcc_update (files_and_dependencies): Handle libphobos. diff --git a/contrib/check_GNU_style_lib.py b/contrib/check_GNU_style_lib.py index 63d0538aa57..ac3682fb2af 100755 --- a/contrib/check_GNU_style_lib.py +++ b/contrib/check_GNU_style_lib.py @@ -99,6 +99,18 @@ class SpacesCheck: line.replace(self.expanded_tab, error_string(ws_char * ts)), 'blocks of 8 spaces should be replaced with tabs', i) +class SpacesAndTabsMixedCheck: + def __init__(self): + self.re = re.compile('\ \t') + + def check(self, filename, lineno, line): + stripped = line.lstrip() + start = line[:len(line) - len(stripped)] + if self.re.search(line): + return CheckError(filename, lineno, + error_string(start.replace('\t', ws_char * ts)) + line[len(start):], + 'a space should not precede a tab', 0) + class TrailingWhitespaceCheck: def __init__(self): self.re = re.compile('(\s+)$') @@ -236,12 +248,27 @@ class TrailingWhitespaceTest(unittest.TestCase): r = self.check.check('foo', 123, 'a = 123;\t') self.assertIsNotNone(r) +class SpacesAndTabsMixedTest(unittest.TestCase): + def setUp(self): + self.check = SpacesAndTabsMixedCheck() + + def test_trailing_whitespace_check_basic(self): + r = self.check.check('foo', 123, ' \ta = 123;') + self.assertEqual('foo', r.filename) + self.assertEqual(0, r.column) + self.assertIsNotNone(r.console_error) + r = self.check.check('foo', 123, ' \t a = 123;') + self.assertIsNotNone(r.console_error) + r = self.check.check('foo', 123, '\t a = 123;') + self.assertIsNone(r) + def check_GNU_style_file(file, file_encoding, format): checks = [LineLengthCheck(), SpacesCheck(), TrailingWhitespaceCheck(), SentenceSeparatorCheck(), SentenceEndOfCommentCheck(), SentenceDotEndCheck(), FunctionParenthesisCheck(), SquareBracketCheck(), ClosingParenthesisCheck(), - BracesOnSeparateLineCheck(), TrailinigOperatorCheck()] + BracesOnSeparateLineCheck(), TrailinigOperatorCheck(), + SpacesAndTabsMixedCheck()] errors = [] patch = PatchSet(file, encoding=file_encoding)