Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to latest lints, require Dart 2.17, fix deprecation #708

Merged
merged 4 commits into from Nov 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/dart.yml
Expand Up @@ -47,7 +47,7 @@ jobs:
matrix:
# Test against the SDK lower-bound defined in pubspec.yaml and dev.
os: [ubuntu-latest]
sdk: [2.12.0, dev]
sdk: [2.17.0, dev]
steps:
- uses: actions/checkout@v2
- uses: dart-lang/setup-dart@v1.0
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,7 @@

* Expose `TreeIterator` for iterating `TreeSet` instead of using
`BidirectionalIterator`.
* Require Dart 2.17

#### 3.1.0 - 2022-05-03

Expand Down
135 changes: 6 additions & 129 deletions analysis_options.yaml
@@ -1,163 +1,40 @@
# https://dart.dev/guides/language/analysis-options
include: package:lints/recommended.yaml

analyzer:
kevmoo marked this conversation as resolved.
Show resolved Hide resolved
errors:
# treat missing required parameters as a warning (not a hint)
missing_required_param: warning
# treat missing returns as a warning (not a hint)
missing_return: warning
# allow having TODOs in the code
todo: ignore
# Ignore analyzer hints for updating pubspecs when using Future or
# Stream and not importing dart:async
# Please see https://github.com/flutter/flutter/pull/24528 for details.
sdk_version_async_exported_from_core: ignore
# TODO(kevmoo): see https://github.com/dart-lang/linter/issues/3844
null_check_on_nullable_type_parameter: ignore

linter:
rules:
# these rules are documented on and in the same order as
# the Dart Lint rules page to make maintenance easier
# https://github.com/dart-lang/linter/blob/master/example/all.yaml
- always_declare_return_types
# ENABLE - always_put_control_body_on_new_line
- always_put_required_named_parameters_first
- always_require_non_null_named_parameters
# ENABLE - always_specify_types
- annotate_overrides
# - avoid_annotating_with_dynamic # conflicts with always_specify_types
# - avoid_as # conflicts with NNBD
- avoid_bool_literals_in_conditional_expressions
# - avoid_catches_without_on_clauses # we do this commonly
# - avoid_catching_errors # we do this commonly
- avoid_classes_with_only_static_members
# - avoid_double_and_int_checks # only useful when targeting JS runtime
- avoid_empty_else
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
# - avoid_implementing_value_types # not yet tested
- avoid_init_to_null
# - avoid_js_rounded_ints # only useful when targeting JS runtime
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters # not yet tested
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
# - avoid_returning_null # there are plenty of valid reasons to return null
# - avoid_returning_null_for_future # not yet tested
- avoid_returning_null_for_void
# - avoid_returning_this # there are plenty of valid reasons to return this
# - avoid_setters_without_getters # not yet tested
# - avoid_shadowing_type_parameters # not yet tested
# - avoid_single_cascade_in_expression_statements # not yet tested
- avoid_slow_async_io
- avoid_types_as_parameter_names
# - avoid_types_on_closure_parameters # conflicts with always_specify_types
- avoid_unused_constructor_parameters
- avoid_void_async
- await_only_futures
- camel_case_types
- cancel_subscriptions
# - cascade_invocations # not yet tested
# - close_sinks # not reliable enough
# - comment_references # blocked on https://github.com/flutter/flutter/issues/20765
# - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
- control_flow_in_finally
- curly_braces_in_flow_control_structures
# - diagnostic_describe_all_properties # not yet tested
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
# - file_names # not yet tested
- flutter_style_todos
- hash_and_equals
- implementation_imports
- iterable_contains_unrelated_type
# - join_return_with_assignment # not yet tested
- library_names
- library_prefixes
# - lines_longer_than_80_chars # not yet tested
- list_remove_unrelated_type
# - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
- no_adjacent_strings_in_list
- no_duplicate_case_values
- non_constant_identifier_names
# - null_closures # not yet tested
# - omit_local_variable_types # opposite of always_specify_types
# - one_member_abstracts # too many false positives
# - only_throw_errors # https://github.com/flutter/flutter/issues/5792
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments # we do this commonly
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
# - prefer_asserts_with_message # not yet tested
# ENABLE - prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
# - prefer_constructors_over_static_methods # not yet tested
- prefer_contains
# - prefer_double_quotes # opposite of prefer_single_quotes
- prefer_equal_for_default_values
# - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
- prefer_final_fields
- prefer_final_in_for_each
# ENABLE - prefer_final_locals
# - prefer_for_elements_to_map_fromIterable # not yet tested
- prefer_foreach
# - prefer_function_declarations_over_variables # not yet tested
- prefer_generic_function_type_aliases
- prefer_if_elements_to_conditional_expressions
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
# - prefer_int_literals # not yet tested
# - prefer_interpolation_to_compose_strings # not yet tested
- prefer_is_empty
- prefer_is_not_empty
- prefer_iterable_whereType
# - prefer_mixin # https://github.com/dart-lang/language/issues/32
# - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
# ENABLE - prefer_void_to_null
- provide_deprecation_message
# - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
- recursive_getters
- slash_for_doc_comments
# - sort_child_properties_last # not yet tested
- sort_constructors_first
- sort_pub_dependencies
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
# - type_annotate_public_apis # subset of always_specify_types
- type_init_formals
# - unawaited_futures # too many false positives
# - unnecessary_await_in_return # not yet tested
- unnecessary_brace_in_string_interps
- unnecessary_const
- unnecessary_getters_setters
# - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_this
- unrelated_type_equality_checks
# - unsafe_html # not yet tested
- use_full_hex_values_for_flutter_colors
# - use_function_type_syntax_for_parameters # not yet tested
- use_rethrow_when_possible
# - use_setters_to_change_properties # not yet tested
# - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
# - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
- valid_regexps
# - void_checks # not yet tested
- use_super_parameters
6 changes: 3 additions & 3 deletions lib/pattern.dart
Expand Up @@ -42,7 +42,7 @@ class _MultiPattern extends Pattern {

@override
Iterable<Match> allMatches(String str, [int start = 0]) {
final _allMatches = <Match>[];
final allMatches = <Match>[];
for (final pattern in include) {
var matches = pattern.allMatches(str, start);
if (_hasMatch(matches)) {
Expand All @@ -53,10 +53,10 @@ class _MultiPattern extends Pattern {
}
}
}
_allMatches.addAll(matches);
allMatches.addAll(matches);
}
}
return _allMatches;
return allMatches;
}

@override
Expand Down
4 changes: 2 additions & 2 deletions lib/src/async/concat.dart
Expand Up @@ -40,8 +40,8 @@ class _ConcatStream<T> extends Stream<T> {
final Iterable<Stream<T>> _streams;

@override
StreamSubscription<T> listen(void onData(T data)?,
{Function? onError, void onDone()?, bool? cancelOnError}) {
StreamSubscription<T> listen(void Function(T data)? onData,
{Function? onError, void Function()? onDone, bool? cancelOnError}) {
cancelOnError = true == cancelOnError;
StreamSubscription<T>? currentSubscription;
StreamController<T>? controller;
Expand Down
11 changes: 7 additions & 4 deletions lib/src/async/countdown_timer.dart
Expand Up @@ -35,7 +35,7 @@ class CountdownTimer extends Stream<CountdownTimer> {
_stopwatch.start();
}

static const _THRESHOLD_MS = 4;
static const _thresholdMS = 4;

final Duration _duration;
final Stopwatch _stopwatch;
Expand All @@ -46,8 +46,11 @@ class CountdownTimer extends Stream<CountdownTimer> {
late final Timer _timer;

@override
StreamSubscription<CountdownTimer> listen(void onData(CountdownTimer event)?,
{Function? onError, void onDone()?, bool? cancelOnError}) =>
StreamSubscription<CountdownTimer> listen(
void Function(CountdownTimer event)? onData,
{Function? onError,
void Function()? onDone,
bool? cancelOnError}) =>
_controller.stream.listen(onData, onError: onError, onDone: onDone);

Duration get elapsed => _stopwatch.elapsed;
Expand All @@ -66,7 +69,7 @@ class CountdownTimer extends Stream<CountdownTimer> {
var t = remaining;
_controller.add(this);
// timers may have a 4ms resolution
if (t.inMilliseconds < _THRESHOLD_MS) {
if (t.inMilliseconds < _thresholdMS) {
cancel();
}
}
Expand Down
4 changes: 2 additions & 2 deletions lib/src/async/future_stream.dart
Expand Up @@ -71,8 +71,8 @@ class FutureStream<T> extends Stream<T> {
}

@override
StreamSubscription<T> listen(void onData(T event)?,
{Function? onError, void onDone()?, bool? cancelOnError}) {
StreamSubscription<T> listen(void Function(T event)? onData,
{Function? onError, void Function()? onDone, bool? cancelOnError}) {
return _controller!.stream.listen(onData,
onError: onError, onDone: onDone, cancelOnError: cancelOnError);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/src/async/metronome.dart
Expand Up @@ -85,8 +85,8 @@ class Metronome extends Stream<DateTime> {
bool get isBroadcast => true;

@override
StreamSubscription<DateTime> listen(void onData(DateTime event)?,
{Function? onError, void onDone()?, bool? cancelOnError}) =>
StreamSubscription<DateTime> listen(void Function(DateTime event)? onData,
{Function? onError, void Function()? onDone, bool? cancelOnError}) =>
_controller.stream.listen(onData,
onError: onError, onDone: onDone, cancelOnError: cancelOnError);

Expand Down
2 changes: 1 addition & 1 deletion lib/src/async/stream_buffer.dart
Expand Up @@ -135,7 +135,7 @@ class StreamBuffer<T> implements StreamConsumer<List<T>> {
_sub?.cancel();
_currentStream = stream;

final streamDone = Completer<Null>();
final streamDone = Completer<void>();
_sub = stream.listen((items) {
_chunks.addAll(items);
_counter += items.length;
Expand Down
6 changes: 2 additions & 4 deletions lib/src/async/stream_router.dart
Expand Up @@ -46,7 +46,7 @@ class StreamRouter<T> {

/// Events that match [predicate] are sent to the stream created by this
/// method, and not sent to any other router streams.
Stream<T> route(bool predicate(T event)) {
Stream<T> route(bool Function(T event) predicate) {
var controller = StreamController<T>.broadcast();
_routes.add(_Route(predicate, controller));
return controller.stream;
Expand All @@ -72,11 +72,9 @@ class StreamRouter<T> {
}
}

typedef _Predicate<T> = bool Function(T event);

class _Route<T> {
_Route(this.predicate, this.controller);

final _Predicate<T> predicate;
final bool Function(T event) predicate;
final StreamController<T> controller;
}
13 changes: 7 additions & 6 deletions lib/src/collection/bimap.dart
Expand Up @@ -74,7 +74,7 @@ class HashBiMap<K, V> implements BiMap<K, V> {
bool containsValue(Object? value) => _inverse.containsKey(value);

@override
void forEach(void f(K key, V value)) => _map.forEach(f);
void forEach(void Function(K key, V value) f) => _map.forEach(f);

@override
bool get isEmpty => _map.isEmpty;
Expand Down Expand Up @@ -111,11 +111,12 @@ class HashBiMap<K, V> implements BiMap<K, V> {
Iterable<MapEntry<K, V>> get entries => _map.entries;

@override
Map<K2, V2> map<K2, V2>(MapEntry<K2, V2> transform(K key, V value)) =>
Map<K2, V2> map<K2, V2>(
MapEntry<K2, V2> Function(K key, V value) transform) =>
_map.map(transform);

@override
V putIfAbsent(K key, V ifAbsent()) {
V putIfAbsent(K key, V Function() ifAbsent) {
if (containsKey(key)) {
return _map[key]!;
}
Expand All @@ -129,13 +130,13 @@ class HashBiMap<K, V> implements BiMap<K, V> {
}

@override
void removeWhere(bool test(K key, V value)) {
void removeWhere(bool Function(K key, V value) test) {
_inverse.removeWhere((v, k) => test(k, v));
_map.removeWhere(test);
}

@override
V update(K key, V update(V value), {V ifAbsent()?}) {
V update(K key, V Function(V value) update, {V Function()? ifAbsent}) {
var value = _map[key];
if (value != null) {
return _add(key, update(value), true);
Expand All @@ -148,7 +149,7 @@ class HashBiMap<K, V> implements BiMap<K, V> {
}

@override
void updateAll(V update(K key, V value)) {
void updateAll(V Function(K key, V value) update) {
for (final key in keys) {
_add(key, update(key, _map[key]!), true);
}
Expand Down