Wed, 18 Sep 2019 20:25:52 +0200
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)) |