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

Tue, 23 May 2023 15:58:50 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 23 May 2023 15:58:50 +0200
branch
eric7
changeset 10058
5d965939ab85
parent 10050
3750abc45d5e
child 10086
c8854a6300d1
permissions
-rw-r--r--

Code Style Checker
- Updated the annotations checker to support more cases.

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

eric ide

mercurial