diff options
author | Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com> | 2021-09-23 10:18:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-23 10:18:29 +0200 |
commit | 09a0b50bfeb473625f8ad586f72fd35d790de6ac (patch) | |
tree | 66a9508e91cf47f8f4aba062327a0641a50e0918 | |
parent | 9d0b2827ee92279a9caa0b448ec4b0b0dcdfd3ba (diff) | |
download | pylint-git-09a0b50bfeb473625f8ad586f72fd35d790de6ac.tar.gz |
Fix ``useless-suppression`` for ``wrong-import-order`` (#5063)
This also adds a new method to ``MessagesHandlerMixIn`` which
adds messages to the list of the ignored messages without doing anything
else. This can be used to avoid ``useless-suppression`` false positives.
This closes #2366
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | pylint/checkers/imports.py | 27 | ||||
-rw-r--r-- | pylint/message/message_handler_mix_in.py | 25 | ||||
-rw-r--r-- | tests/functional/u/useless/useless_suppression.py | 6 |
4 files changed, 56 insertions, 6 deletions
@@ -39,6 +39,10 @@ Release date: TBA * Fix false-positive ``undefined-variable`` with ``Lambda``, ``IfExp``, and assignment expression. +* Fix false-positive ``useless-suppression`` for ``wrong-import-order`` + + Closes #2366 + What's New in Pylint 2.11.1? ============================ diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py index 68559520e..d887cd3ff 100644 --- a/pylint/checkers/imports.py +++ b/pylint/checkers/imports.py @@ -755,8 +755,13 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): elif import_category == "THIRDPARTY": third_party_imports.append(node_and_package_import) external_imports.append(node_and_package_import) - if not nested and not ignore_for_import_order: - third_party_not_ignored.append(node_and_package_import) + if not nested: + if not ignore_for_import_order: + third_party_not_ignored.append(node_and_package_import) + else: + self.linter.add_ignored_message( + "wrong-import-order", node.fromlineno, node + ) wrong_import = first_party_not_ignored or local_not_ignored if wrong_import and not nested: self.add_message( @@ -770,8 +775,13 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): elif import_category == "FIRSTPARTY": first_party_imports.append(node_and_package_import) external_imports.append(node_and_package_import) - if not nested and not ignore_for_import_order: - first_party_not_ignored.append(node_and_package_import) + if not nested: + if not ignore_for_import_order: + first_party_not_ignored.append(node_and_package_import) + else: + self.linter.add_ignored_message( + "wrong-import-order", node.fromlineno, node + ) wrong_import = local_not_ignored if wrong_import and not nested: self.add_message( @@ -784,8 +794,13 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): ) elif import_category == "LOCALFOLDER": local_imports.append((node, package)) - if not nested and not ignore_for_import_order: - local_not_ignored.append((node, package)) + if not nested: + if not ignore_for_import_order: + local_not_ignored.append((node, package)) + else: + self.linter.add_ignored_message( + "wrong-import-order", node.fromlineno, node + ) return std_imports, external_imports, local_imports def _get_imported_module(self, importnode, modname): diff --git a/pylint/message/message_handler_mix_in.py b/pylint/message/message_handler_mix_in.py index 5d8228b00..90f40235a 100644 --- a/pylint/message/message_handler_mix_in.py +++ b/pylint/message/message_handler_mix_in.py @@ -257,6 +257,31 @@ class MessagesHandlerMixIn: message_definition, line, node, args, confidence, col_offset ) + def add_ignored_message( # type: ignore # MessagesHandlerMixIn is always mixed with PyLinter + self: "PyLinter", + msgid: str, + line: int, + node: nodes.NodeNG, + confidence: Optional[Confidence] = UNDEFINED, + ) -> None: + """Prepares a message to be added to the ignored message storage + + Some checks return early in special cases and never reach add_message(), + even though they would normally issue a message. + This creates false positives for useless-suppression. + This function avoids this by adding those message to the ignored msgs attribute + """ + message_definitions = self.msgs_store.get_message_definitions(msgid) + for message_definition in message_definitions: + self.check_message_definition(message_definition, line, node) + self.file_state.handle_ignored_message( + self.get_message_state_scope( + message_definition.msgid, line, confidence + ), + message_definition.msgid, + line, + ) + @staticmethod def check_message_definition(message_definition, line, node): if message_definition.msgid[0] not in _SCOPE_EXEMPT: diff --git a/tests/functional/u/useless/useless_suppression.py b/tests/functional/u/useless/useless_suppression.py new file mode 100644 index 000000000..f9bf7d490 --- /dev/null +++ b/tests/functional/u/useless/useless_suppression.py @@ -0,0 +1,6 @@ +"""Test for useless suppression false positive for wrong-import-order +Reported in https://github.com/PyCQA/pylint/issues/2366""" +# pylint: enable=useless-suppression +# pylint: disable=unused-import, wrong-import-order +from pylint import run_pylint +import astroid |