Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/tensorflow/python/autograph/pyct/pretty_printer.py: 17%
83 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-03 07:57 +0000
1# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# ==============================================================================
15"""Print an AST tree in a form more readable than ast.dump."""
17import gast
18import termcolor
21class PrettyPrinter(gast.NodeVisitor):
22 """Print AST nodes."""
24 def __init__(self, color, noanno):
25 self.indent_lvl = 0
26 self.result = ''
27 self.color = color
28 self.noanno = noanno
30 def _color(self, string, color, attrs=None):
31 if self.color:
32 return termcolor.colored(string, color, attrs=attrs)
33 return string
35 def _type(self, node):
36 return self._color(node.__class__.__name__, None, ['bold'])
38 def _field(self, name):
39 return self._color(name, 'blue')
41 def _value(self, name):
42 return self._color(name, 'magenta')
44 def _warning(self, name):
45 return self._color(name, 'red')
47 def _indent(self):
48 return self._color('| ' * self.indent_lvl, None, ['dark'])
50 def _print(self, s):
51 self.result += s
52 self.result += '\n'
54 def generic_visit(self, node, name=None):
55 # In very rare instances, a list can contain something other than a Node.
56 # e.g. Global contains a list of strings.
57 if isinstance(node, str):
58 if name:
59 self._print('%s%s="%s"' % (self._indent(), name, node))
60 else:
61 self._print('%s"%s"' % (self._indent(), node))
62 return
64 if node._fields:
65 cont = ':'
66 else:
67 cont = '()'
69 if name:
70 self._print('%s%s=%s%s' % (self._indent(), self._field(name),
71 self._type(node), cont))
72 else:
73 self._print('%s%s%s' % (self._indent(), self._type(node), cont))
75 self.indent_lvl += 1
76 for f in node._fields:
77 if self.noanno and f.startswith('__'):
78 continue
79 if not hasattr(node, f):
80 self._print('%s%s' % (self._indent(), self._warning('%s=<unset>' % f)))
81 continue
82 v = getattr(node, f)
83 if isinstance(v, list):
84 if v:
85 self._print('%s%s=[' % (self._indent(), self._field(f)))
86 self.indent_lvl += 1
87 for n in v:
88 if n is not None:
89 self.generic_visit(n)
90 else:
91 self._print('%sNone' % (self._indent()))
92 self.indent_lvl -= 1
93 self._print('%s]' % (self._indent()))
94 else:
95 self._print('%s%s=[]' % (self._indent(), self._field(f)))
96 elif isinstance(v, tuple):
97 if v:
98 self._print('%s%s=(' % (self._indent(), self._field(f)))
99 self.indent_lvl += 1
100 for n in v:
101 if n is not None:
102 self.generic_visit(n)
103 else:
104 self._print('%sNone' % (self._indent()))
105 self.indent_lvl -= 1
106 self._print('%s)' % (self._indent()))
107 else:
108 self._print('%s%s=()' % (self._indent(), self._field(f)))
109 elif isinstance(v, gast.AST):
110 self.generic_visit(v, f)
111 elif isinstance(v, bytes):
112 self._print('%s%s=%s' % (self._indent(), self._field(f),
113 self._value('b"%s"' % v)))
114 elif isinstance(v, str):
115 self._print('%s%s=%s' % (self._indent(), self._field(f),
116 self._value('u"%s"' % v)))
117 else:
118 self._print('%s%s=%s' % (self._indent(), self._field(f),
119 self._value(v)))
120 self.indent_lvl -= 1
123def fmt(node, color=True, noanno=False):
124 printer = PrettyPrinter(color, noanno)
125 if isinstance(node, (list, tuple)):
126 for n in node:
127 printer.visit(n)
128 else:
129 printer.visit(node)
130 return printer.result