summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <cpopa@cloudbasesolutions.com>2014-11-15 17:26:12 +0200
committerClaudiu Popa <cpopa@cloudbasesolutions.com>2014-11-15 17:26:12 +0200
commitf409292f746f3532042b074d9454822b9fb2c329 (patch)
treeced36734664277703c7ce3cd99903ad8f88f96e7
parent05ffa4a548380f5de416ac398e042a18a729adc9 (diff)
downloadpylint-f409292f746f3532042b074d9454822b9fb2c329.tar.gz
Add 'long-suffix' error, emitted when encountering the long suffix
on numbers. This is sligthly different than lowercase-l-suffix, so it's a new error instead of overwriting that one.
-rw-r--r--ChangeLog3
-rw-r--r--checkers/python3.py22
-rw-r--r--test/input/func_w0332_py_30.py2
-rw-r--r--test/unittest_checker_python3.py15
4 files changed, 40 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index ebe2532..e96c652 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -169,6 +169,9 @@ ChangeLog for Pylint
* 'abstract-class-instantiated' is also emitted for Python 2.
It was previously disabled.
+ * Add 'long-suffix' error, emitted when encountering the long suffix
+ on numbers.
+
2014-07-26 -- 1.3.0
diff --git a/checkers/python3.py b/checkers/python3.py
index 899bb9b..e8609a0 100644
--- a/checkers/python3.py
+++ b/checkers/python3.py
@@ -14,6 +14,8 @@
"""Check Python 2 code for Python 2/3 source-compatible issues."""
from __future__ import absolute_import
+import tokenize
+
import astroid
from pylint import checkers, interfaces
from pylint.checkers import utils
@@ -345,5 +347,25 @@ class Python3Checker(checkers.BaseChecker):
return True
+class Python3TokenChecker(checkers.BaseTokenChecker):
+ __implements__ = interfaces.ITokenChecker
+ name = 'python3'
+ msgs = {
+ 'E1605': ('Use of long suffix',
+ 'long-suffix',
+ 'Used when "l" or "L" is used to mark a long integer. '
+ 'This will not work in Python 3, since `int` and `long` '
+ 'types have merged.',
+ {'maxversion': (3, 0)}),
+ }
+
+ def process_tokens(self, tokens):
+ for (tok_type, token, start, _, _) in tokens:
+ if tok_type == tokenize.NUMBER and token.lower().endswith('l'):
+ # This has a different semantic than lowercase-l-suffix.
+ self.add_message('long-suffix', line=start[0])
+
+
def register(linter):
linter.register_checker(Python3Checker(linter))
+ linter.register_checker(Python3TokenChecker(linter))
diff --git a/test/input/func_w0332_py_30.py b/test/input/func_w0332_py_30.py
index d6fed47..6a38e8c 100644
--- a/test/input/func_w0332_py_30.py
+++ b/test/input/func_w0332_py_30.py
@@ -1,4 +1,4 @@
"""check use of l as long int marker
"""
-
+# pylint: disable=long-suffix
__revision__ = 1l
diff --git a/test/unittest_checker_python3.py b/test/unittest_checker_python3.py
index 75ed8a6..340470d 100644
--- a/test/unittest_checker_python3.py
+++ b/test/unittest_checker_python3.py
@@ -27,7 +27,6 @@ def python2_only(test):
"""Decorator for any tests that will fail under Python 3."""
return unittest.skipIf(sys.version_info[0] > 2, 'Python 2 only')(test)
-
# TODO(cpopa): Port these to the functional test framework instead.
class Python3CheckerTest(testutils.CheckerTestCase):
@@ -254,5 +253,19 @@ class Python3CheckerTest(testutils.CheckerTestCase):
self.walk(node)
+class Python3TokenCheckerTest(testutils.CheckerTestCase):
+
+ CHECKER_CLASS = checker.Python3TokenChecker
+
+ @python2_only
+ def test_long_suffix(self):
+ for code in ("1l", "1L"):
+ tokens = testutils.tokenize_str(code)
+ with self.assertAddsMessages(
+ testutils.Message('long-suffix', line=1)):
+ self.checker.process_tokens(tokens)
+
+
if __name__ == '__main__':
unittest.main()
+ \ No newline at end of file