# HG changeset patch # User paulb@jeremy # Date 1161391961 -7200 # Node ID c5c392d882dd107c2a0e2c3ec97479376509dfdc # Parent a6806f3e1af8c9ebf9bb222ab77781d21c589b4f Added support more nodes. Fixed docstrings (using analysis code). Introduced checks for simplified node definitions, skipping AST nodes which lack such definitions. (This may be incorrect behaviour.) diff -r a6806f3e1af8 -r c5c392d882dd viewer.py --- a/viewer.py Sat Oct 21 00:16:02 2006 +0200 +++ b/viewer.py Sat Oct 21 02:52:41 2006 +0200 @@ -24,6 +24,7 @@ from compiler.visitor import ASTVisitor from simplified import * import sys +import textwrap # Exceptions. @@ -153,6 +154,18 @@ """ +# Validation functions. + +def hasnode(fn): + def _hasnode(self, node): + if not hasattr(node, "_node"): + return + else: + fn(self, node) + return _hasnode + +# Browser classes. + class Browser(ASTVisitor): """ @@ -183,8 +196,13 @@ # Statements. - def visitPass(self, node): - self._keyword("pass") + def visitAssign(self, node): + self.stream.write("
\n") + for lvalue in node.nodes: + self.dispatch(lvalue) + self.stream.write("=\n") + self.dispatch(node.expr) + self.stream.write("
\n") def visitClass(self, node): definition = node._node @@ -222,6 +240,8 @@ self.stream.write("\n") self.stream.write("\n") + visitClass = hasnode(visitClass) # Remove unannotated nodes. + def visitFunction(self, node): definition = node._node subprogram = definition.expr.ref @@ -263,23 +283,23 @@ self.stream.write("\n") self.stream.write("\n") + visitFunction = hasnode(visitFunction) # Remove unannotated nodes. + + def visitPass(self, node): + self._keyword("pass") + + def visitReturn(self, node): + self._keyword("return") + self.dispatch(node.value) + def visitStmt(self, node): self.stream.write("
\n") self.default(node) self.stream.write("
\n") - def visitAssign(self, node): - self.stream.write("
\n") - for lvalue in node.nodes: - self.dispatch(lvalue) - self.stream.write("=\n") - self.dispatch(node.expr) - self.stream.write("
\n") - # Expressions. def visitCallFunc(self, node): - invocation = node._node self.stream.write("\n") self.dispatch(node.node) self.stream.write("(") @@ -321,20 +341,26 @@ visitAssList = visitList def visitName(self, node): - self._name_start(node._node.name) - self._popup_start() - self._types(node._node) - self._scopes(node._node) - self._popup_end() - self._name_end() + if hasattr(node, "_node"): + self._name_start(node._node.name) + self._popup_start() + self._types(node._node) + self._scopes(node._node) + self._popup_end() + self._name_end() + else: + self._name(node.name) def visitAssName(self, node): - self._name_start(node._node.name) - self._popup_start() - self._types(node._node.expr) - self._scopes(node._node) - self._popup_end() - self._name_end() + if hasattr(node, "_node"): + self._name_start(node._node.name) + self._popup_start() + self._types(node._node.expr) + self._scopes(node._node) + self._popup_end() + self._name_end() + else: + self._name(node.name) def visitConst(self, node): self.stream.write(repr(node.value)) @@ -344,10 +370,11 @@ self.dispatch(node.expr) self.stream.write("\n") self.stream.write(".%s\n" % self._text(node.attrname)) - self._popup_start() - self._types(node._node) - self._scopes(node._node) - self._popup_end() + if hasattr(node, "_node"): + self._popup_start() + self._types(node._node) + self._scopes(node._node) + self._popup_end() self.stream.write("\n") self.stream.write("\n") @@ -356,10 +383,11 @@ self.dispatch(node.expr) self.stream.write("\n") self.stream.write(".%s\n" % self._text(node.attrname)) - self._popup_start() - self._types(node._node) - self._scopes(node._node) - self._popup_end() + if hasattr(node, "_node"): + self._popup_start() + self._types(node._node) + self._scopes(node._node) + self._popup_end() self.stream.write("\n") self.stream.write("\n") @@ -382,7 +410,12 @@ def _doc(self, node): if node.doc is not None: - self.stream.write("
%s
\n" % self._text(repr(node.doc))) + self.stream.write("
\n")
+            self.stream.write('"""')
+            output = textwrap.dedent(node.doc.replace('"""', '\\"\\"\\"'))
+            self.stream.write(self._text(output))
+            self.stream.write('"""')
+            self.stream.write("
\n") def _sequence(self, node): first = 1