src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Unused/UnusedChecker.py

Tue, 23 May 2023 12:04:07 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 23 May 2023 12:04:07 +0200
branch
eric7
changeset 10054
d7a47f0cff2b
parent 10053
9914b7b4b11c
child 10056
ac1c214e0a05
permissions
-rw-r--r--

Regenerated source documentation.

10052
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a checker for unused arguments, variables, ... .
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import ast
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
11 import collections
10052
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import copy
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 import AstUtilities
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 class UnusedChecker:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 Class implementing a checker for unused arguments, variables, ... .
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 Codes = [
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 ## Unused Arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 "U100",
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 "U101",
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
26 ## Unused Globals
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
27 "U200",
10052
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 ]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 Constructor
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 @param source source code to be checked
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @param filename name of the source file
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @type str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @param tree AST tree of the source code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @type ast.Module
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @param select list of selected codes
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @param ignore list of codes to be ignored
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @param expected list of expected codes
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @param repeat flag indicating to report each occurrence of a code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @type bool
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @param args dictionary of arguments for the various checks
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @type dict
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 self.__select = tuple(select)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.__ignore = ("",) if select else tuple(ignore)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.__expected = expected[:]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 self.__repeat = repeat
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__filename = filename
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 self.__source = source[:]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 self.__tree = copy.deepcopy(tree)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.__args = args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 # statistics counters
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 self.counters = {}
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 # collection of detected errors
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 self.errors = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 checkersWithCodes = [
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 (self.__checkUnusedArguments, ("U100", "U101")),
10054
d7a47f0cff2b Regenerated source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10053
diff changeset
68 (self.__checkUnusedGlobals, ("U200",)),
10052
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 ]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 self.__checkers = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 for checker, codes in checkersWithCodes:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 if any(not (code and self.__ignoreCode(code)) for code in codes):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 self.__checkers.append(checker)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 def __ignoreCode(self, code):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 Private method to check if the message code should be ignored.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 @param code message code to check for
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 @type str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @return flag indicating to ignore the given code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 @rtype bool
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 return code.startswith(self.__ignore) and not code.startswith(self.__select)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 def __error(self, lineNumber, offset, code, *args):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 Private method to record an issue.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 @param lineNumber line number of the issue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 @type int
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 @param offset position within line of the issue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 @type int
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @param code message code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @type str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @param args arguments for the message
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @type list
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 if self.__ignoreCode(code):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 if code in self.counters:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 self.counters[code] += 1
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 self.counters[code] = 1
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 # Don't care about expected codes
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 if code in self.__expected:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 if code and (self.counters[code] == 1 or self.__repeat):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 # record the issue with one based line number
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 self.errors.append(
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 {
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 "file": self.__filename,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 "line": lineNumber + 1,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 "offset": offset,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 "code": code,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 "args": args,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 }
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 )
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 def run(self):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 Public method to check the given source against miscellaneous
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 conditions.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 if not self.__filename:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 # don't do anything, if essential data is missing
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 if not self.__checkers:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 # don't do anything, if no codes were selected
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 for check in self.__checkers:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 check()
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 #######################################################################
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 ## Unused Arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 ##
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 ## adapted from: flake8-unused-arguments v0.0.13
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 #######################################################################
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 def __checkUnusedArguments(self):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 Private method to check function and method definitions for unused arguments.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 finder = FunctionFinder(self.__args["IgnoreNestedFunctions"])
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 finder.visit(self.__tree)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 for functionNode in finder.functionNodes():
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 decoratorNames = set(self.__getDecoratorNames(functionNode))
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 # ignore overload functions, it's not a surprise when they're empty
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 if self.__args["IgnoreOverload"] and "overload" in decoratorNames:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 # ignore overridden functions
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 if self.__args["IgnoreOverride"] and "override" in decoratorNames:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 # ignore abstractmethods, it's not a surprise when they're empty
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 if self.__args["IgnoreAbstract"] and "abstractmethod" in decoratorNames:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 # ignore Qt slot methods
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 if self.__args["IgnoreSlotMethods"] and (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 "pyqtSlot" in decoratorNames or "Slot" in decoratorNames
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 # ignore stub functions
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 if self.__args["IgnoreStubs"] and self.__isStubFunction(functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 # ignore lambdas
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 if self.__args["IgnoreLambdas"] and isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 # ignore __double_underscore_methods__()
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 if self.__args["IgnoreDunderMethods"] and self.__isDunderMethod(
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 functionNode
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 for i, argument in self.__getUnusedArguments(functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 name = argument.arg
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 if self.__args["IgnoreVariadicNames"]:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 if (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 functionNode.args.vararg
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 and functionNode.args.vararg.arg == name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 if functionNode.args.kwarg and functionNode.args.kwarg.arg == name:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 # ignore self or whatever the first argument is for a classmethod
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 if i == 0 and (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 name in ("self", "cls") or "classmethod" in decoratorNames
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 lineNumber = argument.lineno
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 offset = argument.col_offset
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 errorCode = "U101" if name.startswith("_") else "U100"
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 self.__error(lineNumber - 1, offset, errorCode, name)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 def __getDecoratorNames(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 Private method to yield the decorator names of the function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 @yield decorator name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 @ytype str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 for decorator in functionNode.decorator_list:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 if isinstance(decorator, ast.Name):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 yield decorator.id
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 elif isinstance(decorator, ast.Attribute):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 yield decorator.attr
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 elif isinstance(decorator, ast.Call):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 if isinstance(decorator.func, ast.Name):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 yield decorator.func.id
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 yield decorator.func.attr
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 def __isStubFunction(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 Private method to check, if the given function node defines a stub function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 @return flag indicating a stub function
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 @rtype bool
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 return AstUtilities.isEllipsis(functionNode.body)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 statement = functionNode.body[0]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 if isinstance(statement, ast.Expr) and AstUtilities.isString(statement.value):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 if len(functionNode.body) > 1:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 # first statement is a docstring, let's skip it
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 statement = functionNode.body[1]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 # it's a function with only a docstring, that's a stub
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 if isinstance(statement, ast.Pass):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 if isinstance(statement, ast.Expr) and AstUtilities.isEllipsis(statement.value):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 if isinstance(statement, ast.Raise):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 # like 'raise NotImplementedError()'
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 if (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 isinstance(statement.exc, ast.Call)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 and hasattr(statement.exc.func, "id")
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 and statement.exc.func.id == "NotImplementedError"
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 # like 'raise NotImplementedError'
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 elif (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 isinstance(statement.exc, ast.Name)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 and hasattr(statement.exc, "id")
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 and statement.exc.id == "NotImplementedError"
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 return False
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 def __isDunderMethod(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 Private method to check, if the function node defines a special function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 @return flag indicating a special function
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 @rtype bool
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 return False
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 if not hasattr(functionNode, "name"):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 return False
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 name = functionNode.name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 return len(name) > 4 and name.startswith("__") and name.endswith("__")
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 def __getUnusedArguments(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 Private method to get a list of unused arguments of the given function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 @return list of tuples of the argument position and the argument
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 @rtype list of tuples of (int, ast.arg)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 arguments = list(enumerate(self.__getArguments(functionNode)))
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 class NameFinder(ast.NodeVisitor):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 Class to find the used argument names.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 def visit_Name(self, name):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 Public method to check a Name node.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 @param name reference to the name node to be checked
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 @type ast.Name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 nonlocal arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 if isinstance(name.ctx, ast.Store):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 arguments = [
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 (argIndex, arg) for argIndex, arg in arguments if arg.arg != name.id
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 ]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 NameFinder().visit(functionNode)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 return arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 def __getArguments(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 Private method to get all argument names of the given function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 @return list of argument names
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 @rtype list of ast.arg
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 args = functionNode.args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 orderedArguments = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 # plain old args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 orderedArguments.extend(args.args)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 # *arg name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 if args.vararg is not None:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 orderedArguments.append(args.vararg)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 # *, key, word, only, args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 orderedArguments.extend(args.kwonlyargs)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 # **kwarg name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 if args.kwarg is not None:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 orderedArguments.append(args.kwarg)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 return orderedArguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
361 #######################################################################
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
362 ## Unused Arguments
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
363 ##
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
364 ## adapted from: flake8-unused-arguments v0.0.13
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
365 #######################################################################
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
366
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
367 def __checkUnusedGlobals(self):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
368 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
369 Private method to check for unused global variables.
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
370 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
371 errors = {}
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
372 loadCounter = GlobalVariableLoadCounter()
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
373 loadCounter.visit(self.__tree)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
374
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
375 globalVariables = self.__extractGlobalVariables()
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
376
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
377 for varId, loads in loadCounter.getLoads():
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
378 if varId in globalVariables and loads == 0:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
379 storeInfo = loadCounter.getStoreInfo(varId)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
380 errorInfo = (storeInfo.lineno - 1, storeInfo.offset, "U200", varId)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
381 errors[varId] = errorInfo
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
382
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
383 for node in self.__tree.body[::-1]:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
384 if isinstance(node, ast.Assign):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
385 for target in node.targets:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
386 if isinstance(target, ast.Name) and target.id in errors:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
387 errors.pop(target.id)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
388 elif (
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
389 isinstance(node, ast.AnnAssign)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
390 and isinstance(node.target, ast.Name)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
391 and node.target.id in errors
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
392 ):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
393 errors.pop(node.target.id)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
394 else:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
395 break
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
396
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
397 if self.__args["IgnoreDunderGlobals"]:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
398 # eliminate some special cases
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
399 for name in list(errors.keys()):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
400 if name.startswith("__") and name.endswith("__"):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
401 errors.pop(name)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
402
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
403 for varId in errors:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
404 self.__error(*errors[varId])
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
405
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
406 def __extractGlobalVariables(self):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
407 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
408 Private method to get the names of all global variables.
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
409
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
410 @return set containing the defined global variable names
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
411 @rtype set of str
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
412 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
413 variables = set()
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
414
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
415 for assignment in self.__tree.body:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
416 if isinstance(assignment, ast.Assign):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
417 for target in assignment.targets:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
418 if isinstance(target, ast.Name):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
419 variables.add(target.id)
10054
d7a47f0cff2b Regenerated source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10053
diff changeset
420 elif isinstance(assignment, ast.AnnAssign) and isinstance(
d7a47f0cff2b Regenerated source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10053
diff changeset
421 assignment.target, ast.Name
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
422 ):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
423 variables.add(assignment.target.id)
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
424
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
425 return variables
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
426
10054
d7a47f0cff2b Regenerated source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10053
diff changeset
427
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
428 #######################################################################
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
429 ## Class used by 'Unused Arguments'
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
430 ##
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
431 ## adapted from: flake8-unused-arguments v0.0.13
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
432 #######################################################################
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
433
10052
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 class FunctionFinder(ast.NodeVisitor):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 Class to find all defined functions and methods.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
439
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 def __init__(self, onlyTopLevel=False):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
442 Constructor
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444 @param onlyTopLevel flag indicating to search for top level functions only
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 (defaults to False)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
446 @type bool (optional)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 super().__init__()
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450 self.__functions = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 self.__onlyTopLevel = onlyTopLevel
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 def functionNodes(self):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 Public method to get the list of detected functions and lambdas.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 @return list of detected functions and lambdas
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458 @rtype list of ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 return self.__functions
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 def __visitFunctionTypes(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 Private method to handle an AST node defining a function or lambda.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 @param functionNode reference to the node defining a function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 self.__functions.append(functionNode)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470 if not self.__onlyTopLevel:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 self.visit(functionNode.body)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 for obj in functionNode.body:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475 self.visit(obj)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477 visit_AsyncFunctionDef = visit_FunctionDef = visit_Lambda = __visitFunctionTypes
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
478
10054
d7a47f0cff2b Regenerated source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10053
diff changeset
479
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
480 #######################################################################
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
481 ## Class used by 'Unused Globals'
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
482 ##
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
483 ## adapted from: flake8-unused-globals v0.1.9
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
484 #######################################################################
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
485
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
486
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
487 GlobalVariableStoreInfo = collections.namedtuple(
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
488 "GlobalVariableStoreInfo", ["lineno", "offset"]
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
489 )
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
490
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
491
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
492 class GlobalVariableLoadCounter(ast.NodeVisitor):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
493 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
494 Class to find all defined global variables and count their usages.
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
495 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
496
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
497 def __init__(self):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
498 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
499 Constructor
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
500 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
501 super().__init__()
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
502
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
503 self.__loads = {}
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
504 self.__storeInfo = {}
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
505
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
506 def visit_Name(self, nameNode):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
507 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
508 Public method to record the definition and use of a global variable.
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
509
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
510 @param nameNode reference to the name node to be processed
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
511 @type ast.Name
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
512 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
513 if isinstance(nameNode.ctx, ast.Load) and nameNode.id in self.__loads:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
514 self.__loads[nameNode.id] += 1
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
515 elif (
10054
d7a47f0cff2b Regenerated source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10053
diff changeset
516 isinstance(nameNode.ctx, ast.Store) and nameNode.id not in self.__storeInfo
10053
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
517 ):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
518 self.__loads[nameNode.id] = 0
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
519 self.__storeInfo[nameNode.id] = GlobalVariableStoreInfo(
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
520 lineno=nameNode.lineno, offset=nameNode.col_offset
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
521 )
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
522
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
523 def getLoads(self):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
524 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
525 Public method to get an iterator of the detected variable loads.
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
526
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
527 @return DESCRIPTION
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
528 @rtype TYPE
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
529 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
530 return self.__loads.items()
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
531
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
532 def getStoreInfo(self, variableId):
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
533 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
534 Public method to get the store info data of a given variable ID.
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
535
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
536 @param variableId variable ID to retrieve the store info for
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
537 @type str
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
538 @return named tuple containing the line number and column offset
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
539 @rtype GlobalVariableStoreInfo
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
540 """
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
541 try:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
542 return self.__storeInfo[variableId]
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
543 except KeyError:
9914b7b4b11c Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10052
diff changeset
544 return None

eric ide

mercurial