Index: lib/src/util.dart |
diff --git a/lib/src/util.dart b/lib/src/util.dart |
index e30ba1799e1e095943a7ef3e7db3d5b78cac5405..1b8a0847b2373b6899b3a791db9c428289b01bd4 100644 |
--- a/lib/src/util.dart |
+++ b/lib/src/util.dart |
@@ -1,4 +1,8 @@ |
-library compiler.tool.util; |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library dart2js_info.src.util; |
import 'package:dart2js_info/info.dart'; |
import 'graph.dart'; |
@@ -73,3 +77,50 @@ pad(value, n, {bool right: false}) { |
var pad = ' ' * (n - s.length); |
return right ? '$s$pad' : '$pad$s'; |
} |
+ |
+/// Color-highlighted string used mainly to debug invariants. |
+String recursiveDiagnosticString(Measurements measurements, Metric metric) { |
+ var sb = new StringBuffer(); |
+ helper(Metric m) { |
+ int value = measurements.counters[m]; |
+ if (value == null) value = 0; |
+ if (m is! GroupedMetric) { |
+ sb.write(value); |
+ sb.write(' ${m.name}'); |
+ return; |
+ } |
+ GroupedMetric group = m; |
+ |
+ int expected = 0; |
+ for (var sub in group.submetrics) { |
+ var n = measurements.counters[sub]; |
+ if (n != null) expected += n; |
+ } |
+ if (value == expected) { |
+ sb.write('[32m'); |
+ sb.write(value); |
+ } else { |
+ sb.write('[31m'); |
+ sb.write(value); |
+ sb.write('[33m['); |
+ sb.write(expected); |
+ sb.write(']'); |
+ } |
+ sb.write('[0m'); |
+ sb.write(' ${group.name}'); |
+ |
+ bool first = true; |
+ sb.write('('); |
+ for (var sub in group.submetrics) { |
+ if (first) { |
+ first = false; |
+ } else { |
+ sb.write(' + '); |
+ } |
+ helper(sub); |
+ } |
+ sb.write(')'); |
+ } |
+ helper(metric); |
+ return sb.toString(); |
+} |