src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsChecker.py

Thu, 15 Sep 2022 11:00:36 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 15 Sep 2022 11:00:36 +0200
branch
eric7
changeset 9328
49a0a9cb2505
parent 9276
e6748a5e24b9
child 9473
3f23dbf37dbe
permissions
-rw-r--r--

Fixed some code style issues detected by the new checks.

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
8881
54e42bc2437a Updated copyright for 2022.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8773
diff changeset
3 # Copyright (c) 2019 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
7246
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
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
10 import ast
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
11 import contextlib
8198
1c765dc90c21 Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8166
diff changeset
12 import copy
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
13 import sys
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
14 from functools import lru_cache
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
7622
384e2aa5c073 Code Style Checker: continued to implement checker for security related issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7610
diff changeset
16 import AstUtilities
384e2aa5c073 Code Style Checker: continued to implement checker for security related issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7610
diff changeset
17
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
18 from .AnnotationsEnums import AnnotationType, ClassDecoratorType, FunctionType
8246
e4b95b0ebd31 Code Style Checker: added configuration options for the reworked the type annotations checker to the code style checker dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8244
diff changeset
19 from .AnnotationsCheckerDefaults import AnnotationsCheckerDefaultArgs
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
20
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
8207
d359172d11be Applied some more code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8204
diff changeset
22 class AnnotationsChecker:
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 Class implementing a checker for function type annotations.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
26
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 Codes = [
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 ## Function Annotations
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
29 "A001",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
30 "A002",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
31 "A003",
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 ## Method Annotations
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
33 "A101",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
34 "A102",
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 ## Return Annotations
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
36 "A201",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
37 "A202",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
38 "A203",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
39 "A204",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
40 "A205",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
41 "A206",
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
42 ## Mixed kind of annotations
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
43 "A301",
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
44 ## Dynamically typed annotations
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
45 "A401",
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
46 ## Annotations Future
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
47 "A871",
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
48 "A872",
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
49 ## Annotation Coverage
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
50 "A881",
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
51 ## Annotation Complexity
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
52 "A891",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
53 "A892",
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 ]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
56 def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
59
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 @param source source code to be checked
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 @param filename name of the source file
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 @type str
8198
1c765dc90c21 Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8166
diff changeset
64 @param tree AST tree of the source code
1c765dc90c21 Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8166
diff changeset
65 @type ast.Module
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 @param select list of selected codes
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 @param ignore list of codes to be ignored
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 @param expected list of expected codes
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 @type list of str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 @param repeat flag indicating to report each occurrence of a code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 @type bool
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
74 @param args dictionary of arguments for the annotation checks
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
75 @type dict
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 self.__select = tuple(select)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
78 self.__ignore = ("",) if select else tuple(ignore)
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 self.__expected = expected[:]
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 self.__repeat = repeat
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 self.__filename = filename
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 self.__source = source[:]
8198
1c765dc90c21 Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8166
diff changeset
83 self.__tree = copy.deepcopy(tree)
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
84 self.__args = args
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 # statistics counters
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 self.counters = {}
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
88
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 # collection of detected errors
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 self.errors = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
91
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 checkersWithCodes = [
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 (
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 self.__checkFunctionAnnotations,
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
95 (
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
96 "A001",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
97 "A002",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
98 "A003",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
99 "A101",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
100 "A102",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
101 "A201",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
102 "A202",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
103 "A203",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
104 "A204",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
105 "A205",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
106 "A206",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
107 "A301",
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
108 "A401",
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
109 ),
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 ),
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
111 (self.__checkAnnotationsFuture, ("A871", "A872")),
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
112 (self.__checkAnnotationsCoverage, ("A881",)),
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
113 (self.__checkAnnotationComplexity, ("A891", "A892")),
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 ]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
115
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 self.__checkers = []
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 for checker, codes in checkersWithCodes:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
118 if any(not (code and self.__ignoreCode(code)) for code in codes):
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 self.__checkers.append(checker)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
120
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 def __ignoreCode(self, code):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 Private method to check if the message code should be ignored.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 @param code message code to check for
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 @return flag indicating to ignore the given code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 @rtype bool
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
130 return code.startswith(self.__ignore) and not code.startswith(self.__select)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
131
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 def __error(self, lineNumber, offset, code, *args):
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 record an issue.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
135
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 @param lineNumber line number of the issue
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 @type int
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 @param offset position within line of the issue
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 @type int
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 @param code message code
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 @type str
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 @param args arguments for the message
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 @type list
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 if self.__ignoreCode(code):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
147
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 if code in self.counters:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 self.counters[code] += 1
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 else:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 self.counters[code] = 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
152
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 # Don't care about expected codes
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 if code in self.__expected:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
156
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 if code and (self.counters[code] == 1 or self.__repeat):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 # record the issue with one based line number
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 self.errors.append(
7610
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
160 {
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
161 "file": self.__filename,
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
162 "line": lineNumber + 1,
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
163 "offset": offset,
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
164 "code": code,
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
165 "args": args,
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
166 }
df7025fe26a3 Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
167 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
168
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 def run(self):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 Public method to check the given source against annotation issues.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 if not self.__filename:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 # don't do anything, if essential data is missing
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
176
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 if not self.__checkers:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 # don't do anything, if no codes were selected
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
180
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 for check in self.__checkers:
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 check()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
183
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
184 #######################################################################
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
185 ## Annotations
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
186 ##
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
187 ## adapted from: flake8-annotations v2.9.0
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
188 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
189
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 def __checkFunctionAnnotations(self):
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 """
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 Private method to check for function annotation issues.
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 """
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
194 suppressNoneReturning = self.__args.get(
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
195 "SuppressNoneReturning",
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
196 AnnotationsCheckerDefaultArgs["SuppressNoneReturning"],
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
197 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
198 suppressDummyArgs = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
199 "SuppressDummyArgs", AnnotationsCheckerDefaultArgs["SuppressDummyArgs"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
200 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
201 allowUntypedDefs = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
202 "AllowUntypedDefs", AnnotationsCheckerDefaultArgs["AllowUntypedDefs"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
203 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
204 allowUntypedNested = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
205 "AllowUntypedNested", AnnotationsCheckerDefaultArgs["AllowUntypedNested"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
206 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
207 mypyInitReturn = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
208 "MypyInitReturn", AnnotationsCheckerDefaultArgs["MypyInitReturn"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
209 )
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
210 allowStarArgAny = self.__args.get(
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
211 "AllowStarArgAny", AnnotationsCheckerDefaultArgs["AllowStarArgAny"]
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
212 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
213
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
214 # Store decorator lists as sets for easier lookup
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
215 dispatchDecorators = set(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
216 self.__args.get(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
217 "DispatchDecorators",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
218 AnnotationsCheckerDefaultArgs["DispatchDecorators"],
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
219 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
220 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
221 overloadDecorators = set(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
222 self.__args.get(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
223 "OverloadDecorators",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
224 AnnotationsCheckerDefaultArgs["OverloadDecorators"],
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
225 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
226 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
227
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
228 from .AnnotationsFunctionVisitor import FunctionVisitor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
229
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 visitor = FunctionVisitor(self.__source)
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 visitor.visit(self.__tree)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
232
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
233 # Keep track of the last encountered function decorated by
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
234 # `typing.overload`, if any. Per the `typing` module documentation,
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
235 # a series of overload-decorated definitions must be followed by
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
236 # exactly one non-overload-decorated definition of the same function.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
237 lastOverloadDecoratedFunctionName = None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
238
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
239 # Iterate over the arguments with missing type hints, by function.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
240 for function in visitor.functionDefinitions:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
241 if function.isDynamicallyTyped() and (
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
242 allowUntypedDefs or (function.isNested and allowUntypedNested)
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
243 ):
8246
e4b95b0ebd31 Code Style Checker: added configuration options for the reworked the type annotations checker to the code style checker dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8244
diff changeset
244 # Skip recording errors from dynamically typed functions
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
245 # or nested functions
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
246 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
247
8246
e4b95b0ebd31 Code Style Checker: added configuration options for the reworked the type annotations checker to the code style checker dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8244
diff changeset
248 # Skip recording errors for configured dispatch functions, such as
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
249 # (by default) `functools.singledispatch` and
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
250 # `functools.singledispatchmethod`
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
251 if function.hasDecorator(dispatchDecorators):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
252 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
253
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
254 # Create sentinels to check for mixed hint styles
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
255 hasTypeComment = function.hasTypeComment
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
256
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
257 has3107Annotation = False
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
258 # PEP 3107 annotations are captured by the return arg
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
259
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
260 annotatedArgs = function.getAnnotatedArguments()
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
261
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
262 # Iterate over annotated args to detect mixing of type annotations
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
263 # and type comments. Emit this only once per function definition
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
264 for arg in annotatedArgs:
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
265 if arg.hasTypeComment:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
266 hasTypeComment = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
267
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
268 if arg.has3107Annotation:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
269 has3107Annotation = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
270
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
271 if hasTypeComment and has3107Annotation:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
272 # Short-circuit check for mixing of type comments &
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
273 # 3107-style annotations
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
274 self.__error(function.lineno - 1, function.col_offset, "A301")
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
275 break
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
276
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
277 # Iterate over the annotated args to look for 'typing.Any' annotations
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
278 # We could combine this with the above loop but I'd rather not add even
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
279 # more sentinels unless we'd notice a significant enough performance impact
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
280 for arg in annotatedArgs:
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
281 if arg.isDynamicallyTyped:
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
282 if allowStarArgAny and arg.annotationType in {
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
283 AnnotationType.VARARG,
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
284 AnnotationType.KWARG,
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
285 }:
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
286 continue
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
287
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
288 self.__error(function.lineno - 1, function.col_offset, "A401")
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
289
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
290 # Before we iterate over the function's missing annotations, check
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
291 # to see if it's the closing function def in a series of
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
292 # `typing.overload` decorated functions.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
293 if lastOverloadDecoratedFunctionName == function.name:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
294 continue
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
295
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
296 # If it's not, and it is overload decorated, store it for the next
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
297 # iteration
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
298 if function.hasDecorator(overloadDecorators):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
299 lastOverloadDecoratedFunctionName = function.name
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
300
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
301 # Record explicit errors for arguments that are missing annotations
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
302 for arg in function.getMissedAnnotations():
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
303 if arg.argname == "return":
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
304 # return annotations have multiple possible short-circuit
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
305 # paths
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
306 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
307 suppressNoneReturning
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
308 and not arg.hasTypeAnnotation
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
309 and function.hasOnlyNoneReturns
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
310 ):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
311 # Skip recording return errors if the function has only
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
312 # `None` returns. This includes the case of no returns.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
313 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
314
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
315 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
316 mypyInitReturn
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
317 and function.isClassMethod
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
318 and function.name == "__init__"
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
319 and annotatedArgs
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
320 ):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
321 # Skip recording return errors for `__init__` if at
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
322 # least one argument is annotated
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
323 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
324
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
325 # If the `suppressDummyArgs` flag is `True`, skip recording
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
326 # errors for any arguments named `_`
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
327 if arg.argname == "_" and suppressDummyArgs:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
328 continue
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
329
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
330 self.__classifyError(function, arg)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
331
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
332 def __classifyError(self, function, arg):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
333 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
334 Private method to classify the missing type annotation based on the
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
335 Function & Argument metadata.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
336
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
337 For the currently defined rules & program flow, the assumption can be
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
338 made that an argument passed to this method will match a linting error,
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
339 and will only match a single linting error
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
340
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
341 This function provides an initial classificaton, then passes relevant
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
342 attributes to cached helper function(s).
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
343
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
344 @param function reference to the Function object
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
345 @type Function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
346 @param arg reference to the Argument object
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
347 @type Argument
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
348 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
349 # Check for return type
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
350 # All return "arguments" have an explicitly defined name "return"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
351 if arg.argname == "return":
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
352 errorCode = self.__returnErrorClassifier(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
353 function.isClassMethod,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
354 function.classDecoratorType,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
355 function.functionType,
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
356 )
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
357 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
358 # Otherwise, classify function argument error
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
359 isFirstArg = arg == function.args[0]
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
360 errorCode = self.__argumentErrorClassifier(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
361 function.isClassMethod,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
362 isFirstArg,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
363 function.classDecoratorType,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
364 arg.annotationType,
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
365 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
366
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
367 if errorCode in ("A001", "A002", "A003"):
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
368 self.__error(arg.lineno - 1, arg.col_offset, errorCode, arg.argname)
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
369 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
370 self.__error(arg.lineno - 1, arg.col_offset, errorCode)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
371
9328
49a0a9cb2505 Fixed some code style issues detected by the new checks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
372 @lru_cache() # __IGNORE_WARNING_M519__
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
373 def __returnErrorClassifier(self, isClassMethod, classDecoratorType, functionType):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
374 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
375 Private method to classify a return type annotation issue.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
376
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
377 @param isClassMethod flag indicating a classmethod type function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
378 @type bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
379 @param classDecoratorType type of class decorator
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
380 @type ClassDecoratorType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
381 @param functionType type of function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
382 @type FunctionType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
383 @return error code
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
384 @rtype str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
385 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
386 # Decorated class methods (@classmethod, @staticmethod) have a higher
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
387 # priority than the rest
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
388 if isClassMethod:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
389 if classDecoratorType == ClassDecoratorType.CLASSMETHOD:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
390 return "A206"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
391 elif classDecoratorType == ClassDecoratorType.STATICMETHOD:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
392 return "A205"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
393
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
394 if functionType == FunctionType.SPECIAL:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
395 return "A204"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
396 elif functionType == FunctionType.PRIVATE:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
397 return "A203"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
398 elif functionType == FunctionType.PROTECTED:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
399 return "A202"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
400 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
401 return "A201"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
402
9328
49a0a9cb2505 Fixed some code style issues detected by the new checks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
403 @lru_cache() # __IGNORE_WARNING_M519__
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
404 def __argumentErrorClassifier(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
405 self, isClassMethod, isFirstArg, classDecoratorType, annotationType
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
406 ):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
407 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
408 Private method to classify an argument type annotation issue.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
409
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
410 @param isClassMethod flag indicating a classmethod type function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
411 @type bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
412 @param isFirstArg flag indicating the first argument
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
413 @type bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
414 @param classDecoratorType type of class decorator
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
415 @type enums.ClassDecoratorType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
416 @param annotationType type of annotation
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
417 @type AnnotationType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
418 @return error code
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
419 @rtype str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
420 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
421 # Check for regular class methods and @classmethod, @staticmethod is
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
422 # deferred to final check
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
423 if isClassMethod and isFirstArg:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
424 # The first function argument here would be an instance of self or
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
425 # class
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
426 if classDecoratorType == ClassDecoratorType.CLASSMETHOD:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
427 return "A102"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
428 elif classDecoratorType != ClassDecoratorType.STATICMETHOD:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
429 # Regular class method
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
430 return "A101"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
431
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
432 # Check for remaining codes
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
433 if annotationType == AnnotationType.KWARG:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
434 return "A003"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
435 elif annotationType == AnnotationType.VARARG:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
436 return "A002"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
437 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
438 # Combine PosOnlyArgs, Args, and KwOnlyArgs
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
439 return "A001"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
440
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
441 #######################################################################
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
442 ## Annotations Coverage
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
443 ##
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
444 ## adapted from: flake8-annotations-coverage v0.0.6
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
445 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
446
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
447 def __checkAnnotationsCoverage(self):
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
448 """
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
449 Private method to check for function annotation coverage.
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
450 """
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
451 minAnnotationsCoverage = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
452 "MinimumCoverage", AnnotationsCheckerDefaultArgs["MinimumCoverage"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
453 )
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
454 if minAnnotationsCoverage == 0:
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
455 # 0 means it is switched off
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
456 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
457
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
458 functionDefs = [
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
459 f
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
460 for f in ast.walk(self.__tree)
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
461 if isinstance(f, (ast.AsyncFunctionDef, ast.FunctionDef))
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
462 ]
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
463 if not functionDefs:
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
464 # no functions/methods at all
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
465 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
466
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
467 functionDefAnnotationsInfo = [
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
468 self.__hasTypeAnnotations(f) for f in functionDefs
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
469 ]
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
470 if not bool(functionDefAnnotationsInfo):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
471 return
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
472
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
473 annotationsCoverage = int(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
474 len(list(filter(None, functionDefAnnotationsInfo)))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
475 / len(functionDefAnnotationsInfo)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
476 * 100
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
477 )
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
478 if annotationsCoverage < minAnnotationsCoverage:
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
479 self.__error(0, 0, "A881", annotationsCoverage)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
480
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
481 def __hasTypeAnnotations(self, funcNode):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
482 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
483 Private method to check for type annotations.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
484
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
485 @param funcNode reference to the function definition node to be checked
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
486 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
487 @return flag indicating the presence of type annotations
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
488 @rtype bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
489 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
490 hasReturnAnnotation = funcNode.returns is not None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
491 hasArgsAnnotations = any(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
492 a for a in funcNode.args.args if a.annotation is not None
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
493 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
494 hasKwargsAnnotations = (
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
495 funcNode.args
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
496 and funcNode.args.kwarg
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
497 and funcNode.args.kwarg.annotation is not None
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
498 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
499 hasKwonlyargsAnnotations = any(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
500 a for a in funcNode.args.kwonlyargs if a.annotation is not None
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
501 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
502
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
503 return any(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
504 (
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
505 hasReturnAnnotation,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
506 hasArgsAnnotations,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
507 hasKwargsAnnotations,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
508 hasKwonlyargsAnnotations,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
509 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
510 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
511
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
512 #######################################################################
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
513 ## Annotations Complexity
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
514 ##
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
515 ## adapted from: flake8-annotations-complexity v0.0.7
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
516 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
517
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
518 def __checkAnnotationComplexity(self):
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
519 """
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
520 Private method to check the type annotation complexity.
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
521 """
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
522 maxAnnotationComplexity = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
523 "MaximumComplexity", AnnotationsCheckerDefaultArgs["MaximumComplexity"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
524 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
525 maxAnnotationLength = self.__args.get(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
526 "MaximumLength", AnnotationsCheckerDefaultArgs["MaximumLength"]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
527 )
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
528 typeAnnotations = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
529
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
530 functionDefs = [
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
531 f
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
532 for f in ast.walk(self.__tree)
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
533 if isinstance(f, (ast.AsyncFunctionDef, ast.FunctionDef))
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
534 ]
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
535 for functionDef in functionDefs:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
536 typeAnnotations += list(
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
537 filter(None, (a.annotation for a in functionDef.args.args))
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
538 )
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
539 if functionDef.returns:
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
540 typeAnnotations.append(functionDef.returns)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
541 typeAnnotations += [
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
542 a.annotation
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
543 for a in ast.walk(self.__tree)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
544 if isinstance(a, ast.AnnAssign) and a.annotation
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
545 ]
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
546 for annotation in typeAnnotations:
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
547 complexity = self.__getAnnotationComplexity(annotation)
7247
bf9379f964f3 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7246
diff changeset
548 if complexity > maxAnnotationComplexity:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
549 self.__error(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
550 annotation.lineno - 1,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
551 annotation.col_offset,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
552 "A891",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
553 complexity,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
554 maxAnnotationComplexity,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
555 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
556
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
557 annotationLength = self.__getAnnotationLength(annotation)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
558 if annotationLength > maxAnnotationLength:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
559 self.__error(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
560 annotation.lineno - 1,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
561 annotation.col_offset,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
562 "A892",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
563 annotationLength,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
564 maxAnnotationLength,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
565 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
566
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
567 def __getAnnotationComplexity(self, annotationNode, defaultComplexity=1):
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
568 """
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
569 Private method to determine the annotation complexity.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
570
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
571 @param annotationNode reference to the node to determine the annotation
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
572 complexity for
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
573 @type ast.AST
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
574 @param defaultComplexity default complexity value
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
575 @type int
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
576 @return annotation complexity
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
577 @rtype = int
7246
c32a350d2414 Code Style Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
578 """
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
579 if AstUtilities.isString(annotationNode):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
580 try:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
581 annotationNode = ast.parse(annotationNode.s).body[0].value
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
582 except (SyntaxError, IndexError):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
583 return defaultComplexity
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
584
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
585 complexity = defaultComplexity
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
586 if isinstance(annotationNode, ast.Subscript):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
587 if sys.version_info >= (3, 9):
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
588 complexity = defaultComplexity + self.__getAnnotationComplexity(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
589 annotationNode.slice
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
590 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
591 else:
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
592 complexity = defaultComplexity + self.__getAnnotationComplexity(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
593 annotationNode.slice.value
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
594 )
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
595
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
596 if isinstance(annotationNode, ast.Tuple):
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
597 complexity = max(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
598 (self.__getAnnotationComplexity(n) for n in annotationNode.elts),
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
599 default=defaultComplexity,
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
600 )
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
601
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
602 return complexity
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
603
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
604 def __getAnnotationLength(self, annotationNode):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
605 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
606 Private method to determine the annotation length.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
607
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
608 @param annotationNode reference to the node to determine the annotation
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
609 length for
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
610 @type ast.AST
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
611 @return annotation length
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
612 @rtype = int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
613 """
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
614 annotationLength = 0
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
615 if AstUtilities.isString(annotationNode):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
616 try:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
617 annotationNode = ast.parse(annotationNode.s).body[0].value
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
618 except (SyntaxError, IndexError):
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
619 return annotationLength
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
620
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8236
diff changeset
621 if isinstance(annotationNode, ast.Subscript):
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
622 with contextlib.suppress(AttributeError):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
623 annotationLength = (
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
624 len(annotationNode.slice.elts)
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
625 if sys.version_info >= (3, 9)
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
626 else len(annotationNode.slice.value.elts)
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
627 )
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
628
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
629 return annotationLength
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
630
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
631 #######################################################################
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
632 ## 'from __future__ import annotations' checck
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
633 ##
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
634 ## adapted from: flake8-future-annotations v0.0.5
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
635 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
636
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
637 def __checkAnnotationsFuture(self):
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
638 """
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
639 Private method to check the use of __future__ and typing imports.
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
640 """
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
641 from .AnnotationsFutureVisitor import AnnotationsFutureVisitor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
642
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
643 forceFutureAnnotations = self.__args.get(
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
644 "ForceFutureAnnotations",
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
645 AnnotationsCheckerDefaultArgs["ForceFutureAnnotations"],
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
646 )
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
647
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
648 visitor = AnnotationsFutureVisitor()
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
649 visitor.visit(self.__tree)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
650
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
651 if visitor.importsFutureAnnotations():
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
652 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
653
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
654 if visitor.hasTypingImports():
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
655 imports = ", ".join(visitor.getTypingImports())
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
656 self.__error(0, 0, "A871", imports)
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
657 elif forceFutureAnnotations:
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
658 self.__error(0, 0, "A872")

eric ide

mercurial