Added ast pretty printer
This commit is contained in:
parent
e41624d47d
commit
1506ff16ad
41
hy/util.py
41
hy/util.py
@ -18,6 +18,8 @@
|
|||||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
# DEALINGS IN THE SOFTWARE.
|
# DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
import ast
|
||||||
|
|
||||||
|
|
||||||
def flatten_literal_list(entry):
|
def flatten_literal_list(entry):
|
||||||
for e in entry:
|
for e in entry:
|
||||||
@ -26,3 +28,42 @@ def flatten_literal_list(entry):
|
|||||||
yield x # needs more yield-from
|
yield x # needs more yield-from
|
||||||
else:
|
else:
|
||||||
yield e
|
yield e
|
||||||
|
|
||||||
|
|
||||||
|
def dump(node, annotate_fields=True, include_attributes=False, indent=' '):
|
||||||
|
"""
|
||||||
|
Return a formatted dump of the tree in *node*. This is mainly useful for
|
||||||
|
debugging purposes. The returned string will show the names and the values
|
||||||
|
for fields. This makes the code impossible to evaluate, so if evaluation is
|
||||||
|
wanted *annotate_fields* must be set to False. Attributes such as line
|
||||||
|
numbers and column offsets are not dumped by default. If this is wanted,
|
||||||
|
*include_attributes* can be set to True.
|
||||||
|
|
||||||
|
Original author: Alex Leone (acleone ~AT~ gmail.com), 2010-01-30
|
||||||
|
"""
|
||||||
|
def _format(node, level=0):
|
||||||
|
if isinstance(node, ast.AST):
|
||||||
|
fields = [(a, _format(b, level)) for a, b in ast.iter_fields(node)]
|
||||||
|
if include_attributes and node._attributes:
|
||||||
|
fields.extend([(a, _format(getattr(node, a), level))
|
||||||
|
for a in node._attributes])
|
||||||
|
return ''.join([
|
||||||
|
node.__class__.__name__,
|
||||||
|
'(',
|
||||||
|
', '.join(('%s=%s' % field for field in fields)
|
||||||
|
if annotate_fields else
|
||||||
|
(b for a, b in fields)),
|
||||||
|
')'])
|
||||||
|
elif isinstance(node, list):
|
||||||
|
lines = ['[']
|
||||||
|
lines.extend((indent * (level + 2) + _format(x, level + 2) + ','
|
||||||
|
for x in node))
|
||||||
|
if len(lines) > 1:
|
||||||
|
lines.append(indent * (level + 1) + ']')
|
||||||
|
else:
|
||||||
|
lines[-1] += ']'
|
||||||
|
return '\n'.join(lines)
|
||||||
|
return repr(node)
|
||||||
|
if not isinstance(node, ast.AST):
|
||||||
|
raise TypeError('expected AST, got %r' % node.__class__.__name__)
|
||||||
|
return _format(node)
|
||||||
|
Loading…
Reference in New Issue
Block a user