Index: lib/src/utils.dart |
diff --git a/lib/src/utils.dart b/lib/src/utils.dart |
index da2192764a1af63e56830205f26e5129dc3acd06..6b0939fe5ccf805bcf9ffb33e5e9d86b045eb1c1 100644 |
--- a/lib/src/utils.dart |
+++ b/lib/src/utils.dart |
@@ -13,48 +13,38 @@ import 'package:stack_trace/stack_trace.dart'; |
/// The return type should only ever by [Future] or void. |
typedef AsyncFunction(); |
+/// A regular expression to match the exception prefix that some exceptions' |
+/// [Object.toString] values contain. |
+final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): '); |
+ |
+/// Get a string description of an exception. |
+/// |
+/// Many exceptions include the exception class name at the beginning of their |
+/// [toString], so we remove that if it exists. |
+String getErrorMessage(error) => |
+ error.toString().replaceFirst(_exceptionPrefix, ''); |
+ |
/// Indent each line in [str] by two spaces. |
String indent(String str) => |
str.replaceAll(new RegExp("^", multiLine: true), " "); |
-/// A pair of values. |
-class Pair<E, F> { |
- final E first; |
- final F last; |
- |
- Pair(this.first, this.last); |
- |
- String toString() => '($first, $last)'; |
- |
- bool operator ==(other) { |
- if (other is! Pair) return false; |
- return other.first == first && other.last == last; |
- } |
- |
- int get hashCode => first.hashCode ^ last.hashCode; |
-} |
- |
-/// Returns a Trace object from a StackTrace object or a String, or the |
-/// unchanged input if formatStacks is false; |
-Trace getTrace(stack, bool formatStacks, bool filterStacks) { |
- Trace trace; |
- if (stack == null || !formatStacks) return null; |
- if (stack is String) { |
- trace = new Trace.parse(stack); |
- } else if (stack is StackTrace) { |
- trace = new Trace.from(stack); |
- } else { |
- throw new Exception('Invalid stack type ${stack.runtimeType} for $stack.'); |
- } |
+/// A regular expression matching the path to a temporary file used to start an |
+/// isolate. |
+/// |
+/// These paths aren't relevant and are removed from stack traces. |
+final _isolatePath = |
+ new RegExp(r"/unittest_[A-Za-z0-9]{6}/runInIsolate\.dart$"); |
- if (!filterStacks) return trace; |
+/// Returns [stackTrace] converted to a [Chain] with all irrelevant frames |
+/// folded together. |
+Chain terseChain(StackTrace stackTrace) { |
+ return new Chain.forTrace(stackTrace).foldFrames((frame) { |
+ if (frame.package == 'unittest') return true; |
- // Format the stack trace by removing everything above TestCase._runTest, |
- // which is usually going to be irrelevant. Also fold together unittest and |
- // core library calls so only the function the user called is visible. |
- return new Trace(trace.frames.takeWhile((frame) { |
- return frame.package != 'unittest' || frame.member != 'TestCase._runTest'; |
- })).terse.foldFrames((frame) => frame.package == 'unittest' || frame.isCore); |
+ // Filter out frames from our isolate bootstrap as well. |
+ if (frame.uri.scheme != 'file') return false; |
+ return frame.uri.path.contains(_isolatePath); |
+ }, terse: true); |
} |
/// Flattens nested [Iterable]s inside an [Iterable] into a single [List] |