1.1 --- a/micropython/report.py Tue Aug 10 23:18:42 2010 +0200
1.2 +++ b/micropython/report.py Wed Aug 11 00:04:11 2010 +0200
1.3 @@ -73,12 +73,24 @@
1.4 z-index: 3;
1.5 }
1.6
1.7 + .types-popup {
1.8 + display: none;
1.9 + position: absolute;
1.10 + bottom: 3ex; left: 0;
1.11 + color: white;
1.12 + border-bottom: 0.5ex solid #000;
1.13 + border-right: 0.5ex solid #000;
1.14 + z-index: 3;
1.15 + }
1.16 +
1.17 + .accessor,
1.18 .name {
1.19 position: relative;
1.20 background-color: #300;
1.21 color: white;
1.22 }
1.23
1.24 + .accessor:hover,
1.25 .name:hover {
1.26 background-color: #500;
1.27 padding-top: 0.5ex;
1.28 @@ -86,11 +98,13 @@
1.29 z-index: 2;
1.30 }
1.31
1.32 + .accessor:hover .types-popup,
1.33 .name:hover .popup {
1.34 display: block;
1.35 }
1.36
1.37 .attrnames,
1.38 + .typenames,
1.39 .scope {
1.40 padding: 0.5em;
1.41 background-color: #700;
1.42 @@ -157,8 +171,8 @@
1.43 self.stream.write(self._text(name))
1.44 self._name_end()
1.45
1.46 - def _popup_start(self):
1.47 - self._span_start("popup")
1.48 + def _popup_start(self, classes=None):
1.49 + self._span_start(classes or "popup")
1.50
1.51 _popup_end = _span_end
1.52
1.53 @@ -222,27 +236,47 @@
1.54 self._span(name)
1.55 self._span_end()
1.56
1.57 - def _attrnames(self, attrnames):
1.58 - if not attrnames:
1.59 + def _names_list(self, names, label, classes):
1.60 + if not names:
1.61 return
1.62 + names = list(names)
1.63 + names.sort()
1.64
1.65 - self.stream.write("<div class='attrnames'><span class='label'>attributes</span><br />")
1.66 + self.stream.write("<div class='%s'><span class='label'>%s</span><br />" % (classes, label))
1.67 first = 1
1.68 - for attrname in attrnames:
1.69 + for name in names:
1.70 if not first:
1.71 self.stream.write("<br />")
1.72 - self.stream.write(attrname)
1.73 + self.stream.write(name)
1.74 first = 0
1.75 self.stream.write("</div>\n")
1.76
1.77 + def _attrnames(self, attrnames):
1.78 + self._names_list(attrnames, "attributes", "attrnames")
1.79 +
1.80 + def _typenames(self, typenames):
1.81 + self._names_list(typenames, "types", "typenames")
1.82 +
1.83 + def _accessor_start(self, target_names):
1.84 + if target_names is not None:
1.85 + self._span_start("accessor")
1.86 + self._popup_start("types-popup")
1.87 + self._typenames(target_names)
1.88 + self._popup_end()
1.89 +
1.90 + def _accessor_end(self, target_names):
1.91 + if target_names is not None:
1.92 + self._span_end()
1.93 +
1.94 # Summary classes.
1.95
1.96 class Summary(Writer):
1.97
1.98 "Summarise classes and attributes in modules."
1.99
1.100 - def __init__(self, module):
1.101 + def __init__(self, module, program):
1.102 self.module = module
1.103 + self.program = program
1.104
1.105 def to_stream(self, stream):
1.106
1.107 @@ -313,10 +347,13 @@
1.108
1.109 "A module source code browser."
1.110
1.111 - def __init__(self, module):
1.112 + def __init__(self, module, program):
1.113 ASTVisitor.__init__(self)
1.114 self.visitor = self
1.115 self.module = module
1.116 + self.program = program
1.117 + self.objtable = self.program.get_object_table()
1.118 + self.paramtable = self.program.get_parameter_table()
1.119
1.120 def to_stream(self, stream):
1.121
1.122 @@ -780,8 +817,11 @@
1.123 self._visitBinary(node, "floordiv", "//")
1.124
1.125 def visitGetattr(self, node):
1.126 + target_names = self.possible_accessor_types(node)
1.127 self._span_start("getattr")
1.128 + self._accessor_start(target_names)
1.129 self.dispatch(node.expr)
1.130 + self._accessor_end(target_names)
1.131 self._span_start("attr")
1.132 self.stream.write(".")
1.133 self._span(node.attrname, "attrname")
1.134 @@ -913,28 +953,28 @@
1.135
1.136 # Convenience functions.
1.137
1.138 -def summarise(module, filename):
1.139 +def summarise(module, program, filename):
1.140 stream = open(filename, "wb")
1.141 try:
1.142 - summary = Summary(module)
1.143 + summary = Summary(module, program)
1.144 summary.to_stream(stream)
1.145 finally:
1.146 stream.close()
1.147
1.148 -def annotate(module, filename):
1.149 +def annotate(module, program, filename):
1.150 stream = open(filename, "wb")
1.151 try:
1.152 - source = AnnotatedSource(module)
1.153 + source = AnnotatedSource(module, program)
1.154 source.to_stream(stream)
1.155 finally:
1.156 stream.close()
1.157
1.158 -def report(importer, directory):
1.159 +def report(program, directory):
1.160 if not exists(directory):
1.161 os.mkdir(directory)
1.162
1.163 - for module in importer.get_modules():
1.164 - annotate(module, join(directory, "%s%sxhtml" % (module.full_name(), extsep)))
1.165 - summarise(module, join(directory, "%s-summary%sxhtml" % (module.full_name(), extsep)))
1.166 + for module in program.get_importer().get_modules():
1.167 + annotate(module, program, join(directory, "%s%sxhtml" % (module.full_name(), extsep)))
1.168 + summarise(module, program, join(directory, "%s-summary%sxhtml" % (module.full_name(), extsep)))
1.169
1.170 # vim: tabstop=4 expandtab shiftwidth=4