summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2021-09-23 10:18:29 +0200
committerGitHub <noreply@github.com>2021-09-23 10:18:29 +0200
commit09a0b50bfeb473625f8ad586f72fd35d790de6ac (patch)
tree66a9508e91cf47f8f4aba062327a0641a50e0918
parent9d0b2827ee92279a9caa0b448ec4b0b0dcdfd3ba (diff)
downloadpylint-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--ChangeLog4
-rw-r--r--pylint/checkers/imports.py27
-rw-r--r--pylint/message/message_handler_mix_in.py25
-rw-r--r--tests/functional/u/useless/useless_suppression.py6
4 files changed, 56 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 39bc95b57..c79d44cca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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