src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/BugBearVisitor.py

Sat, 26 Apr 2025 12:34:32 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 26 Apr 2025 12:34:32 +0200
branch
eric7
changeset 11240
c48c615c04a3
parent 11150
73d80859079c
permissions
-rw-r--r--

MicroPython
- Added a configuration option to disable the support for the no longer produced Pimoroni Pico Wireless Pack.

11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de>
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a visitor to check for various potential issues.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import ast
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import builtins
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import contextlib
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import itertools
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 import math
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 import re
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 from collections import Counter, namedtuple
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 from dataclasses import dataclass
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 from keyword import iskeyword
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 import AstUtilities
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 #######################################################################
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 ## adapted from: flake8-bugbear v24.12.12
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 ##
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 ## Original: Copyright (c) 2016 Ɓukasz Langa
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 #######################################################################
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 BugbearMutableLiterals = ("Dict", "List", "Set")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 BugbearMutableComprehensions = ("ListComp", "DictComp", "SetComp")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 BugbearMutableCalls = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 "Counter",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 "OrderedDict",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 "collections.Counter",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 "collections.OrderedDict",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 "collections.defaultdict",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 "collections.deque",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 "defaultdict",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 "deque",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 "dict",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 "list",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 "set",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 BugbearImmutableCalls = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 "tuple",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 "frozenset",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 "types.MappingProxyType",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 "MappingProxyType",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 "re.compile",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 "operator.attrgetter",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 "operator.itemgetter",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 "operator.methodcaller",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 "attrgetter",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 "itemgetter",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 "methodcaller",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 BugBearContext = namedtuple("BugBearContext", ["node", "stack"])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 def composeCallPath(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 Generator function to assemble the call path of a given node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 @param node node to assemble call path for
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 @yield call path components
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 @ytype str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 if isinstance(node, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 yield from composeCallPath(node.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 yield node.attr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 elif isinstance(node, ast.Call):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 yield from composeCallPath(node.func)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 elif isinstance(node, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 yield node.id
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 @dataclass
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 class M540CaughtException:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 Class to hold the data for a caught exception.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 name: str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 hasNote: bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 class M541UnhandledKeyType:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 Class to hold a dictionary key of a type that we do not check for duplicates.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 class M541VariableKeyType:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 Class to hold the name of a variable key type.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 def __init__(self, name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 @param name name of the variable key type
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 @type str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 self.name = name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 class BugBearVisitor(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 Class implementing a node visitor to check for various topics.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 CONTEXTFUL_NODES = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 ast.Module,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 ast.ClassDef,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 ast.AsyncFunctionDef,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 ast.FunctionDef,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 ast.Lambda,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 ast.ListComp,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 ast.SetComp,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 ast.DictComp,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 ast.GeneratorExp,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 FUNCTION_NODES = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 ast.AsyncFunctionDef,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 ast.FunctionDef,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 ast.Lambda,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 NodeWindowSize = 4
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 def __init__(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 self.nodeWindow = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 self.violations = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 self.contexts = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 self.__M523Seen = set()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 self.__M505Imports = set()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 self.__M540CaughtException = None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 self.__inTryStar = ""
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 @property
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 def nodeStack(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 Public method to get a reference to the most recent node stack.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 @return reference to the most recent node stack
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 @rtype list
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 if len(self.contexts) == 0:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 return []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 context, stack = self.contexts[-1]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 return stack
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 def __isIdentifier(self, arg):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 Private method to check if arg is a valid identifier.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 See https://docs.python.org/2/reference/lexical_analysis.html#identifiers
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 @param arg reference to an argument node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 @return flag indicating a valid identifier
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 @rtype TYPE
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 if not AstUtilities.isString(arg):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 return False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 return (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 re.match(r"^[A-Za-z_][A-Za-z0-9_]*$", AstUtilities.getValue(arg))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 is not None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 def toNameStr(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 Public method to turn Name and Attribute nodes to strings, handling any
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 depth of attribute accesses.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 @param node reference to the node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 @type ast.Name or ast.Attribute
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 @return string representation
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 @rtype str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 if isinstance(node, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 return node.id
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 elif isinstance(node, ast.Call):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 return self.toNameStr(node.func)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 elif isinstance(node, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 inner = self.toNameStr(node.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 if inner is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 return None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 return f"{inner}.{node.attr}"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 return None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 def __typesafeIssubclass(self, obj, classOrTuple):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 Private method implementing a type safe issubclass() function.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 @param obj reference to the object to be tested
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 @type Any
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 @param classOrTuple type to check against
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 @type type
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 @return flag indicating a subclass
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 @rtype bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 try:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 return issubclass(obj, classOrTuple)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 except TypeError:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 # User code specifies a type that is not a type in our current run.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 # Might be their error, might be a difference in our environments.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 # We don't know so we ignore this.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 return False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 def __getAssignedNames(self, loopNode):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 Private method to get the names of a for loop.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 @param loopNode reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 @type ast.For
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 @yield DESCRIPTION
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 @ytype TYPE
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 loopTargets = (ast.For, ast.AsyncFor, ast.comprehension)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 for node in self.__childrenInScope(loopNode):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 if isinstance(node, (ast.Assign)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 for child in node.targets:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 yield from self.__namesFromAssignments(child)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 if isinstance(node, loopTargets + (ast.AnnAssign, ast.AugAssign)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 yield from self.__namesFromAssignments(node.target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 def __namesFromAssignments(self, assignTarget):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 Private method to get names of an assignment.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 @param assignTarget reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 @yield name of the assignment
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 @ytype str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 if isinstance(assignTarget, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 yield assignTarget.id
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 elif isinstance(assignTarget, ast.Starred):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 yield from self.__namesFromAssignments(assignTarget.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 elif isinstance(assignTarget, (ast.List, ast.Tuple)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 for child in assignTarget.elts:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 yield from self.__namesFromAssignments(child)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 def __childrenInScope(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 Private method to get all child nodes in the given scope.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 @yield reference to a child node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 @ytype ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 yield node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 if not isinstance(node, BugBearVisitor.FUNCTION_NODES):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 for child in ast.iter_child_nodes(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 yield from self.__childrenInScope(child)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 def __flattenExcepthandler(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 Private method to flatten the list of exceptions handled by an except handler.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 @yield reference to the exception type node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 @ytype ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 if not isinstance(node, ast.Tuple):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 yield node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 exprList = node.elts.copy()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 while len(exprList):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 expr = exprList.pop(0)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 if isinstance(expr, ast.Starred) and isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 expr.value, (ast.List, ast.Tuple)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 exprList.extend(expr.value.elts)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 continue
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 yield expr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 def __checkRedundantExcepthandlers(self, names, node, inTryStar):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 Private method to check for redundant exception types in an exception handler.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 @param names list of exception types to be checked
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 @type list of ast.Name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 @param node reference to the exception handler node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 @type ast.ExceptionHandler
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 @param inTryStar character indicating an 'except*' handler
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 @type str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 @return tuple containing the error data
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 @rtype tuple of (ast.Node, str, str, str, str)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 redundantExceptions = {
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 "OSError": {
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 # All of these are actually aliases of OSError since Python 3.3
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 "IOError",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 "EnvironmentError",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 "WindowsError",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 "mmap.error",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 "socket.error",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 "select.error",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 },
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 "ValueError": {
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 "binascii.Error",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 },
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 }
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 # See if any of the given exception names could be removed, e.g. from:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 # (MyError, MyError) # duplicate names # noqa: M-891
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 # (MyError, BaseException) # everything derives from the Base # noqa: M-891
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 # (Exception, TypeError) # builtins where one subclasses another
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 # noqa: M-891
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 # (IOError, OSError) # IOError is an alias of OSError since Python3.3
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 # noqa: M-891
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 # but note that other cases are impractical to handle from the AST.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 # We expect this is mostly useful for users who do not have the
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 # builtin exception hierarchy memorised, and include a 'shadowed'
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 # subtype without realising that it's redundant.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 good = sorted(set(names), key=names.index)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 if "BaseException" in good:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 good = ["BaseException"]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 # Remove redundant exceptions that the automatic system either handles
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 # poorly (usually aliases) or can't be checked (e.g. it's not an
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 # built-in exception).
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 for primary, equivalents in redundantExceptions.items():
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 if primary in good:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 good = [g for g in good if g not in equivalents]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 for name, other in itertools.permutations(tuple(good), 2):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 self.__typesafeIssubclass(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 getattr(builtins, name, type), getattr(builtins, other, ())
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 and name in good
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 good.remove(name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 if good != names:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 desc = good[0] if len(good) == 1 else "({0})".format(", ".join(good))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 as_ = " as " + node.name if node.name is not None else ""
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 return (node, "M-514", ", ".join(names), as_, desc, inTryStar)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 return None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 def __walkList(self, nodes):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 Private method to walk a given list of nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 @param nodes list of nodes to walk
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 @type list of ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 @yield node references as determined by the ast.walk() function
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 @ytype ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 for node in nodes:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 yield from ast.walk(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 def __getNamesFromTuple(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 Private method to get the names from an ast.Tuple node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 @param node ast node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 @type ast.Tuple
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 @yield names
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 @ytype str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 for dim in node.elts:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 if isinstance(dim, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 yield dim.id
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 elif isinstance(dim, ast.Tuple):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 yield from self.__getNamesFromTuple(dim)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 def __getDictCompLoopAndNamedExprVarNames(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 Private method to get the names of comprehension loop variables.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 @param node ast node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 @type ast.DictComp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 @yield loop variable names
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 @ytype str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 finder = NamedExprFinder()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 for gen in node.generators:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 if isinstance(gen.target, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 yield gen.target.id
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 elif isinstance(gen.target, ast.Tuple):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 yield from self.__getNamesFromTuple(gen.target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 finder.visit(gen.ifs)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 yield from finder.getNames().keys()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 def __inClassInit(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 Private method to check, if we are inside an '__init__' method.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 @return flag indicating being within the '__init__' method
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414 @rtype bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 return (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 len(self.contexts) >= 2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
418 and isinstance(self.contexts[-2].node, ast.ClassDef)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
419 and isinstance(self.contexts[-1].node, ast.FunctionDef)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
420 and self.contexts[-1].node.name == "__init__"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 def visit_Return(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 Public method to handle 'Return' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 @type ast.Return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
430 if self.__inClassInit() and node.value is not None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 self.violations.append((node, "M-537"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 def visit_Yield(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 Public method to handle 'Yield' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
439 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 @type ast.Yield
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
442 if self.__inClassInit():
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443 self.violations.append((node, "M-537"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
446
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 def visit_YieldFrom(self, node) -> None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 Public method to handle 'YieldFrom' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 @type ast.YieldFrom
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 if self.__inClassInit():
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 self.violations.append((node, "M-537"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 def visit(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 Public method to traverse a given AST node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 @param node AST node to be traversed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 isContextful = isinstance(node, BugBearVisitor.CONTEXTFUL_NODES)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 if isContextful:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 context = BugBearContext(node, [])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470 self.contexts.append(context)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 self.nodeStack.append(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 self.nodeWindow.append(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 self.nodeWindow = self.nodeWindow[-BugBearVisitor.NodeWindowSize :]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 super().visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 self.nodeStack.pop()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 if isContextful:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 self.contexts.pop()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
483 self.__checkForM518(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
484
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
485 def visit_ExceptHandler(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
486 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
487 Public method to handle exception handlers.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
488
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
489 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
490 @type ast.ExceptHandler
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 if node.type is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 # bare except is handled by pycodestyle already
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
496
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
497 oldM540CaughtException = self.__M540CaughtException
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498 if node.name is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
499 self.__M540CaughtException = None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501 self.__M540CaughtException = M540CaughtException(node.name, False)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
502
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
503 names = self.__checkForM513_M514_M529_M530(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
504
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
505 if "BaseException" in names and not ExceptBaseExceptionVisitor(node).reRaised():
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506 self.violations.append((node, "M-536"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
509
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
510 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
511 self.__M540CaughtException is not None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512 and self.__M540CaughtException.hasNote
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 self.violations.append((node, "M-540"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
515 self.__M540CaughtException = oldM540CaughtException
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
516
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517 def visit_UAdd(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 Public method to handle unary additions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
520
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522 @type ast.UAdd
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
523 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
524 trailingNodes = list(map(type, self.nodeWindow[-4:]))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
525 if trailingNodes == [ast.UnaryOp, ast.UAdd, ast.UnaryOp, ast.UAdd]:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
526 originator = self.nodeWindow[-4]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
527 self.violations.append((originator, "M-502"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
528
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
530
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
531 def visit_Call(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
533 Public method to handle a function call.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
535 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
536 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
537 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
538 isM540AddNote = False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
539
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
540 if isinstance(node.func, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
541 self.__checkForM505(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
542 isM540AddNote = self.__checkForM540AddNote(node.func)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
543 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 with contextlib.suppress(AttributeError, IndexError):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545 # bad super() call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 if isinstance(node.func, ast.Name) and node.func.id == "super":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 args = node.args
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
548 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
549 len(args) == 2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 and isinstance(args[0], ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
551 and isinstance(args[0].value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
552 and args[0].value.id == "self"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
553 and args[0].attr == "__class__"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
554 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
555 self.violations.append((node, "M-582"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
556
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
557 # bad getattr and setattr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
558 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
559 node.func.id in ("getattr", "hasattr")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
560 and node.args[1].value == "__call__"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
561 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
562 self.violations.append((node, "M-504"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
563 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
564 node.func.id == "getattr"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
565 and len(node.args) == 2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
566 and self.__isIdentifier(node.args[1])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
567 and iskeyword(AstUtilities.getValue(node.args[1]))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
568 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
569 self.violations.append((node, "M-509"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
570 elif (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
571 node.func.id == "setattr"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
572 and len(node.args) == 3
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
573 and self.__isIdentifier(node.args[1])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
574 and iskeyword(AstUtilities.getValue(node.args[1]))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
575 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
576 self.violations.append((node, "M-510"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
577
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
578 self.__checkForM526(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
579
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
580 self.__checkForM528(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
581 self.__checkForM534(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
582 self.__checkForM539(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
583
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
584 # no need for copying, if used in nested calls it will be set to None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
585 currentM540CaughtException = self.__M540CaughtException
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
586 if not isM540AddNote:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
587 self.__checkForM540Usage(node.args)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
588 self.__checkForM540Usage(node.keywords)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
589
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
590 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
591
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
592 if isM540AddNote:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
593 # Avoid nested calls within the parameter list using the variable itself.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
594 # e.g. `e.add_note(str(e))`
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
595 self.__M540CaughtException = currentM540CaughtException
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
596
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
597 def visit_Module(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
598 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
599 Public method to handle a module node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
600
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
601 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
602 @type ast.Module
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
603 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
604 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
605
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
606 def visit_Assign(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
607 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
608 Public method to handle assignments.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
609
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
610 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
611 @type ast.Assign
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
612 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
613 self.__checkForM540Usage(node.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
614 if len(node.targets) == 1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
615 target = node.targets[0]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
616 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
617 isinstance(target, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
618 and isinstance(target.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
619 and (target.value.id, target.attr) == ("os", "environ")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
620 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
621 self.violations.append((node, "M-503"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
622
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
623 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
624
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
625 def visit_For(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
626 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
627 Public method to handle 'for' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
628
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
629 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
630 @type ast.For
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
631 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
632 self.__checkForM507(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
633 self.__checkForM520(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
634 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
635 self.__checkForM531(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
636 self.__checkForM569(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
637
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
638 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
639
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
640 def visit_AsyncFor(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
641 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
642 Public method to handle 'for' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
643
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
644 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
645 @type ast.AsyncFor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
646 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
647 self.__checkForM507(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
648 self.__checkForM520(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
649 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
650 self.__checkForM531(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
651
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
652 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
653
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
654 def visit_While(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
655 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
656 Public method to handle 'while' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
657
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
658 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
659 @type ast.While
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
660 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
661 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
662
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
663 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
664
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
665 def visit_ListComp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
666 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
667 Public method to handle list comprehensions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
668
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
669 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
670 @type ast.ListComp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
671 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
672 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
673
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
674 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
675
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
676 def visit_SetComp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
677 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
678 Public method to handle set comprehensions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
679
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
680 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
681 @type ast.SetComp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
682 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
683 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
684
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
685 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
686
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
687 def visit_DictComp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
688 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
689 Public method to handle dictionary comprehensions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
690
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
691 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
692 @type ast.DictComp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
693 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
694 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
695 self.__checkForM535(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
696
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
697 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
698
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
699 def visit_GeneratorExp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
700 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
701 Public method to handle generator expressions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
702
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
703 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
704 @type ast.GeneratorExp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
705 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
706 self.__checkForM523(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
707
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
708 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
709
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
710 def visit_Assert(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
711 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
712 Public method to handle 'assert' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
713
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
714 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
715 @type ast.Assert
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
716 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
717 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
718 AstUtilities.isNameConstant(node.test)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
719 and AstUtilities.getValue(node.test) is False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
720 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
721 self.violations.append((node, "M-511"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
722
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
723 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
724
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
725 def visit_AsyncFunctionDef(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
726 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
727 Public method to handle async function definitions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
728
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
729 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
730 @type ast.AsyncFunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
731 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
732 self.__checkForM506_M508(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
733
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
734 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
735
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
736 def visit_FunctionDef(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
737 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
738 Public method to handle function definitions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
739
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
740 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
741 @type ast.FunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
742 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
743 self.__checkForM506_M508(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
744 self.__checkForM519(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
745 self.__checkForM521(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
746
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
747 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
748
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
749 def visit_ClassDef(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
750 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
751 Public method to handle class definitions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
752
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
753 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
754 @type ast.ClassDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
755 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
756 self.__checkForM521(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
757 self.__checkForM524_M527(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
758
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
759 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
760
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
761 def visit_Try(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
762 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
763 Public method to handle 'try' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
764
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
765 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
766 @type ast.Try
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
767 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
768 self.__checkForM512(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
769 self.__checkForM525(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
770
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
771 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
772
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
773 def visit_TryStar(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
774 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
775 Public method to handle 'except*' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
776
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
777 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
778 @type ast.TryStar
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
779 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
780 outerTryStar = self.__inTryStar
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
781 self.__inTryStar = "*"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
782 self.visit_Try(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
783 self.__inTryStar = outerTryStar
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
784
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
785 def visit_Compare(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
786 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
787 Public method to handle comparison statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
788
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
789 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
790 @type ast.Compare
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
791 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
792 self.__checkForM515(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
793
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
794 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
795
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
796 def visit_Raise(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
797 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
798 Public method to handle 'raise' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
799
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
800 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
801 @type ast.Raise
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
802 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
803 if node.exc is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
804 self.__M540CaughtException = None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
805 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
806 self.__checkForM540Usage(node.exc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
807 self.__checkForM540Usage(node.cause)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
808 self.__checkForM516(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
809
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
810 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
811
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
812 def visit_With(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
813 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
814 Public method to handle 'with' statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
815
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
816 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
817 @type ast.With
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
818 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
819 self.__checkForM517(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
820 self.__checkForM522(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
821
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
822 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
823
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
824 def visit_JoinedStr(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
825 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
826 Public method to handle f-string arguments.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
827
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
828 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
829 @type ast.JoinedStr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
830 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
831 for value in node.values:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
832 if isinstance(value, ast.FormattedValue):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
833 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
834
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
835 self.violations.append((node, "M-581"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
836
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
837 def visit_AnnAssign(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
838 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
839 Public method to check annotated assign statements.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
840
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
841 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
842 @type ast.AnnAssign
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
843 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
844 self.__checkForM532(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
845 self.__checkForM540Usage(node.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
846
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
847 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
848
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
849 def visit_Import(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
850 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
851 Public method to check imports.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
852
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
853 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
854 @type ast.Import
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
855 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
856 self.__checkForM505(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
857
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
858 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
859
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
860 def visit_ImportFrom(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
861 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
862 Public method to check from imports.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
863
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
864 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
865 @type ast.Import
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
866 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
867 self.visit_Import(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
868
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
869 def visit_Set(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
870 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
871 Public method to check a set.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
872
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
873 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
874 @type ast.Set
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
875 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
876 self.__checkForM533(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
877
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
878 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
879
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
880 def visit_Dict(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
881 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
882 Public method to check a dictionary.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
883
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
884 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
885 @type ast.Dict
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
886 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
887 self.__checkForM541(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
888
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
889 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
890
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
891 def __checkForM505(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
892 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
893 Private method to check the use of *strip().
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
894
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
895 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
896 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
897 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
898 if isinstance(node, ast.Import):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
899 for name in node.names:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
900 self.__M505Imports.add(name.asname or name.name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
901 elif isinstance(node, ast.ImportFrom):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
902 for name in node.names:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
903 self.__M505Imports.add(f"{node.module}.{name.name or name.asname}")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
904 elif isinstance(node, ast.Call) and isinstance(node.func, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
905 if node.func.attr not in ("lstrip", "rstrip", "strip"):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
906 return # method name doesn't match
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
907
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
908 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
909 isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
910 and node.func.value.id in self.__M505Imports
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
911 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
912 return # method is being run on an imported module
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
913
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
914 if len(node.args) != 1 or not AstUtilities.isString(node.args[0]):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
915 return # used arguments don't match the builtin strip
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
916
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
917 value = AstUtilities.getValue(node.args[0])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
918 if len(value) == 1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
919 return # stripping just one character
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
920
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
921 if len(value) == len(set(value)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
922 return # no characters appear more than once
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
923
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
924 self.violations.append((node, "M-505"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
925
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
926 def __checkForM506_M508(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
927 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
928 Private method to check the use of mutable literals, comprehensions and calls.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
929
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
930 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
931 @type ast.AsyncFunctionDef or ast.FunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
932 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
933 visitor = FunctionDefDefaultsVisitor("M-506", "M-508")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
934 visitor.visit(node.args.defaults + node.args.kw_defaults)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
935 self.violations.extend(visitor.errors)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
936
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
937 def __checkForM507(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
938 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
939 Private method to check for unused loop variables.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
940
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
941 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
942 @type ast.For or ast.AsyncFor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
943 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
944 targets = NameFinder()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
945 targets.visit(node.target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
946 ctrlNames = set(filter(lambda s: not s.startswith("_"), targets.getNames()))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
947 body = NameFinder()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
948 for expr in node.body:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
949 body.visit(expr)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
950 usedNames = set(body.getNames())
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
951 for name in sorted(ctrlNames - usedNames):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
952 n = targets.getNames()[name][0]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
953 self.violations.append((n, "M-507", name))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
954
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
955 def __checkForM512(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
956 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
957 Private method to check for return/continue/break inside finally blocks.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
958
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
959 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
960 @type ast.Try
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
961 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
962
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
963 def _loop(node, badNodeTypes):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
964 if isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
965 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
966
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
967 if isinstance(node, (ast.While, ast.For)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
968 badNodeTypes = (ast.Return,)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
969
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
970 elif isinstance(node, badNodeTypes):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
971 self.violations.append((node, "M-512", self.__inTryStar))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
972
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
973 for child in ast.iter_child_nodes(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
974 _loop(child, badNodeTypes)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
975
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
976 for child in node.finalbody:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
977 _loop(child, (ast.Return, ast.Continue, ast.Break))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
978
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
979 def __checkForM513_M514_M529_M530(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
980 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
981 Private method to check various exception handler situations.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
982
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
983 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
984 @type ast.ExceptHandler
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
985 @return list of exception handler names
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
986 @rtype list of str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
987 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
988 handlers = self.__flattenExcepthandler(node.type)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
989 names = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
990 badHandlers = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
991 ignoredHandlers = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
992
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
993 for handler in handlers:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
994 if isinstance(handler, (ast.Name, ast.Attribute)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
995 name = self.toNameStr(handler)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
996 if name is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
997 ignoredHandlers.append(handler)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
998 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
999 names.append(name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1000 elif isinstance(handler, (ast.Call, ast.Starred)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1001 ignoredHandlers.append(handler)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1002 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1003 badHandlers.append(handler)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1004 if badHandlers:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1005 self.violations.append((node, "M-530"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1006 if len(names) == 0 and not badHandlers and not ignoredHandlers:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1007 self.violations.append((node, "M-529", self.__inTryStar))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1008 elif (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1009 len(names) == 1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1010 and not badHandlers
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1011 and not ignoredHandlers
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1012 and isinstance(node.type, ast.Tuple)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1013 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1014 self.violations.append((node, "M-513", *names, self.__inTryStar))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1015 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1016 maybeError = self.__checkRedundantExcepthandlers(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1017 names, node, self.__inTryStar
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1018 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1019 if maybeError is not None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1020 self.violations.append(maybeError)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1021 return names
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1022
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1023 def __checkForM515(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1024 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1025 Private method to check for pointless comparisons.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1026
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1027 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1028 @type ast.Compare
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1029 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1030 if isinstance(self.nodeStack[-2], ast.Expr):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1031 self.violations.append((node, "M-515"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1032
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1033 def __checkForM516(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1034 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1035 Private method to check for raising a literal instead of an exception.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1036
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1037 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1038 @type ast.Raise
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1039 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1040 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1041 AstUtilities.isNameConstant(node.exc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1042 or AstUtilities.isNumber(node.exc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1043 or AstUtilities.isString(node.exc)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1044 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1045 self.violations.append((node, "M-516"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1046
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1047 def __checkForM517(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1048 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1049 Private method to check for use of the evil syntax
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1050 'with assertRaises(Exception): or 'with pytest.raises(Exception):'.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1051
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1052 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1053 @type ast.With
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1054 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1055 item = node.items[0]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1056 itemContext = item.context_expr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1057 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1058 hasattr(itemContext, "func")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1059 and (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1060 (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1061 isinstance(itemContext.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1062 and (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1063 itemContext.func.attr == "assertRaises"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1064 or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1065 itemContext.func.attr == "raises"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1066 and isinstance(itemContext.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1067 and itemContext.func.value.id == "pytest"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1068 and "match" not in (kwd.arg for kwd in itemContext.keywords)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1069 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1070 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1071 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1072 or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1073 isinstance(itemContext.func, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1074 and itemContext.func.id == "raises"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1075 and isinstance(itemContext.func.ctx, ast.Load)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1076 and "pytest.raises" in self.__M505Imports
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1077 and "match" not in (kwd.arg for kwd in itemContext.keywords)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1078 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1079 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1080 and len(itemContext.args) == 1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1081 and isinstance(itemContext.args[0], ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1082 and itemContext.args[0].id in ("Exception", "BaseException")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1083 and not item.optional_vars
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1084 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1085 self.violations.append((node, "M-517"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1086
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1087 def __checkForM518(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1088 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1089 Private method to check for useless expressions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1090
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1091 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1092 @type ast.FunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1093 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1094 if not isinstance(node, ast.Expr):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1095 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1096
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1097 if isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1098 node.value,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1099 (ast.List, ast.Set, ast.Dict, ast.Tuple),
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1100 ) or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1101 isinstance(node.value, ast.Constant)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1102 and (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1103 isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1104 node.value.value,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1105 (int, float, complex, bytes, bool),
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1106 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1107 or node.value.value is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1108 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1109 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1110 self.violations.append((node, "M-518", node.value.__class__.__name__))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1111
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1112 def __checkForM519(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1113 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1114 Private method to check for use of 'functools.lru_cache' or 'functools.cache'.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1115
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1116 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1117 @type ast.FunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1118 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1119 caches = {
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1120 "functools.cache",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1121 "functools.lru_cache",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1122 "cache",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1123 "lru_cache",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1124 }
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1125
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1126 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1127 len(node.decorator_list) == 0
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1128 or len(self.contexts) < 2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1129 or not isinstance(self.contexts[-2].node, ast.ClassDef)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1130 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1131 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1132
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1133 # Preserve decorator order so we can get the lineno from the decorator node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1134 # rather than the function node (this location definition changes in Python 3.8)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1135 resolvedDecorators = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1136 ".".join(composeCallPath(decorator)) for decorator in node.decorator_list
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1137 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1138 for idx, decorator in enumerate(resolvedDecorators):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1139 if decorator in {"classmethod", "staticmethod"}:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1140 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1141
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1142 if decorator in caches:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1143 self.violations.append((node.decorator_list[idx], "M-519"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1144 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1145
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1146 def __checkForM520(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1147 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1148 Private method to check for a loop that modifies its iterable.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1149
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1150 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1151 @type ast.For or ast.AsyncFor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1152 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1153 targets = NameFinder()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1154 targets.visit(node.target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1155 ctrlNames = set(targets.getNames())
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1156
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1157 iterset = M520NameFinder()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1158 iterset.visit(node.iter)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1159 itersetNames = set(iterset.getNames())
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1160
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1161 for name in sorted(ctrlNames):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1162 if name in itersetNames:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1163 n = targets.getNames()[name][0]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1164 self.violations.append((n, "M-520"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1165
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1166 def __checkForM521(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1167 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1168 Private method to check for use of an f-string as docstring.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1169
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1170 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1171 @type ast.FunctionDef or ast.ClassDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1172 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1173 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1174 node.body
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1175 and isinstance(node.body[0], ast.Expr)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1176 and isinstance(node.body[0].value, ast.JoinedStr)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1177 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1178 self.violations.append((node.body[0].value, "M-521"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1179
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1180 def __checkForM522(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1181 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1182 Private method to check for use of an f-string as docstring.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1183
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1184 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1185 @type ast.With
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1186 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1187 item = node.items[0]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1188 itemContext = item.context_expr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1189 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1190 hasattr(itemContext, "func")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1191 and hasattr(itemContext.func, "value")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1192 and hasattr(itemContext.func.value, "id")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1193 and itemContext.func.value.id == "contextlib"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1194 and hasattr(itemContext.func, "attr")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1195 and itemContext.func.attr == "suppress"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1196 and len(itemContext.args) == 0
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1197 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1198 self.violations.append((node, "M-522"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1199
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1200 def __checkForM523(self, loopNode):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1201 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1202 Private method to check that functions (including lambdas) do not use loop
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1203 variables.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1204
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1205 @param loopNode reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1206 @type ast.For, ast.AsyncFor, ast.While, ast.ListComp, ast.SetComp,ast.DictComp,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1207 or ast.GeneratorExp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1208 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1209 safe_functions = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1210 suspiciousVariables = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1211 for node in ast.walk(loopNode):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1212 # check if function is immediately consumed to avoid false alarm
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1213 if isinstance(node, ast.Call):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1214 # check for filter&reduce
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1215 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1216 isinstance(node.func, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1217 and node.func.id in ("filter", "reduce", "map")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1218 ) or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1219 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1220 and node.func.attr == "reduce"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1221 and isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1222 and node.func.value.id == "functools"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1223 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1224 for arg in node.args:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1225 if isinstance(arg, BugBearVisitor.FUNCTION_NODES):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1226 safe_functions.append(arg)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1227
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1228 # check for key=
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1229 for keyword in node.keywords:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1230 if keyword.arg == "key" and isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1231 keyword.value, BugBearVisitor.FUNCTION_NODES
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1232 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1233 safe_functions.append(keyword.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1234
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1235 # mark `return lambda: x` as safe
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1236 # does not (currently) check inner lambdas in a returned expression
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1237 # e.g. `return (lambda: x, )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1238 if isinstance(node, ast.Return) and isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1239 node.value, BugBearVisitor.FUNCTION_NODES
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1240 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1241 safe_functions.append(node.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1242
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1243 # find unsafe functions
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1244 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1245 isinstance(node, BugBearVisitor.FUNCTION_NODES)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1246 and node not in safe_functions
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1247 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1248 argnames = {
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1249 arg.arg for arg in ast.walk(node.args) if isinstance(arg, ast.arg)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1250 }
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1251 if isinstance(node, ast.Lambda):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1252 bodyNodes = ast.walk(node.body)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1253 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1254 bodyNodes = itertools.chain.from_iterable(map(ast.walk, node.body))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1255 errors = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1256 for name in bodyNodes:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1257 if isinstance(name, ast.Name) and name.id not in argnames:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1258 if isinstance(name.ctx, ast.Load):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1259 errors.append((name.lineno, name.col_offset, name.id, name))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1260 elif isinstance(name.ctx, ast.Store):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1261 argnames.add(name.id)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1262 for err in errors:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1263 if err[2] not in argnames and err not in self.__M523Seen:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1264 self.__M523Seen.add(err) # dedupe across nested loops
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1265 suspiciousVariables.append(err)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1266
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1267 if suspiciousVariables:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1268 reassignedInLoop = set(self.__getAssignedNames(loopNode))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1269
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1270 for err in sorted(suspiciousVariables):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1271 if reassignedInLoop.issuperset(err[2]):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1272 self.violations.append((err[3], "M-523", err[2]))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1273
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1274 def __checkForM524_M527(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1275 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1276 Private method to check for inheritance from abstract classes in abc and lack of
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1277 any methods decorated with abstract*.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1278
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1279 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1280 @type ast.ClassDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1281 """ # __IGNORE_WARNING_D-234r__
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1282
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1283 def isAbcClass(value, name="ABC"):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1284 if isinstance(value, ast.keyword):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1285 return value.arg == "metaclass" and isAbcClass(value.value, "ABCMeta")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1286
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1287 # class foo(ABC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1288 # class foo(abc.ABC)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1289 return (isinstance(value, ast.Name) and value.id == name) or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1290 isinstance(value, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1291 and value.attr == name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1292 and isinstance(value.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1293 and value.value.id == "abc"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1294 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1295
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1296 def isAbstractDecorator(expr):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1297 return (isinstance(expr, ast.Name) and expr.id[:8] == "abstract") or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1298 isinstance(expr, ast.Attribute) and expr.attr[:8] == "abstract"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1299 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1300
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1301 def isOverload(expr):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1302 return (isinstance(expr, ast.Name) and expr.id == "overload") or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1303 isinstance(expr, ast.Attribute) and expr.attr == "overload"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1304 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1305
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1306 def emptyBody(body):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1307 def isStrOrEllipsis(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1308 return isinstance(node, ast.Constant) and (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1309 node.value is Ellipsis or isinstance(node.value, str)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1310 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1311
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1312 # Function body consist solely of `pass`, `...`, and/or (doc)string literals
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1313 return all(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1314 isinstance(stmt, ast.Pass)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1315 or (isinstance(stmt, ast.Expr) and isStrOrEllipsis(stmt.value))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1316 for stmt in body
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1317 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1318
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1319 # don't check multiple inheritance
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1320 if len(node.bases) + len(node.keywords) > 1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1321 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1322
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1323 # only check abstract classes
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1324 if not any(map(isAbcClass, (*node.bases, *node.keywords))):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1325 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1326
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1327 hasMethod = False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1328 hasAbstractMethod = False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1329
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1330 if not any(map(isAbcClass, (*node.bases, *node.keywords))):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1331 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1332
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1333 for stmt in node.body:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1334 # Ignore abc's that declares a class attribute that must be set
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1335 if isinstance(stmt, ast.AnnAssign) and stmt.value is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1336 hasAbstractMethod = True
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1337 continue
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1338
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1339 # only check function defs
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1340 if not isinstance(stmt, (ast.FunctionDef, ast.AsyncFunctionDef)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1341 continue
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1342 hasMethod = True
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1343
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1344 hasAbstractDecorator = any(map(isAbstractDecorator, stmt.decorator_list))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1345
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1346 hasAbstractMethod |= hasAbstractDecorator
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1347
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1348 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1349 not hasAbstractDecorator
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1350 and emptyBody(stmt.body)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1351 and not any(map(isOverload, stmt.decorator_list))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1352 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1353 self.violations.append((stmt, "M-527", stmt.name))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1354
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1355 if hasMethod and not hasAbstractMethod:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1356 self.violations.append((node, "M-524", node.name))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1357
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1358 def __checkForM525(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1359 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1360 Private method to check for exceptions being handled multiple times.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1361
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1362 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1363 @type ast.Try
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1364 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1365 seen = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1366
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1367 for handler in node.handlers:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1368 if isinstance(handler.type, (ast.Name, ast.Attribute)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1369 name = ".".join(composeCallPath(handler.type))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1370 seen.append(name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1371 elif isinstance(handler.type, ast.Tuple):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1372 # to avoid checking the same as M514, remove duplicates per except
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1373 uniques = set()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1374 for entry in handler.type.elts:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1375 name = ".".join(composeCallPath(entry))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1376 uniques.add(name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1377 seen.extend(uniques)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1378
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1379 # sort to have a deterministic output
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1380 duplicates = sorted({x for x in seen if seen.count(x) > 1})
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1381 for duplicate in duplicates:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1382 self.violations.append((node, "M-525", duplicate, self.__inTryStar))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1383
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1384 def __checkForM526(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1385 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1386 Private method to check for Star-arg unpacking after keyword argument.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1387
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1388 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1389 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1390 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1391 if not node.keywords:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1392 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1393
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1394 starreds = [arg for arg in node.args if isinstance(arg, ast.Starred)]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1395 if not starreds:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1396 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1397
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1398 firstKeyword = node.keywords[0].value
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1399 for starred in starreds:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1400 if (starred.lineno, starred.col_offset) > (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1401 firstKeyword.lineno,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1402 firstKeyword.col_offset,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1403 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1404 self.violations.append((node, "M-526"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1405
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1406 def __checkForM528(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1407 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1408 Private method to check for warn without stacklevel.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1409
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1410 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1411 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1412 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1413 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1414 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1415 and node.func.attr == "warn"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1416 and isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1417 and node.func.value.id == "warnings"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1418 and not any(kw.arg == "stacklevel" for kw in node.keywords)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1419 and len(node.args) < 3
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1420 and not any(isinstance(a, ast.Starred) for a in node.args)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1421 and not any(kw.arg is None for kw in node.keywords)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1422 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1423 self.violations.append((node, "M-528"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1424
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1425 def __checkForM531(self, loopNode):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1426 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1427 Private method to check that 'itertools.groupby' isn't iterated over more than
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1428 once.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1429
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1430 A warning is emitted when the generator returned by 'groupby()' is used
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1431 more than once inside a loop body or when it's used in a nested loop.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1432
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1433 @param loopNode reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1434 @type ast.For or ast.AsyncFor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1435 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1436 # for <loop_node.target> in <loop_node.iter>: ...
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1437 if isinstance(loopNode.iter, ast.Call):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1438 node = loopNode.iter
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1439 if (isinstance(node.func, ast.Name) and node.func.id in ("groupby",)) or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1440 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1441 and node.func.attr == "groupby"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1442 and isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1443 and node.func.value.id == "itertools"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1444 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1445 # We have an invocation of groupby which is a simple unpacking
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1446 if isinstance(loopNode.target, ast.Tuple) and isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1447 loopNode.target.elts[1], ast.Name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1448 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1449 groupName = loopNode.target.elts[1].id
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1450 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1451 # Ignore any 'groupby()' invocation that isn't unpacked
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1452 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1453
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1454 numUsages = 0
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1455 for node in self.__walkList(loopNode.body):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1456 # Handled nested loops
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1457 if isinstance(node, ast.For):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1458 for nestedNode in self.__walkList(node.body):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1459 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1460 isinstance(nestedNode, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1461 and nestedNode.id == groupName
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1462 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1463 self.violations.append((nestedNode, "M-531"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1464
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1465 # Handle multiple uses
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1466 if isinstance(node, ast.Name) and node.id == groupName:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1467 numUsages += 1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1468 if numUsages > 1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1469 self.violations.append((nestedNode, "M-531"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1470
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1471 def __checkForM532(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1472 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1473 Private method to check for possible unintentional typing annotation.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1474
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1475 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1476 @type ast.AnnAssign
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1477 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1478 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1479 node.value is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1480 and hasattr(node.target, "value")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1481 and isinstance(node.target.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1482 and (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1483 isinstance(node.target, ast.Subscript)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1484 or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1485 isinstance(node.target, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1486 and node.target.value.id != "self"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1487 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1488 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1489 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1490 self.violations.append((node, "M-532"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1491
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1492 def __checkForM533(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1493 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1494 Private method to check a set for duplicate items.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1495
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1496 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1497 @type ast.Set
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1498 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1499 seen = set()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1500 for elt in node.elts:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1501 if not isinstance(elt, ast.Constant):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1502 continue
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1503 if elt.value in seen:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1504 self.violations.append((node, "M-533", repr(elt.value)))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1505 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1506 seen.add(elt.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1507
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1508 def __checkForM534(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1509 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1510 Private method to check that re.sub/subn/split arguments flags/count/maxsplit
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1511 are passed as keyword arguments.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1512
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1513 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1514 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1515 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1516 if not isinstance(node.func, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1517 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1518 func = node.func
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1519 if not isinstance(func.value, ast.Name) or func.value.id != "re":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1520 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1521
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1522 def check(numArgs, paramName):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1523 if len(node.args) > numArgs:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1524 arg = node.args[numArgs]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1525 self.violations.append((arg, "M-534", func.attr, paramName))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1526
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1527 if func.attr in ("sub", "subn"):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1528 check(3, "count")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1529 elif func.attr == "split":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1530 check(2, "maxsplit")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1531
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1532 def __checkForM535(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1533 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1534 Private method to check that a static key isn't used in a dict comprehension.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1535
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1536 Record a warning if a likely unchanging key is used - either a constant,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1537 or a variable that isn't coming from the generator expression.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1538
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1539 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1540 @type ast.DictComp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1541 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1542 if isinstance(node.key, ast.Constant):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1543 self.violations.append((node, "M-535", node.key.value))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1544 elif isinstance(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1545 node.key, ast.Name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1546 ) and node.key.id not in self.__getDictCompLoopAndNamedExprVarNames(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1547 self.violations.append((node, "M-535", node.key.id))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1548
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1549 def __checkForM539(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1550 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1551 Private method to check for correct ContextVar usage.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1552
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1553 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1554 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1555 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1556 if not (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1557 (isinstance(node.func, ast.Name) and node.func.id == "ContextVar")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1558 or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1559 isinstance(node.func, ast.Attribute)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1560 and node.func.attr == "ContextVar"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1561 and isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1562 and node.func.value.id == "contextvars"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1563 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1564 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1565 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1566
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1567 # ContextVar only takes one kw currently, but better safe than sorry
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1568 for kw in node.keywords:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1569 if kw.arg == "default":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1570 break
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1571 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1572 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1573
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1574 visitor = FunctionDefDefaultsVisitor("M-539", "M-539")
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1575 visitor.visit(kw.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1576 self.violations.extend(visitor.errors)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1577
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1578 def __checkForM540AddNote(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1579 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1580 Private method to check add_note usage.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1581
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1582 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1583 @type ast.Attribute
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1584 @return flag
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1585 @rtype bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1586 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1587 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1588 node.attr == "add_note"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1589 and isinstance(node.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1590 and self.__M540CaughtException
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1591 and node.value.id == self.__M540CaughtException.name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1592 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1593 self.__M540CaughtException.hasNote = True
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1594 return True
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1595
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1596 return False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1597
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1598 def __checkForM540Usage(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1599 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1600 Private method to check the usage of exceptions with added note.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1601
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1602 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1603 @type ast.expr or None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1604 """ # noqa: D-234y
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1605
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1606 def superwalk(node: ast.AST | list[ast.AST]):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1607 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1608 Function to walk an AST node or a list of AST nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1609
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1610 @param node reference to the node or a list of nodes to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1611 @type ast.AST or list[ast.AST]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1612 @yield next node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1613 @ytype ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1614 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1615 if isinstance(node, list):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1616 for n in node:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1617 yield from ast.walk(n)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1618 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1619 yield from ast.walk(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1620
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1621 if not self.__M540CaughtException or node is None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1622 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1623
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1624 for n in superwalk(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1625 if isinstance(n, ast.Name) and n.id == self.__M540CaughtException.name:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1626 self.__M540CaughtException = None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1627 break
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1628
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1629 def __checkForM541(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1630 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1631 Private method to check for duplicate key value pairs in a dictionary literal.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1632
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1633 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1634 @type ast.Dict
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1635 """ # noqa: D-234r
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1636
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1637 def convertToValue(item):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1638 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1639 Function to extract the value of a given item.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1640
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1641 @param item node to extract value from
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1642 @type ast.Ast
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1643 @return value of the node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1644 @rtype Any
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1645 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1646 if isinstance(item, ast.Constant):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1647 return item.value
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1648 elif isinstance(item, ast.Tuple):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1649 return tuple(convertToValue(i) for i in item.elts)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1650 elif isinstance(item, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1651 return M541VariableKeyType(item.id)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1652 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1653 return M541UnhandledKeyType()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1654
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1655 keys = [convertToValue(key) for key in node.keys]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1656 keyCounts = Counter(keys)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1657 duplicateKeys = [key for key, count in keyCounts.items() if count > 1]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1658 for key in duplicateKeys:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1659 keyIndices = [i for i, iKey in enumerate(keys) if iKey == key]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1660 seen = set()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1661 for index in keyIndices:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1662 value = convertToValue(node.values[index])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1663 if value in seen:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1664 keyNode = node.keys[index]
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1665 self.violations.append((keyNode, "M-541"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1666 seen.add(value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1667
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1668 def __checkForM569(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1669 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1670 Private method to check for changes to a loop's mutable iterable.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1671
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1672 @param node loop node to be checked
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1673 @type ast.For
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1674 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1675 if isinstance(node.iter, ast.Name):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1676 name = self.toNameStr(node.iter)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1677 elif isinstance(node.iter, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1678 name = self.toNameStr(node.iter)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1679 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1680 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1681 checker = M569Checker(name, self)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1682 checker.visit(node.body)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1683 for mutation in checker.mutations:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1684 self.violations.append((mutation, "M-569"))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1685
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1686
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1687 class M569Checker(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1688 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1689 Class traversing a 'for' loop body to check for modifications to a loop's
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1690 mutable iterable.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1691 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1692
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1693 # https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1694 MUTATING_FUNCTIONS = (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1695 "append",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1696 "sort",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1697 "reverse",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1698 "remove",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1699 "clear",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1700 "extend",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1701 "insert",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1702 "pop",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1703 "popitem",
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1704 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1705
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1706 def __init__(self, name, bugbear):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1707 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1708 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1709
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1710 @param name name of the iterator
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1711 @type str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1712 @param bugbear reference to the bugbear visitor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1713 @type BugBearVisitor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1714 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1715 self.__name = name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1716 self.__bb = bugbear
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1717 self.mutations = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1718
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1719 def visit_Delete(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1720 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1721 Public method handling 'Delete' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1722
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1723 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1724 @type ast.Delete
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1725 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1726 for target in node.targets:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1727 if isinstance(target, ast.Subscript):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1728 name = self.__bb.toNameStr(target.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1729 elif isinstance(target, (ast.Attribute, ast.Name)):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1730 name = self.__bb.toNameStr(target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1731 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1732 name = "" # fallback
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1733 self.generic_visit(target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1734
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1735 if name == self.__name:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1736 self.mutations.append(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1737
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1738 def visit_Call(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1739 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1740 Public method handling 'Call' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1741
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1742 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1743 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1744 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1745 if isinstance(node.func, ast.Attribute):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1746 name = self.__bb.toNameStr(node.func.value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1747 functionObject = name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1748 functionName = node.func.attr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1749
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1750 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1751 functionObject == self.__name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1752 and functionName in self.MUTATING_FUNCTIONS
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1753 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1754 self.mutations.append(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1755
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1756 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1757
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1758 def visit(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1759 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1760 Public method to inspect an ast node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1761
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1762 Like super-visit but supports iteration over lists.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1763
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1764 @param node AST node to be traversed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1765 @type TYPE
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1766 @return reference to the last processed node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1767 @rtype ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1768 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1769 if not isinstance(node, list):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1770 return super().visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1771
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1772 for elem in node:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1773 super().visit(elem)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1774 return node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1775
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1776
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1777 class NamedExprFinder(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1778 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1779 Class to extract names defined through an ast.NamedExpr.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1780 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1781
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1782 def __init__(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1783 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1784 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1785 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1786 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1787
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1788 self.__names = {}
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1789
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1790 def visit_NamedExpr(self, node: ast.NamedExpr):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1791 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1792 Public method handling 'NamedExpr' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1793
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1794 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1795 @type ast.NamedExpr
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1796 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1797 self.__names.setdefault(node.target.id, []).append(node.target)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1798
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1799 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1800
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1801 def visit(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1802 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1803 Public method to traverse a given AST node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1804
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1805 Like super-visit but supports iteration over lists.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1806
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1807 @param node AST node to be traversed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1808 @type TYPE
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1809 @return reference to the last processed node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1810 @rtype ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1811 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1812 if not isinstance(node, list):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1813 super().visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1814
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1815 for elem in node:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1816 super().visit(elem)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1817
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1818 return node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1819
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1820 def getNames(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1821 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1822 Public method to return the extracted names and Name nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1823
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1824 @return dictionary containing the names as keys and the list of nodes
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1825 @rtype dict
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1826 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1827 return self.__names
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1828
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1829
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1830 class ExceptBaseExceptionVisitor(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1831 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1832 Class to determine, if a 'BaseException' is re-raised.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1833 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1834
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1835 def __init__(self, exceptNode):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1836 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1837 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1838
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1839 @param exceptNode exception node to be inspected
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1840 @type ast.ExceptHandler
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1841 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1842 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1843 self.__root = exceptNode
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1844 self.__reRaised = False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1845
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1846 def reRaised(self) -> bool:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1847 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1848 Public method to check, if the exception is re-raised.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1849
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1850 @return flag indicating a re-raised exception
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1851 @rtype bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1852 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1853 self.visit(self.__root)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1854 return self.__reRaised
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1855
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1856 def visit_Raise(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1857 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1858 Public method to handle 'Raise' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1859
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1860 If we find a corresponding `raise` or `raise e` where e was from
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1861 `except BaseException as e:` then we mark re_raised as True and can
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1862 stop scanning.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1863
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1864 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1865 @type ast.Raise
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1866 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1867 if node.exc is None or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1868 isinstance(node.exc, ast.Name) and node.exc.id == self.__root.name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1869 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1870 self.__reRaised = True
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1871 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1872
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1873 super().generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1874
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1875 def visit_ExceptHandler(self, node: ast.ExceptHandler):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1876 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1877 Public method to handle 'ExceptHandler' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1878
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1879 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1880 @type ast.ExceptHandler
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1881 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1882 if node is not self.__root:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1883 return # entered a nested except - stop searching
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1884
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1885 super().generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1886
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1887
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1888 class FunctionDefDefaultsVisitor(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1889 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1890 Class used by M506, M508 and M539.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1891 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1892
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1893 def __init__(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1894 self,
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1895 errorCodeCalls, # M506 or M539
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1896 errorCodeLiterals, # M508 or M539
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1897 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1898 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1899 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1900
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1901 @param errorCodeCalls error code for ast.Call nodes
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1902 @type str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1903 @param errorCodeLiterals error code for literal nodes
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1904 @type str
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1905 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1906 self.__errorCodeCalls = errorCodeCalls
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1907 self.__errorCodeLiterals = errorCodeLiterals
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1908 for nodeType in BugbearMutableLiterals + BugbearMutableComprehensions:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1909 setattr(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1910 self, f"visit_{nodeType}", self.__visitMutableLiteralOrComprehension
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1911 )
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1912 self.errors = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1913 self.__argDepth = 0
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1914
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1915 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1916
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1917 def __visitMutableLiteralOrComprehension(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1918 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1919 Private method to flag mutable literals and comprehensions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1920
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1921 @param node AST node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1922 @type ast.Dict, ast.List, ast.Set, ast.ListComp, ast.DictComp or ast.SetComp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1923 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1924 # Flag M506 if mutable literal/comprehension is not nested.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1925 # We only flag these at the top level of the expression as we
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1926 # cannot easily guarantee that nested mutable structures are not
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1927 # made immutable by outer operations, so we prefer no false positives.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1928 # e.g.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1929 # >>> def this_is_fine(a=frozenset({"a", "b", "c"})): ...
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1930 #
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1931 # >>> def this_is_not_fine_but_hard_to_detect(a=(lambda x: x)([1, 2, 3]))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1932 #
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1933 # We do still search for cases of B008 within mutable structures though.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1934 if self.__argDepth == 1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1935 self.errors.append((node, self.__errorCodeCalls))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1936
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1937 # Check for nested functions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1938 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1939
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1940 def visit_Call(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1941 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1942 Public method to process Call nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1943
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1944 @param node AST node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1945 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1946 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1947 callPath = ".".join(composeCallPath(node.func))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1948 if callPath in BugbearMutableCalls:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1949 self.errors.append((node, self.__errorCodeCalls))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1950 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1951 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1952
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1953 if callPath in BugbearImmutableCalls:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1954 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1955 return
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1956
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1957 # Check if function call is actually a float infinity/NaN literal
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1958 if callPath == "float" and len(node.args) == 1:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1959 try:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1960 value = float(ast.literal_eval(node.args[0]))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1961 except Exception: # secok
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1962 pass
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1963 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1964 if math.isfinite(value):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1965 self.errors.append((node, self.__errorCodeLiterals))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1966 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1967 self.errors.append((node, self.__errorCodeLiterals))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1968
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1969 # Check for nested functions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1970 self.generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1971
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1972 def visit_Lambda(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1973 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1974 Public method to process Lambda nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1975
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1976 @param node AST node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1977 @type ast.Lambda
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1978 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1979 # Don't recurse into lambda expressions
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1980 # as they are evaluated at call time.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1981 pass
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1982
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1983 def visit(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1984 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1985 Public method to traverse an AST node or a list of AST nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1986
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1987 This is an extended method that can also handle a list of AST nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1988
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1989 @param node AST node or list of AST nodes to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1990 @type ast.AST or list of ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1991 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1992 self.__argDepth += 1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1993 if isinstance(node, list):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1994 for elem in node:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1995 if elem is not None:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1996 super().visit(elem)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1997 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1998 super().visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1999 self.__argDepth -= 1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2000
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2001
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2002 class NameFinder(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2003 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2004 Class to extract a name out of a tree of nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2005 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2006
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2007 def __init__(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2008 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2009 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2010 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2011 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2012
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2013 self.__names = {}
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2014
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2015 def visit_Name(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2016 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2017 Public method to handle 'Name' nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2018
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2019 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2020 @type ast.Name
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2021 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2022 self.__names.setdefault(node.id, []).append(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2023
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2024 def visit(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2025 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2026 Public method to traverse a given AST node.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2027
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2028 @param node AST node to be traversed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2029 @type ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2030 @return reference to the last processed node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2031 @rtype ast.Node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2032 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2033 if isinstance(node, list):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2034 for elem in node:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2035 super().visit(elem)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2036 return node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2037 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2038 return super().visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2039
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2040 def getNames(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2041 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2042 Public method to return the extracted names and Name nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2043
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2044 @return dictionary containing the names as keys and the list of nodes
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2045 @rtype dict
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2046 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2047 return self.__names
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2048
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2049
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2050 class M520NameFinder(NameFinder):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2051 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2052 Class to extract a name out of a tree of nodes ignoring names defined within the
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2053 local scope of a comprehension.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2054 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2055
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2056 def visit_GeneratorExp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2057 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2058 Public method to handle a generator expressions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2059
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2060 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2061 @type ast.GeneratorExp
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2062 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2063 self.visit(node.generators)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2064
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2065 def visit_ListComp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2066 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2067 Public method to handle a list comprehension.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2068
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2069 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2070 @type TYPE
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2071 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2072 self.visit(node.generators)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2073
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2074 def visit_DictComp(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2075 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2076 Public method to handle a dictionary comprehension.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2077
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2078 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2079 @type TYPE
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2080 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2081 self.visit(node.generators)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2082
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2083 def visit_comprehension(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2084 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2085 Public method to handle the 'for' of a comprehension.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2086
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2087 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2088 @type ast.comprehension
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2089 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2090 self.visit(node.iter)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2091
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2092 def visit_Lambda(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2093 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2094 Public method to handle a Lambda function.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2095
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2096 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2097 @type ast.Lambda
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2098 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2099 self.visit(node.body)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2100 for lambdaArg in node.args.args:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2101 self.getNames().pop(lambdaArg.arg, None)

eric ide

mercurial