src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/TextVisitor.py

Sat, 26 Apr 2025 12:34:32 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 26 Apr 2025 12:34:32 +0200
branch
eric7
changeset 11240
c48c615c04a3
parent 11150
73d80859079c
permissions
-rw-r--r--

MicroPython
- Added a configuration option to disable the support for the no longer produced Pimoroni Pico Wireless Pack.

11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de>
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a node visitor for bytes and str instances.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import ast
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import AstUtilities
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 class TextVisitor(ast.NodeVisitor):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 Class implementing a node visitor for bytes and str instances.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 It tries to detect docstrings as string of the first expression of each
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 module, class or function.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 # modeled after the string format flake8 extension
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 def __init__(self):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 self.nodes = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 self.calls = {}
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 def __addNode(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 Private method to add a node to our list of nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @param node reference to the node to add
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @type ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 if not hasattr(node, "is_docstring"):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 node.is_docstring = False
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 self.nodes.append(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 def visit_Constant(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 Public method to handle constant nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @param node reference to the bytes node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @type ast.Constant
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 if AstUtilities.isBaseString(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.__addNode(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 else:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 super().generic_visit(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 def __visitDefinition(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 Private method handling class and function definitions.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 @param node reference to the node to handle
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 @type ast.FunctionDef, ast.AsyncFunctionDef or ast.ClassDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 # Manually traverse class or function definition
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 # * Handle decorators normally
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 # * Use special check for body content
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 # * Don't handle the rest (e.g. bases)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 for decorator in node.decorator_list:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 self.visit(decorator)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 self.__visitBody(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 def __visitBody(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 Private method to traverse the body of the node manually.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 If the first node is an expression which contains a string or bytes it
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 marks that as a docstring.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 @param node reference to the node to traverse
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 @type ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 if (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 node.body
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 and isinstance(node.body[0], ast.Expr)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 and AstUtilities.isBaseString(node.body[0].value)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 node.body[0].value.is_docstring = True
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 for subnode in node.body:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 self.visit(subnode)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 def visit_Module(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 Public method to handle a module.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @param node reference to the node to handle
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @type ast.Module
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 self.__visitBody(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 def visit_ClassDef(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 Public method to handle a class definition.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 @param node reference to the node to handle
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 @type ast.ClassDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 # Skipped nodes: ('name', 'bases', 'keywords', 'starargs', 'kwargs')
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 self.__visitDefinition(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 def visit_FunctionDef(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 Public method to handle a function definition.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 @param node reference to the node to handle
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 @type ast.FunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 # Skipped nodes: ('name', 'args', 'returns')
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 self.__visitDefinition(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 def visit_AsyncFunctionDef(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 Public method to handle an asynchronous function definition.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 @param node reference to the node to handle
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 @type ast.AsyncFunctionDef
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 # Skipped nodes: ('name', 'args', 'returns')
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 self.__visitDefinition(node)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 def visit_Call(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 Public method to handle a function call.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 @param node reference to the node to handle
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 @type ast.Call
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 if isinstance(node.func, ast.Attribute) and node.func.attr == "format":
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 if AstUtilities.isBaseString(node.func.value):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 self.calls[node.func.value] = (node, False)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 elif (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 isinstance(node.func.value, ast.Name)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 and node.func.value.id == "str"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 and node.args
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 and AstUtilities.isBaseString(node.args[0])
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 ):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 self.calls[node.args[0]] = (node, True)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 super().generic_visit(node)

eric ide

mercurial