in lib/src/trace.dart [285:328]
Trace foldFrames(bool Function(Frame) predicate, {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 = <Frame>[];
for (var frame in frames.reversed) {
if (frame is UnparsedFrame || !predicate(frame)) {
newFrames.add(frame);
} else if (newFrames.isEmpty || !predicate(newFrames.last)) {
newFrames.add(Frame(frame.uri, frame.line, frame.column, frame.member));
}
}
if (terse) {
newFrames = newFrames.map((frame) {
if (frame is UnparsedFrame || !predicate(frame)) return frame;
var library = frame.library.replaceAll(_terseRegExp, '');
return Frame(Uri.parse(library), null, null, frame.member);
}).toList();
if (newFrames.length > 1 && predicate(newFrames.first)) {
newFrames.removeAt(0);
}
}
return Trace(newFrames.reversed, original: original.toString());
}