Index: pkg/scheduled_test/lib/src/schedule.dart |
diff --git a/pkg/scheduled_test/lib/src/schedule.dart b/pkg/scheduled_test/lib/src/schedule.dart |
index d5eb9af41929f55e15741b14f3eecabd02325740..1dfb6106d93cba63650ce32e32d0f374b1f7a539 100644 |
--- a/pkg/scheduled_test/lib/src/schedule.dart |
+++ b/pkg/scheduled_test/lib/src/schedule.dart |
@@ -379,9 +379,9 @@ class TaskQueue { |
/// The descriptions of all callbacks that are blocking the completion of |
/// [this]. |
- List<String> get pendingCallbacks => |
- new UnmodifiableListView<String>(_pendingCallbacks); |
- final _pendingCallbacks = new Queue<String>(); |
+ List<PendingCallback> get pendingCallbacks => |
+ new UnmodifiableListView<PendingCallback>(_pendingCallbacks); |
+ final _pendingCallbacks = new Queue<PendingCallback>(); |
/// A completer that will be completed once [_pendingCallbacks] becomes empty |
/// after the queue finishes running its tasks. |
@@ -505,18 +505,21 @@ class TaskQueue { |
bool _timedOut() => |
_schedule.currentQueue != this || pendingCallbacks.isEmpty; |
- if (description == null) { |
- description = "Out-of-band operation #${_totalCallbacks}"; |
- } |
- |
- if (captureStackTraces) { |
- var stackString = prefixLines(terseTraceString(new Trace.current())); |
- description += "\n\nStack trace:\n$stackString"; |
- } |
- |
_totalCallbacks++; |
+ var trace = captureStackTraces ? new Trace.current() : null; |
+ var pendingCallback = new PendingCallback._(() { |
+ var fullDescription = description; |
+ if (fullDescription == null) { |
+ fullDescription = "Out-of-band operation #${_totalCallbacks}"; |
+ } |
+ |
+ if (captureStackTraces) { |
Bob Nystrom
2013/04/30 23:05:36
If capturing stack traces is fast enough now, how
nweiz
2013/04/30 23:13:14
Done.
|
+ var stackString = prefixLines(terseTraceString(trace)); |
+ fullDescription += "\n\nStack trace:\n$stackString"; |
+ } |
+ }); |
+ _pendingCallbacks.add(pendingCallback); |
- _pendingCallbacks.add(description); |
return (arg) { |
try { |
return fn(arg); |
@@ -531,7 +534,7 @@ class TaskQueue { |
} finally { |
if (_timedOut()) return; |
- _pendingCallbacks.remove(description); |
+ _pendingCallbacks.remove(pendingCallback); |
if (_pendingCallbacks.isEmpty && !isRunningTasks) { |
_noPendingCallbacksCompleter.complete(); |
} |
@@ -605,3 +608,22 @@ class TaskQueue { |
}).join("\n"); |
} |
} |
+ |
+/// A thunk for lazily resolving the description of a [PendingCallback]. |
+typedef String _DescriptionThunk(); |
Bob Nystrom
2013/04/30 23:05:36
Oh Dart and your awful function type syntax. You c
nweiz
2013/04/30 23:13:14
Currently we're using this once each in several di
|
+ |
+/// An identifier for an out-of-band callback running during a schedule. |
+class PendingCallback { |
Bob Nystrom
2013/04/30 23:05:36
The fact that it's for an out-of-band callback isn
nweiz
2013/04/30 23:13:14
I'm more interested in being able to add more pend
Bob Nystrom
2013/05/01 00:02:25
In that case, keep the name of this type, but upda
nweiz
2013/05/01 00:33:44
That's specifically referring to the string, not t
|
+ final _DescriptionThunk _thunk; |
+ String _description; |
+ |
+ /// The string description of the callback. |
+ String get description { |
+ if (_description == null) _description = _thunk(); |
+ return _description; |
+ } |
+ |
+ String toString() => description; |
+ |
+ PendingCallback._(this._thunk); |
+} |