1.1 --- a/annotate.py Sat Apr 07 00:47:19 2007 +0200
1.2 +++ b/annotate.py Mon Apr 09 02:07:48 2007 +0200
1.3 @@ -601,6 +601,7 @@
1.4
1.5 self.dispatch(loadattr.expr)
1.6 types = set()
1.7 + raises = set()
1.8 non_accesses = []
1.9 accesses = {}
1.10
1.11 @@ -620,7 +621,9 @@
1.12
1.13 if not attr in non_accesses:
1.14 non_accesses.append(attr)
1.15 - self.namespace.raises.update(self.get_builtin_instances(loadattr, "AttributeError"))
1.16 + exc = self.get_builtin_instances(loadattr, "AttributeError")
1.17 + raises.update(exc)
1.18 + self.namespace.raises.update(exc)
1.19
1.20 # Revoke this type from any name involved.
1.21
1.22 @@ -646,7 +649,9 @@
1.23 else:
1.24 if not attr in non_accesses:
1.25 non_accesses.append(attr)
1.26 - self.namespace.raises.update(self.get_builtin_instances(loadattr, "AttributeError"))
1.27 + exc = self.get_builtin_instances(loadattr, "AttributeError")
1.28 + raises.update(exc)
1.29 + self.namespace.raises.update(exc)
1.30
1.31 # Revoke this type from any name involved.
1.32
1.33 @@ -660,6 +665,7 @@
1.34 self.namespace.set_types(types)
1.35 loadattr.non_accesses = non_accesses
1.36 loadattr.accesses = accesses
1.37 + loadattr.raises = raises
1.38 self.annotate(loadattr)
1.39
1.40 def _prune_non_accesses(self, expr, attr):
2.1 --- a/lib/builtins.py Sat Apr 07 00:47:19 2007 +0200
2.2 +++ b/lib/builtins.py Mon Apr 09 02:07:48 2007 +0200
2.3 @@ -833,9 +833,10 @@
2.4 return int()
2.5
2.6 def __add__(self, other):
2.7 + result = tuple(self)
2.8 for value in other:
2.9 - self.value = value
2.10 - return self
2.11 + result.append(value)
2.12 + return result
2.13
2.14 def __str__(self):
2.15 return str()
3.1 --- a/viewer.py Sat Apr 07 00:47:19 2007 +0200
3.2 +++ b/viewer.py Mon Apr 09 02:07:48 2007 +0200
3.3 @@ -48,6 +48,7 @@
3.4 .body { padding-left: 2em; }
3.5 .keyword { color: yellow; }
3.6 .comment { color: blue; }
3.7 + .class-name { color: cyan; }
3.8 .function-name { color: cyan; }
3.9 .str { color: #FF00FF; }
3.10 .doc { color: #FF00FF; margin-top: 1em; margin-bottom: 1em; }
3.11 @@ -200,7 +201,7 @@
3.12 self.stream.write("<div class='class' id='%s'>\n" % self._url(structure.full_name()))
3.13 self.stream.write("<div>\n")
3.14 self._keyword("class")
3.15 - self._name_start(structure.name)
3.16 + self._name_start(structure.name, "class-name")
3.17 self._popup(
3.18 self._scopes(definitions)
3.19 )
3.20 @@ -429,8 +430,15 @@
3.21 self.stream.write("</div>\n")
3.22
3.23 def visitRaise(self, node):
3.24 + target = node._node.expr
3.25 + targets = target.active()
3.26 self.stream.write("<div class='raise'>\n")
3.27 + self.stream.write("<span class='call'>\n")
3.28 self._keyword("raise")
3.29 + self._popup(
3.30 + self._invocations(targets)
3.31 + )
3.32 + self.stream.write("</span>\n")
3.33 self.dispatch(node.expr1)
3.34 if node.expr2 is not None:
3.35 self.stream.write(",\n")
3.36 @@ -539,7 +547,7 @@
3.37 self.stream.write("<span class='%s'>\n" % name)
3.38 self.dispatch(node.left)
3.39 self.stream.write("<span class='operator'>\n")
3.40 - self.stream.write(symbol)
3.41 + self.stream.write(self._text(symbol))
3.42 self._popup(
3.43 self._invocations(node._left_call.active() + node._right_call.active())
3.44 )
3.45 @@ -616,7 +624,7 @@
3.46 self.dispatch(node.nodes[0])
3.47 for op in node._ops:
3.48 self.stream.write("<span class='op'>\n")
3.49 - self.stream.write(op.name)
3.50 + self.stream.write(self._text(op.name))
3.51 self._popup(
3.52 self._op(op)
3.53 )
3.54 @@ -659,7 +667,7 @@
3.55 self.dispatch(node.expr)
3.56 for op in node._ops:
3.57 self.stream.write("<span class='op'>\n")
3.58 - self.stream.write(op.name)
3.59 + self.stream.write(self._text(op.name))
3.60 self._popup(
3.61 self._op(op)
3.62 )
3.63 @@ -795,9 +803,16 @@
3.64 self._visitBinary(node, "power", "**")
3.65
3.66 def visitSlice(self, node):
3.67 + target = node._node
3.68 + targets = target.active()
3.69 self.stream.write("<span class='slice'>\n")
3.70 self.dispatch(node.expr)
3.71 + self.stream.write("<span class='call'>\n")
3.72 self.stream.write("[")
3.73 + self._popup(
3.74 + self._invocations(targets)
3.75 + )
3.76 + self.stream.write("</span>\n")
3.77 if node.lower:
3.78 self.dispatch(node.lower)
3.79 self.stream.write(":")
3.80 @@ -820,9 +835,16 @@
3.81 self._visitBinary(node, "sub", "-")
3.82
3.83 def visitSubscript(self, node):
3.84 + target = node._node
3.85 + targets = target.active()
3.86 self.stream.write("<span class='subscript'>\n")
3.87 self.dispatch(node.expr)
3.88 + self.stream.write("<span class='call'>\n")
3.89 self.stream.write("[")
3.90 + self._popup(
3.91 + self._invocations(targets)
3.92 + )
3.93 + self.stream.write("</span>\n")
3.94 first = 1
3.95 for sub in node.subs:
3.96 if not first: