summaryrefslogtreecommitdiff
path: root/pylint/checkers/unsupported_version.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/checkers/unsupported_version.py')
-rw-r--r--pylint/checkers/unsupported_version.py36
1 files changed, 35 insertions, 1 deletions
diff --git a/pylint/checkers/unsupported_version.py b/pylint/checkers/unsupported_version.py
index 917d64cba..005bb8f88 100644
--- a/pylint/checkers/unsupported_version.py
+++ b/pylint/checkers/unsupported_version.py
@@ -7,10 +7,15 @@
indicated by the py-version setting.
"""
+
from astroid import nodes
from pylint.checkers import BaseChecker
-from pylint.checkers.utils import check_messages
+from pylint.checkers.utils import (
+ check_messages,
+ safe_infer,
+ uninferable_final_decorators,
+)
from pylint.interfaces import IAstroidChecker
from pylint.lint import PyLinter
from pylint.utils import get_global_option
@@ -30,12 +35,19 @@ class UnsupportedVersionChecker(BaseChecker):
"Used when the py-version set by the user is lower than 3.6 and pylint encounters "
"a f-string.",
),
+ "W1602": (
+ "typing.final is not supported by all versions included in the py-version setting",
+ "using-final-decorator-in-unsupported-version",
+ "Used when the py-version set by the user is lower than 3.8 and pylint encounters "
+ "a ``typing.final`` decorator.",
+ ),
}
def open(self) -> None:
"""Initialize visit variables and statistics."""
py_version = get_global_option(self, "py-version")
self._py36_plus = py_version >= (3, 6)
+ self._py38_plus = py_version >= (3, 8)
@check_messages("using-f-string-in-unsupported-version")
def visit_joinedstr(self, node: nodes.JoinedStr) -> None:
@@ -43,6 +55,28 @@ class UnsupportedVersionChecker(BaseChecker):
if not self._py36_plus:
self.add_message("using-f-string-in-unsupported-version", node=node)
+ @check_messages("using-final-decorator-in-unsupported-version")
+ def visit_decorators(self, node: nodes.Decorators) -> None:
+ """Check decorators"""
+ self._check_typing_final(node)
+
+ def _check_typing_final(self, node: nodes.Decorators) -> None:
+ """Add a message when the `typing.final` decorator is used and the
+ py-version is lower than 3.8"""
+ if self._py38_plus:
+ return
+
+ decorators = []
+ for decorator in node.get_children():
+ inferred = safe_infer(decorator)
+ if inferred and inferred.qname() == "typing.final":
+ decorators.append(decorator)
+
+ for decorator in decorators or uninferable_final_decorators(node):
+ self.add_message(
+ "using-final-decorator-in-unsupported-version", node=decorator
+ )
+
def register(linter: PyLinter) -> None:
"""Required method to auto register this checker"""