Fixes async gap handling in Trace.parse and Chain.parse (#89)
* Fixes Trace and Chain parsing of async gap at end.
* Update CHANGELOG.md.
* Lint: isEmpty instead of length
* Bump version in pubspec.yaml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e19614..46a371d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.10.0-nullsafety.6-dev
+
+* Fix bug parsing asynchronous suspension gap markers at the end of stack
+ traces, when parsing with `Trace.parse` and `Chain.parse`.
+
## 1.10.0-nullsafety.5
* Allow prerelease versions of the 2.12 sdk.
diff --git a/lib/src/chain.dart b/lib/src/chain.dart
index ba6fa40..aad0c33 100644
--- a/lib/src/chain.dart
+++ b/lib/src/chain.dart
@@ -180,8 +180,10 @@
factory Chain.parse(String chain) {
if (chain.isEmpty) return Chain([]);
if (chain.contains(vmChainGap)) {
- return Chain(
- chain.split(vmChainGap).map((trace) => Trace.parseVM(trace)));
+ return Chain(chain
+ .split(vmChainGap)
+ .where((line) => line.isNotEmpty)
+ .map((trace) => Trace.parseVM(trace)));
}
if (!chain.contains(chainGap)) return Chain([Trace.parse(chain)]);
diff --git a/lib/src/trace.dart b/lib/src/trace.dart
index 7e30b95..42371c7 100644
--- a/lib/src/trace.dart
+++ b/lib/src/trace.dart
@@ -151,6 +151,11 @@
.replaceAll(vmChainGap, '')
.split('\n')
.where((line) => line.isNotEmpty);
+
+ if (lines.isEmpty) {
+ return [];
+ }
+
var frames = lines
.take(lines.length - 1)
.map((line) => Frame.parseVM(line))
diff --git a/pubspec.yaml b/pubspec.yaml
index 7dbf9a8..048978c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: stack_trace
-version: 1.10.0-nullsafety.5
+version: 1.10.0-nullsafety.6-dev
description: A package for manipulating stack traces and printing them readably.
homepage: https://github.com/dart-lang/stack_trace
diff --git a/test/chain/chain_test.dart b/test/chain/chain_test.dart
index 1e466ac..3309ae1 100644
--- a/test/chain/chain_test.dart
+++ b/test/chain/chain_test.dart
@@ -36,6 +36,21 @@
expect(chain.traces[1].frames, isEmpty);
expect(chain.traces[2].frames, isEmpty);
});
+
+ test('parses a chain with VM gaps', () {
+ final chain =
+ Chain.parse('#1 MyClass.run (package:my_lib.dart:134:5)\n'
+ '<asynchronous suspension>\n'
+ '#2 main (file:///my_app.dart:9:3)\n'
+ '<asynchronous suspension>\n');
+ expect(chain.traces, hasLength(2));
+ expect(chain.traces[0].frames, hasLength(1));
+ expect(chain.traces[0].frames[0].toString(),
+ equals('package:my_lib.dart 134:5 in MyClass.run'));
+ expect(chain.traces[1].frames, hasLength(1));
+ expect(chain.traces[1].frames[0].toString(),
+ equals('/my_app.dart 9:3 in main'));
+ });
});
group('Chain.capture()', () {