1.1 --- a/viewer.py Mon Nov 27 01:06:38 2006 +0100
1.2 +++ b/viewer.py Tue Nov 28 00:37:12 2006 +0100
1.3 @@ -152,7 +152,9 @@
1.4 .name,
1.5 .attr,
1.6 .conditional,
1.7 - .operator
1.8 + .operator,
1.9 + .iterator,
1.10 + .returns
1.11 {
1.12 position: relative;
1.13 }
1.14 @@ -161,7 +163,9 @@
1.15 .name:hover > .popup,
1.16 .attr:hover > .popup,
1.17 .conditional:hover > .popup,
1.18 - .operator:hover > .popup
1.19 + .operator:hover > .popup,
1.20 + .iterator:hover > .popup,
1.21 + .returns:hover > .popup
1.22 {
1.23 display: block;
1.24 }
1.25 @@ -291,9 +295,19 @@
1.26 def visitFor(self, node):
1.27 self.stream.write("<div class='if'>\n")
1.28 self.stream.write("<div>\n")
1.29 + self.stream.write("<span class='iterator'>\n")
1.30 self._keyword("for")
1.31 + self._popup_start()
1.32 + self._invocations(node._node.code[1].expr.ref.code[0].body[0].code[0].expr) # Link to next call in subprogram.
1.33 + self._popup_end()
1.34 + self.stream.write("</span>\n")
1.35 self.dispatch(node.assign)
1.36 + self.stream.write("<span class='iterator'>\n")
1.37 self._keyword("in")
1.38 + self._popup_start()
1.39 + self._invocations(node._node.code[0].expr) # Link to __iter__ call.
1.40 + self._popup_end()
1.41 + self.stream.write("</span>\n")
1.42 self.dispatch(node.list)
1.43 self.stream.write(":\n")
1.44 self.stream.write("</div>\n")
1.45 @@ -390,7 +404,12 @@
1.46
1.47 def visitReturn(self, node):
1.48 self.stream.write("<div class='return'>\n")
1.49 + self.stream.write("<span class='returns'>\n")
1.50 self._keyword("return")
1.51 + self._popup_start()
1.52 + self._types(node._node)
1.53 + self._popup_end()
1.54 + self.stream.write("</span>\n")
1.55 self.dispatch(node.value)
1.56 self.stream.write("</div>\n")
1.57
1.58 @@ -476,11 +495,11 @@
1.59
1.60 # Expressions.
1.61
1.62 - def visitAdd(self, node):
1.63 - self.stream.write("<span class='add'>\n")
1.64 + def _visitBinary(self, node, name, symbol):
1.65 + self.stream.write("<span class='%s'>\n" % name)
1.66 self.dispatch(node.left)
1.67 self.stream.write("<span class='operator'>\n")
1.68 - self.stream.write("+")
1.69 + self.stream.write(symbol)
1.70 self._popup_start()
1.71 self.stream.write("<div class='invocations'>\n")
1.72 self._invocations_list(node._node.body[0].expr) # NOTE: See visitAdd in simplify.
1.73 @@ -491,6 +510,9 @@
1.74 self.dispatch(node.right)
1.75 self.stream.write("</span>")
1.76
1.77 + def visitAdd(self, node):
1.78 + self._visitBinary(node, "add", "+")
1.79 +
1.80 def visitAnd(self, node):
1.81 self.stream.write("<span class='and'>\n")
1.82 first = 1
1.83 @@ -581,6 +603,9 @@
1.84 def visitConst(self, node):
1.85 self.stream.write(repr(node.value))
1.86
1.87 + def visitDiv(self, node):
1.88 + self._visitBinary(node, "div", "/")
1.89 +
1.90 def visitGetattr(self, node):
1.91 self.stream.write("<span class='getattr'>\n")
1.92 self.dispatch(node.expr)
1.93 @@ -614,6 +639,9 @@
1.94
1.95 visitList = visitAssList
1.96
1.97 + def visitMul(self, node):
1.98 + self._visitBinary(node, "mul", "*")
1.99 +
1.100 def visitName(self, node):
1.101 if hasattr(node, "_node"):
1.102 self._name_start(node._node.name)
1.103 @@ -655,6 +683,9 @@
1.104 self.stream.write("]")
1.105 self.stream.write("</span>\n")
1.106
1.107 + def visitSub(self, node):
1.108 + self._visitBinary(node, "sub", "-")
1.109 +
1.110 def visitSubscript(self, node):
1.111 self.stream.write("<span class='subscript'>\n")
1.112 self.dispatch(node.expr)
1.113 @@ -752,7 +783,10 @@
1.114
1.115 def _op(self, op_name, op):
1.116 if op is not None:
1.117 - self._invocations(op)
1.118 + if isinstance(op, Not):
1.119 + self._invocations(op.expr)
1.120 + else:
1.121 + self._invocations(op)
1.122
1.123 def _invocations(self, node):
1.124 self.stream.write("<div class='invocations'>\n")