Thu, 30 Dec 2021 11:17:58 +0100
Updated copyright for 2022.
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
8881
54e42bc2437a
Updated copyright for 2022.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8773
diff
changeset
|
3 | # Copyright (c) 2021 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing a node visitor for function type annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10 | # |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
11 | # The visitor and associated classes are adapted from flake8-annotations v2.7.0 |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | # |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | import ast |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | import itertools |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
16 | import sys |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | from .AnnotationsEnums import AnnotationType, ClassDecoratorType, FunctionType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | # The order of AST_ARG_TYPES must match Python's grammar |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | AST_ARG_TYPES = ("posonlyargs", "args", "vararg", "kwonlyargs", "kwarg") |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24 | class Argument: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | Class representing a function argument. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | def __init__(self, argname, lineno, col_offset, annotationType, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | hasTypeAnnotation=False, has3107Annotation=False, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | hasTypeComment=False): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | Constructor |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | @param argname name of the argument |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | @type str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | @param lineno line number |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | @type int |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | @param col_offset column number |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | @type int |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | @param annotationType type of annotation |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | @type AnnotationType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | @param hasTypeAnnotation flag indicating the presence of a type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | annotation (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | @param has3107Annotation flag indicating the presence of a PEP 3107 |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | annotation (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | @param hasTypeComment flag indicating the presence of a type comment |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | self.argname = argname |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | self.lineno = lineno |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | self.col_offset = col_offset |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | self.annotationType = annotationType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | self.hasTypeAnnotation = hasTypeAnnotation |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | self.has3107Annotation = has3107Annotation |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | self.hasTypeComment = hasTypeComment |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60 | @classmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | def fromNode(cls, node, annotationTypeName): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | Class method to create an Argument object based on the given node. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | @param node reference to the node to be converted |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | @type ast.arguments |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | @param annotationTypeName name of the annotation type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | @type str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | @return Argument object |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | @rtype Argument |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | annotationType = AnnotationType[annotationTypeName] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | newArg = cls(node.arg, node.lineno, node.col_offset, annotationType) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | newArg.hasTypeAnnotation = False |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | if node.annotation: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | newArg.hasTypeAnnotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | newArg.has3107Annotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80 | if node.type_comment: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81 | newArg.hasTypeAnnotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | newArg.hasTypeComment = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84 | return newArg |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | class Function: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | Class representing a function. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | def __init__(self, name, lineno, col_offset, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | functionType=FunctionType.PUBLIC, isClassMethod=False, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | classDecoratorType=None, isReturnAnnotated=False, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | hasTypeComment=False, hasOnlyNoneReturns=True, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | isNested=False, decoratorList=None, args=None): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | Constructor |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | @param name name of the function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | @type str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | @param lineno line number |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | @type int |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | @param col_offset column number |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | @type int |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | @param functionType type of the function (defaults to |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | FunctionType.PUBLIC) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | @type FunctionType (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | @param isClassMethod flag indicating a class method (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | @param classDecoratorType type of a function decorator |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | (defaults to None) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112 | @type ClassDecoratorType or None (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113 | @param isReturnAnnotated flag indicating the presence of a return |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | type annotation (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | @param hasTypeComment flag indicating the presence of a type comment |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119 | @param hasOnlyNoneReturns flag indicating only None return values |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120 | (defaults to True) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | @param isNested flag indicating a nested function (defaults to False) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | @type bool (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124 | @param decoratorList list of decorator nodes (defaults to None) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125 | @type list of ast.Attribute, ast.Call or ast.Name (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126 | @param args list of arguments (defaults to None) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127 | @type list of Argument (optional) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129 | self.name = name |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130 | self.lineno = lineno |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131 | self.col_offset = col_offset |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | self.functionType = functionType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | self.isClassMethod = isClassMethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | self.classDecoratorType = classDecoratorType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135 | self.isReturnAnnotated = isReturnAnnotated |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | self.hasTypeComment = hasTypeComment |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | self.hasOnlyNoneReturns = hasOnlyNoneReturns |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138 | self.isNested = isNested |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139 | self.decoratorList = decoratorList |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140 | self.args = args |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | def isFullyAnnotated(self): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144 | Public method to check, if the function definition is fully type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | annotated. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | Note: self.args will always include an Argument object for return. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149 | @return flag indicating a fully annotated function definition |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150 | @rtype bool |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152 | return all(arg.hasTypeAnnotation for arg in self.args) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154 | def isDynamicallyTyped(self): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156 | Public method to check, if a function definition is dynamically typed |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157 | (i.e. completely lacking hints). |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159 | @return flag indicating a dynamically typed function definition |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160 | @rtype bool |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162 | return not any(arg.hasTypeAnnotation for arg in self.args) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164 | def getMissedAnnotations(self): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166 | Public method to provide a list of arguments with missing type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169 | @return list of arguments with missing type annotations |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170 | @rtype list of Argument |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172 | return [arg for arg in self.args if not arg.hasTypeAnnotation] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174 | def getAnnotatedArguments(self): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176 | Public method to get list of arguments with type annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178 | @return list of arguments with type annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179 | @rtype list of Argument |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181 | return [arg for arg in self.args if arg.hasTypeAnnotation] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183 | def hasDecorator(self, checkDecorators): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185 | Public method to check whether the function node is decorated by any of |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186 | the provided decorators. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188 | Decorator matching is done against the provided `checkDecorators` set. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189 | Decorators are assumed to be either a module attribute (e.g. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190 | `@typing.overload`) or name (e.g. `@overload`). For the case of a |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191 | module attribute, only the attribute is checked against |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192 | `overload_decorators`. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194 | Note: Deeper decorator imports (e.g. `a.b.overload`) are not explicitly |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195 | supported. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197 | @param checkDecorators set of decorators to check against |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198 | @type set of str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199 | @return flag indicating the presence of any decorators |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200 | @rtype bool |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202 | for decorator in self.decoratorList: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203 | # Drop to a helper to allow for simpler handling of callable |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204 | # decorators |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205 | return self.__decoratorChecker(decorator, checkDecorators) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206 | else: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207 | return False |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209 | def __decoratorChecker(self, decorator, checkDecorators): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211 | Private method to check the provided decorator for a match against the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212 | provided set of check names. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214 | Decorators are assumed to be of the following form: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215 | * `a.name` or `a.name()` |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216 | * `name` or `name()` |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218 | Note: Deeper imports (e.g. `a.b.name`) are not explicitly supported. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220 | @param decorator decorator node to check |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221 | @type ast.Attribute, ast.Call or ast.Name |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222 | @param checkDecorators set of decorators to check against |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223 | @type set of str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224 | @return flag indicating the presence of any decorators |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225 | @rtype bool |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227 | if isinstance(decorator, ast.Name): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228 | # e.g. `@overload`, where `decorator.id` will be the name |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229 | if decorator.id in checkDecorators: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230 | return True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231 | elif isinstance(decorator, ast.Attribute): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232 | # e.g. `@typing.overload`, where `decorator.attr` will be the name |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233 | if decorator.attr in checkDecorators: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234 | return True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235 | elif isinstance(decorator, ast.Call): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236 | # e.g. `@overload()` or `@typing.overload()`, where |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237 | # `decorator.func` will be `ast.Name` or `ast.Attribute`, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238 | # which we can check recursively |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239 | return self.__decoratorChecker(decorator.func, checkDecorators) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241 | return None |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243 | @classmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244 | def fromNode(cls, node, lines, **kwargs): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246 | Class method to create a Function object from ast.FunctionDef or |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247 | ast.AsyncFunctionDef nodes. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249 | Accept the source code, as a list of strings, in order to get the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250 | column where the function definition ends. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252 | With exceptions, input kwargs are passed straight through to Function's |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253 | __init__. The following kwargs will be overridden: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254 | * function_type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255 | * class_decorator_type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256 | * args |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258 | @param node reference to the function definition node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260 | @param lines list of source code lines |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261 | @type list of str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262 | @keyparam **kwargs keyword arguments |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263 | @type dict |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264 | @return created Function object |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265 | @rtype Function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267 | # Extract function types from function name |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268 | kwargs["functionType"] = cls.getFunctionType(node.name) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
269 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
270 | # Identify type of class method, if applicable |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
271 | if kwargs.get("isClassMethod", False): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
272 | kwargs["classDecoratorType"] = cls.getClassDecoratorType(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
273 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
274 | # Store raw decorator list for use by property methods |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
275 | kwargs["decoratorList"] = node.decorator_list |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
276 | |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
277 | # Instantiate empty args list here since it has no default |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
278 | kwargs["args"] = [] |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
279 | |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
280 | newFunction = cls(node.name, node.lineno, node.col_offset, **kwargs) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
281 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
282 | # Iterate over arguments by type & add |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
283 | for argType in AST_ARG_TYPES: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
284 | args = node.args.__getattribute__(argType) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
285 | if args: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
286 | if not isinstance(args, list): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
287 | args = [args] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
288 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
289 | newFunction.args.extend( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
290 | [Argument.fromNode(arg, argType.upper()) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
291 | for arg in args] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
292 | ) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
293 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
294 | # Create an Argument object for the return hint |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
295 | defEndLineno, defEndColOffset = cls.colonSeeker(node, lines) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
296 | returnArg = Argument("return", defEndLineno, defEndColOffset, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
297 | AnnotationType.RETURN) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
298 | if node.returns: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
299 | returnArg.hasTypeAnnotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
300 | returnArg.has3107Annotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
301 | newFunction.isReturnAnnotated = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
302 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
303 | newFunction.args.append(returnArg) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
304 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
305 | # Type comments in-line with input arguments are handled by the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
306 | # Argument class. If a function-level type comment is present, attempt |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
307 | # to parse for any missed type hints. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
308 | if node.type_comment: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
309 | newFunction.hasTypeComment = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
310 | newFunction = cls.tryTypeComment(newFunction, node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
311 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
312 | # Check for the presence of non-`None` returns using the special-case |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
313 | # return node visitor. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
314 | returnVisitor = ReturnVisitor(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
315 | returnVisitor.visit(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
316 | newFunction.hasOnlyNoneReturns = returnVisitor.hasOnlyNoneReturns |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
317 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
318 | return newFunction |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
319 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
320 | @staticmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
321 | def colonSeeker(node, lines): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
322 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
323 | Static method to find the line & column indices of the function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
324 | definition's closing colon. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
325 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
326 | @param node reference to the function definition node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
327 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
328 | @param lines list of source code lines |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
329 | @type list of str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
330 | @return line and column offset of the colon |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
331 | @rtype tuple of (int, int) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
332 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
333 | # Special case single line function definitions |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
334 | if node.lineno == node.body[0].lineno: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
335 | return Function._singleLineColonSeeker( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
336 | node, lines[node.lineno - 1]) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
337 | |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
338 | # With Python < 3.8, the function node includes the docstring and the |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
339 | # body does not, so we have to rewind through any docstrings, if |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
340 | # present, before looking for the def colon. We should end up with |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
341 | # lines[defEndLineno - 1] having the colon. |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
342 | defEndLineno = node.body[0].lineno |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
343 | if sys.version_info < (3, 8, 0): |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
344 | # If the docstring is on one line then no rewinding is necessary. |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
345 | nTripleQuotes = lines[defEndLineno - 1].count('"""') |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
346 | if nTripleQuotes == 1: |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
347 | # Docstring closure, rewind until the opening is found and take |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
348 | # the line prior. |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
349 | while True: |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
350 | defEndLineno -= 1 |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
351 | if '"""' in lines[defEndLineno - 1]: |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
352 | # Docstring has closed |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
353 | break |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
354 | |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
355 | # Once we've gotten here, we've found the line where the docstring |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
356 | # begins, so we have to step up one more line to get to the close of |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
357 | # the def. |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
358 | defEndLineno -= 1 |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
359 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
360 | # Use str.rfind() to account for annotations on the same line, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
361 | # definition closure should be the last : on the line |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
362 | defEndColOffset = lines[defEndLineno - 1].rfind(":") |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
363 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
364 | return defEndLineno, defEndColOffset |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
365 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
366 | @staticmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
367 | def _singleLineColonSeeker(node, line): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
368 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
369 | Static method to find the line & column indices of a single line |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
370 | function definition. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
371 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
372 | @param node reference to the function definition node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
373 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
374 | @param line source code line |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
375 | @type str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
376 | @return line and column offset of the colon |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
377 | @rtype tuple of (int, int) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
378 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
379 | colStart = node.col_offset |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
380 | colEnd = node.body[0].col_offset |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
381 | defEndColOffset = line.rfind(":", colStart, colEnd) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
382 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
383 | return node.lineno, defEndColOffset |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
384 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
385 | @staticmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
386 | def tryTypeComment(funcObj, node): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
387 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
388 | Static method to infer type hints from a function-level type comment. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
389 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
390 | If a function is type commented it is assumed to have a return |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
391 | annotation, otherwise Python will fail to parse the hint. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
392 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
393 | @param funcObj reference to the Function object |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
394 | @type Function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
395 | @param node reference to the function definition node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
396 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
397 | @return reference to the modified Function object |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
398 | @rtype Function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
399 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
400 | hintTree = ast.parse(node.type_comment, "<func_type>", "func_type") |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
401 | hintTree = Function._maybeInjectClassArgument(hintTree, funcObj) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
402 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
403 | for arg, hintComment in itertools.zip_longest( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
404 | funcObj.args, hintTree.argtypes |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
405 | ): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
406 | if isinstance(hintComment, ast.Ellipsis): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
407 | continue |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
408 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
409 | if arg and hintComment: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
410 | arg.hasTypeAnnotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
411 | arg.hasTypeComment = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
412 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
413 | # Return arg is always last |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
414 | funcObj.args[-1].hasTypeAnnotation = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
415 | funcObj.args[-1].hasTypeComment = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
416 | funcObj.isReturnAnnotated = True |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
417 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
418 | return funcObj |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
419 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
420 | @staticmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
421 | def _maybeInjectClassArgument(hintTree, funcObj): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
422 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
423 | Static method to inject `self` or `cls` args into a type comment to |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
424 | align with PEP 3107-style annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
425 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
426 | Because PEP 484 does not describe a method to provide partial function- |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
427 | level type comments, there is a potential for ambiguity in the context |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
428 | of both class methods and classmethods when aligning type comments to |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
429 | method arguments. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
430 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
431 | These two class methods, for example, should lint equivalently: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
432 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
433 | def bar(self, a): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
434 | # type: (int) -> int |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
435 | ... |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
436 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
437 | def bar(self, a: int) -> int |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
438 | ... |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
439 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
440 | When this example type comment is parsed by `ast` and then matched with |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
441 | the method's arguments, it associates the `int` hint to `self` rather |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
442 | than `a`, so a dummy hint needs to be provided in situations where |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
443 | `self` or `class` are not hinted in the type comment in order to |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
444 | achieve equivalent linting results to PEP-3107 style annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
445 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
446 | A dummy `ast.Ellipses` constant is injected if the following criteria |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
447 | are met: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
448 | 1. The function node is either a class method or classmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
449 | 2. The number of hinted args is at least 1 less than the number |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
450 | of function args |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
451 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
452 | @param hintTree parsed type hint node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
453 | @type ast.FunctionType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
454 | @param funcObj reference to the Function object |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
455 | @type Function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
456 | @return reference to the hint node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
457 | @rtype ast.FunctionType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
458 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
459 | if not funcObj.isClassMethod: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
460 | # Short circuit |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
461 | return hintTree |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
462 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
463 | if ( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
464 | funcObj.classDecoratorType != ClassDecoratorType.STATICMETHOD and |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
465 | len(hintTree.argtypes) < (len(funcObj.args) - 1) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
466 | ): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
467 | # Subtract 1 to skip return arg |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
468 | hintTree.argtypes = [ast.Ellipsis()] + hintTree.argtypes |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
469 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
470 | return hintTree |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
471 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
472 | @staticmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
473 | def getFunctionType(functionName): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
474 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
475 | Static method to determine the function's FunctionType from its name. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
476 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
477 | MethodType is determined by the following priority: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
478 | 1. Special: function name prefixed & suffixed by "__" |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
479 | 2. Private: function name prefixed by "__" |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
480 | 3. Protected: function name prefixed by "_" |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
481 | 4. Public: everything else |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
482 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
483 | @param functionName function name to be checked |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
484 | @type str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
485 | @return type of function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
486 | @rtype FunctionType |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
487 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
488 | if functionName.startswith("__") and functionName.endswith("__"): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
489 | return FunctionType.SPECIAL |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
490 | elif functionName.startswith("__"): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
491 | return FunctionType.PRIVATE |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
492 | elif functionName.startswith("_"): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
493 | return FunctionType.PROTECTED |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
494 | else: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
495 | return FunctionType.PUBLIC |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
496 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
497 | @staticmethod |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
498 | def getClassDecoratorType(functionNode): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
499 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
500 | Static method to get the class method's decorator type from its |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
501 | function node. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
502 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
503 | Only @classmethod and @staticmethod decorators are identified; all |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
504 | other decorators are ignored |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
505 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
506 | If @classmethod or @staticmethod decorators are not present, this |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
507 | function will return None. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
508 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
509 | @param functionNode reference to the function definition node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
510 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
511 | @return class decorator type |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
512 | @rtype ClassDecoratorType or None |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
513 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
514 | # @classmethod and @staticmethod will show up as ast.Name objects, |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
515 | # where callable decorators will show up as ast.Call, which we can |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
516 | # ignore |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
517 | decorators = [ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
518 | decorator.id |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
519 | for decorator in functionNode.decorator_list |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
520 | if isinstance(decorator, ast.Name) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
521 | ] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
522 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
523 | if "classmethod" in decorators: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
524 | return ClassDecoratorType.CLASSMETHOD |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
525 | elif "staticmethod" in decorators: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
526 | return ClassDecoratorType.STATICMETHOD |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
527 | else: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
528 | return None |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
529 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
530 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
531 | class FunctionVisitor(ast.NodeVisitor): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
532 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
533 | Class implementing a node visitor to check function annotations. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
534 | """ |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
535 | AstFuncTypes = (ast.FunctionDef, ast.AsyncFunctionDef) |
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
536 | |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
537 | def __init__(self, lines): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
538 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
539 | Constructor |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
540 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
541 | @param lines source code lines of the function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
542 | @type list of str |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
543 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
544 | self.lines = lines |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
545 | self.functionDefinitions = [] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
546 | self.__context = [] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
547 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
548 | def switchContext(self, node): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
549 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
550 | Public method implementing a context switcher as a generic function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
551 | visitor in order to track function context. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
552 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
553 | Without keeping track of context, it's challenging to reliably |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
554 | differentiate class methods from "regular" functions, especially in the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
555 | case of nested classes. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
556 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
557 | @param node reference to the function definition node to be analyzed |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
558 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
559 | """ |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
560 | if isinstance(node, FunctionVisitor.AstFuncTypes): |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
561 | # Check for non-empty context first to prevent IndexErrors for |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
562 | # non-nested nodes |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
563 | if self.__context: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
564 | if isinstance(self.__context[-1], ast.ClassDef): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
565 | # Check if current context is a ClassDef node & pass the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
566 | # appropriate flag |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
567 | self.functionDefinitions.append( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
568 | Function.fromNode(node, self.lines, isClassMethod=True) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
569 | ) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
570 | elif isinstance( |
8773
3dd81b827455
Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8312
diff
changeset
|
571 | self.__context[-1], FunctionVisitor.AstFuncTypes |
8244
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
572 | ): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
573 | # Check for nested function & pass the appropriate flag |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
574 | self.functionDefinitions.append( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
575 | Function.fromNode(node, self.lines, isNested=True) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
576 | ) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
577 | else: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
578 | self.functionDefinitions.append( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
579 | Function.fromNode(node, self.lines)) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
580 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
581 | self.__context.append(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
582 | self.generic_visit(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
583 | self.__context.pop() |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
584 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
585 | visit_FunctionDef = switchContext |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
586 | visit_AsyncFunctionDef = switchContext |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
587 | visit_ClassDef = switchContext |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
588 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
589 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
590 | class ReturnVisitor(ast.NodeVisitor): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
591 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
592 | Class implementing a node visitor to check the return statements of a |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
593 | function node. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
594 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
595 | If the function node being visited has an explicit return statement of |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
596 | anything other than `None`, the `instance.hasOnlyNoneReturns` flag will |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
597 | be set to `False`. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
598 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
599 | If the function node being visited has no return statement, or contains |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
600 | only return statement(s) that explicitly return `None`, the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
601 | `instance.hasOnlyNoneReturns` flag will be set to `True`. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
602 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
603 | Due to the generic visiting being done, we need to keep track of the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
604 | context in which a non-`None` return node is found. These functions are |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
605 | added to a set that is checked to see whether nor not the parent node is |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
606 | present. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
607 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
608 | def __init__(self, parentNode): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
609 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
610 | Constructor |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
611 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
612 | @param parentNode reference to the function definition node to be |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
613 | analyzed |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
614 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
615 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
616 | self.parentNode = parentNode |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
617 | self.__context = [] |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
618 | self.__nonNoneReturnNodes = set() |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
619 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
620 | @property |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
621 | def hasOnlyNoneReturns(self): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
622 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
623 | Public method indicating, that the parent node isn't in the visited |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
624 | nodes that don't return `None`. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
625 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
626 | @return flag indicating, that the parent node isn't in the visited |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
627 | nodes that don't return `None` |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
628 | @rtype bool |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
629 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
630 | return self.parentNode not in self.__nonNoneReturnNodes |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
631 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
632 | def visit_Return(self, node): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
633 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
634 | Public method to check each Return node to see if it returns anything |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
635 | other than `None`. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
636 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
637 | If the node being visited returns anything other than `None`, its |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
638 | parent context is added to the set of non-returning child nodes of |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
639 | the parent node. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
640 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
641 | @param node reference to the AST Return node |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
642 | @type ast.Return |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
643 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
644 | if node.value is not None: |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
645 | # In the event of an explicit `None` return (`return None`), the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
646 | # node body will be an instance of either `ast.Constant` (3.8+) or |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
647 | # `ast.NameConstant`, which we need to check to see if it's |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
648 | # actually `None` |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
649 | if ( |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
650 | isinstance(node.value, (ast.Constant, ast.NameConstant)) and |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
651 | node.value.value is None |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
652 | ): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
653 | return |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
654 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
655 | self.__nonNoneReturnNodes.add(self.__context[-1]) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
656 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
657 | def switchContext(self, node): |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
658 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
659 | Public method implementing a context switcher as a generic function |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
660 | visitor in order to track function context. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
661 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
662 | Without keeping track of context, it's challenging to reliably |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
663 | differentiate class methods from "regular" functions, especially in the |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
664 | case of nested classes. |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
665 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
666 | @param node reference to the function definition node to be analyzed |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
667 | @type ast.AsyncFunctionDef or ast.FunctionDef |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
668 | """ |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
669 | self.__context.append(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
670 | self.generic_visit(node) |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
671 | self.__context.pop() |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
672 | |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
673 | visit_FunctionDef = switchContext |
ed8cb108b27b
Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
674 | visit_AsyncFunctionDef = switchContext |