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

Mon, 22 May 2023 19:53:41 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 22 May 2023 19:53:41 +0200
branch
eric7
changeset 10052
041d0785dd42
child 10053
9914b7b4b11c
permissions
-rw-r--r--

Code Style Checker
- Added a checker for unused function/method and lambda arguments..

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
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import copy
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import AstUtilities
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
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 class UnusedChecker:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 Class implementing a checker for unused arguments, variables, ... .
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 """
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 Codes = [
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 ## Unused Arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 "U100",
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 "U101",
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 ]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
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 Constructor
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @param source source code to be checked
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @param filename name of the source file
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 @type str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 @param tree AST tree of the source code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @type ast.Module
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @param select list of selected codes
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @param ignore list of codes to be ignored
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 @param expected list of expected codes
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @type list of str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @param repeat flag indicating to report each occurrence of a code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @type bool
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @param args dictionary of arguments for the various checks
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @type dict
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 self.__select = tuple(select)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 self.__ignore = ("",) if select else tuple(ignore)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 self.__expected = expected[:]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 self.__repeat = repeat
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.__filename = filename
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.__source = source[:]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 self.__tree = copy.deepcopy(tree)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__args = args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 ### parameters for unused arguments checks
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 ##self.__ignoreAbstract "IgnoreAbstract": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 ##self.__ignoreOverload "IgnoreOverload": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 ##self.__ignoreOverride "IgnoreOverride": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 ##self.__ignoreStubs "IgnoreStubs": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 ##self.__ignoreVariadicNames "IgnoreVariadicNames": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 ##self.__ignoreLambdas "IgnoreLambdas": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 ##self.__ignoreNestedFunctions "IgnoreNestedFunctions": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 ##self.__ignoreDunderMethods "IgnoreDunderMethods": False,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 # statistics counters
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 self.counters = {}
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 # collection of detected errors
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 self.errors = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 checkersWithCodes = [
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 (self.__checkUnusedArguments, ("U100", "U101")),
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
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 self.__checkers = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 for checker, codes in checkersWithCodes:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 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
80 self.__checkers.append(checker)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 def __ignoreCode(self, code):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 Private method to check if the message code should be ignored.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 @param code message code to check for
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 @type str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 @return flag indicating to ignore the given code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 @rtype bool
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 return code.startswith(self.__ignore) and not code.startswith(self.__select)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 def __error(self, lineNumber, offset, code, *args):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 Private method to record an issue.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @param lineNumber line number of the issue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @type int
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @param offset position within line of the issue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @type int
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 @param code message code
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 @type str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 @param args arguments for the message
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 @type list
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 if self.__ignoreCode(code):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 if code in self.counters:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 self.counters[code] += 1
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 self.counters[code] = 1
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 # Don't care about expected codes
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 if code in self.__expected:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 if code and (self.counters[code] == 1 or self.__repeat):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 # record the issue with one based line number
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 self.errors.append(
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 "file": self.__filename,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 "line": lineNumber + 1,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 "offset": offset,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 "code": code,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 "args": args,
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 }
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
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 def run(self):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 Public method to check the given source against miscellaneous
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 conditions.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 if not self.__filename:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 # don't do anything, if essential data is missing
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 if not self.__checkers:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 # don't do anything, if no codes were selected
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 return
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 for check in self.__checkers:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 check()
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 #######################################################################
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 ## Unused Arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 ##
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 ## adapted from: flake8-unused-arguments v0.0.13
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 #######################################################################
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 def __checkUnusedArguments(self):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 Private method to check function and method definitions for unused arguments.
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 finder = FunctionFinder(self.__args["IgnoreNestedFunctions"])
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 finder.visit(self.__tree)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 for functionNode in finder.functionNodes():
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 decoratorNames = set(self.__getDecoratorNames(functionNode))
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 # 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
163 if self.__args["IgnoreOverload"] and "overload" in decoratorNames:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 # ignore overridden functions
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 if self.__args["IgnoreOverride"] and "override" in decoratorNames:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 # ignore abstractmethods, it's not a surprise when they're empty
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 if self.__args["IgnoreAbstract"] and "abstractmethod" in decoratorNames:
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 Qt slot methods
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 if self.__args["IgnoreSlotMethods"] and (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 "pyqtSlot" in decoratorNames or "Slot" in decoratorNames
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 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 # ignore stub functions
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 if self.__args["IgnoreStubs"] and self.__isStubFunction(functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 # ignore lambdas
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 if self.__args["IgnoreLambdas"] and isinstance(functionNode, ast.Lambda):
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 # ignore __double_underscore_methods__()
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 if self.__args["IgnoreDunderMethods"] and self.__isDunderMethod(
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 functionNode
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 for i, argument in self.__getUnusedArguments(functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 name = argument.arg
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 if self.__args["IgnoreVariadicNames"]:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 if (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 functionNode.args.vararg
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 and functionNode.args.vararg.arg == name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 continue
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 if functionNode.args.kwarg and functionNode.args.kwarg.arg == name:
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 # ignore self or whatever the first argument is for a classmethod
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 if i == 0 and (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 name in ("self", "cls") or "classmethod" in decoratorNames
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 continue
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 lineNumber = argument.lineno
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 offset = argument.col_offset
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 errorCode = "U101" if name.startswith("_") else "U100"
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 self.__error(lineNumber - 1, offset, errorCode, name)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 def __getDecoratorNames(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 Private method to yield the decorator names of the function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 @yield decorator name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 @ytype str
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 for decorator in functionNode.decorator_list:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 if isinstance(decorator, ast.Name):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 yield decorator.id
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 elif isinstance(decorator, ast.Attribute):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 yield decorator.attr
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 elif isinstance(decorator, ast.Call):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 if isinstance(decorator.func, ast.Name):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 yield decorator.func.id
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 yield decorator.func.attr
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 def __isStubFunction(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 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
243
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 @return flag indicating a stub function
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 @rtype bool
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 return AstUtilities.isEllipsis(functionNode.body)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 statement = functionNode.body[0]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 if isinstance(statement, ast.Expr) and AstUtilities.isString(statement.value):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 if len(functionNode.body) > 1:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 # first statement is a docstring, let's skip it
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 statement = functionNode.body[1]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 # 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
259 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 if isinstance(statement, ast.Pass):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 if isinstance(statement, ast.Expr) and AstUtilities.isEllipsis(statement.value):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 return True
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 if isinstance(statement, ast.Raise):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 # like 'raise NotImplementedError()'
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 if (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 isinstance(statement.exc, ast.Call)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 and hasattr(statement.exc.func, "id")
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 and statement.exc.func.id == "NotImplementedError"
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 ):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 return True
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 # like 'raise NotImplementedError'
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 elif (
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 isinstance(statement.exc, ast.Name)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 and hasattr(statement.exc, "id")
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 and statement.exc.id == "NotImplementedError"
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 return True
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 return False
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 def __isDunderMethod(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 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
288
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 @return flag indicating a special function
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 @rtype bool
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 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 return False
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 if not hasattr(functionNode, "name"):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 return False
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 name = functionNode.name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 return len(name) > 4 and name.startswith("__") and name.endswith("__")
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 def __getUnusedArguments(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 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
306
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 @return list of tuples of the argument position and the argument
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 @rtype list of tuples of (int, ast.arg)
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 arguments = list(enumerate(self.__getArguments(functionNode)))
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 class NameFinder(ast.NodeVisitor):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 Class to find the used argument names.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 def visit_Name(self, name):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 Public method to check a Name node.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 @param name reference to the name node to be checked
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 @type ast.Name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 nonlocal arguments
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 if isinstance(name.ctx, ast.Store):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 return
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 arguments = [
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 (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
333 ]
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 NameFinder().visit(functionNode)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 return arguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 def __getArguments(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 Private method to get all argument names of the given function.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 @param functionNode reference to the node defining the function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 @return list of argument names
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 @rtype list of ast.arg
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 args = functionNode.args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 orderedArguments = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 # plain old args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 orderedArguments.extend(args.args)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 # *arg name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 if args.vararg is not None:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 orderedArguments.append(args.vararg)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 # *, key, word, only, args
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 orderedArguments.extend(args.kwonlyargs)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 # **kwarg name
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 if args.kwarg is not None:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 orderedArguments.append(args.kwarg)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 return orderedArguments
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 class FunctionFinder(ast.NodeVisitor):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 Class to find all defined functions and methods.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 def __init__(self, onlyTopLevel=False):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 Constructor
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 @param onlyTopLevel flag indicating to search for top level functions only
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 (defaults to False)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 @type bool (optional)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 super().__init__()
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 self.__functions = []
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 self.__onlyTopLevel = onlyTopLevel
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 def functionNodes(self):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 Public method to get the list of detected functions and lambdas.
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 @return list of detected functions and lambdas
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 @rtype list of ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 return self.__functions
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 def __visitFunctionTypes(self, functionNode):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 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
398
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 @param functionNode reference to the node defining a function or lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 @type ast.AsyncFunctionDef, ast.FunctionDef or ast.Lambda
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 """
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 self.__functions.append(functionNode)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 if not self.__onlyTopLevel:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 if isinstance(functionNode, ast.Lambda):
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 self.visit(functionNode.body)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 else:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 for obj in functionNode.body:
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 self.visit(obj)
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 visit_AsyncFunctionDef = visit_FunctionDef = visit_Lambda = __visitFunctionTypes

eric ide

mercurial