1.1 --- a/micropython/report.py Wed Aug 11 00:04:11 2010 +0200
1.2 +++ b/micropython/report.py Sun Aug 15 21:49:47 2010 +0200
1.3 @@ -60,6 +60,7 @@
1.4 .comment { color: blue; }
1.5 .class-name { color: cyan; }
1.6 .function-name { color: cyan; }
1.7 + .specific-ref { color: #07F; }
1.8 .str { color: #FF00FF; }
1.9 .doc { color: #FF00FF; margin-top: 1em; margin-bottom: 1em; }
1.10
1.11 @@ -202,9 +203,6 @@
1.12 self.stream.write('"""')
1.13 self.stream.write("</pre>\n")
1.14
1.15 - def _summary_link(self, module_name, full_name, name, classes=None):
1.16 - self._name_link("%s-summary" % module_name, full_name, name, classes)
1.17 -
1.18 def _object_name_def(self, module, obj, classes=None):
1.19
1.20 """
1.21 @@ -214,9 +212,21 @@
1.22
1.23 self._summary_link(module.full_name(), obj.full_name(), obj.name, classes)
1.24
1.25 + def _object_name_ref(self, module, obj, classes=None):
1.26 +
1.27 + """
1.28 + Link to the definition for 'module' using 'obj'. The optional 'classes'
1.29 + can be used to customise the CSS classes employed.
1.30 + """
1.31 +
1.32 + self._name_link(module.full_name(), obj.full_name(), obj.name, classes)
1.33 +
1.34 + def _summary_link(self, module_name, full_name, name, classes=None):
1.35 + self._name_link("%s-summary" % module_name, full_name, name, classes)
1.36 +
1.37 def _name_link(self, module_name, full_name, name, classes=None):
1.38 self.stream.write("<a class='%s' href='%s%sxhtml#%s'>%s</a>" % (
1.39 - classes or "name", module_name, os.path.extsep,
1.40 + classes or "specific-ref", module_name, os.path.extsep,
1.41 self._attr(full_name), self._text(name)))
1.42
1.43 def _scope(self, scope):
1.44 @@ -283,7 +293,6 @@
1.45 "Write the summary to the given 'stream'."
1.46
1.47 self.stream = stream
1.48 - self._init_details()
1.49 self.stream.write(html_header % {"full_name" : self.module.full_name()})
1.50 self._write_classes(self.module)
1.51 self.stream.write(html_footer)
1.52 @@ -316,31 +325,17 @@
1.53 self.stream.write(obj.name)
1.54 self.stream.write("</th>\n")
1.55
1.56 - # ...and all known attribute names.
1.57 + # ...and instance attribute names in order.
1.58
1.59 - obj_attributes = obj.all_attribute_names()
1.60 + attrs = obj.instance_attributes().values()
1.61 + attrs.sort(cmp=lambda x, y: cmp(x.position, y.position))
1.62
1.63 - for name in self.attribute_names:
1.64 - if name in obj_attributes:
1.65 - self.stream.write("<th class='summary-attr'>%s</th>\n" % self._text(name))
1.66 - else:
1.67 - self.stream.write("<th></th>\n")
1.68 + for attr in attrs:
1.69 + self.stream.write("<th class='summary-attr'>%s</th>\n" % self._text(attr.name))
1.70 +
1.71 self.stream.write("</tr>\n")
1.72 -
1.73 self.stream.write("</tbody>\n")
1.74
1.75 - def _init_details(self):
1.76 - names = set()
1.77 -
1.78 - # Visit all classes.
1.79 -
1.80 - for obj in self.module.all_objects:
1.81 - if isinstance(obj, Class):
1.82 - names.update(obj.all_attribute_names())
1.83 -
1.84 - self.attribute_names = list(names)
1.85 - self.attribute_names.sort()
1.86 -
1.87 # Source code classes.
1.88
1.89 class AnnotatedSource(ASTVisitor, Writer):
1.90 @@ -427,7 +422,7 @@
1.91 if not first:
1.92 self.stream.write(", ")
1.93
1.94 - self._object_name_def(base.module, base)
1.95 + self._object_name_ref(base.module, base)
1.96
1.97 first = 0
1.98 self.stream.write(")")
1.99 @@ -439,7 +434,18 @@
1.100
1.101 self.stream.write("<div class='body nowrap'>\n")
1.102 self._doc(node)
1.103 - self.dispatch(node.code)
1.104 +
1.105 + # NOTE: Some streams may not support tell.
1.106 +
1.107 + x = self.stream.tell()
1.108 +
1.109 + self.default(node.code)
1.110 +
1.111 + # Check for no output.
1.112 +
1.113 + if x == self.stream.tell():
1.114 + self.visitPass(None)
1.115 +
1.116 self.stream.write("</div>\n")
1.117 self.stream.write("</div>\n")
1.118
1.119 @@ -902,6 +908,71 @@
1.120 else:
1.121 self._span(node.name)
1.122
1.123 + def visitNot(self, node):
1.124 + self._span_start("not")
1.125 + self._keyword("not")
1.126 + self.dispatch(node.expr)
1.127 + self._span_end()
1.128 +
1.129 + def visitOr(self, node):
1.130 + self._span_start("or")
1.131 + first = 1
1.132 + for n in node.nodes:
1.133 + if not first:
1.134 + self._keyword("or", 1)
1.135 + self.dispatch(n)
1.136 + first = 0
1.137 + self._span_end()
1.138 +
1.139 + def visitPower(self, node):
1.140 + self._visitBinary(node, "power", "**")
1.141 +
1.142 + def visitSlice(self, node):
1.143 + self._span_start("slice")
1.144 + self.dispatch(node.expr)
1.145 + self.stream.write("[")
1.146 + if node.lower:
1.147 + self.dispatch(node.lower)
1.148 + self.stream.write(":")
1.149 + if node.upper:
1.150 + self.dispatch(node.upper)
1.151 + # NOTE: Step?
1.152 + self.stream.write("]")
1.153 + self._span_end()
1.154 +
1.155 + def visitSliceobj(self, node):
1.156 + self._span_start("sliceobj")
1.157 + first = 1
1.158 + for n in node.nodes:
1.159 + if not first:
1.160 + self.stream.write(":")
1.161 + self.dispatch(n)
1.162 + self._span_end()
1.163 +
1.164 + def visitSub(self, node):
1.165 + self._visitBinary(node, "sub", "-")
1.166 +
1.167 + def visitSubscript(self, node):
1.168 + self._span_start("subscript")
1.169 + self.dispatch(node.expr)
1.170 + self.stream.write("[")
1.171 + first = 1
1.172 + for sub in node.subs:
1.173 + if not first:
1.174 + self.stream.write(", ")
1.175 + self.dispatch(sub)
1.176 + first = 0
1.177 + self.stream.write("]")
1.178 + self._span_end()
1.179 +
1.180 + visitTuple = visitAssTuple
1.181 +
1.182 + def visitUnaryAdd(self, node):
1.183 + self._visitUnary(node, "add", "+")
1.184 +
1.185 + def visitUnarySub(self, node):
1.186 + self._visitUnary(node, "sub", "-")
1.187 +
1.188 # Output preparation methods.
1.189
1.190 def _sequence(self, node):