Chain.terse shouldn't return an empty chain. R=rnystrom@google.com BUG= Review URL: https://codereview.chromium.org//116913003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/stack_trace@31177 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/stack_trace/lib/src/chain.dart b/pkgs/stack_trace/lib/src/chain.dart index f6e2f3f..4055bc8 100644 --- a/pkgs/stack_trace/lib/src/chain.dart +++ b/pkgs/stack_trace/lib/src/chain.dart
@@ -157,10 +157,19 @@ /// This calls [Trace.terse] on every trace in [traces], and discards any /// trace that contain only internal frames. Chain get terse { - return new Chain(traces.map((trace) => trace.terse).where((trace) { + var terseTraces = traces.map((trace) => trace.terse); + var nonEmptyTraces = terseTraces.where((trace) { // Ignore traces that contain only internal processing. return trace.frames.length > 1; - })); + }); + + // If all the traces contain only internal processing, preserve the last + // (top-most) one so that the chain isn't empty. + if (nonEmptyTraces.isEmpty && terseTraces.isNotEmpty) { + return new Chain([terseTraces.last]); + } + + return new Chain(nonEmptyTraces); } /// Converts [this] to a [Trace].
diff --git a/pkgs/stack_trace/test/chain_test.dart b/pkgs/stack_trace/test/chain_test.dart index 4d31acb..9c16690 100644 --- a/pkgs/stack_trace/test/chain_test.dart +++ b/pkgs/stack_trace/test/chain_test.dart
@@ -386,6 +386,21 @@ '$userSlashCode 10:11 Foo.bar\n' 'dart:core Bar.baz\n')); }); + + test("doesn't return in an empty chain", () { + var chain = new Chain([ + new Trace.parse( + 'dart:core 10:11 Foo.bar\n' + 'package:stack_trace/stack_trace.dart 10:11 Bar.baz\n' + 'dart:core 10:11 Zip.zap'), + new Trace.parse( + 'dart:core 10:11 A.b\n' + 'package:stack_trace/stack_trace.dart 10:11 C.d\n' + 'dart:core 10:11 E.f') + ]); + + expect(chain.terse.toString(), equals('dart:core E.f\n')); + }); }); test('Chain.toTrace eliminates asynchronous gaps', () {