1.1 --- a/viewer.py Sat Oct 21 00:16:02 2006 +0200
1.2 +++ b/viewer.py Sat Oct 21 02:52:41 2006 +0200
1.3 @@ -24,6 +24,7 @@
1.4 from compiler.visitor import ASTVisitor
1.5 from simplified import *
1.6 import sys
1.7 +import textwrap
1.8
1.9 # Exceptions.
1.10
1.11 @@ -153,6 +154,18 @@
1.12 </html>
1.13 """
1.14
1.15 +# Validation functions.
1.16 +
1.17 +def hasnode(fn):
1.18 + def _hasnode(self, node):
1.19 + if not hasattr(node, "_node"):
1.20 + return
1.21 + else:
1.22 + fn(self, node)
1.23 + return _hasnode
1.24 +
1.25 +# Browser classes.
1.26 +
1.27 class Browser(ASTVisitor):
1.28
1.29 """
1.30 @@ -183,8 +196,13 @@
1.31
1.32 # Statements.
1.33
1.34 - def visitPass(self, node):
1.35 - self._keyword("pass")
1.36 + def visitAssign(self, node):
1.37 + self.stream.write("<div class='assign'>\n")
1.38 + for lvalue in node.nodes:
1.39 + self.dispatch(lvalue)
1.40 + self.stream.write("=\n")
1.41 + self.dispatch(node.expr)
1.42 + self.stream.write("</div>\n")
1.43
1.44 def visitClass(self, node):
1.45 definition = node._node
1.46 @@ -222,6 +240,8 @@
1.47 self.stream.write("</div>\n")
1.48 self.stream.write("</div>\n")
1.49
1.50 + visitClass = hasnode(visitClass) # Remove unannotated nodes.
1.51 +
1.52 def visitFunction(self, node):
1.53 definition = node._node
1.54 subprogram = definition.expr.ref
1.55 @@ -263,23 +283,23 @@
1.56 self.stream.write("</div>\n")
1.57 self.stream.write("</div>\n")
1.58
1.59 + visitFunction = hasnode(visitFunction) # Remove unannotated nodes.
1.60 +
1.61 + def visitPass(self, node):
1.62 + self._keyword("pass")
1.63 +
1.64 + def visitReturn(self, node):
1.65 + self._keyword("return")
1.66 + self.dispatch(node.value)
1.67 +
1.68 def visitStmt(self, node):
1.69 self.stream.write("<div class='stmt'>\n")
1.70 self.default(node)
1.71 self.stream.write("</div>\n")
1.72
1.73 - def visitAssign(self, node):
1.74 - self.stream.write("<div class='assign'>\n")
1.75 - for lvalue in node.nodes:
1.76 - self.dispatch(lvalue)
1.77 - self.stream.write("=\n")
1.78 - self.dispatch(node.expr)
1.79 - self.stream.write("</div>\n")
1.80 -
1.81 # Expressions.
1.82
1.83 def visitCallFunc(self, node):
1.84 - invocation = node._node
1.85 self.stream.write("<span class='callfunc'>\n")
1.86 self.dispatch(node.node)
1.87 self.stream.write("(")
1.88 @@ -321,20 +341,26 @@
1.89 visitAssList = visitList
1.90
1.91 def visitName(self, node):
1.92 - self._name_start(node._node.name)
1.93 - self._popup_start()
1.94 - self._types(node._node)
1.95 - self._scopes(node._node)
1.96 - self._popup_end()
1.97 - self._name_end()
1.98 + if hasattr(node, "_node"):
1.99 + self._name_start(node._node.name)
1.100 + self._popup_start()
1.101 + self._types(node._node)
1.102 + self._scopes(node._node)
1.103 + self._popup_end()
1.104 + self._name_end()
1.105 + else:
1.106 + self._name(node.name)
1.107
1.108 def visitAssName(self, node):
1.109 - self._name_start(node._node.name)
1.110 - self._popup_start()
1.111 - self._types(node._node.expr)
1.112 - self._scopes(node._node)
1.113 - self._popup_end()
1.114 - self._name_end()
1.115 + if hasattr(node, "_node"):
1.116 + self._name_start(node._node.name)
1.117 + self._popup_start()
1.118 + self._types(node._node.expr)
1.119 + self._scopes(node._node)
1.120 + self._popup_end()
1.121 + self._name_end()
1.122 + else:
1.123 + self._name(node.name)
1.124
1.125 def visitConst(self, node):
1.126 self.stream.write(repr(node.value))
1.127 @@ -344,10 +370,11 @@
1.128 self.dispatch(node.expr)
1.129 self.stream.write("<span class='attr'>\n")
1.130 self.stream.write(".%s\n" % self._text(node.attrname))
1.131 - self._popup_start()
1.132 - self._types(node._node)
1.133 - self._scopes(node._node)
1.134 - self._popup_end()
1.135 + if hasattr(node, "_node"):
1.136 + self._popup_start()
1.137 + self._types(node._node)
1.138 + self._scopes(node._node)
1.139 + self._popup_end()
1.140 self.stream.write("</span>\n")
1.141 self.stream.write("</span>\n")
1.142
1.143 @@ -356,10 +383,11 @@
1.144 self.dispatch(node.expr)
1.145 self.stream.write("<span class='attr'>\n")
1.146 self.stream.write(".%s\n" % self._text(node.attrname))
1.147 - self._popup_start()
1.148 - self._types(node._node)
1.149 - self._scopes(node._node)
1.150 - self._popup_end()
1.151 + if hasattr(node, "_node"):
1.152 + self._popup_start()
1.153 + self._types(node._node)
1.154 + self._scopes(node._node)
1.155 + self._popup_end()
1.156 self.stream.write("</span>\n")
1.157 self.stream.write("</span>\n")
1.158
1.159 @@ -382,7 +410,12 @@
1.160
1.161 def _doc(self, node):
1.162 if node.doc is not None:
1.163 - self.stream.write("<div class='doc'>%s</div>\n" % self._text(repr(node.doc)))
1.164 + self.stream.write("<pre class='doc'>\n")
1.165 + self.stream.write('"""')
1.166 + output = textwrap.dedent(node.doc.replace('"""', '\\"\\"\\"'))
1.167 + self.stream.write(self._text(output))
1.168 + self.stream.write('"""')
1.169 + self.stream.write("</pre>\n")
1.170
1.171 def _sequence(self, node):
1.172 first = 1