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()', () {