# HG changeset patch # User paulb@localhost.localdomain # Date 1176077268 -7200 # Node ID deffda1ada7fd537a2b80e8f4fe7a73d070381d0 # Parent 88ccf0ca4bd6c3984e3bd62829317c9af4d551e2 Added exception recording on LoadAttr. Made tuple.__add__ more realistic. Fixed viewer output for operator symbols (needed to encode the HTML). Added more pop-up elements for slices, subscripts and raised exception initialisation. Made class names a separate colour. diff -r 88ccf0ca4bd6 -r deffda1ada7f annotate.py --- a/annotate.py Sat Apr 07 00:47:19 2007 +0200 +++ b/annotate.py Mon Apr 09 02:07:48 2007 +0200 @@ -601,6 +601,7 @@ self.dispatch(loadattr.expr) types = set() + raises = set() non_accesses = [] accesses = {} @@ -620,7 +621,9 @@ if not attr in non_accesses: non_accesses.append(attr) - self.namespace.raises.update(self.get_builtin_instances(loadattr, "AttributeError")) + exc = self.get_builtin_instances(loadattr, "AttributeError") + raises.update(exc) + self.namespace.raises.update(exc) # Revoke this type from any name involved. @@ -646,7 +649,9 @@ else: if not attr in non_accesses: non_accesses.append(attr) - self.namespace.raises.update(self.get_builtin_instances(loadattr, "AttributeError")) + exc = self.get_builtin_instances(loadattr, "AttributeError") + raises.update(exc) + self.namespace.raises.update(exc) # Revoke this type from any name involved. @@ -660,6 +665,7 @@ self.namespace.set_types(types) loadattr.non_accesses = non_accesses loadattr.accesses = accesses + loadattr.raises = raises self.annotate(loadattr) def _prune_non_accesses(self, expr, attr): diff -r 88ccf0ca4bd6 -r deffda1ada7f lib/builtins.py --- a/lib/builtins.py Sat Apr 07 00:47:19 2007 +0200 +++ b/lib/builtins.py Mon Apr 09 02:07:48 2007 +0200 @@ -833,9 +833,10 @@ return int() def __add__(self, other): + result = tuple(self) for value in other: - self.value = value - return self + result.append(value) + return result def __str__(self): return str() diff -r 88ccf0ca4bd6 -r deffda1ada7f viewer.py --- a/viewer.py Sat Apr 07 00:47:19 2007 +0200 +++ b/viewer.py Mon Apr 09 02:07:48 2007 +0200 @@ -48,6 +48,7 @@ .body { padding-left: 2em; } .keyword { color: yellow; } .comment { color: blue; } + .class-name { color: cyan; } .function-name { color: cyan; } .str { color: #FF00FF; } .doc { color: #FF00FF; margin-top: 1em; margin-bottom: 1em; } @@ -200,7 +201,7 @@ self.stream.write("
\n" % self._url(structure.full_name())) self.stream.write("
\n") self._keyword("class") - self._name_start(structure.name) + self._name_start(structure.name, "class-name") self._popup( self._scopes(definitions) ) @@ -429,8 +430,15 @@ self.stream.write("
\n") def visitRaise(self, node): + target = node._node.expr + targets = target.active() self.stream.write("
\n") + self.stream.write("\n") self._keyword("raise") + self._popup( + self._invocations(targets) + ) + self.stream.write("\n") self.dispatch(node.expr1) if node.expr2 is not None: self.stream.write(",\n") @@ -539,7 +547,7 @@ self.stream.write("\n" % name) self.dispatch(node.left) self.stream.write("\n") - self.stream.write(symbol) + self.stream.write(self._text(symbol)) self._popup( self._invocations(node._left_call.active() + node._right_call.active()) ) @@ -616,7 +624,7 @@ self.dispatch(node.nodes[0]) for op in node._ops: self.stream.write("\n") - self.stream.write(op.name) + self.stream.write(self._text(op.name)) self._popup( self._op(op) ) @@ -659,7 +667,7 @@ self.dispatch(node.expr) for op in node._ops: self.stream.write("\n") - self.stream.write(op.name) + self.stream.write(self._text(op.name)) self._popup( self._op(op) ) @@ -795,9 +803,16 @@ self._visitBinary(node, "power", "**") def visitSlice(self, node): + target = node._node + targets = target.active() self.stream.write("\n") self.dispatch(node.expr) + self.stream.write("\n") self.stream.write("[") + self._popup( + self._invocations(targets) + ) + self.stream.write("\n") if node.lower: self.dispatch(node.lower) self.stream.write(":") @@ -820,9 +835,16 @@ self._visitBinary(node, "sub", "-") def visitSubscript(self, node): + target = node._node + targets = target.active() self.stream.write("\n") self.dispatch(node.expr) + self.stream.write("\n") self.stream.write("[") + self._popup( + self._invocations(targets) + ) + self.stream.write("\n") first = 1 for sub in node.subs: if not first: