in lib/src/hierarchy_view.dart [63:98]
void _display() {
_treeTable.columnInfo(_columnNames, _columnHelp, _columnSizes);
int programSize = _model.size;
// A helper function for lazily constructing the tree
LogicalRow buildTree(String id, bool isTop, HtmlElement tbody, int level) {
Map<String, dynamic> node = _model.elementById(id);
if (node['size'] == null) {
node['size'] = _computeSize(node, _model.elementById);
}
node['size_percent'] =
(100 * node['size'] / programSize).toStringAsFixed(2) + '%';
var row = new LogicalRow(node, _renderRow, tbody, level);
_addMetadata(node, row, tbody, level + 1, _model.elementById);
if (isTop) {
_treeTable.addTopLevel(row);
}
if (node['children'] != null) {
for (var childId in node['children']) {
// Thunk! Lazy tree creation happens in this closure.
row.addChild(() => buildTree(childId, false, tbody, level + 1));
}
}
return row;
}
// Start building the tree from the libraries because
// libraries are always the top level.
for (String libraryId in _model.allOfType('library').map((a) => a['id'])) {
buildTree('$libraryId', true, _treeTable.tbody, 0).show();
}
}