Skip to content

Commit 48d8741

Browse files
scheglovCommit Queue
authored andcommitted
CQ. Tweaks for InsertOnKeyword and tests.
Change-Id: I7dcdcbceb775fbf07c0bc27ab38a94bc02253086 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/394343 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent c9391d7 commit 48d8741

File tree

2 files changed

+42
-47
lines changed

2 files changed

+42
-47
lines changed

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

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analysis_server/src/services/correction/fix.dart';
6+
import 'package:analysis_server/src/utilities/extensions/object.dart';
67
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
78
import 'package:analyzer/dart/ast/ast.dart';
89
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -25,25 +26,39 @@ class InsertOnKeyword extends ResolvedCorrectionProducer {
2526

2627
@override
2728
Future<void> compute(ChangeBuilder builder) async {
28-
var node = this.node;
29-
if (node is! ExtensionDeclaration) {
30-
if (node.parent case ExtensionDeclaration parent) {
31-
node = parent;
32-
} else {
33-
return;
34-
}
29+
var extension =
30+
node.ifTypeOrNull<ExtensionDeclaration>() ??
31+
node.parent.ifTypeOrNull<ExtensionDeclaration>();
32+
if (extension == null) {
33+
return;
3534
}
3635

37-
var onClause = node.onClause;
38-
if (onClause != null && onClause.onKeyword.isSynthetic) {
39-
var onOffset = onClause.onKeyword.offset;
40-
if (onClause.extendedType.length == 0) {
41-
onOffset = node.name?.offset ?? onOffset;
42-
}
36+
var onClause = extension.onClause;
37+
if (onClause == null) {
38+
return;
39+
}
40+
41+
var name = extension.name;
42+
var onKeyword = onClause.onKeyword;
43+
var extendedType = onClause.extendedType;
44+
45+
// We don't expect this.
46+
if (name == null || name.isSynthetic) {
47+
return;
48+
}
4349

44-
await builder.addDartFileEdit(file, (builder) {
45-
builder.addSimpleInsertion(onOffset, 'on ');
46-
});
50+
// Otherwise this is not our error to fix.
51+
if (!onKeyword.isSynthetic) {
52+
return;
4753
}
54+
55+
// `extension int {}`
56+
// `extension E int {}`
57+
var insertOffset =
58+
extendedType.isSynthetic ? name.offset : extendedType.offset;
59+
60+
await builder.addDartFileEdit(file, (builder) {
61+
builder.addSimpleInsertion(insertOffset, 'on ');
62+
});
4863
}
4964
}

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

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void main() {
1919

2020
@reflectiveTest
2121
class InsertOnKeywordMultiTest extends FixInFileProcessorTest {
22-
Future<void> test_expected_onKeyword_multi() async {
22+
Future<void> test_hasName() async {
2323
await resolveTestCode('''
2424
extension String {}
2525
extension String {}
@@ -40,7 +40,7 @@ class InsertOnKeywordTest extends FixProcessorTest {
4040
@override
4141
FixKind get kind => DartFixKind.INSERT_ON_KEYWORD;
4242

43-
Future<void> test_expected_onKeyword() async {
43+
Future<void> test_hasName() async {
4444
await resolveTestCode('''
4545
extension int {}
4646
''');
@@ -54,7 +54,7 @@ extension on int {}
5454
);
5555
}
5656

57-
Future<void> test_expected_onKeyword_betweenNameAndType() async {
57+
Future<void> test_hasName_hasType() async {
5858
await resolveTestCode('''
5959
extension E int {}
6060
''');
@@ -63,45 +63,25 @@ extension E on int {}
6363
''');
6464
}
6565

66-
Future<void> test_expected_onKeyword_betweenTypeParameterAndType() async {
66+
Future<void> test_hasName_hasType_withTypeArguments() async {
6767
await resolveTestCode('''
68-
extension E<T> int {}
68+
extension E List<int> {}
6969
''');
7070
await assertHasFix('''
71-
extension E<T> on int {}
71+
extension E on List<int> {}
7272
''');
7373
}
7474

75-
Future<void> test_expected_onKeyword_nonType() async {
75+
Future<void> test_hasName_hasTypeParameters_noType() async {
7676
await resolveTestCode('''
77-
extension UnresolvedType {}
77+
extension E<T> int {}
7878
''');
79-
await assertHasFix(
80-
'''
81-
extension on UnresolvedType {}
82-
''',
83-
errorFilter: (error) {
84-
return error.errorCode == ParserErrorCode.EXPECTED_TOKEN;
85-
},
86-
);
87-
}
88-
89-
Future<void> test_expected_onKeyword_nonTypeWithTypeArguments() async {
90-
// We want to believe that the type parameter is from the undefined type.
91-
await resolveTestCode('''
92-
extension UnresolvedType<T> {}
79+
await assertHasFix('''
80+
extension E<T> on int {}
9381
''');
94-
await assertHasFix(
95-
'''
96-
extension on UnresolvedType<T> {}
97-
''',
98-
errorFilter: (error) {
99-
return error.errorCode == ParserErrorCode.EXPECTED_TOKEN;
100-
},
101-
);
10282
}
10383

104-
Future<void> test_expected_onKeyword_typeWithTypeArguments() async {
84+
Future<void> test_noName_hasType_withTypeArguments() async {
10585
await resolveTestCode('''
10686
extension List<int> {}
10787
''');

0 commit comments

Comments
 (0)