eric6/Plugins/CheckerPlugins/CodeStyleChecker/AnnotationsChecker.py

Wed, 18 Sep 2019 20:25:52 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 18 Sep 2019 20:25:52 +0200
changeset 7246
c32a350d2414
child 7247
bf9379f964f3
permissions
-rw-r--r--

Code Style Checker:
- added a checker for type annotations

7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a checker for function type annotations.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import sys
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import ast
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 class AnnotationsChecker(object):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 Class implementing a checker for function type annotations.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 Codes = [
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 ## Function Annotations
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 "A001", "A002", "A003",
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 ## Method Annotations
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 "A101", "A102",
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 ## Return Annotations
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 "A201", "A202", "A203", "A204", "A205", "A206",
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 ## Syntax Error
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 "A999",
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 ]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 def __init__(self, source, filename, select, ignore, expected, repeat):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 Constructor
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @param source source code to be checked
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @param filename name of the source file
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @param select list of selected codes
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @param ignore list of codes to be ignored
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @param expected list of expected codes
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @param repeat flag indicating to report each occurrence of a code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @type bool
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 self.__select = tuple(select)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 self.__ignore = ('',) if select else tuple(ignore)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 self.__expected = expected[:]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.__repeat = repeat
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.__filename = filename
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 self.__source = source[:]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 # statistics counters
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 self.counters = {}
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 # collection of detected errors
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.errors = []
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 checkersWithCodes = [
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 (
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 self.__checkFunctionAnnotations,
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 ("A001", "A002", "A003", "A101", "A102",
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 "A201", "A202", "A203", "A204", "A205", "A206",)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 ),
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 ]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 self.__checkers = []
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 for checker, codes in checkersWithCodes:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 if any(not (code and self.__ignoreCode(code))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 for code in codes):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 self.__checkers.append(checker)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 def __ignoreCode(self, code):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 Private method to check if the message code should be ignored.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 @param code message code to check for
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @return flag indicating to ignore the given code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 @rtype bool
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 return (code.startswith(self.__ignore) and
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 not code.startswith(self.__select))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 def __error(self, lineNumber, offset, code, *args):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 Private method to record an issue.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 @param lineNumber line number of the issue
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 @type int
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 @param offset position within line of the issue
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @type int
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @param code message code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @param args arguments for the message
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @type list
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 if self.__ignoreCode(code):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 if code in self.counters:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 self.counters[code] += 1
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 self.counters[code] = 1
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 # Don't care about expected codes
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 if code in self.__expected:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 if code and (self.counters[code] == 1 or self.__repeat):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 # record the issue with one based line number
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 self.errors.append(
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 (self.__filename, lineNumber + 1, offset, (code, args)))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 def __reportInvalidSyntax(self):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 Private method to report a syntax error.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 exc_type, exc = sys.exc_info()[:2]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 if len(exc.args) > 1:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 offset = exc.args[1]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 if len(offset) > 2:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 offset = offset[1:3]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 offset = (1, 0)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 self.__error(offset[0] - 1, offset[1] or 0,
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 'A999', exc_type.__name__, exc.args[0])
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 def __generateTree(self):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 Private method to generate an AST for our source.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 @return generated AST
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 @rtype ast.Module
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 source = "".join(self.__source)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 # Check type for py2: if not str it's unicode
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 if sys.version_info[0] == 2:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 try:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 source = source.encode('utf-8')
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 except UnicodeError:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 pass
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 return compile(source, self.__filename, 'exec', ast.PyCF_ONLY_AST)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 def run(self):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 Public method to check the given source against annotation issues.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 if not self.__filename:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 # don't do anything, if essential data is missing
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 if not self.__checkers:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 # don't do anything, if no codes were selected
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 try:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 self.__tree = self.__generateTree()
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 except (SyntaxError, TypeError):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 self.__reportInvalidSyntax()
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 for check in self.__checkers:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 check()
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 def __checkFunctionAnnotations(self):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 Private method to check for function annotation issues.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 visitor = FunctionVisitor(self.__source)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 visitor.visit(self.__tree)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 for issue in visitor.issues:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 node = issue[0]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 reason = issue[1]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 params = issue[2:]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 self.__error(node.lineno - 1, node.col_offset, reason, *params)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 class FunctionVisitor(ast.NodeVisitor):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 Class implementing a node visitor to check function annotations.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 Note: this class is modelled after flake8-annotations checker.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 def __init__(self, sourceLines):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 Constructor
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 @param sourceLines lines of source code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 super(FunctionVisitor, self).__init__()
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 self.__sourceLines = sourceLines
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 self.issues = []
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 def visit_FunctionDef(self, node):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 Public method to handle a function or method definition.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 @param node reference to the node to be processed
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 @type ast.FunctionDef
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 self.__checkFunctionNode(node)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 self.generic_visit(node)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 def visit_AsyncFunctionDef(self, node):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 Public method to handle an async function or method definition.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 @param node reference to the node to be processed
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 @type ast.AsyncFunctionDef
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 self.__checkFunctionNode(node)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 self.generic_visit(node)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 def visit_ClassDef(self, node):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 Public method to handle class definitions.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 @param node reference to the node to be processed
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 @type ast.ClassDef
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 methodNodes = [
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 childNode for childNode in node.body
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 if isinstance(childNode, (ast.FunctionDef, ast.AsyncFunctionDef))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 ]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 for methodNode in methodNodes:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 self.__checkFunctionNode(methodNode, classMethod=True)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 def __checkFunctionNode(self, node, classMethod=False):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 Private method to check an individual function definition node.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 @param node reference to the node to be processed
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 @type ast.FunctionDef or ast.AsyncFunctionDef
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 @param classMethod flag indicating a class method
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 @type bool
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 if node.name.startswith("__") and node.name.endswith("__"):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 visibilityType = "special"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 elif node.name.startswith("__"):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 visibilityType = "private"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 elif node.name.startswith("_"):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 visibilityType = "protected"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 visibilityType = "public"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 if classMethod:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 decorators = [
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 decorator.id for decorator in node.decorator_list
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 if isinstance(decorator, ast.Name)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 ]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 if "classmethod" in decorators:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 classMethodType = "decorator"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 elif "staticmethod" in decorators:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 classMethodType = "staticmethod"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 classMethodType = ""
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 classMethodType = "function"
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 # check argument annotations
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 for argType in ("args", "vararg", "kwonlyargs", "kwarg"):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 args = node.args.__getattribute__(argType)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 if args:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 if not isinstance(args, list):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 args = [args]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 for arg in args:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 if not arg.annotation:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 self.__classifyArgumentError(
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 arg, argType, classMethodType)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 # check function return annotation
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 if not node.returns:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 lineno = node.body[0].lineno
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 colOffset = self.__sourceLines[lineno - 1].find(":") + 1
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 self.__classifyReturnError(classMethodType, visibilityType,
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 lineno, colOffset)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 def __classifyReturnError(self, methodType, visibilityType, lineno,
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 colOffset):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 Private method to classify and record a return annotation issue.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 @param methodType type of method/function the argument belongs to
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 @param visibilityType visibility of the function
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 @param lineno line number
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 @type int
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 @param colOffset column number
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 @type int
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 # create a dummy AST node to report line and column
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 node = ast.AST()
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 node.lineno = lineno
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 node.col_offset = colOffset
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 # now classify the issue
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 if methodType == "classmethod":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 self.issues.append((node, "A206"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 elif methodType == "staticmethod":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 self.issues.append((node, "A205"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 elif visibilityType == "special":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 self.issues.append((node, "A204"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 elif visibilityType == "private":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 self.issues.append((node, "A203"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 elif visibilityType == "protected":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 self.issues.append((node, "A202"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 self.issues.append((node, "A201"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 def __classifyArgumentError(self, argNode, argType, methodType):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 Private method to classify and record an argument annotation issue.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 @param argNode reference to the argument node
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 @type ast.arguments
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 @param argType type of the argument node
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 @param methodType type of method/function the argument belongs to
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 # check class method issues
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 if methodType != "function":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 if argNode.arg in ("cls", "self"):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 if methodType == "classmethod":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 self.issues.append((argNode, "A102"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 elif methodType != "staticmethod":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 self.issues.append((argNode, "A101"))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 return
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 # check all other arguments
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 if argType == "kwarg":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 self.issues.append((argNode, "A003", argNode.arg))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 elif argType == "vararg":
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 self.issues.append((argNode, "A002", argNode.arg))
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 # args and kwonlyargs
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 self.issues.append((argNode, "A001", argNode.arg))

eric ide

mercurial