summaryrefslogtreecommitdiff
path: root/pylint/checkers/refactoring
diff options
context:
space:
mode:
authorPierre Sassoulas <pierre.sassoulas@gmail.com>2022-11-06 12:43:41 +0100
committerGitHub <noreply@github.com>2022-11-06 12:43:41 +0100
commitf5f9e265d74d8675d7f33bb308bbc5dd868e2555 (patch)
tree0d78b73a394468a827c35a4172a9dd5bdaae3794 /pylint/checkers/refactoring
parent60a2db21d8ff6ca59e32f632ca501305c0403fe5 (diff)
downloadpylint-git-f5f9e265d74d8675d7f33bb308bbc5dd868e2555.tar.gz
[implicit_booleaness_checker] Add the confidence to related messages (#7721)
First step prior doing #6870 in order to make it more reviewable.
Diffstat (limited to 'pylint/checkers/refactoring')
-rw-r--r--pylint/checkers/refactoring/implicit_booleaness_checker.py61
1 files changed, 35 insertions, 26 deletions
diff --git a/pylint/checkers/refactoring/implicit_booleaness_checker.py b/pylint/checkers/refactoring/implicit_booleaness_checker.py
index 13172a97e..20d8e0c30 100644
--- a/pylint/checkers/refactoring/implicit_booleaness_checker.py
+++ b/pylint/checkers/refactoring/implicit_booleaness_checker.py
@@ -9,6 +9,7 @@ from astroid import bases, nodes
from pylint import checkers
from pylint.checkers import utils
+from pylint.interfaces import HIGH, INFERENCE
class ImplicitBooleanessChecker(checkers.BaseChecker):
@@ -99,7 +100,11 @@ class ImplicitBooleanessChecker(checkers.BaseChecker):
)
if isinstance(len_arg, generator_or_comprehension):
# The node is a generator or comprehension as in len([x for x in ...])
- self.add_message("use-implicit-booleaness-not-len", node=node)
+ self.add_message(
+ "use-implicit-booleaness-not-len",
+ node=node,
+ confidence=HIGH,
+ )
return
try:
instance = next(len_arg.infer())
@@ -113,7 +118,11 @@ class ImplicitBooleanessChecker(checkers.BaseChecker):
if "range" in mother_classes or (
affected_by_pep8 and not self.instance_has_bool(instance)
):
- self.add_message("use-implicit-booleaness-not-len", node=node)
+ self.add_message(
+ "use-implicit-booleaness-not-len",
+ node=node,
+ confidence=INFERENCE,
+ )
@staticmethod
def instance_has_bool(class_def: nodes.ClassDef) -> bool:
@@ -134,7 +143,9 @@ class ImplicitBooleanessChecker(checkers.BaseChecker):
and node.op == "not"
and utils.is_call_of_name(node.operand, "len")
):
- self.add_message("use-implicit-booleaness-not-len", node=node)
+ self.add_message(
+ "use-implicit-booleaness-not-len", node=node, confidence=HIGH
+ )
@utils.only_required_for_messages("use-implicit-booleaness-not-comparison")
def visit_compare(self, node: nodes.Compare) -> None:
@@ -177,35 +188,33 @@ class ImplicitBooleanessChecker(checkers.BaseChecker):
# No need to check for operator when visiting compare node
if operator in {"==", "!=", ">=", ">", "<=", "<"}:
- collection_literal = "{}"
- if isinstance(literal_node, nodes.List):
- collection_literal = "[]"
- if isinstance(literal_node, nodes.Tuple):
- collection_literal = "()"
-
- instance_name = "x"
- if isinstance(target_node, nodes.Call) and target_node.func:
- instance_name = f"{target_node.func.as_string()}(...)"
- elif isinstance(target_node, (nodes.Attribute, nodes.Name)):
- instance_name = target_node.as_string()
-
- original_comparison = (
- f"{instance_name} {operator} {collection_literal}"
- )
- suggestion = (
- f"{instance_name}"
- if operator == "!="
- else f"not {instance_name}"
- )
self.add_message(
"use-implicit-booleaness-not-comparison",
- args=(
- original_comparison,
- suggestion,
+ args=self._implicit_booleaness_message_args(
+ literal_node, operator, target_node
),
node=node,
+ confidence=HIGH,
)
+ def _implicit_booleaness_message_args(
+ self, literal_node: nodes.NodeNG, operator: str, target_node: nodes.NodeNG
+ ) -> tuple[str, str]:
+ """Helper to get the right message for "use-implicit-booleaness-not-comparison"."""
+ collection_literal = "{}"
+ if isinstance(literal_node, nodes.List):
+ collection_literal = "[]"
+ if isinstance(literal_node, nodes.Tuple):
+ collection_literal = "()"
+ instance_name = "x"
+ if isinstance(target_node, nodes.Call) and target_node.func:
+ instance_name = f"{target_node.func.as_string()}(...)"
+ elif isinstance(target_node, (nodes.Attribute, nodes.Name)):
+ instance_name = target_node.as_string()
+ original_comparison = f"{instance_name} {operator} {collection_literal}"
+ suggestion = f"{instance_name}" if operator == "!=" else f"not {instance_name}"
+ return original_comparison, suggestion
+
@staticmethod
def base_names_of_instance(node: bases.Uninferable | bases.Instance) -> list[str]:
"""Return all names inherited by a class instance or those returned by a