src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/DefaultMatchCaseVisitor.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 to check default match cases.
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
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 class DefaultMatchCaseVisitor(ast.NodeVisitor):
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 implementing a node visitor to check default match cases.
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 Note: This class is modeled after flake8-spm v0.0.1.
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
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 def __init__(self):
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 Constructor
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 super().__init__()
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 self.violations = []
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 def visit_Match(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 Public method to handle Match nodes.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @type ast.Match
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 for badNode, issueCode in self.__badNodes(node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 self.violations.append((badNode, issueCode))
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 self.generic_visit(node)
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 def __badNodes(self, node):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 Private method to yield bad match nodes.
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 @param node reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @type ast.Match
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @yield tuple containing a reference to bad match case node and the corresponding
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 issue code
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @ytype tyuple of (ast.AST, str)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 for case in node.cases:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 if self.__emptyMatchDefault(case):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 if self.__lastStatementDoesNotRaise(case):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 yield self.__findBadNode(case), "M-901"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 elif self.__returnPrecedesExceptionRaising(case):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 yield self.__findBadNode(case), "M-902"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 def __emptyMatchDefault(self, case):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 Private method to check for an empty default match case.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 @param case reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 @type ast.match_case
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 @return flag indicating an empty default match case
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 @rtype bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 pattern = case.pattern
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 return isinstance(pattern, ast.MatchAs) and (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 pattern.pattern is None
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 or (
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 isinstance(pattern.pattern, ast.MatchAs)
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 and pattern.pattern.pattern is None
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 )
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 def __lastStatementDoesNotRaise(self, case):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 Private method to check that the last case statement does not raise an
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 exception.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 @param case reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 @type ast.match_case
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @return flag indicating that the last case statement does not raise an
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 exception
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 @rtype bool
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 return not isinstance(case.body[-1], ast.Raise)
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 def __returnPrecedesExceptionRaising(self, case):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 Private method to check that no return precedes an exception raising.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 @param case reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 @type ast.match_case
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 @return flag indicating that a return precedes an exception raising
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @rtype bool
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 returnIndex = -1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 raiseIndex = -1
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 for index, body in enumerate(case.body):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 if isinstance(body, ast.Return):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 returnIndex = index
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 elif isinstance(body, ast.Raise):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 raiseIndex = index
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 return returnIndex >= 0 and returnIndex < raiseIndex
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 def __findBadNode(self, case) -> ast.AST:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 Private method returning a reference to the bad node of a case 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 @param case reference to the node to be processed
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 @type ast.match_case
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 @return reference to the bad node
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 @rtype ast.AST
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 """
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 for body in case.body:
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 # Handle special case when return precedes exception raising.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 # In this case the bad node is that with the return statement.
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 if isinstance(body, ast.Return):
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 return body
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 return case.body[-1]

eric ide

mercurial