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

Fri, 19 May 2023 18:08:45 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 19 May 2023 18:08:45 +0200
branch
eric7
changeset 10043
f1427d95cfde
parent 9653
e67609152c5e
child 10058
5d965939ab85
permissions
-rw-r--r--

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

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
9653
e67609152c5e Updated copyright for 2023.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9500
diff changeset
3 # Copyright (c) 2021 - 2023 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 #
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
11 # The visitor and associated classes are adapted from flake8-annotations v2.9.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 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
28
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
29 def __init__(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
30 self,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
31 argname,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
32 lineno,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
33 col_offset,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
34 annotationType,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
35 hasTypeAnnotation=False,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
36 has3107Annotation=False,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
37 hasTypeComment=False,
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
38 isDynamicallyTyped=False,
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
39 ):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
42
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @param argname name of the argument
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @type str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @param lineno line number
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @type int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @param col_offset column number
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @type int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @param annotationType type of annotation
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 @type AnnotationType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 @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
52 annotation (defaults to False)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 @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
55 annotation (defaults to False)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 @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
58 (defaults to False)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 @type bool (optional)
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
60 @param isDynamicallyTyped flag indicating dynamic typing (defaults to False)
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
61 @type bool (optional)
8244
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 self.argname = argname
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 self.lineno = lineno
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 self.col_offset = col_offset
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 self.annotationType = annotationType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 self.hasTypeAnnotation = hasTypeAnnotation
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 self.has3107Annotation = has3107Annotation
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 self.hasTypeComment = hasTypeComment
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
70 self.isDynamicallyTyped = isDynamicallyTyped
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
71
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 @classmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 def fromNode(cls, node, annotationTypeName):
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 Class method to create an Argument object based on the given node.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
76
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 @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
78 @type ast.arguments
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 @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
80 @type str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 @return Argument object
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @rtype Argument
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 annotationType = AnnotationType[annotationTypeName]
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 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
86
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 newArg.hasTypeAnnotation = False
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 if node.annotation:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 newArg.hasTypeAnnotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 newArg.has3107Annotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 if node.type_comment:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 newArg.hasTypeAnnotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 newArg.hasTypeComment = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
96 if cls._isAnnotatedAny(node.type_comment):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
97 newArg.isDynamicallyTyped = True
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
98
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 return newArg
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
101 @staticmethod
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
102 def _isAnnotatedAny(argExpr):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
103 """
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
104 Static method to check if the provided expression node is annotated with
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
105 'typing.Any'.
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
106
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
107 Support is provided for the following patterns:
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
108 * 'from typing import Any; foo: Any'
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
109 * 'import typing; foo: typing.Any'
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
110 * 'import typing as <alias>; foo: <alias>.Any'
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
111
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
112 Type comments are also supported. Inline type comments are assumed to be
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
113 passed here as 'str', and function-level type comments are assumed to be
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
114 passed as 'ast.expr'.
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
115
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
116 @param argExpr DESCRIPTION
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
117 @type ast.expr or str
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
118 @return flag indicating an annotation with 'typing.Any'
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
119 @rtype bool
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
120 """
9500
5771348ded12 Corrected some code style issues and changed some suppressed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
121 if isinstance(argExpr, ast.Name) and argExpr.id == "Any":
5771348ded12 Corrected some code style issues and changed some suppressed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
122 return True
5771348ded12 Corrected some code style issues and changed some suppressed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
123 elif isinstance(argExpr, ast.Attribute) and argExpr.attr == "Any":
5771348ded12 Corrected some code style issues and changed some suppressed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
124 return True
5771348ded12 Corrected some code style issues and changed some suppressed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
125 elif isinstance(argExpr, str) and argExpr.split(".", maxsplit=1)[-1] == "Any":
5771348ded12 Corrected some code style issues and changed some suppressed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9276
diff changeset
126 return True
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
127
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
128 return False
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
129
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 class Function:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 Class representing a function.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
135
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
136 def __init__(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
137 self,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
138 name,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
139 lineno,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
140 col_offset,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
141 functionType=FunctionType.PUBLIC,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
142 isClassMethod=False,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
143 classDecoratorType=None,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
144 isReturnAnnotated=False,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
145 hasTypeComment=False,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
146 hasOnlyNoneReturns=True,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
147 isNested=False,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
148 decoratorList=None,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
149 args=None,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
150 ):
8244
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 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
153
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 @param name name of the function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 @type str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 @param lineno line number
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 @type int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 @param col_offset column number
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 @type int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 @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
161 FunctionType.PUBLIC)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 @type FunctionType (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 @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
164 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 @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
166 (defaults to None)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 @type ClassDecoratorType or None (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 @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
169 type annotation (defaults to False)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 @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
172 (defaults to False)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 @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
175 (defaults to True)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 @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
178 @type bool (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 @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
180 @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
181 @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
182 @type list of Argument (optional)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 self.name = name
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 self.lineno = lineno
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 self.col_offset = col_offset
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 self.functionType = functionType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 self.isClassMethod = isClassMethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 self.classDecoratorType = classDecoratorType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 self.isReturnAnnotated = isReturnAnnotated
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 self.hasTypeComment = hasTypeComment
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 self.hasOnlyNoneReturns = hasOnlyNoneReturns
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 self.isNested = isNested
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 self.decoratorList = decoratorList
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 self.args = args
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
196
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 def isFullyAnnotated(self):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 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
200 annotated.
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 Note: self.args will always include an Argument object for return.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
203
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 @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
205 @rtype bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 return all(arg.hasTypeAnnotation for arg in self.args)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
208
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 def isDynamicallyTyped(self):
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 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
212 (i.e. completely lacking hints).
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
213
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 @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
215 @rtype bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 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
218
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 def getMissedAnnotations(self):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 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
222 annotations.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
223
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 @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
225 @rtype list of Argument
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 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
228
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 def getAnnotatedArguments(self):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 Public method to get list of arguments with type annotations.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
232
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 @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
234 @rtype list of Argument
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 return [arg for arg in self.args if arg.hasTypeAnnotation]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
237
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 def hasDecorator(self, checkDecorators):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 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
241 the provided decorators.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
242
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 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
244 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
245 `@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
246 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
247 `overload_decorators`.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
248
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 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
250 supported.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
251
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 @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
253 @type set of str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 @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
255 @rtype bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 for decorator in self.decoratorList:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 # 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
259 # decorators
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 return self.__decoratorChecker(decorator, checkDecorators)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 return False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
263
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 def __decoratorChecker(self, decorator, checkDecorators):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 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
267 provided set of check names.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
268
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 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
270 * `a.name` or `a.name()`
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 * `name` or `name()`
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
272
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 Note: Deeper imports (e.g. `a.b.name`) are not explicitly supported.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
274
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 @param decorator decorator node to check
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 @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
277 @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
278 @type set of str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 @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
280 @rtype bool
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 if isinstance(decorator, ast.Name):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 # 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
284 if decorator.id in checkDecorators:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 return True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 elif isinstance(decorator, ast.Attribute):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 # 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
288 if decorator.attr in checkDecorators:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 return True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 elif isinstance(decorator, ast.Call):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 # 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
292 # `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
293 # which we can check recursively
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 return self.__decoratorChecker(decorator.func, checkDecorators)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
295
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
297
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 @classmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 def fromNode(cls, node, lines, **kwargs):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 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
302 ast.AsyncFunctionDef nodes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
303
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 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
305 column where the function definition ends.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
306
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 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
308 __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
309 * function_type
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 * class_decorator_type
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 * args
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
312
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 @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
314 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 @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
316 @type list of str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 @keyparam **kwargs keyword arguments
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 @type dict
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 @return created Function object
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 @rtype Function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 # Extract function types from function name
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 kwargs["functionType"] = cls.getFunctionType(node.name)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
324
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 # 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
326 if kwargs.get("isClassMethod", False):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 kwargs["classDecoratorType"] = cls.getClassDecoratorType(node)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
328
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 # 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
330 kwargs["decoratorList"] = node.decorator_list
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
331
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
332 # 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
333 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
334
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 newFunction = cls(node.name, node.lineno, node.col_offset, **kwargs)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
336
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 # Iterate over arguments by type & add
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 for argType in AST_ARG_TYPES:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 args = node.args.__getattribute__(argType)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 if args:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 if not isinstance(args, list):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 args = [args]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
343
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 newFunction.args.extend(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
345 [Argument.fromNode(arg, argType.upper()) for arg in args]
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
347
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 # 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
349 defEndLineno, defEndColOffset = cls.colonSeeker(node, lines)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
350 returnArg = Argument(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
351 "return", defEndLineno, defEndColOffset, AnnotationType.RETURN
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
352 )
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 if node.returns:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 returnArg.hasTypeAnnotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 returnArg.has3107Annotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 newFunction.isReturnAnnotated = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
357
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
358 if Argument._isAnnotatedAny(node.returns):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
359 returnArg.isDynamicallyTyped = True
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
360
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 newFunction.args.append(returnArg)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
362
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 # 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
364 # 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
365 # 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
366 if node.type_comment:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 newFunction.hasTypeComment = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 newFunction = cls.tryTypeComment(newFunction, node)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
369
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 # 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
371 # return node visitor.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 returnVisitor = ReturnVisitor(node)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 returnVisitor.visit(node)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 newFunction.hasOnlyNoneReturns = returnVisitor.hasOnlyNoneReturns
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
375
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 return newFunction
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
377
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 @staticmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 def colonSeeker(node, lines):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 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
382 definition's closing colon.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
383
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 @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
385 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 @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
387 @type list of str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 @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
389 @rtype tuple of (int, int)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 # Special case single line function definitions
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 if node.lineno == node.body[0].lineno:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
393 return Function._singleLineColonSeeker(node, lines[node.lineno - 1])
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
394
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
395 # 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
396 # 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
397 # 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
398 # 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
399 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
400 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
401 # 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
402 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
403 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
404 # 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
405 # 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
406 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
407 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
408 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
409 # 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
410 break
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
411
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
412 # 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
413 # 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
414 # 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
415 defEndLineno -= 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
416
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 # 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
418 # 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
419 defEndColOffset = lines[defEndLineno - 1].rfind(":")
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
420
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421 return defEndLineno, defEndColOffset
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
422
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 @staticmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 def _singleLineColonSeeker(node, line):
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 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
427 function definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
428
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 @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
430 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 @param line source code line
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 @type str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433 @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
434 @rtype tuple of (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 colStart = node.col_offset
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 colEnd = node.body[0].col_offset
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 defEndColOffset = line.rfind(":", colStart, colEnd)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
439
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 return node.lineno, defEndColOffset
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
441
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
442 @staticmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443 def tryTypeComment(funcObj, node):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 Static method to infer type hints from a function-level type comment.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
446
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 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
448 annotation, otherwise Python will fail to parse the hint.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
449
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450 @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
451 @type Function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 @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
453 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 @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
455 @rtype Function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 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
458 hintTree = Function._maybeInjectClassArgument(hintTree, funcObj)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
459
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
460 for arg, hintComment in itertools.zip_longest(funcObj.args, hintTree.argtypes):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 if isinstance(hintComment, ast.Ellipsis):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
463
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 if arg and hintComment:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 arg.hasTypeAnnotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 arg.hasTypeComment = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
467
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
468 if Argument._isAnnotatedAny(hintComment):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
469 arg.isDynamicallyTyped = True
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
470
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 # Return arg is always last
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 funcObj.args[-1].hasTypeAnnotation = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 funcObj.args[-1].hasTypeComment = True
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 funcObj.isReturnAnnotated = True
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
475 if Argument._isAnnotatedAny(hintTree.returns):
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
476 arg.isDynamicallyTyped = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
477
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 return funcObj
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
479
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 @staticmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 def _maybeInjectClassArgument(hintTree, funcObj):
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 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
484 align with PEP 3107-style annotations.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
485
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
486 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
487 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
488 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
489 method arguments.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
490
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 These two class methods, for example, should lint equivalently:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
492
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 def bar(self, a):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494 # type: (int) -> int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 ...
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
496
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
497 def bar(self, a: int) -> int
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498 ...
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
499
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 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
501 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
502 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
503 `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
504 achieve equivalent linting results to PEP-3107 style annotations.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
505
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506 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
507 are met:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 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
509 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
510 of function args
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
511
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512 @param hintTree parsed type hint node
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 @type ast.FunctionType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 @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
515 @type Function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
516 @return reference to the hint node
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517 @rtype ast.FunctionType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 if not funcObj.isClassMethod:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
520 # Short circuit
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 return hintTree
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522
9276
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
523 if funcObj.classDecoratorType != ClassDecoratorType.STATICMETHOD and (
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
524 len(hintTree.argtypes) < (len(funcObj.args) - 1)
e6748a5e24b9 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
525 ):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
526 # Subtract 1 to skip return arg
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
527 hintTree.argtypes = [ast.Ellipsis()] + hintTree.argtypes
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
528
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 return hintTree
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
530
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
531 @staticmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532 def getFunctionType(functionName):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
533 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534 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
535
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
536 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
537 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
538 2. Private: function name prefixed by "__"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
539 3. Protected: function name prefixed by "_"
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
540 4. Public: everything else
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
541
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
542 @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
543 @type str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 @return type of function
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545 @rtype FunctionType
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 if functionName.startswith("__") and functionName.endswith("__"):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
548 return FunctionType.SPECIAL
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
549 elif functionName.startswith("__"):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 return FunctionType.PRIVATE
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
551 elif functionName.startswith("_"):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
552 return FunctionType.PROTECTED
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
553 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
554 return FunctionType.PUBLIC
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
555
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
556 @staticmethod
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
557 def getClassDecoratorType(functionNode):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
558 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
559 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
560 function node.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
561
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
562 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
563 other decorators are ignored
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
564
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
565 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
566 function will return None.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
567
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
568 @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
569 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
570 @return class decorator type
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
571 @rtype ClassDecoratorType or None
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 # @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
574 # 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
575 # ignore
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
576 decorators = [
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
577 decorator.id
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
578 for decorator in functionNode.decorator_list
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
579 if isinstance(decorator, ast.Name)
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
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
582 if "classmethod" in decorators:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
583 return ClassDecoratorType.CLASSMETHOD
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
584 elif "staticmethod" in decorators:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
585 return ClassDecoratorType.STATICMETHOD
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
586 else:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
587 return None
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 FunctionVisitor(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 function annotations.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
593 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
594
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
595 AstFuncTypes = (ast.FunctionDef, ast.AsyncFunctionDef)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
596
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
597 def __init__(self, lines):
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 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
600
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
601 @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
602 @type list of str
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
603 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
604 self.lines = lines
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
605 self.functionDefinitions = []
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
606 self.__context = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
607
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
608 def switchContext(self, node):
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 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
611 visitor in order to track function context.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
612
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
613 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
614 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
615 case of nested classes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
616
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
617 @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
618 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
619 """
8773
3dd81b827455 Extended the annotations checker to check for missing 'from __future__ import annotations'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
620 if isinstance(node, FunctionVisitor.AstFuncTypes):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
621 # 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
622 # non-nested nodes
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
623 if self.__context:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
624 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
625 # 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
626 # appropriate flag
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
627 self.functionDefinitions.append(
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
628 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
629 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
630 elif isinstance(self.__context[-1], FunctionVisitor.AstFuncTypes):
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
631 # 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
632 self.functionDefinitions.append(
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
633 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
634 )
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
635 else:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
636 self.functionDefinitions.append(Function.fromNode(node, self.lines))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
637
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
638 self.__context.append(node)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
639 self.generic_visit(node)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
640 self.__context.pop()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
641
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
642 visit_FunctionDef = switchContext
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
643 visit_AsyncFunctionDef = switchContext
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
644 visit_ClassDef = switchContext
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
645
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
646
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
647 class ReturnVisitor(ast.NodeVisitor):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
648 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
649 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
650 function node.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
651
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
652 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
653 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
654 be set to `False`.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
655
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
656 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
657 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
658 `instance.hasOnlyNoneReturns` flag will be set to `True`.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
659
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
660 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
661 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
662 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
663 present.
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
664 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
665
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
666 def __init__(self, parentNode):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
667 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
668 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
669
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
670 @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
671 analyzed
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
672 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
673 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
674 self.parentNode = parentNode
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
675 self.__context = []
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
676 self.__nonNoneReturnNodes = set()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
677
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
678 @property
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
679 def hasOnlyNoneReturns(self):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
680 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
681 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
682 nodes that don't return `None`.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
683
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
684 @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
685 nodes that don't return `None`
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
686 @rtype bool
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
687 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
688 return self.parentNode not in self.__nonNoneReturnNodes
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
689
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
690 def visit_Return(self, node):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
691 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
692 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
693 other than `None`.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
694
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
695 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
696 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
697 the parent node.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
698
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
699 @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
700 @type ast.Return
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
701 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
702 if node.value is not None:
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
703 # 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
704 # 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
705 # `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
706 # actually `None`
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
707 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
708 isinstance(node.value, (ast.Constant, ast.NameConstant))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
709 and node.value.value is None
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
710 ):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
711 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
712
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
713 self.__nonNoneReturnNodes.add(self.__context[-1])
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
714
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
715 def switchContext(self, node):
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
716 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
717 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
718 visitor in order to track function context.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
719
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
720 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
721 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
722 case of nested classes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
723
8244
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
724 @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
725 @type ast.AsyncFunctionDef or ast.FunctionDef
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
726 """
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
727 self.__context.append(node)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
728 self.generic_visit(node)
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
729 self.__context.pop()
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
730
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
731 visit_FunctionDef = switchContext
ed8cb108b27b Code Style Checker: reworked the type annotations checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
732 visit_AsyncFunctionDef = switchContext

eric ide

mercurial