Index: lib/src/trace.dart |
diff --git a/lib/src/trace.dart b/lib/src/trace.dart |
index 5cd09e9bb7fe0774e06ac6297667597dfb19e57e..53dbe33e4c2e9c1724e806e364bf9f5ac95fc209 100644 |
--- a/lib/src/trace.dart |
+++ b/lib/src/trace.dart |
@@ -203,36 +203,43 @@ class Trace implements StackTrace { |
/// core library or from this package, as in [foldFrames]. Remaining core |
/// library frames have their libraries, "-patch" suffixes, and line numbers |
/// removed. |
- Trace get terse { |
- return new Trace(foldFrames((frame) { |
- if (frame.isCore) return true; |
- if (frame.package == 'stack_trace') return true; |
- |
- // Ignore async stack frames without any line or column information. These |
- // come from the VM's async/await implementation and represent internal |
- // frames. They only ever show up in stack chains and are always |
- // surrounded by other traces that are actually useful, so we can just get |
- // rid of them. |
- // TODO(nweiz): Get rid of this logic some time after issue 22009 is |
- // fixed. |
- if (!frame.member.contains('<async>')) return false; |
- return frame.line == null; |
- }).frames.map((frame) { |
- if (!frame.isCore) return frame; |
- var library = frame.library.replaceAll(_terseRegExp, ''); |
- return new Frame(Uri.parse(library), null, null, frame.member); |
- })); |
- } |
+ /// |
+ /// For custom folding, see [foldFrames]. |
+ Trace get terse => foldFrames((_) => false, terse: true); |
/// Returns a new [Trace] based on [this] where multiple stack frames matching |
- /// [predicate] are folded together. This means that whenever there are |
- /// multiple frames in a row that match [predicate], only the last one is |
- /// kept. |
+ /// [predicate] are folded together. |
/// |
- /// This is useful for limiting the amount of library code that appears in a |
- /// stack trace by only showing user code and code that's called by user code. |
- Trace foldFrames(bool predicate(Frame frame)) { |
- var newFrames = <Frame>[]; |
+ /// This means that whenever there are multiple frames in a row that match |
+ /// [predicate], only the last one is kept. This is useful for limiting the |
+ /// amount of library code that appears in a stack trace by only showing user |
+ /// code and code that's called by user code. |
+ /// |
+ /// If [terse] is true, this will also fold together frames from the core |
+ /// library or from this package, and simplify core library frames as in |
+ /// [Trace.terse]. |
+ Trace foldFrames(bool predicate(Frame frame), {bool terse: false}) { |
+ if (terse) { |
+ var oldPredicate = predicate; |
+ predicate = (frame) { |
+ if (oldPredicate(frame)) return true; |
+ |
+ if (frame.isCore) return true; |
+ if (frame.package == 'stack_trace') return true; |
+ |
+ // Ignore async stack frames without any line or column information. |
+ // These come from the VM's async/await implementation and represent |
+ // internal frames. They only ever show up in stack chains and are |
+ // always surrounded by other traces that are actually useful, so we can |
+ // just get rid of them. |
+ // TODO(nweiz): Get rid of this logic some time after issue 22009 is |
+ // fixed. |
+ if (!frame.member.contains('<async>')) return false; |
+ return frame.line == null; |
+ }; |
+ } |
+ |
+ var newFrames = []; |
for (var frame in frames.reversed) { |
if (!predicate(frame)) { |
newFrames.add(frame); |
@@ -242,6 +249,14 @@ class Trace implements StackTrace { |
} |
} |
+ if (terse) { |
+ newFrames = newFrames.map((frame) { |
+ if (!frame.isCore) return frame; |
+ var library = frame.library.replaceAll(_terseRegExp, ''); |
+ return new Frame(Uri.parse(library), null, null, frame.member); |
+ }).toList(); |
+ } |
+ |
return new Trace(newFrames.reversed); |
} |