Enable discarded_futures lint in analyzer and _fe_analyzer_shared. Several call sites intentionally discard a future; these call sites have been wrapped with `unawaited()` (which is the standard way to suppress the lint). Turning on this lint uncovered several tests that should have been async; these tests have been fixed. Change-Id: I66e0f6bf7a05946e8d460ce9b5581837ce067870 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431420 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Auto-Submit: Paul Berry <paulberry@google.com>
diff --git a/pkg/_fe_analyzer_shared/analysis_options.yaml b/pkg/_fe_analyzer_shared/analysis_options.yaml index 8579d9b..aab7f10 100644 --- a/pkg/_fe_analyzer_shared/analysis_options.yaml +++ b/pkg/_fe_analyzer_shared/analysis_options.yaml
@@ -10,6 +10,7 @@ - annotate_overrides - collection_methods_unrelated_type - curly_braces_in_flow_control_structures + - discarded_futures - prefer_adjacent_string_concatenation - unawaited_futures - recursive_getters
diff --git a/pkg/analyzer/analysis_options.yaml b/pkg/analyzer/analysis_options.yaml index 4b9db4e..324647e 100644 --- a/pkg/analyzer/analysis_options.yaml +++ b/pkg/analyzer/analysis_options.yaml
@@ -53,6 +53,7 @@ - avoid_dynamic_calls - avoid_redundant_argument_values - avoid_unused_constructor_parameters + - discarded_futures - flutter_style_todos - unawaited_futures - unnecessary_breaks
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart index d2cb846..017b01a 100644 --- a/pkg/analyzer/lib/file_system/memory_file_system.dart +++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -631,12 +631,14 @@ void setupWatcher() { var watchers = provider._pathToWatchers[path] ??= []; watchers.add(streamController); - streamController.done.then((_) { - watchers.remove(streamController); - if (watchers.isEmpty) { - provider._pathToWatchers.remove(path); - } - }); + unawaited( + streamController.done.then((_) { + watchers.remove(streamController); + if (watchers.isEmpty) { + provider._pathToWatchers.remove(path); + } + }), + ); ready.complete(); if (provider.emitPathNotFoundExceptionsForPaths.contains(path)) { streamController.addError(
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart index bf6a744..9d84321 100644 --- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart +++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -2,6 +2,8 @@ // 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 'dart:async'; + import 'package:analyzer/dart/analysis/analysis_context_collection.dart'; import 'package:analyzer/dart/analysis/declared_variables.dart'; import 'package:analyzer/file_system/file_system.dart'; @@ -70,7 +72,7 @@ if (scheduler == null) { scheduler = AnalysisDriverScheduler(performanceLog); if (drainStreams) { - scheduler.events.drain<void>(); + unawaited(scheduler.events.drain<void>()); } scheduler.start(); }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart index 3d1d6af..338d08d 100644 --- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart +++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -2,6 +2,8 @@ // 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 'dart:async'; + import 'package:analyzer/dart/analysis/context_root.dart'; import 'package:analyzer/dart/analysis/declared_variables.dart'; import 'package:analyzer/file_system/file_system.dart'; @@ -179,7 +181,7 @@ // AnalysisDriver reports results into streams. // We need to drain these streams to avoid memory leak. if (drainStreams) { - driver.exceptions.drain<void>(); + unawaited(driver.exceptions.drain<void>()); } return analysisContext;
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index 086b37d..dfbf27c 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -2559,7 +2559,7 @@ throw StateError('The scheduler has already been started.'); } _started = true; - _run(); + unawaited(_run()); } /// Return a future that will be completed the next time the status is idle.
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart index 16227d9..a634753 100644 --- a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart +++ b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
@@ -2,6 +2,7 @@ // 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 'dart:async'; import 'dart:io'; import 'dart:isolate'; import 'dart:typed_data'; @@ -37,7 +38,7 @@ EvictingFileByteStore(this._cachePath, this._maxSizeBytes) : _fileByteStore = FileByteStore(_cachePath) { - _requestCacheCleanUp(); + unawaited(_requestCacheCleanUp()); } @override @@ -49,7 +50,7 @@ // Update the current size. _bytesWrittenSinceCleanup += bytes.length; if (_bytesWrittenSinceCleanup > _maxSizeBytes ~/ 8) { - _requestCacheCleanUp(); + unawaited(_requestCacheCleanUp()); } return bytes; } @@ -300,12 +301,14 @@ void _run(Future Function() fn) { _available--; - fn().whenComplete(() { - _available++; + unawaited( + fn().whenComplete(() { + _available++; - if (waiting.isNotEmpty) { - _run(waiting.removeAt(0)); - } - }); + if (waiting.isNotEmpty) { + _run(waiting.removeAt(0)); + } + }), + ); } }
diff --git a/pkg/analyzer/lib/src/workspace/blaze_watcher.dart b/pkg/analyzer/lib/src/workspace/blaze_watcher.dart index be84a0f..442f140 100644 --- a/pkg/analyzer/lib/src/workspace/blaze_watcher.dart +++ b/pkg/analyzer/lib/src/workspace/blaze_watcher.dart
@@ -317,10 +317,10 @@ _toIsolatePort.send(BlazeWatcherShutdownIsolate()); } if (_isolateIsStarting) { - _fromIsolateSubscription.cancel(); + unawaited(_fromIsolateSubscription.cancel()); _fromIsolatePort.close(); } - _events.close(); + unawaited(_events.close()); } void startWatching(String workspace, BlazeSearchInfo info) { @@ -363,11 +363,13 @@ void _startIsolateIfNeeded() { if (_isolateIsStarting) return; _isolateIsStarting = true; - _startIsolateImpl(); - _isolateHasStarted.future.then((_) { - _buffer.forEach(_toIsolatePort.send); - _buffer.clear(); - }); + unawaited(_startIsolateImpl()); + unawaited( + _isolateHasStarted.future.then((_) { + _buffer.forEach(_toIsolatePort.send); + _buffer.clear(); + }), + ); } Future<void> _startIsolateImpl() async {
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart index 24decfb..31e21b7 100644 --- a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart +++ b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
@@ -154,7 +154,7 @@ var subscription = file.watch().changes.listen(changesReceived.add); // Delay running the rest of the test to allow file.changes propagate. return _delayed(() => test(changesReceived)).whenComplete(() { - subscription.cancel(); + unawaited(subscription.cancel()); }); }); } @@ -177,7 +177,7 @@ // won't be able to reliably distinguish new files from modified // ones. return _delayed(() => test(changesReceived)).whenComplete(() { - subscription.cancel(); + unawaited(subscription.cancel()); }); }); }
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart index 829a59d..f131a08 100644 --- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart +++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -1040,8 +1040,8 @@ '''); } - test_errors_hasNullSuffix() { - assertErrorsInCode( + Future<void> test_errors_hasNullSuffix() async { + await assertErrorsInCode( r''' String f(Map<int, String> a) { return a[0];
diff --git a/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_not_found_test.dart b/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_not_found_test.dart index 4849900..c6331e0 100644 --- a/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_not_found_test.dart +++ b/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_not_found_test.dart
@@ -15,8 +15,8 @@ @reflectiveTest class IncludeFileNotFoundTest extends AbstractAnalysisOptionsTest { - void test_notFound_existent_doubleQuoted() { - assertErrorsInCode( + Future<void> test_notFound_existent_doubleQuoted() async { + await assertErrorsInCode( ''' include: "./analysis_options.yaml" ''', @@ -24,8 +24,8 @@ ); } - void test_notFound_existent_notQuoted() { - assertErrorsInCode( + Future<void> test_notFound_existent_notQuoted() async { + await assertErrorsInCode( ''' include: ./analysis_options.yaml ''', @@ -33,8 +33,8 @@ ); } - void test_notFound_existent_singleQuoted() { - assertErrorsInCode( + Future<void> test_notFound_existent_singleQuoted() async { + await assertErrorsInCode( ''' include: './analysis_options.yaml' ''', @@ -42,8 +42,8 @@ ); } - void test_notFound_nonexistent_doubleQuoted() { - assertErrorsInCode( + Future<void> test_notFound_nonexistent_doubleQuoted() async { + await assertErrorsInCode( ''' # We don't depend on pedantic, but we should consider adding it. include: "package:pedantic/analysis_options.yaml" @@ -61,8 +61,8 @@ ); } - void test_notFound_nonexistent_notQuoted() { - assertErrorsInCode( + Future<void> test_notFound_nonexistent_notQuoted() async { + await assertErrorsInCode( ''' # We don't depend on pedantic, but we should consider adding it. include: package:pedantic/analysis_options.yaml @@ -80,8 +80,8 @@ ); } - void test_notFound_nonexistent_singleQuoted() { - assertErrorsInCode( + Future<void> test_notFound_nonexistent_singleQuoted() async { + await assertErrorsInCode( ''' # We don't depend on pedantic, but we should consider adding it. include: 'package:pedantic/analysis_options.yaml'
diff --git a/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_warning_test.dart b/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_warning_test.dart index 9d0d0a4..932ba9f 100644 --- a/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_warning_test.dart +++ b/pkg/analyzer/test/src/diagnostics/analysis_options/include_file_warning_test.dart
@@ -15,12 +15,12 @@ @reflectiveTest class IncludeFileWarningTest extends AbstractAnalysisOptionsTest { - void test_fileWarning() { + Future<void> test_fileWarning() async { newFile('/a.yaml', ''' analyzer: something: bad '''); - assertErrorsInCode( + await assertErrorsInCode( ''' include: a.yaml ''',
diff --git a/pkg/analyzer/test/src/diagnostics/analysis_options/recursive_include_file_test.dart b/pkg/analyzer/test/src/diagnostics/analysis_options/recursive_include_file_test.dart index 735e8fdc..51cff61 100644 --- a/pkg/analyzer/test/src/diagnostics/analysis_options/recursive_include_file_test.dart +++ b/pkg/analyzer/test/src/diagnostics/analysis_options/recursive_include_file_test.dart
@@ -15,8 +15,8 @@ @reflectiveTest class RecursiveIncludeFileTest extends AbstractAnalysisOptionsTest { - void test_itself() { - assertErrorsInCode( + Future<void> test_itself() async { + await assertErrorsInCode( ''' include: analysis_options.yaml ''', @@ -33,8 +33,8 @@ ); } - void test_itself_inList() { - assertErrorsInCode( + Future<void> test_itself_inList() async { + await assertErrorsInCode( ''' include: - analysis_options.yaml @@ -52,14 +52,14 @@ ); } - void test_recursive() { + Future<void> test_recursive() async { newFile('/a.yaml', ''' include: b.yaml '''); newFile('/b.yaml', ''' include: analysis_options.yaml '''); - assertErrorsInCode( + await assertErrorsInCode( ''' include: a.yaml ''', @@ -76,11 +76,11 @@ ); } - void test_recursive_itself() { + Future<void> test_recursive_itself() async { newFile('/a.yaml', ''' include: a.yaml '''); - assertErrorsInCode( + await assertErrorsInCode( ''' include: a.yaml ''', @@ -98,7 +98,7 @@ ); } - void test_recursive_listAtTop() { + Future<void> test_recursive_listAtTop() async { newFile('/a.yaml', ''' include: b.yaml '''); @@ -107,7 +107,7 @@ '''); newFile('/empty.yaml', ''' '''); - assertErrorsInCode( + await assertErrorsInCode( ''' include: - empty.yaml @@ -126,7 +126,7 @@ ); } - void test_recursive_listIncluded() { + Future<void> test_recursive_listIncluded() async { newFile('/a.yaml', ''' include: - empty.yaml @@ -137,7 +137,7 @@ '''); newFile('/empty.yaml', ''' '''); - assertErrorsInCode( + await assertErrorsInCode( ''' include: a.yaml ''', @@ -154,14 +154,14 @@ ); } - void test_recursive_notInBeginning() { + Future<void> test_recursive_notInBeginning() async { newFile('/a.yaml', ''' include: b.yaml '''); newFile('/b.yaml', ''' include: a.yaml '''); - assertErrorsInCode( + await assertErrorsInCode( ''' include: a.yaml ''',
diff --git a/pkg/analyzer/test/src/options/options_rule_validator_test.dart b/pkg/analyzer/test/src/options/options_rule_validator_test.dart index dae7c8e..c8c76e3 100644 --- a/pkg/analyzer/test/src/options/options_rule_validator_test.dart +++ b/pkg/analyzer/test/src/options/options_rule_validator_test.dart
@@ -46,26 +46,26 @@ @reflectiveTest class OptionsRuleValidatorIncludedFileTest extends AbstractAnalysisOptionsTest with OptionsRuleValidatorTestMixin { - test_deprecated_rule_inInclude_ok() { + Future<void> test_deprecated_rule_inInclude_ok() async { newFile('/included.yaml', ''' linter: rules: - deprecated_lint '''); - assertErrorsInCode(''' + await assertErrorsInCode(''' include: included.yaml ''', []); } - test_removed_rule_inInclude_ok() { + Future<void> test_removed_rule_inInclude_ok() async { newFile('/included.yaml', ''' linter: rules: - removed_in_2_12_lint '''); - assertErrorsInCode(''' + await assertErrorsInCode(''' include: included.yaml ''', []); }
diff --git a/pkg/analyzer_utilities/lib/testing/tree_string_sink.dart b/pkg/analyzer_utilities/lib/testing/tree_string_sink.dart index 71d0bfd..5ef214d 100644 --- a/pkg/analyzer_utilities/lib/testing/tree_string_sink.dart +++ b/pkg/analyzer_utilities/lib/testing/tree_string_sink.dart
@@ -37,7 +37,7 @@ } } - Future<void> writeFlags(Map<String, bool> flags) async { + void writeFlags(Map<String, bool> flags) { if (flags.values.any((flag) => flag)) { writeIndentedLine(() { write('flags:');