Skip to content

Commit f77d681

Browse files
srawlinsCommit Queue
authored andcommitted
DAS: Add fix for unnecessary_unawaited
Change-Id: I03781a7231c684e5241d0b0af36b61e5194137fe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428621 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 20755e2 commit f77d681

File tree

6 files changed

+174
-7
lines changed

6 files changed

+174
-7
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analysis_server/src/services/correction/fix.dart';
6+
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
7+
import 'package:analyzer/dart/ast/ast.dart';
8+
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
9+
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
10+
import 'package:analyzer_plugin/utilities/range_factory.dart';
11+
12+
class RemoveUnawaited extends ResolvedCorrectionProducer {
13+
RemoveUnawaited({required super.context});
14+
15+
@override
16+
CorrectionApplicability get applicability =>
17+
CorrectionApplicability.automatically;
18+
19+
@override
20+
FixKind get fixKind => DartFixKind.REMOVE_UNAWAITED;
21+
22+
@override
23+
FixKind get multiFixKind => DartFixKind.REMOVE_UNAWAITED_MULTI;
24+
25+
@override
26+
Future<void> compute(ChangeBuilder builder) async {
27+
var unawaited = node;
28+
if (unawaited case SimpleIdentifier(
29+
name: 'unawaited',
30+
:MethodInvocation parent,
31+
)) {
32+
await builder.addDartFileEdit(file, (builder) {
33+
builder.addDeletion(
34+
range.startEnd(unawaited, parent.argumentList.leftParenthesis),
35+
);
36+
builder.addDeletion(range.entity(parent.argumentList.rightParenthesis));
37+
});
38+
}
39+
}
40+
}

pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@
4444
# issue created for it.
4545
#
4646
# Stats:
47-
# - 58 "needsEvaluation"
48-
# - 308 "needsFix"
49-
# - 470 "hasFix"
50-
# - 514 "noFix"
47+
# - 62 "needsEvaluation"
48+
# - 302 "needsFix"
49+
# - 500 "hasFix"
50+
# - 498 "noFix"
5151

5252
AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR:
5353
status: noFix
@@ -2479,9 +2479,7 @@ LintCode.unnecessary_this:
24792479
LintCode.unnecessary_to_list_in_spreads:
24802480
status: hasFix
24812481
LintCode.unnecessary_unawaited:
2482-
status: needsFix
2483-
notes: |-
2484-
A fix can be made to remove the 'unawaited' call.
2482+
status: hasFix
24852483
LintCode.unnecessary_underscores:
24862484
status: hasFix
24872485
LintCode.unreachable_from_main:

pkg/analysis_server/lib/src/services/correction/fix.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,16 @@ abstract final class DartFixKind {
15501550
DartFixKindPriority.inFile,
15511551
'Remove type check everywhere in file',
15521552
);
1553+
static const REMOVE_UNAWAITED = FixKind(
1554+
'dart.fix.remove.unawaited',
1555+
DartFixKindPriority.standard,
1556+
"Remove 'unawaited' call",
1557+
);
1558+
static const REMOVE_UNAWAITED_MULTI = FixKind(
1559+
'dart.fix.remove.unawaited.multi',
1560+
DartFixKindPriority.standard,
1561+
"Remove 'unawaited' call in file",
1562+
);
15531563
static const REMOVE_UNEXPECTED_UNDERSCORES = FixKind(
15541564
'dart.fix.remove.unexpectedUnderscores',
15551565
DartFixKindPriority.standard,

pkg/analysis_server/lib/src/services/correction/fix_internal.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ import 'package:analysis_server/src/services/correction/dart/remove_this_express
178178
import 'package:analysis_server/src/services/correction/dart/remove_to_list.dart';
179179
import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
180180
import 'package:analysis_server/src/services/correction/dart/remove_type_arguments.dart';
181+
import 'package:analysis_server/src/services/correction/dart/remove_unawaited.dart';
181182
import 'package:analysis_server/src/services/correction/dart/remove_unexpected_underscores.dart';
182183
import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_cast.dart';
183184
import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_final.dart';
@@ -528,6 +529,7 @@ final _builtInLintGenerators = <LintCode, List<ProducerGenerator>>{
528529
],
529530
LinterLintCode.unnecessary_to_list_in_spreads: [RemoveToList.new],
530531
LinterLintCode.unnecessary_this: [RemoveThisExpression.new],
532+
LinterLintCode.unnecessary_unawaited: [RemoveUnawaited.new],
531533
LinterLintCode.unnecessary_underscores: [ConvertToWildcardVariable.new],
532534
LinterLintCode.unreachable_from_main: [RemoveUnusedElement.new],
533535
LinterLintCode.use_colored_box: [ReplaceContainerWithColoredBox.new],
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analysis_server/src/services/correction/fix.dart';
6+
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
7+
import 'package:linter/src/lint_names.dart';
8+
import 'package:test_reflective_loader/test_reflective_loader.dart';
9+
10+
import 'fix_processor.dart';
11+
12+
void main() {
13+
defineReflectiveSuite(() {
14+
defineReflectiveTests(RemoveAwaitBulkTest);
15+
defineReflectiveTests(RemoveAwaitTest);
16+
});
17+
}
18+
19+
@reflectiveTest
20+
class RemoveAwaitBulkTest extends BulkFixProcessorTest {
21+
@override
22+
String get lintCode => LintNames.unnecessary_unawaited;
23+
24+
@override
25+
void setUp() {
26+
super.setUp();
27+
writeTestPackageConfig(meta: true);
28+
}
29+
30+
Future<void> test_nested() async {
31+
await resolveTestCode(r'''
32+
import 'dart:async';
33+
import 'package:meta/meta.dart';
34+
void f() async {
35+
unawaited(g('${unawaited(g())}'));
36+
}
37+
38+
@awaitNotRequired
39+
Future<int> g(String s) async => 7;
40+
''');
41+
await assertHasFix(r'''
42+
import 'dart:async';
43+
import 'package:meta/meta.dart';
44+
void f() async {
45+
g('${g()}');
46+
}
47+
48+
@awaitNotRequired
49+
Future<int> g(String s) async => 7;
50+
''');
51+
}
52+
53+
Future<void> test_singleFile() async {
54+
await resolveTestCode(r'''
55+
import 'dart:async';
56+
import 'package:meta/meta.dart';
57+
void f() async {
58+
unawaited(g());
59+
unawaited(g());
60+
}
61+
62+
@awaitNotRequired
63+
Future<int> g() async => 7;
64+
''');
65+
await assertHasFix(r'''
66+
import 'dart:async';
67+
import 'package:meta/meta.dart';
68+
void f() async {
69+
g();
70+
g();
71+
}
72+
73+
@awaitNotRequired
74+
Future<int> g() async => 7;
75+
''');
76+
}
77+
}
78+
79+
@reflectiveTest
80+
class RemoveAwaitTest extends FixProcessorLintTest {
81+
@override
82+
FixKind get kind => DartFixKind.REMOVE_UNAWAITED;
83+
84+
@override
85+
String get lintCode => LintNames.unnecessary_unawaited;
86+
87+
@override
88+
void setUp() {
89+
super.setUp();
90+
writeTestPackageConfig(meta: true);
91+
}
92+
93+
Future<void> test_unawaited() async {
94+
await resolveTestCode('''
95+
import 'dart:async';
96+
import 'package:meta/meta.dart';
97+
void f() async {
98+
unawaited(g());
99+
}
100+
101+
@awaitNotRequired
102+
Future<int> g() async => 7;
103+
''');
104+
await assertHasFix('''
105+
import 'dart:async';
106+
import 'package:meta/meta.dart';
107+
void f() async {
108+
g();
109+
}
110+
111+
@awaitNotRequired
112+
Future<int> g() async => 7;
113+
''');
114+
}
115+
}

pkg/analysis_server/test/src/services/correction/fix/test_all.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ import 'remove_returned_value_test.dart' as remove_returned_value;
227227
import 'remove_this_expression_test.dart' as remove_this_expression;
228228
import 'remove_type_annotation_test.dart' as remove_type_annotation;
229229
import 'remove_type_arguments_test.dart' as remove_type_arguments;
230+
import 'remove_unawaited_test.dart' as remove_unawaited;
230231
import 'remove_unexpected_underscores_test.dart'
231232
as remove_unexpected_underscores;
232233
import 'remove_unnecessary_cast_test.dart' as remove_unnecessary_cast;
@@ -514,6 +515,7 @@ void main() {
514515
remove_this_expression.main();
515516
remove_type_annotation.main();
516517
remove_type_arguments.main();
518+
remove_unawaited.main();
517519
remove_unexpected_underscores.main();
518520
remove_unnecessary_cast.main();
519521
remove_unnecessary_const.main();

0 commit comments

Comments
 (0)