1.1 --- a/viewer.py Sun Dec 03 00:51:30 2006 +0100
1.2 +++ b/viewer.py Sun Dec 03 01:25:17 2006 +0100
1.3 @@ -27,75 +27,8 @@
1.4 import os
1.5 import textwrap
1.6
1.7 -# Exceptions.
1.8 -
1.9 -class ViewerError(SimplifiedError):
1.10 -
1.11 - "An error in viewing."
1.12 -
1.13 - pass
1.14 -
1.15 # Classes.
1.16
1.17 -class Viewer(ASTVisitor):
1.18 -
1.19 - """
1.20 - A viewing visitor for AST nodes.
1.21 - """
1.22 -
1.23 - def __init__(self, stream):
1.24 - ASTVisitor.__init__(self)
1.25 - self.cached_files = {}
1.26 - self.printed_lines = {}
1.27 - self.visitor = self
1.28 - self.stream = stream
1.29 -
1.30 - def process(self, module):
1.31 - self.dispatch(module)
1.32 -
1.33 - def dispatch(self, node):
1.34 - self.dispatch_only(node)
1.35 - ASTVisitor.dispatch(self, node)
1.36 -
1.37 - def dispatch_only(self, node, every_time=0):
1.38 - self.print_line(getattr(node, "filename", None), getattr(node, "lineno", None), every_time)
1.39 -
1.40 - def print_line(self, filename, lineno, every_time):
1.41 - last_printed = self.printed_lines.get(filename, 0)
1.42 - if lineno > last_printed or every_time:
1.43 - self.stream.write(self.get_line(filename, lineno))
1.44 - self.printed_lines[filename] = lineno
1.45 -
1.46 - def get_line(self, filename, lineno):
1.47 - if filename is None or lineno is None:
1.48 - return ""
1.49 -
1.50 - if self.cached_files.has_key(filename):
1.51 - lines = self.cached_files[filename]
1.52 - else:
1.53 - f = open(filename)
1.54 - try:
1.55 - self.cached_files[filename] = lines = f.readlines()
1.56 - finally:
1.57 - f.close()
1.58 -
1.59 - try:
1.60 - return lines[lineno - 1]
1.61 - except IndexError:
1.62 - return ""
1.63 -
1.64 - def report(self, exc):
1.65 - self.stream.write("Exception was:\n\n" + str(exc.exc) + "\n\n")
1.66 - self.stream.write("Nodes:\n\n")
1.67 - for node in exc.nodes:
1.68 - self.stream.write(repr(node) + "\n")
1.69 - if node is not None and hasattr(node, "original"):
1.70 - self.dispatch_only(node.original, every_time=1)
1.71 - if hasattr(exc.nodes[0], "original"):
1.72 - self.stream.write("\nOriginal node was:\n\n" + repr(exc.nodes[0].original) + "\n")
1.73 - self.stream.write("\nSimplified node was:\n\n")
1.74 - exc.nodes[0].pprint(stream=self.stream)
1.75 -
1.76 # HTML-related output production.
1.77
1.78 html_header = """<?xml version="1.0" encoding="iso-8859-15"?>
1.79 @@ -213,16 +146,6 @@
1.80 self.dispatch(module)
1.81 self.stream.write(html_footer)
1.82
1.83 - def dispatch(self, node):
1.84 - ASTVisitor.dispatch(self, node)
1.85 - #try:
1.86 - # ASTVisitor.dispatch(self, node)
1.87 - #except ViewerError, exc:
1.88 - # exc.add(node)
1.89 - # raise
1.90 - #except Exception, exc:
1.91 - # raise ViewerError(exc, node)
1.92 -
1.93 def visitModule(self, node):
1.94 self.default(node)
1.95
1.96 @@ -304,14 +227,14 @@
1.97 self.stream.write("<span class='iterator'>\n")
1.98 self._keyword("for")
1.99 self._popup_start()
1.100 - self._invocations(node._node.code[1].expr.ref.code[0].body[0].code[0].expr) # Link to next call in subprogram.
1.101 + self._invocations(node._next_call)
1.102 self._popup_end()
1.103 self.stream.write("</span>\n")
1.104 self.dispatch(node.assign)
1.105 self.stream.write("<span class='iterator'>\n")
1.106 self._keyword("in")
1.107 self._popup_start()
1.108 - self._invocations(node._node.code[0].expr) # Link to __iter__ call.
1.109 + self._invocations(node._iter_call)
1.110 self._popup_end()
1.111 self.stream.write("</span>\n")
1.112 self.dispatch(node.list)
1.113 @@ -505,7 +428,7 @@
1.114 self.stream.write("<span class='conditional'>\n")
1.115 self._keyword("while")
1.116 self._popup_start()
1.117 - self._invocations(node._node.expr.ref.code[0].test)
1.118 + self._invocations(node._test_call)
1.119 self._popup_end()
1.120 self.stream.write("</span>\n")
1.121 self.dispatch(node.test)
1.122 @@ -533,8 +456,8 @@
1.123 self.stream.write(symbol)
1.124 self._popup_start()
1.125 self.stream.write("<div class='invocations'>\n")
1.126 - self._invocations_list(node._node.body[0].expr) # NOTE: See visitAdd in simplify.
1.127 - self._invocations_list(node._node.handler[0].body[0].expr) # NOTE: See visitAdd in simplify.
1.128 + self._invocations_list(node._left_call)
1.129 + self._invocations_list(node._right_call)
1.130 self.stream.write("</div>\n")
1.131 self._popup_end()
1.132 self.stream.write("</span>\n")
1.133 @@ -547,7 +470,7 @@
1.134 self.stream.write(symbol)
1.135 self._popup_start()
1.136 self.stream.write("<div class='invocations'>\n")
1.137 - self._invocations_list(node._node) # NOTE: See _visitUnary in simplify.
1.138 + self._invocations_list(node._unary_call)
1.139 self.stream.write("</div>\n")
1.140 self._popup_end()
1.141 self.stream.write("</span>\n")
1.142 @@ -874,14 +797,22 @@
1.143 if node.types:
1.144 self._types_list(node.types)
1.145 else:
1.146 - self.stream.write("<div class='types'>\n")
1.147 - self.stream.write("no types\n")
1.148 - self.stream.write("</div>\n")
1.149 + self._no_types()
1.150 + elif hasattr(node, "writes"):
1.151 + if node.writes:
1.152 + self._types_list(flatten(node.writes.values()))
1.153 + else:
1.154 + self._no_types()
1.155 else:
1.156 self.stream.write("<div class='types'>\n")
1.157 self.stream.write("unvisited\n")
1.158 self.stream.write("</div>\n")
1.159
1.160 + def _no_types(self):
1.161 + self.stream.write("<div class='types'>\n")
1.162 + self.stream.write("no types\n")
1.163 + self.stream.write("</div>\n")
1.164 +
1.165 def _types_list(self, types, style_class="types"):
1.166 self.stream.write("<div class='%s'>\n" % style_class)
1.167 for type in types:
1.168 @@ -922,14 +853,6 @@
1.169
1.170 # Convenience functions.
1.171
1.172 -def view(module, stream=None):
1.173 - viewer = Viewer(stream or sys.stdout)
1.174 - viewer.process(module.original)
1.175 -
1.176 -def report(exc):
1.177 - viewer = Viewer(stream or sys.stdout)
1.178 - viewer.report(exc)
1.179 -
1.180 def browse(module, stream=None):
1.181 browser = Browser(stream or sys.stdout)
1.182 browser.process(module.original)
1.183 @@ -943,13 +866,10 @@
1.184 stream.close()
1.185
1.186 def makedocs(module, builtins):
1.187 - try:
1.188 - dirname = "%s-docs" % module.name
1.189 - if not os.path.exists(dirname):
1.190 - os.mkdir(dirname)
1.191 - makedoc(module, os.path.join(dirname, "%s%shtml" % (module.name, os.path.extsep)))
1.192 - makedoc(builtins, os.path.join(dirname, "%s%shtml" % (builtins.name, os.path.extsep)))
1.193 - except ViewerError, exc:
1.194 - raise
1.195 + dirname = "%s-docs" % module.name
1.196 + if not os.path.exists(dirname):
1.197 + os.mkdir(dirname)
1.198 + makedoc(module, os.path.join(dirname, "%s%shtml" % (module.name, os.path.extsep)))
1.199 + makedoc(builtins, os.path.join(dirname, "%s%shtml" % (builtins.name, os.path.extsep)))
1.200
1.201 # vim: tabstop=4 expandtab shiftwidth=4