Path 1: 110 calls (0.5)

UnaryOp (110)

None (110)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 2: 83 calls (0.38)

UnaryOp (83)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 3: 15 calls (0.07)

UnaryOp (15)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 4: 2 calls (0.01)

UnaryOp (2)

None (2)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 5: 2 calls (0.01)

UnaryOp (2)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 6: 2 calls (0.01)

UnaryOp (2)

None (2)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 7: 2 calls (0.01)

UnaryOp (2)

None (2)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 8: 1 calls (0.0)

UnaryOp (1)

None (1)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )
            

Path 9: 1 calls (0.0)

UnaryOp (1)

None (1)

1@utils.only_required_for_messages("unneeded-not")
2    def visit_unaryop(self, node: nodes.UnaryOp) -> None:
3        if node.op != "not":
4            return
5        operand = node.operand
6
7        if isinstance(operand, nodes.UnaryOp) and operand.op == "not":
8            self.add_message(
9                "unneeded-not",
10                node=node,
11                args=(node.as_string(), operand.operand.as_string()),
12            )
13        elif isinstance(operand, nodes.Compare):
14            left = operand.left
15            # ignore multiple comparisons
16            if len(operand.ops) > 1:
17                return
18            operator, right = operand.ops[0]
19            if operator not in self.reverse_op:
20                return
21            # Ignore __ne__ as function of __eq__
22            frame = node.frame(future=True)
23            if frame.name == "__ne__" and operator == "==":
24                return
25            for _type in (utils.node_type(left), utils.node_type(right)):
26                if not _type:
27                    return
28                if isinstance(_type, self.skipped_nodes):
29                    return
30                if (
31                    isinstance(_type, astroid.Instance)
32                    and _type.qname() in self.skipped_classnames
33                ):
34                    return
35            suggestion = (
36                f"{left.as_string()} {self.reverse_op[operator]} {right.as_string()}"
37            )
38            self.add_message(
39                "unneeded-not", node=node, args=(node.as_string(), suggestion)
40            )