1.1 --- a/compiler/ast.py Sun Mar 03 01:31:58 2013 +0100
1.2 +++ b/compiler/ast.py Tue Mar 12 00:12:25 2013 +0100
1.3 @@ -7,8 +7,7 @@
1.4 def flatten(seq):
1.5 l = []
1.6 for elt in seq:
1.7 - t = type(elt)
1.8 - if t is tuple or t is list:
1.9 + if isinstance(elt, (tuple, list)):
1.10 for elt2 in flatten(elt):
1.11 l.append(elt2)
1.12 else:
1.13 @@ -18,6 +17,24 @@
1.14 def flatten_nodes(seq):
1.15 return [n for n in flatten(seq) if isinstance(n, Node)]
1.16
1.17 +def flatten_statement(seq):
1.18 + l = []
1.19 + for elt in seq:
1.20 + if isinstance(elt, Stmt):
1.21 + l += flatten_statement(elt)
1.22 + else:
1.23 + l.append(elt)
1.24 + return l
1.25 +
1.26 +def docstring(s):
1.27 + if s.find("\n") != -1:
1.28 + if s.find("'''") != -1:
1.29 + return '"""%s"""' % s.replace('"""', '\\"\\"\\"')
1.30 + else:
1.31 + return "'''%s'''" % s.replace("'''", "\\'\\'\\'")
1.32 + else:
1.33 + return repr(s)
1.34 +
1.35 def indent(s):
1.36 return s.replace("\n", "\n\t")
1.37
1.38 @@ -532,11 +549,11 @@
1.39 return "Class(%r, %r, %r, %r, %r)" % (self.name, self.bases, self.doc, self.code, self.decorators)
1.40
1.41 def __str__(self):
1.42 - return "%sclass %s%s:%s%s" % (
1.43 + return "%sclass %s%s:%s%s\n" % (
1.44 self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.45 self.name,
1.46 self.bases and "(%s)" % ", ".join(map(str, self.bases)) or "",
1.47 - indent(self.doc and "\n%r" % self.doc or ""),
1.48 + indent(self.doc and "\n%s" % docstring(self.doc) or ""),
1.49 indent("\n%s" % self.code)
1.50 )
1.51
1.52 @@ -889,11 +906,11 @@
1.53 def __str__(self):
1.54 parameters = decode_function(self)
1.55
1.56 - return "%sdef %s(%s):%s%s" % (
1.57 + return "%sdef %s(%s):%s%s\n" % (
1.58 self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.59 self.name,
1.60 ", ".join(parameters),
1.61 - indent(self.doc and "\n%r" % self.doc or ""),
1.62 + indent(self.doc and "\n\n%s\n" % docstring(self.doc) or ""),
1.63 indent("\n%s" % self.code)
1.64 )
1.65
1.66 @@ -1390,7 +1407,7 @@
1.67 return "Module(%r, %r)" % (self.doc, self.node)
1.68
1.69 def __str__(self):
1.70 - return "%s%s" % (self.doc and "%r\n" % self.doc or "", self.node)
1.71 + return "%s%s" % (self.doc and "%s\n\n" % docstring(self.doc) or "", self.node)
1.72
1.73 def visit(self, visitor, *args):
1.74 return visitor.visitModule(self, *args)
1.75 @@ -1754,7 +1771,7 @@
1.76 return "Stmt(%r)" % (self.nodes,)
1.77
1.78 def __str__(self):
1.79 - return "\n".join(map(str, self.nodes))
1.80 + return "\n".join(map(str, flatten_statement(self.nodes)))
1.81
1.82 def visit(self, visitor, *args):
1.83 return visitor.visitStmt(self, *args)