diff options
author | Mark Byrne <31762852+mbyrnepr2@users.noreply.github.com> | 2021-11-09 12:51:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-09 12:51:34 +0100 |
commit | 57515ae304c9e4bae6a94f08ea7ef2d6fadc61ce (patch) | |
tree | 926eb6ccea2547632aa5e2624da6657cfcb75854 /pylint/checkers/unsupported_version.py | |
parent | 5d39f58b60f635d990324b8759053ff1cc279451 (diff) | |
download | pylint-git-57515ae304c9e4bae6a94f08ea7ef2d6fadc61ce.tar.gz |
Add checker `using-final-decorator-in-unsupported-version` (#5165)
* Add checker `using-final-in-unsupported-version`
This is one of the tasks in issue: #5134
Also:
- Ensure the existing checkers for `typing.final` are used irrespective of Python
version
* Emit `using-final-in-unsupported-version` warning when Python version < 3.8
and none of the other `typing.final`-related warnings
* Add `uninferable_final_decorators`
Return any `typing.final` decorators for a given `Decorators` node.
Used to determine if this decorator is used with a version of Python in
which it is unsupported.
Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
Diffstat (limited to 'pylint/checkers/unsupported_version.py')
-rw-r--r-- | pylint/checkers/unsupported_version.py | 36 |
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""" |