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

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.""" 

16 

17import gast 

18import termcolor 

19 

20 

21class PrettyPrinter(gast.NodeVisitor): 

22 """Print AST nodes.""" 

23 

24 def __init__(self, color, noanno): 

25 self.indent_lvl = 0 

26 self.result = '' 

27 self.color = color 

28 self.noanno = noanno 

29 

30 def _color(self, string, color, attrs=None): 

31 if self.color: 

32 return termcolor.colored(string, color, attrs=attrs) 

33 return string 

34 

35 def _type(self, node): 

36 return self._color(node.__class__.__name__, None, ['bold']) 

37 

38 def _field(self, name): 

39 return self._color(name, 'blue') 

40 

41 def _value(self, name): 

42 return self._color(name, 'magenta') 

43 

44 def _warning(self, name): 

45 return self._color(name, 'red') 

46 

47 def _indent(self): 

48 return self._color('| ' * self.indent_lvl, None, ['dark']) 

49 

50 def _print(self, s): 

51 self.result += s 

52 self.result += '\n' 

53 

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 

63 

64 if node._fields: 

65 cont = ':' 

66 else: 

67 cont = '()' 

68 

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)) 

74 

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 

121 

122 

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