eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/ast_unparse.py

Sun, 26 Jun 2022 17:21:11 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 26 Jun 2022 17:21:11 +0200
branch
eric7
changeset 9179
9ae7ca51e347
parent 8435
f3554a0a34ca
permissions
-rw-r--r--

Changed default max. line length of code documentation style checker and code style fixer to 88 characters because this gives better looking code (see 'Black' tool).

8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 """
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2 ast_unparse
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 ~~~~~~~~~~~
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5 This module is a backport of the unparse function of the Python 3.9
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 ast module.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 Original ast module code is
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9 :copyright: Copyright 2008 by Armin Ronacher.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 :license: Python License.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 """
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import ast
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 import sys
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 from enum import IntEnum, auto
8435
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
16 from contextlib import contextmanager
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
8252
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
18 import AstUtilities
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
19
8435
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
20 try:
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
21 from contextlib import nullcontext
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
22 except ImportError:
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
23 # 'nullcontext'' was defined in Python 3.7. The following code is a copy
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
24 # of that class.
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
25
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
26 from contextlib import AbstractContextManager
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
27
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
28 class nullcontext(AbstractContextManager):
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
29 """Context manager that does no additional processing.
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
30
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
31 Used as a stand-in for a normal context manager, when a particular
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
32 block of code is only sometimes used with a normal context manager:
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
33
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
34 cm = optional_cm if condition else nullcontext()
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
35 with cm:
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
36 # Perform operation, using optional_cm if condition is True
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
37 """
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
38
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
39 def __init__(self, enter_result=None):
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
40 self.enter_result = enter_result
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
41
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
42 def __enter__(self):
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
43 return self.enter_result
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
44
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
45 def __exit__(self, *excinfo):
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
46 pass
f3554a0a34ca ast_unparse: added code for the nullcontext class, which is available as of Python 3.7 only.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
47
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 # Large float and imaginary literals get turned into infinities in the AST.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 # We unparse those infinities to INFSTR.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 _INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 class _Precedence(IntEnum):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 """Precedence table that originated from python grammar."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 TUPLE = auto()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 YIELD = auto() # 'yield', 'yield from'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 TEST = auto() # 'if'-'else', 'lambda'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 OR = auto() # 'or'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 AND = auto() # 'and'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 NOT = auto() # 'not'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 CMP = auto() # '<', '>', '==', '>=', '<=', '!=',
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 # 'in', 'not in', 'is', 'is not'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 EXPR = auto()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 BOR = EXPR # '|'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 BXOR = auto() # '^'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 BAND = auto() # '&'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 SHIFT = auto() # '<<', '>>'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 ARITH = auto() # '+', '-'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 TERM = auto() # '*', '@', '/', '%', '//'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 FACTOR = auto() # unary '+', '-', '~'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 POWER = auto() # '**'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 AWAIT = auto() # 'await'
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 ATOM = auto()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 def next(self):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 try:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 return self.__class__(self + 1)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 except ValueError:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 return self
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 _SINGLE_QUOTES = ("'", '"')
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 _MULTI_QUOTES = ('"""', "'''")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 _ALL_QUOTES = (*_SINGLE_QUOTES, *_MULTI_QUOTES)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 class _Unparser(ast.NodeVisitor):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 """Methods in this class recursively traverse an AST and
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 output source code for the abstract syntax; original formatting
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 is disregarded."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 def __init__(self, *, _avoid_backslashes=False):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 self._source = []
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 self._buffer = []
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 self._precedences = {}
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 self._type_ignores = {}
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 self._indent = 0
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 self._avoid_backslashes = _avoid_backslashes
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 def interleave(self, inter, f, seq):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 """Call f on each item in seq, calling inter() in between."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 seq = iter(seq)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 try:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 f(next(seq))
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 except StopIteration:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 pass
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 for x in seq:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 inter()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 f(x)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 def items_view(self, traverser, items):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 """Traverse and separate the given *items* with a comma and append it to
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 the buffer. If *items* is a single item sequence, a trailing comma
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 will be added."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 if len(items) == 1:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 traverser(items[0])
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 self.write(",")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 self.interleave(lambda: self.write(", "), traverser, items)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 def maybe_newline(self):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 """Adds a newline if it isn't the start of generated source"""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 if self._source:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 self.write("\n")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 def fill(self, text=""):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 """Indent a piece of text and append it, according to the current
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 indentation level"""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 self.maybe_newline()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 self.write(" " * self._indent + text)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 def write(self, text):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 """Append a piece of text"""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 self._source.append(text)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 def buffer_writer(self, text):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 self._buffer.append(text)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 @property
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 def buffer(self):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 value = "".join(self._buffer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 self._buffer.clear()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 return value
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 @contextmanager
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 def block(self, *, extra = None):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 """A context manager for preparing the source for blocks. It adds
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 the character':', increases the indentation on enter and decreases
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 the indentation on exit. If *extra* is given, it will be directly
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 appended after the colon character.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 """
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 self.write(":")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 if extra:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 self.write(extra)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 self._indent += 1
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 yield
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 self._indent -= 1
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 @contextmanager
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 def delimit(self, start, end):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 """A context manager for preparing the source for expressions. It adds
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 *start* to the buffer and enters, after exit it adds *end*."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 self.write(start)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 yield
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 self.write(end)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 def delimit_if(self, start, end, condition):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 if condition:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 return self.delimit(start, end)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 return nullcontext()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 def require_parens(self, precedence, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 """Shortcut to adding precedence related parens"""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 return self.delimit_if("(", ")", self.get_precedence(node) > precedence)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 def get_precedence(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 return self._precedences.get(node, _Precedence.TEST)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 def set_precedence(self, precedence, *nodes):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 for node in nodes:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 self._precedences[node] = precedence
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 def get_raw_docstring(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 """If a docstring node is found in the body of the *node* parameter,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 return that docstring node, None otherwise.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 Logic mirrored from ``_PyAST_GetDocString``."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 if not isinstance(
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 node, (ast.AsyncFunctionDef, ast.FunctionDef, ast.ClassDef,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 ast.Module)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 ) or len(node.body) < 1:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 return None
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 node = node.body[0]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 if not isinstance(node, ast.Expr):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 return None
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 node = node.value
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 if isinstance(node, ast.Constant) and isinstance(node.value, str):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 return node
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 def get_type_comment(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 comment = self._type_ignores.get(node.lineno) or node.type_comment
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 if comment is not None:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 return f" # type: {comment}"
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 def traverse(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 if isinstance(node, list):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 for item in node:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 self.traverse(item)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 super().visit(node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 def visit(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 """Outputs a source code string that, if converted back to an ast
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 (using ast.parse) will generate an AST equivalent to *node*"""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 self._source = []
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 self.traverse(node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 return "".join(self._source)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 def _write_docstring_and_traverse_body(self, node):
8201
a1149b1b4456 Fixed some code in ast_unparse to make it compatible with older Python versions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8186
diff changeset
222 docstring = self.get_raw_docstring(node)
a1149b1b4456 Fixed some code in ast_unparse to make it compatible with older Python versions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8186
diff changeset
223 if (docstring):
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 self._write_docstring(docstring)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 self.traverse(node.body[1:])
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 def visit_Module(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 self._type_ignores = {
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 ignore.lineno: f"ignore{ignore.tag}"
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 for ignore in node.type_ignores
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 }
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 self._write_docstring_and_traverse_body(node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 self._type_ignores.clear()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 def visit_FunctionType(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 with self.delimit("(", ")"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 self.interleave(
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 lambda: self.write(", "), self.traverse, node.argtypes
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 )
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 self.write(" -> ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 self.traverse(node.returns)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 def visit_Expr(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 self.fill()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 self.set_precedence(_Precedence.YIELD, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 def visit_NamedExpr(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 with self.require_parens(_Precedence.TUPLE, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 self.set_precedence(_Precedence.ATOM, node.target, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 self.traverse(node.target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 self.write(" := ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 def visit_Import(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 self.fill("import ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 self.interleave(lambda: self.write(", "), self.traverse, node.names)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 def visit_ImportFrom(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 self.fill("from ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 self.write("." * node.level)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 if node.module:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 self.write(node.module)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 self.write(" import ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 self.interleave(lambda: self.write(", "), self.traverse, node.names)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 def visit_Assign(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 self.fill()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 for target in node.targets:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 self.traverse(target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 self.write(" = ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 self.traverse(node.value)
8201
a1149b1b4456 Fixed some code in ast_unparse to make it compatible with older Python versions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8186
diff changeset
276 type_comment = self.get_type_comment(node)
a1149b1b4456 Fixed some code in ast_unparse to make it compatible with older Python versions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8186
diff changeset
277 if type_comment:
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 self.write(type_comment)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 def visit_AugAssign(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 self.fill()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 self.traverse(node.target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 self.write(" " + self.binop[node.op.__class__.__name__] + "= ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 def visit_AnnAssign(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 self.fill()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 with self.delimit_if("(", ")", not node.simple and isinstance(node.target, ast.Name)):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 self.traverse(node.target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 self.traverse(node.annotation)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 if node.value:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 self.write(" = ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 def visit_Return(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 self.fill("return")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 if node.value:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 def visit_Pass(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 self.fill("pass")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 def visit_Break(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 self.fill("break")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 def visit_Continue(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 self.fill("continue")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 def visit_Delete(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 self.fill("del ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 self.interleave(lambda: self.write(", "), self.traverse, node.targets)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 def visit_Assert(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 self.fill("assert ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 self.traverse(node.test)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 if node.msg:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 self.traverse(node.msg)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 def visit_Global(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 self.fill("global ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 self.interleave(lambda: self.write(", "), self.write, node.names)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 def visit_Nonlocal(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 self.fill("nonlocal ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 self.interleave(lambda: self.write(", "), self.write, node.names)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 def visit_Await(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 with self.require_parens(_Precedence.AWAIT, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 self.write("await")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 if node.value:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 self.set_precedence(_Precedence.ATOM, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 def visit_Yield(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 with self.require_parens(_Precedence.YIELD, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 self.write("yield")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 if node.value:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 self.set_precedence(_Precedence.ATOM, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 def visit_YieldFrom(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 with self.require_parens(_Precedence.YIELD, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 self.write("yield from ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 if not node.value:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 raise ValueError("Node can't be used without a value attribute.")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 self.set_precedence(_Precedence.ATOM, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 def visit_Raise(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 self.fill("raise")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 if not node.exc:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 if node.cause:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 raise ValueError("Node can't use cause without an exception.")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 return
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 self.traverse(node.exc)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 if node.cause:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 self.write(" from ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 self.traverse(node.cause)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 def visit_Try(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 self.fill("try")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 for ex in node.handlers:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 self.traverse(ex)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 if node.orelse:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 self.fill("else")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 self.traverse(node.orelse)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 if node.finalbody:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 self.fill("finally")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 self.traverse(node.finalbody)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 def visit_ExceptHandler(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 self.fill("except")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 if node.type:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 self.traverse(node.type)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 if node.name:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 self.write(" as ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 self.write(node.name)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 def visit_ClassDef(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 self.maybe_newline()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 for deco in node.decorator_list:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 self.fill("@")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 self.traverse(deco)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 self.fill("class " + node.name)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 with self.delimit_if("(", ")", condition = node.bases or node.keywords):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 comma = False
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 for e in node.bases:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 if comma:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 comma = True
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 self.traverse(e)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 for e in node.keywords:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 if comma:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 comma = True
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 self.traverse(e)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414 self._write_docstring_and_traverse_body(node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 def visit_FunctionDef(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 self._function_helper(node, "def")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
418
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
419 def visit_AsyncFunctionDef(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
420 self._function_helper(node, "async def")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422 def _function_helper(self, node, fill_suffix):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 self.maybe_newline()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 for deco in node.decorator_list:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 self.fill("@")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426 self.traverse(deco)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 def_str = fill_suffix + " " + node.name
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 self.fill(def_str)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 with self.delimit("(", ")"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
430 self.traverse(node.args)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 if node.returns:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 self.write(" -> ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433 self.traverse(node.returns)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434 with self.block(extra=self.get_type_comment(node)):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 self._write_docstring_and_traverse_body(node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 def visit_For(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 self._for_helper("for ", node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
439
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 def visit_AsyncFor(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 self._for_helper("async for ", node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
442
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443 def _for_helper(self, fill, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444 self.fill(fill)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 self.traverse(node.target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
446 self.write(" in ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 self.traverse(node.iter)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 with self.block(extra=self.get_type_comment(node)):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450 if node.orelse:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 self.fill("else")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 self.traverse(node.orelse)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 def visit_If(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456 self.fill("if ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 self.traverse(node.test)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 # collapse nested ifs into equivalent elifs.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 while node.orelse and len(node.orelse) == 1 and isinstance(node.orelse[0], ast.If):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 node = node.orelse[0]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 self.fill("elif ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 self.traverse(node.test)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 # final else
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 if node.orelse:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 self.fill("else")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 self.traverse(node.orelse)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 def visit_While(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 self.fill("while ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475 self.traverse(node.test)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 if node.orelse:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479 self.fill("else")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 with self.block():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 self.traverse(node.orelse)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
483 def visit_With(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
484 self.fill("with ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
485 self.interleave(lambda: self.write(", "), self.traverse, node.items)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
486 with self.block(extra=self.get_type_comment(node)):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
487 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
488
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
489 def visit_AsyncWith(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
490 self.fill("async with ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 self.interleave(lambda: self.write(", "), self.traverse, node.items)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 with self.block(extra=self.get_type_comment(node)):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 def _str_literal_helper(
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
496 self, string, *, quote_types=_ALL_QUOTES, escape_special_whitespace=False
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
497 ):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498 """Helper for writing string literals, minimizing escapes.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
499 Returns the tuple (string literal to write, possible quote types).
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 """
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501 def escape_char(c):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
502 # \n and \t are non-printable, but we only escape them if
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
503 # escape_special_whitespace is True
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
504 if not escape_special_whitespace and c in "\n\t":
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
505 return c
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506 # Always escape backslashes and other non-printable characters
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507 if c == "\\" or not c.isprintable():
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 return c.encode("unicode_escape").decode("ascii")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
509 return c
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
510
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
511 escaped_string = "".join(map(escape_char, string))
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512 possible_quotes = quote_types
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 if "\n" in escaped_string:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 possible_quotes = [q for q in possible_quotes if q in _MULTI_QUOTES]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
515 possible_quotes = [q for q in possible_quotes if q not in escaped_string]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
516 if not possible_quotes:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517 # If there aren't any possible_quotes, fallback to using repr
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 # on the original string. Try to use a quote from quote_types,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 # e.g., so that we use triple quotes for docstrings.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
520 string = repr(string)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 quote = next((q for q in quote_types if string[0] in q), string[0])
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522 return string[1:-1], [quote]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
523 if escaped_string:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
524 # Sort so that we prefer '''"''' over """\""""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
525 possible_quotes.sort(key=lambda q: q[0] == escaped_string[-1])
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
526 # If we're using triple quotes and we'd need to escape a final
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
527 # quote, escape it
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
528 if possible_quotes[0][0] == escaped_string[-1]:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 assert len(possible_quotes[0]) == 3
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
530 escaped_string = escaped_string[:-1] + "\\" + escaped_string[-1]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
531 return escaped_string, possible_quotes
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
533 def _write_str_avoiding_backslashes(self, string, *, quote_types=_ALL_QUOTES):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534 """Write string literal value with a best effort attempt to avoid backslashes."""
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
535 string, quote_types = self._str_literal_helper(string, quote_types=quote_types)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
536 quote_type = quote_types[0]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
537 self.write(f"{quote_type}{string}{quote_type}")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
538
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
539 def visit_JoinedStr(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
540 self.write("f")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
541 if self._avoid_backslashes:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
542 self._fstring_JoinedStr(node, self.buffer_writer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
543 self._write_str_avoiding_backslashes(self.buffer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 return
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 # If we don't need to avoid backslashes globally (i.e., we only need
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 # to avoid them inside FormattedValues), it's cosmetically preferred
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
548 # to use escaped whitespace. That is, it's preferred to use backslashes
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
549 # for cases like: f"{x}\n". To accomplish this, we keep track of what
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 # in our buffer corresponds to FormattedValues and what corresponds to
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
551 # Constant parts of the f-string, and allow escapes accordingly.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
552 buffer = []
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
553 for value in node.values:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
554 meth = getattr(self, "_fstring_" + type(value).__name__)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
555 meth(value, self.buffer_writer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
556 buffer.append((self.buffer, isinstance(value, ast.Constant)))
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
557 new_buffer = []
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
558 quote_types = _ALL_QUOTES
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
559 for value, is_constant in buffer:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
560 # Repeatedly narrow down the list of possible quote_types
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
561 value, quote_types = self._str_literal_helper(
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
562 value, quote_types=quote_types,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
563 escape_special_whitespace=is_constant
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
564 )
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
565 new_buffer.append(value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
566 value = "".join(new_buffer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
567 quote_type = quote_types[0]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
568 self.write(f"{quote_type}{value}{quote_type}")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
569
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
570 def visit_FormattedValue(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
571 self.write("f")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
572 self._fstring_FormattedValue(node, self.buffer_writer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
573 self._write_str_avoiding_backslashes(self.buffer)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
574
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
575 def _fstring_JoinedStr(self, node, write):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
576 for value in node.values:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
577 meth = getattr(self, "_fstring_" + type(value).__name__)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
578 meth(value, write)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
579
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
580 def _fstring_Constant(self, node, write):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
581 if not isinstance(node.value, str):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
582 raise ValueError("Constants inside JoinedStr should be a string.")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
583 value = node.value.replace("{", "{{").replace("}", "}}")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
584 write(value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
585
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
586 def _fstring_FormattedValue(self, node, write):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
587 write("{")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
588 unparser = type(self)(_avoid_backslashes=True)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
589 unparser.set_precedence(_Precedence.TEST.next(), node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
590 expr = unparser.visit(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
591 if expr.startswith("{"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
592 write(" ") # Separate pair of opening brackets as "{ {"
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
593 if "\\" in expr:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
594 raise ValueError("Unable to avoid backslash in f-string expression part")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
595 write(expr)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
596 if node.conversion != -1:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
597 conversion = chr(node.conversion)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
598 if conversion not in "sra":
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
599 raise ValueError("Unknown f-string conversion.")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
600 write(f"!{conversion}")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
601 if node.format_spec:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
602 write(":")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
603 meth = getattr(self, "_fstring_" + type(node.format_spec).__name__)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
604 meth(node.format_spec, write)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
605 write("}")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
606
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
607 def visit_Name(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
608 self.write(node.id)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
609
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
610 def _write_docstring(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
611 self.fill()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
612 if node.kind == "u":
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
613 self.write("u")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
614 self._write_str_avoiding_backslashes(node.value, quote_types=_MULTI_QUOTES)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
615
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
616 def _write_constant(self, value):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
617 if isinstance(value, (float, complex)):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
618 # Substitute overflowing decimal literal for AST infinities,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
619 # and inf - inf for NaNs.
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
620 self.write(
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
621 repr(value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
622 .replace("inf", _INFSTR)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
623 .replace("nan", f"({_INFSTR}-{_INFSTR})")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
624 )
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
625 elif self._avoid_backslashes and isinstance(value, str):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
626 self._write_str_avoiding_backslashes(value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
627 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
628 self.write(repr(value))
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
629
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
630 def visit_Constant(self, node):
8252
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
631 value = AstUtilities.getValue(node)
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
632 if isinstance(value, tuple):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
633 with self.delimit("(", ")"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
634 self.items_view(self._write_constant, value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
635 elif value is ...:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
636 self.write("...")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
637 else:
8252
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
638 if hasattr(node, "kind") and node.kind == "u":
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
639 self.write("u")
8252
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
640 self._write_constant(value)
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
641
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
642 visit_NameConstant = visit_Constant
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
643 visit_Num = visit_Constant
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
644 visit_Str = visit_Constant
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
645 visit_Bytes = visit_Constant
70855a87f546 Fixed an issue in ast_unparse.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8232
diff changeset
646 visit_Ellipsis = visit_Constant
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
647
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
648 def visit_List(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
649 with self.delimit("[", "]"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
650 self.interleave(lambda: self.write(", "), self.traverse, node.elts)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
651
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
652 def visit_ListComp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
653 with self.delimit("[", "]"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
654 self.traverse(node.elt)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
655 for gen in node.generators:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
656 self.traverse(gen)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
657
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
658 def visit_GeneratorExp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
659 with self.delimit("(", ")"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
660 self.traverse(node.elt)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
661 for gen in node.generators:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
662 self.traverse(gen)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
663
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
664 def visit_SetComp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
665 with self.delimit("{", "}"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
666 self.traverse(node.elt)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
667 for gen in node.generators:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
668 self.traverse(gen)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
669
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
670 def visit_DictComp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
671 with self.delimit("{", "}"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
672 self.traverse(node.key)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
673 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
674 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
675 for gen in node.generators:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
676 self.traverse(gen)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
677
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
678 def visit_comprehension(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
679 if node.is_async:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
680 self.write(" async for ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
681 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
682 self.write(" for ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
683 self.set_precedence(_Precedence.TUPLE, node.target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
684 self.traverse(node.target)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
685 self.write(" in ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
686 self.set_precedence(_Precedence.TEST.next(), node.iter, *node.ifs)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
687 self.traverse(node.iter)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
688 for if_clause in node.ifs:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
689 self.write(" if ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
690 self.traverse(if_clause)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
691
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
692 def visit_IfExp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
693 with self.require_parens(_Precedence.TEST, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
694 self.set_precedence(_Precedence.TEST.next(), node.body, node.test)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
695 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
696 self.write(" if ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
697 self.traverse(node.test)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
698 self.write(" else ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
699 self.set_precedence(_Precedence.TEST, node.orelse)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
700 self.traverse(node.orelse)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
701
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
702 def visit_Set(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
703 if node.elts:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
704 with self.delimit("{", "}"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
705 self.interleave(lambda: self.write(", "), self.traverse, node.elts)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
706 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
707 # `{}` would be interpreted as a dictionary literal, and
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
708 # `set` might be shadowed. Thus:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
709 self.write('{*()}')
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
710
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
711 def visit_Dict(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
712 def write_key_value_pair(k, v):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
713 self.traverse(k)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
714 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
715 self.traverse(v)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
716
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
717 def write_item(item):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
718 k, v = item
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
719 if k is None:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
720 # for dictionary unpacking operator in dicts {**{'y': 2}}
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
721 # see PEP 448 for details
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
722 self.write("**")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
723 self.set_precedence(_Precedence.EXPR, v)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
724 self.traverse(v)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
725 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
726 write_key_value_pair(k, v)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
727
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
728 with self.delimit("{", "}"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
729 self.interleave(
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
730 lambda: self.write(", "), write_item, zip(node.keys, node.values)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
731 )
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
732
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
733 def visit_Tuple(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
734 with self.delimit("(", ")"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
735 self.items_view(self.traverse, node.elts)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
736
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
737 unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"}
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
738 unop_precedence = {
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
739 "not": _Precedence.NOT,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
740 "~": _Precedence.FACTOR,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
741 "+": _Precedence.FACTOR,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
742 "-": _Precedence.FACTOR,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
743 }
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
744
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
745 def visit_UnaryOp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
746 operator = self.unop[node.op.__class__.__name__]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
747 operator_precedence = self.unop_precedence[operator]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
748 with self.require_parens(operator_precedence, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
749 self.write(operator)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
750 # factor prefixes (+, -, ~) shouldn't be seperated
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
751 # from the value they belong, (e.g: +1 instead of + 1)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
752 if operator_precedence is not _Precedence.FACTOR:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
753 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
754 self.set_precedence(operator_precedence, node.operand)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
755 self.traverse(node.operand)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
756
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
757 binop = {
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
758 "Add": "+",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
759 "Sub": "-",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
760 "Mult": "*",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
761 "MatMult": "@",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
762 "Div": "/",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
763 "Mod": "%",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
764 "LShift": "<<",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
765 "RShift": ">>",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
766 "BitOr": "|",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
767 "BitXor": "^",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
768 "BitAnd": "&",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
769 "FloorDiv": "//",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
770 "Pow": "**",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
771 }
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
772
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
773 binop_precedence = {
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
774 "+": _Precedence.ARITH,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
775 "-": _Precedence.ARITH,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
776 "*": _Precedence.TERM,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
777 "@": _Precedence.TERM,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
778 "/": _Precedence.TERM,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
779 "%": _Precedence.TERM,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
780 "<<": _Precedence.SHIFT,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
781 ">>": _Precedence.SHIFT,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
782 "|": _Precedence.BOR,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
783 "^": _Precedence.BXOR,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
784 "&": _Precedence.BAND,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
785 "//": _Precedence.TERM,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
786 "**": _Precedence.POWER,
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
787 }
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
788
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
789 binop_rassoc = frozenset(("**",))
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
790 def visit_BinOp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
791 operator = self.binop[node.op.__class__.__name__]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
792 operator_precedence = self.binop_precedence[operator]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
793 with self.require_parens(operator_precedence, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
794 if operator in self.binop_rassoc:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
795 left_precedence = operator_precedence.next()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
796 right_precedence = operator_precedence
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
797 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
798 left_precedence = operator_precedence
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
799 right_precedence = operator_precedence.next()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
800
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
801 self.set_precedence(left_precedence, node.left)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
802 self.traverse(node.left)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
803 self.write(f" {operator} ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
804 self.set_precedence(right_precedence, node.right)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
805 self.traverse(node.right)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
806
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
807 cmpops = {
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
808 "Eq": "==",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
809 "NotEq": "!=",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
810 "Lt": "<",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
811 "LtE": "<=",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
812 "Gt": ">",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
813 "GtE": ">=",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
814 "Is": "is",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
815 "IsNot": "is not",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
816 "In": "in",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
817 "NotIn": "not in",
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
818 }
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
819
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
820 def visit_Compare(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
821 with self.require_parens(_Precedence.CMP, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
822 self.set_precedence(_Precedence.CMP.next(), node.left, *node.comparators)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
823 self.traverse(node.left)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
824 for o, e in zip(node.ops, node.comparators):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
825 self.write(" " + self.cmpops[o.__class__.__name__] + " ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
826 self.traverse(e)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
827
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
828 boolops = {"And": "and", "Or": "or"}
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
829 boolop_precedence = {"and": _Precedence.AND, "or": _Precedence.OR}
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
830
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
831 def visit_BoolOp(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
832 operator = self.boolops[node.op.__class__.__name__]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
833 operator_precedence = self.boolop_precedence[operator]
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
834
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
835 def increasing_level_traverse(node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
836 nonlocal operator_precedence
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
837 operator_precedence = operator_precedence.next()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
838 self.set_precedence(operator_precedence, node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
839 self.traverse(node)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
840
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
841 with self.require_parens(operator_precedence, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
842 s = f" {operator} "
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
843 self.interleave(lambda: self.write(s), increasing_level_traverse, node.values)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
844
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
845 def visit_Attribute(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
846 self.set_precedence(_Precedence.ATOM, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
847 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
848 # Special case: 3.__abs__() is a syntax error, so if node.value
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
849 # is an integer literal then we need to either parenthesize
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
850 # it or add an extra space to get 3 .__abs__().
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
851 if isinstance(node.value, ast.Constant) and isinstance(node.value.value, int):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
852 self.write(" ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
853 self.write(".")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
854 self.write(node.attr)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
855
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
856 def visit_Call(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
857 self.set_precedence(_Precedence.ATOM, node.func)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
858 self.traverse(node.func)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
859 with self.delimit("(", ")"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
860 comma = False
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
861 for e in node.args:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
862 if comma:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
863 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
864 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
865 comma = True
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
866 self.traverse(e)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
867 for e in node.keywords:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
868 if comma:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
869 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
870 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
871 comma = True
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
872 self.traverse(e)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
873
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
874 def visit_Subscript(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
875 def is_simple_tuple(slice_value):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
876 # when unparsing a non-empty tuple, the parantheses can be safely
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
877 # omitted if there aren't any elements that explicitly requires
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
878 # parantheses (such as starred expressions).
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
879 return (
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
880 isinstance(slice_value, ast.Tuple)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
881 and slice_value.elts
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
882 and not any(isinstance(elt, ast.Starred) for elt in slice_value.elts)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
883 )
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
884
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
885 self.set_precedence(_Precedence.ATOM, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
886 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
887 with self.delimit("[", "]"):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
888 if is_simple_tuple(node.slice):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
889 self.items_view(self.traverse, node.slice.elts)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
890 else:
8232
39c4543b7a61 ast_unparse: fixed an issue related to backporting to older Python3 releases.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8201
diff changeset
891 if isinstance(node.slice, ast.Index):
39c4543b7a61 ast_unparse: fixed an issue related to backporting to older Python3 releases.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8201
diff changeset
892 self.traverse(node.slice.value)
39c4543b7a61 ast_unparse: fixed an issue related to backporting to older Python3 releases.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8201
diff changeset
893 else:
39c4543b7a61 ast_unparse: fixed an issue related to backporting to older Python3 releases.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8201
diff changeset
894 self.traverse(node.slice)
8186
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
895
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
896 def visit_Starred(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
897 self.write("*")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
898 self.set_precedence(_Precedence.EXPR, node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
899 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
900
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
901 def visit_Ellipsis(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
902 self.write("...")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
903
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
904 def visit_Slice(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
905 if node.lower:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
906 self.traverse(node.lower)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
907 self.write(":")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
908 if node.upper:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
909 self.traverse(node.upper)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
910 if node.step:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
911 self.write(":")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
912 self.traverse(node.step)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
913
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
914 def visit_arg(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
915 self.write(node.arg)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
916 if node.annotation:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
917 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
918 self.traverse(node.annotation)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
919
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
920 def visit_arguments(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
921 first = True
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
922 # normal arguments
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
923 all_args = node.posonlyargs + node.args
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
924 defaults = [None] * (len(all_args) - len(node.defaults)) + node.defaults
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
925 for index, elements in enumerate(zip(all_args, defaults), 1):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
926 a, d = elements
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
927 if first:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
928 first = False
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
929 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
930 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
931 self.traverse(a)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
932 if d:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
933 self.write("=")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
934 self.traverse(d)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
935 if index == len(node.posonlyargs):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
936 self.write(", /")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
937
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
938 # varargs, or bare '*' if no varargs but keyword-only arguments present
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
939 if node.vararg or node.kwonlyargs:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
940 if first:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
941 first = False
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
942 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
943 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
944 self.write("*")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
945 if node.vararg:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
946 self.write(node.vararg.arg)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
947 if node.vararg.annotation:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
948 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
949 self.traverse(node.vararg.annotation)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
950
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
951 # keyword-only arguments
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
952 if node.kwonlyargs:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
953 for a, d in zip(node.kwonlyargs, node.kw_defaults):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
954 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
955 self.traverse(a)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
956 if d:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
957 self.write("=")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
958 self.traverse(d)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
959
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
960 # kwargs
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
961 if node.kwarg:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
962 if first:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
963 first = False
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
964 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
965 self.write(", ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
966 self.write("**" + node.kwarg.arg)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
967 if node.kwarg.annotation:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
968 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
969 self.traverse(node.kwarg.annotation)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
970
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
971 def visit_keyword(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
972 if node.arg is None:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
973 self.write("**")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
974 else:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
975 self.write(node.arg)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
976 self.write("=")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
977 self.traverse(node.value)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
978
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
979 def visit_Lambda(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
980 with self.require_parens(_Precedence.TEST, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
981 self.write("lambda ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
982 self.traverse(node.args)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
983 self.write(": ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
984 self.set_precedence(_Precedence.TEST, node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
985 self.traverse(node.body)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
986
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
987 def visit_alias(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
988 self.write(node.name)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
989 if node.asname:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
990 self.write(" as " + node.asname)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
991
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
992 def visit_withitem(self, node):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
993 self.traverse(node.context_expr)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
994 if node.optional_vars:
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
995 self.write(" as ")
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
996 self.traverse(node.optional_vars)
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
997
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
998 def unparse(ast_obj):
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
999 unparser = _Unparser()
655b658aa7ee Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1000 return unparser.visit(ast_obj)

eric ide

mercurial