1655 |
1656 |
1656 |
1657 |
1657 ####################################################################### |
1658 ####################################################################### |
1658 ## BugBearVisitor |
1659 ## BugBearVisitor |
1659 ## |
1660 ## |
1660 ## adapted from: flake8-bugbear v24.1.17 |
1661 ## adapted from: flake8-bugbear v24.2.6 |
1661 ## |
1662 ## |
1662 ## Original: Copyright (c) 2016 Łukasz Langa |
1663 ## Original: Copyright (c) 2016 Łukasz Langa |
1663 ####################################################################### |
1664 ####################################################################### |
1664 |
1665 |
1665 BugBearContext = namedtuple("BugBearContext", ["node", "stack"]) |
1666 BugBearContext = namedtuple("BugBearContext", ["node", "stack"]) |
2200 """ |
2201 """ |
2201 self.__checkForM507(node) |
2202 self.__checkForM507(node) |
2202 self.__checkForM520(node) |
2203 self.__checkForM520(node) |
2203 self.__checkForM523(node) |
2204 self.__checkForM523(node) |
2204 self.__checkForM531(node) |
2205 self.__checkForM531(node) |
2205 self.__checkForM538(node) |
2206 self.__checkForM569(node) |
2206 |
2207 |
2207 self.generic_visit(node) |
2208 self.generic_visit(node) |
2208 |
2209 |
2209 def visit_AsyncFor(self, node): |
2210 def visit_AsyncFor(self, node): |
2210 """ |
2211 """ |
3014 elif isinstance( |
3015 elif isinstance( |
3015 node.key, ast.Name |
3016 node.key, ast.Name |
3016 ) and node.key.id not in self.__getDictCompLoopAndNamedExprVarNames(node): |
3017 ) and node.key.id not in self.__getDictCompLoopAndNamedExprVarNames(node): |
3017 self.violations.append((node, "M535", node.key.id)) |
3018 self.violations.append((node, "M535", node.key.id)) |
3018 |
3019 |
3019 def __checkForM538(self, node): |
3020 def __checkForM569(self, node): |
3020 """ |
3021 """ |
3021 Private method to check for changes to a loop's mutable iterable. |
3022 Private method to check for changes to a loop's mutable iterable. |
3022 |
3023 |
3023 @param node loop node to be checked |
3024 @param node loop node to be checked |
3024 @type ast.For |
3025 @type ast.For |
3027 name = self.toNameStr(node.iter) |
3028 name = self.toNameStr(node.iter) |
3028 elif isinstance(node.iter, ast.Attribute): |
3029 elif isinstance(node.iter, ast.Attribute): |
3029 name = self.toNameStr(node.iter) |
3030 name = self.toNameStr(node.iter) |
3030 else: |
3031 else: |
3031 return |
3032 return |
3032 checker = M538Checker(name, self) |
3033 checker = M569Checker(name, self) |
3033 checker.visit(node.body) |
3034 checker.visit(node.body) |
3034 for mutation in checker.mutations: |
3035 for mutation in checker.mutations: |
3035 self.violations.append((mutation, "M538")) |
3036 self.violations.append((mutation, "M569")) |
3036 |
3037 |
3037 |
3038 |
3038 class M538Checker(ast.NodeVisitor): |
3039 class M569Checker(ast.NodeVisitor): |
3039 """ |
3040 """ |
3040 Class traversing a 'for' loop body to check for modifications to a loop's |
3041 Class traversing a 'for' loop body to check for modifications to a loop's |
3041 mutable iterable. |
3042 mutable iterable. |
3042 """ |
3043 """ |
3043 |
3044 |