Fix comment reference issues, among other new lints (dart-lang/stack_trace#119)
diff --git a/pkgs/stack_trace/analysis_options.yaml b/pkgs/stack_trace/analysis_options.yaml
index 1efeefc..48d93f2 100644
--- a/pkgs/stack_trace/analysis_options.yaml
+++ b/pkgs/stack_trace/analysis_options.yaml
@@ -1,3 +1,4 @@
+# https://dart.dev/guides/language/analysis-options
include: package:lints/recommended.yaml
analyzer:
@@ -8,9 +9,14 @@
linter:
rules:
- always_declare_return_types
+ - avoid_catching_errors
+ - avoid_dynamic_calls
- avoid_private_typedef_functions
+ - avoid_redundant_argument_values
- avoid_unused_constructor_parameters
+ - avoid_void_async
- cancel_subscriptions
+ - comment_references
- directives_ordering
- lines_longer_than_80_chars
- literal_only_boolean_expressions
@@ -19,12 +25,20 @@
- no_runtimeType_toString
- omit_local_variable_types
- package_api_docs
+ - prefer_asserts_in_initializer_lists
+ - prefer_const_constructors
+ - prefer_const_declarations
- prefer_relative_imports
- prefer_single_quotes
+ - sort_pub_dependencies
- test_types_in_equals
- throw_in_finally
- type_annotate_public_apis
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_lambdas
+ - unnecessary_parenthesis
+ - unnecessary_statements
+ - use_is_even_rather_than_modulo
+ - use_string_buffers
- use_super_parameters
diff --git a/pkgs/stack_trace/example/example.dart b/pkgs/stack_trace/example/example.dart
index a65abb1..7d71221 100644
--- a/pkgs/stack_trace/example/example.dart
+++ b/pkgs/stack_trace/example/example.dart
@@ -7,7 +7,7 @@
}
void _scheduleAsync() {
- Future.delayed(Duration(seconds: 1)).then((_) => _runAsync());
+ Future.delayed(const Duration(seconds: 1)).then((_) => _runAsync());
}
void _runAsync() {
diff --git a/pkgs/stack_trace/lib/src/chain.dart b/pkgs/stack_trace/lib/src/chain.dart
index 69f9b0c..6a815c6 100644
--- a/pkgs/stack_trace/lib/src/chain.dart
+++ b/pkgs/stack_trace/lib/src/chain.dart
@@ -21,7 +21,7 @@
/// A chain of stack traces.
///
/// A stack chain is a collection of one or more stack traces that collectively
-/// represent the path from [main] through nested function calls to a particular
+/// represent the path from `main` through nested function calls to a particular
/// code location, usually where an error was thrown. Multiple stack traces are
/// necessary when using asynchronous functions, since the program's stack is
/// reset before each asynchronous callback is run.
@@ -189,21 +189,19 @@
/// Returns a new [Chain] comprised of [traces].
Chain(Iterable<Trace> traces) : traces = List<Trace>.unmodifiable(traces);
- /// Returns a terser version of [this].
+ /// Returns a terser version of this chain.
///
/// This calls [Trace.terse] on every trace in [traces], and discards any
/// trace that contain only internal frames.
///
/// This won't do anything with a raw JavaScript trace, since there's no way
/// to determine which frames come from which Dart libraries. However, the
- /// [`source_map_stack_trace`][source_map_stack_trace] package can be used to
- /// convert JavaScript traces into Dart-style traces.
- ///
- /// [source_map_stack_trace]: https://pub.dev/packages/source_map_stack_trace
+ /// [`source_map_stack_trace`](https://pub.dev/packages/source_map_stack_trace)
+ /// package can be used to convert JavaScript traces into Dart-style traces.
Chain get terse => foldFrames((_) => false, terse: true);
- /// Returns a new [Chain] based on [this] where multiple stack frames matching
- /// [predicate] are folded together.
+ /// Returns a new [Chain] based on this chain where multiple stack frames
+ /// matching [predicate] are folded together.
///
/// This means that whenever there are multiple frames in a row that match
/// [predicate], only the last one is kept. In addition, traces that are
@@ -239,7 +237,7 @@
return Chain(nonEmptyTraces);
}
- /// Converts [this] to a [Trace].
+ /// Converts this chain to a [Trace].
///
/// The trace version of a chain is just the concatenation of all the traces
/// in the chain.
@@ -248,18 +246,19 @@
@override
String toString() {
// Figure out the longest path so we know how much to pad.
- var longest = traces.map((trace) {
- return trace.frames
- .map((frame) => frame.location.length)
- .fold(0, math.max);
- }).fold(0, math.max);
+ var longest = traces
+ .map((trace) => trace.frames
+ .map((frame) => frame.location.length)
+ .fold(0, math.max))
+ .fold(0, math.max);
// Don't call out to [Trace.toString] here because that doesn't ensure that
// padding is consistent across all traces.
- return traces.map((trace) {
- return trace.frames.map((frame) {
- return '${frame.location.padRight(longest)} ${frame.member}\n';
- }).join();
- }).join(chainGap);
+ return traces
+ .map((trace) => trace.frames
+ .map((frame) =>
+ '${frame.location.padRight(longest)} ${frame.member}\n')
+ .join())
+ .join(chainGap);
}
}
diff --git a/pkgs/stack_trace/lib/src/stack_zone_specification.dart b/pkgs/stack_trace/lib/src/stack_zone_specification.dart
index 8d1b3a7..8408d04 100644
--- a/pkgs/stack_trace/lib/src/stack_zone_specification.dart
+++ b/pkgs/stack_trace/lib/src/stack_zone_specification.dart
@@ -64,15 +64,13 @@
StackZoneSpecification(this._onError, {bool errorZone = true})
: _errorZone = errorZone;
- /// Converts [this] to a real [ZoneSpecification].
- ZoneSpecification toSpec() {
- return ZoneSpecification(
- handleUncaughtError: _errorZone ? _handleUncaughtError : null,
- registerCallback: _registerCallback,
- registerUnaryCallback: _registerUnaryCallback,
- registerBinaryCallback: _registerBinaryCallback,
- errorCallback: _errorCallback);
- }
+ /// Converts this specification to a real [ZoneSpecification].
+ ZoneSpecification toSpec() => ZoneSpecification(
+ handleUncaughtError: _errorZone ? _handleUncaughtError : null,
+ registerCallback: _registerCallback,
+ registerUnaryCallback: _registerUnaryCallback,
+ registerBinaryCallback: _registerBinaryCallback,
+ errorCallback: _errorCallback);
/// Returns the current stack chain.
///
@@ -107,7 +105,7 @@
}
}
- /// Tracks the current stack chain so it can be set to [_currentChain] when
+ /// Tracks the current stack chain so it can be set to [_currentNode] when
/// [f] is run.
ZoneCallback<R> _registerCallback<R>(
Zone self, ZoneDelegate parent, Zone zone, R Function() f) {
@@ -116,27 +114,25 @@
return parent.registerCallback(zone, () => _run(f, node));
}
- /// Tracks the current stack chain so it can be set to [_currentChain] when
+ /// Tracks the current stack chain so it can be set to [_currentNode] when
/// [f] is run.
ZoneUnaryCallback<R, T> _registerUnaryCallback<R, T>(
Zone self, ZoneDelegate parent, Zone zone, R Function(T) f) {
if (_disabled) return parent.registerUnaryCallback(zone, f);
var node = _createNode(1);
- return parent.registerUnaryCallback(zone, (arg) {
- return _run(() => f(arg), node);
- });
+ return parent.registerUnaryCallback(
+ zone, (arg) => _run(() => f(arg), node));
}
- /// Tracks the current stack chain so it can be set to [_currentChain] when
+ /// Tracks the current stack chain so it can be set to [_currentNode] when
/// [f] is run.
ZoneBinaryCallback<R, T1, T2> _registerBinaryCallback<R, T1, T2>(
Zone self, ZoneDelegate parent, Zone zone, R Function(T1, T2) f) {
if (_disabled) return parent.registerBinaryCallback(zone, f);
var node = _createNode(1);
- return parent.registerBinaryCallback(zone, (arg1, arg2) {
- return _run(() => f(arg1, arg2), node);
- });
+ return parent.registerBinaryCallback(
+ zone, (arg1, arg2) => _run(() => f(arg1, arg2), node));
}
/// Looks up the chain associated with [stackTrace] and passes it either to
diff --git a/pkgs/stack_trace/lib/src/trace.dart b/pkgs/stack_trace/lib/src/trace.dart
index 5df7e4d..2e4427d 100644
--- a/pkgs/stack_trace/lib/src/trace.dart
+++ b/pkgs/stack_trace/lib/src/trace.dart
@@ -94,12 +94,13 @@
}
var trace = Trace.from(StackTrace.current);
- return LazyTrace(() {
- // JS includes a frame for the call to StackTrace.current, but the VM
- // doesn't, so we skip an extra frame in a JS context.
- return Trace(trace.frames.skip(level + (inJS ? 2 : 1)),
- original: trace.original.toString());
- });
+ return LazyTrace(
+ () =>
+ // JS includes a frame for the call to StackTrace.current, but the VM
+ // doesn't, so we skip an extra frame in a JS context.
+ Trace(trace.frames.skip(level + (inJS ? 2 : 1)),
+ original: trace.original.toString()),
+ );
}
/// Returns a new stack trace containing the same data as [trace].
@@ -250,7 +251,7 @@
/// platform is being used.
StackTrace get vmTrace => VMTrace(frames);
- /// Returns a terser version of [this].
+ /// Returns a terser version of this trace.
///
/// This is accomplished by folding together multiple stack frames from the
/// core library or from this package, as in [foldFrames]. Remaining core
@@ -260,15 +261,13 @@
///
/// This won't do anything with a raw JavaScript trace, since there's no way
/// to determine which frames come from which Dart libraries. However, the
- /// [`source_map_stack_trace`][source_map_stack_trace] package can be used to
- /// convert JavaScript traces into Dart-style traces.
- ///
- /// [source_map_stack_trace]: https://pub.dev/packages/source_map_stack_trace
+ /// [`source_map_stack_trace`][https://pub.dev/packages/source_map_stack_trace]
+ /// package can be used to convert JavaScript traces into Dart-style traces.
///
/// For custom folding, see [foldFrames].
Trace get terse => foldFrames((_) => false, terse: true);
- /// Returns a new [Trace] based on [this] where multiple stack frames matching
+ /// Returns a new [Trace] based on `this` where multiple stack frames matching
/// [predicate] are folded together.
///
/// This means that whenever there are multiple frames in a row that match
diff --git a/pkgs/stack_trace/lib/src/utils.dart b/pkgs/stack_trace/lib/src/utils.dart
index 0dd1755..bd971fe 100644
--- a/pkgs/stack_trace/lib/src/utils.dart
+++ b/pkgs/stack_trace/lib/src/utils.dart
@@ -12,4 +12,4 @@
// TODO(nweiz): When cross-platform imports work, use them to set this.
/// Whether we're running in a JS context.
-final bool inJS = 0.0 is int;
+const bool inJS = 0.0 is int;
diff --git a/pkgs/stack_trace/test/chain/chain_test.dart b/pkgs/stack_trace/test/chain/chain_test.dart
index 892738f..6de759b 100644
--- a/pkgs/stack_trace/test/chain/chain_test.dart
+++ b/pkgs/stack_trace/test/chain/chain_test.dart
@@ -103,7 +103,7 @@
test("doesn't enable chain-tracking", () {
return Chain.disable(() {
return Chain.capture(() {
- var completer = Completer();
+ var completer = Completer<Chain>();
inMicrotask(() {
completer.complete(Chain.current());
});
@@ -126,7 +126,7 @@
group('Chain.disable()', () {
test('disables chain-tracking', () {
return Chain.disable(() {
- var completer = Completer();
+ var completer = Completer<Chain>();
inMicrotask(() => completer.complete(Chain.current()));
return completer.future.then((chain) {
@@ -138,7 +138,7 @@
test('Chain.capture() re-enables chain-tracking', () {
return Chain.disable(() {
return Chain.capture(() {
- var completer = Completer();
+ var completer = Completer<Chain>();
inMicrotask(() => completer.complete(Chain.current()));
return completer.future.then((chain) {
@@ -173,7 +173,7 @@
test("with when: false doesn't disable", () {
return Chain.capture(() {
return Chain.disable(() {
- var completer = Completer();
+ var completer = Completer<Chain>();
inMicrotask(() => completer.complete(Chain.current()));
return completer.future.then((chain) {
diff --git a/pkgs/stack_trace/test/chain/dart2js_test.dart b/pkgs/stack_trace/test/chain/dart2js_test.dart
index 41eb1ce..5841466 100644
--- a/pkgs/stack_trace/test/chain/dart2js_test.dart
+++ b/pkgs/stack_trace/test/chain/dart2js_test.dart
@@ -184,7 +184,7 @@
group('current() within capture()', () {
test('called in a microtask', () async {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inMicrotask(() => completer.complete(Chain.current()));
});
@@ -194,7 +194,7 @@
});
test('called in a one-shot timer', () async {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inOneShotTimer(() => completer.complete(Chain.current()));
});
@@ -204,7 +204,7 @@
});
test('called in a periodic timer', () async {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inPeriodicTimer(() => completer.complete(Chain.current()));
});
@@ -214,7 +214,7 @@
});
test('called in a nested series of asynchronous operations', () async {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inPeriodicTimer(() {
inOneShotTimer(() {
@@ -228,7 +228,7 @@
});
test('called in a long future chain', () async {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inFutureChain(() => completer.complete(Chain.current()));
});
@@ -239,11 +239,11 @@
});
test(
- 'current() outside of capture() returns a chain wrapping the current '
- 'trace', () {
- // The test runner runs all tests with chains enabled.
- return Chain.disable(() async {
- var completer = Completer();
+ 'current() outside of capture() returns a chain wrapping the current trace',
+ () =>
+ // The test runner runs all tests with chains enabled.
+ Chain.disable(() async {
+ var completer = Completer<Chain>();
inMicrotask(() => completer.complete(Chain.current()));
var chain = await completer.future;
@@ -251,14 +251,13 @@
// chain isn't available and it just returns the current stack when
// called.
expect(chain.traces, hasLength(1));
- });
- });
+ }),
+ );
group('forTrace() within capture()', () {
test('called for a stack trace from a microtask', () async {
- var chain = await Chain.capture(() {
- return chainForTrace(inMicrotask, () => throw 'error');
- });
+ var chain = await Chain.capture(
+ () => chainForTrace(inMicrotask, () => throw 'error'));
// Because [chainForTrace] has to set up a future chain to capture the
// stack trace while still showing it to the zone specification, it adds
@@ -267,17 +266,15 @@
});
test('called for a stack trace from a one-shot timer', () async {
- var chain = await Chain.capture(() {
- return chainForTrace(inOneShotTimer, () => throw 'error');
- });
+ var chain = await Chain.capture(
+ () => chainForTrace(inOneShotTimer, () => throw 'error'));
expect(chain.traces, hasLength(3));
});
test('called for a stack trace from a periodic timer', () async {
- var chain = await Chain.capture(() {
- return chainForTrace(inPeriodicTimer, () => throw 'error');
- });
+ var chain = await Chain.capture(
+ () => chainForTrace(inPeriodicTimer, () => throw 'error'));
expect(chain.traces, hasLength(3));
});
@@ -285,19 +282,16 @@
test(
'called for a stack trace from a nested series of asynchronous '
'operations', () async {
- var chain = await Chain.capture(() {
- return chainForTrace((callback) {
- inPeriodicTimer(() => inOneShotTimer(() => inMicrotask(callback)));
- }, () => throw 'error');
- });
+ var chain = await Chain.capture(() => chainForTrace((callback) {
+ inPeriodicTimer(() => inOneShotTimer(() => inMicrotask(callback)));
+ }, () => throw 'error'));
expect(chain.traces, hasLength(5));
});
test('called for a stack trace from a long future chain', () async {
- var chain = await Chain.capture(() {
- return chainForTrace(inFutureChain, () => throw 'error');
- });
+ var chain = await Chain.capture(
+ () => chainForTrace(inFutureChain, () => throw 'error'));
expect(chain.traces, hasLength(3));
});
diff --git a/pkgs/stack_trace/test/chain/utils.dart b/pkgs/stack_trace/test/chain/utils.dart
index 0a74d9a..2cc6452 100644
--- a/pkgs/stack_trace/test/chain/utils.dart
+++ b/pkgs/stack_trace/test/chain/utils.dart
@@ -16,7 +16,7 @@
/// Runs [callback] once in a periodic timer callback.
void inPeriodicTimer(void Function() callback) {
var count = 0;
- Timer.periodic(Duration(milliseconds: 1), (timer) {
+ Timer.periodic(const Duration(milliseconds: 1), (timer) {
count++;
if (count != 5) return;
timer.cancel();
diff --git a/pkgs/stack_trace/test/chain/vm_test.dart b/pkgs/stack_trace/test/chain/vm_test.dart
index 7c8278b..83e01d4 100644
--- a/pkgs/stack_trace/test/chain/vm_test.dart
+++ b/pkgs/stack_trace/test/chain/vm_test.dart
@@ -282,7 +282,7 @@
group('current() within capture()', () {
test('called in a microtask', () {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inMicrotask(() => completer.complete(Chain.current()));
});
@@ -296,7 +296,7 @@
});
test('called in a one-shot timer', () {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inOneShotTimer(() => completer.complete(Chain.current()));
});
@@ -310,7 +310,7 @@
});
test('called in a periodic timer', () {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inPeriodicTimer(() => completer.complete(Chain.current()));
});
@@ -324,7 +324,7 @@
});
test('called in a nested series of asynchronous operations', () {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inPeriodicTimer(() {
inOneShotTimer(() {
@@ -346,7 +346,7 @@
});
test('called in a long future chain', () {
- var completer = Completer();
+ var completer = Completer<Chain>();
Chain.capture(() {
inFutureChain(() => completer.complete(Chain.current()));
});
@@ -365,7 +365,7 @@
'trace', () {
// The test runner runs all tests with chains enabled.
return Chain.disable(() {
- var completer = Completer();
+ var completer = Completer<Chain>();
inMicrotask(() => completer.complete(Chain.current()));
return completer.future.then((chain) {
diff --git a/pkgs/stack_trace/test/utils.dart b/pkgs/stack_trace/test/utils.dart
index 8092efe..98cb5ed 100644
--- a/pkgs/stack_trace/test/utils.dart
+++ b/pkgs/stack_trace/test/utils.dart
@@ -2,37 +2,13 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:stack_trace/stack_trace.dart';
import 'package:test/test.dart';
/// Returns a matcher that runs [matcher] against a [Frame]'s `member` field.
Matcher frameMember(Object? matcher) =>
- transform((frame) => frame.member, matcher, 'member');
+ isA<Frame>().having((p0) => p0.member, 'member', matcher);
/// Returns a matcher that runs [matcher] against a [Frame]'s `library` field.
Matcher frameLibrary(Object? matcher) =>
- transform((frame) => frame.library, matcher, 'library');
-
-/// Returns a matcher that runs [transformation] on its input, then matches
-/// the output against [matcher].
-///
-/// [description] should be a noun phrase that describes the relation of the
-/// output of [transformation] to its input.
-Matcher transform(void Function(dynamic) transformation, Object? matcher,
- String description) =>
- _TransformMatcher(transformation, wrapMatcher(matcher), description);
-
-class _TransformMatcher extends Matcher {
- final Function _transformation;
- final Matcher _matcher;
- final String _description;
-
- _TransformMatcher(this._transformation, this._matcher, this._description);
-
- @override
- bool matches(Object? item, Map<dynamic, dynamic> matchState) =>
- _matcher.matches(_transformation(item), matchState);
-
- @override
- Description describe(Description description) =>
- description.add(_description).add(' ').addDescriptionOf(_matcher);
-}
+ isA<Frame>().having((p0) => p0.library, 'library', matcher);
diff --git a/pkgs/stack_trace/test/vm_test.dart b/pkgs/stack_trace/test/vm_test.dart
index c9f819a..e0dbcff 100644
--- a/pkgs/stack_trace/test/vm_test.dart
+++ b/pkgs/stack_trace/test/vm_test.dart
@@ -67,7 +67,7 @@
});
test('at level 0 returns a trace starting at the current frame', () {
- var trace = Trace.current(0);
+ var trace = Trace.current();
expect(trace.frames.first.member, equals('main.<fn>.<fn>.<fn>'));
});