Skip to content

Commit f5dc281

Browse files
FMorschelCommit Queue
authored andcommitted
[DAS] Convert into getter as a fix for declaring an extension type field
[email protected] Fixes #59831 Change-Id: I1bc6345a8e5d2b09d511a97bb4f0d97308b2e30b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/402622 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Phil Quitslund <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Auto-Submit: Felipe Morschel <[email protected]>
1 parent e964a4e commit f5dc281

File tree

6 files changed

+275
-16
lines changed

6 files changed

+275
-16
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ abstract final class DartAssistKind {
124124
static const CONVERT_INTO_GETTER = AssistKind(
125125
'dart.assist.convert.finalFieldToGetter',
126126
DartAssistKindPriority.DEFAULT,
127-
'Convert to getter',
127+
"Convert '{0}' to a getter",
128128
);
129129
static const CONVERT_INTO_IS_NOT = AssistKind(
130130
'dart.assist.convert.isNot',

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

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analysis_server/src/services/correction/assist.dart';
6+
import 'package:analysis_server/src/services/correction/fix.dart';
67
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
78
import 'package:analyzer/dart/ast/ast.dart';
89
import 'package:analyzer/src/utilities/extensions/ast.dart';
910
import 'package:analyzer_plugin/utilities/assist/assist.dart';
1011
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
12+
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
1113
import 'package:analyzer_plugin/utilities/range_factory.dart';
1214

1315
class ConvertIntoGetter extends ResolvedCorrectionProducer {
16+
String _memberName = '';
17+
1418
ConvertIntoGetter({required super.context});
1519

1620
@override
@@ -19,9 +23,18 @@ class ConvertIntoGetter extends ResolvedCorrectionProducer {
1923
CorrectionApplicability
2024
.singleLocation;
2125

26+
@override
27+
List<String>? get assistArguments => [_memberName];
28+
2229
@override
2330
AssistKind get assistKind => DartAssistKind.CONVERT_INTO_GETTER;
2431

32+
@override
33+
List<String>? get fixArguments => assistArguments;
34+
35+
@override
36+
FixKind get fixKind => DartFixKind.CONVERT_INTO_GETTER;
37+
2538
@override
2639
Future<void> compute(ChangeBuilder builder) async {
2740
// Find the enclosing field declaration.
@@ -43,18 +56,18 @@ class ConvertIntoGetter extends ResolvedCorrectionProducer {
4356
if (fieldDeclaration == null) {
4457
return;
4558
}
46-
// The field must be final and have only one variable.
59+
// The field must have only one variable.
4760
var fieldList = fieldDeclaration.fields;
48-
var finalKeyword = fieldList.keyword;
49-
if (finalKeyword == null || fieldList.variables.length != 1) {
61+
if (fieldList.variables.length != 1) {
5062
return;
5163
}
5264
var field = fieldList.variables.first;
53-
// Prepare the initializer.
54-
var initializer = field.initializer;
55-
if (initializer == null) {
65+
_memberName = field.name.lexeme;
66+
if (_memberName.isEmpty) {
5667
return;
5768
}
69+
// Prepare the initializer.
70+
var initializer = field.initializer;
5871
// Add proposal.
5972
var code = '';
6073
var typeAnnotation = fieldList.type;
@@ -63,13 +76,25 @@ class ConvertIntoGetter extends ResolvedCorrectionProducer {
6376
}
6477
code += 'get';
6578
code += ' ${field.name.lexeme}';
66-
code += ' => ${utils.getNodeText(initializer)}';
67-
code += ';';
79+
code += ' => ';
80+
81+
var startingKeyword =
82+
fieldList.lateKeyword ??
83+
fieldList.keyword ??
84+
fieldList.type ??
85+
field.name;
6886

69-
var startingKeyword = fieldList.lateKeyword ?? finalKeyword;
7087
var replacementRange = range.startEnd(startingKeyword, fieldDeclaration);
7188
await builder.addDartFileEdit(file, (builder) {
72-
builder.addSimpleReplacement(replacementRange, code);
89+
builder.addReplacement(replacementRange, (builder) {
90+
builder.write(code);
91+
if (initializer == null) {
92+
builder.addSimpleLinkedEdit('initializer', 'null');
93+
builder.write(';');
94+
} else {
95+
builder.write('${utils.getNodeText(initializer)};');
96+
}
97+
});
7398
});
7499
}
75100
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ CompileTimeErrorCode.EXTENSION_CONFLICTING_STATIC_AND_INSTANCE:
652652
CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT:
653653
status: hasFix
654654
CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD:
655-
status: needsFix
655+
status: hasFix
656656
notes: |-
657657
Remove the field, or add `static`.
658658
CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER:
@@ -669,10 +669,10 @@ CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_FORMAL_PARAMETER:
669669
Remove it.
670670
CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION:
671671
status: needsFix
672+
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_INSTANCE_FIELD:
673+
status: hasFix
672674
notes: |-
673675
Remove the field, or add `static`.
674-
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_INSTANCE_FIELD:
675-
status: needsFix
676676
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_MEMBER_OF_OBJECT:
677677
status: hasFix
678678
CompileTimeErrorCode.EXTENSION_TYPE_IMPLEMENTS_DISALLOWED_TYPE:

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,11 @@ abstract final class DartFixKind {
387387
DartFixKindPriority.inFile,
388388
'Convert to block body everywhere in file',
389389
);
390+
static const CONVERT_INTO_GETTER = FixKind(
391+
'dart.fix.convert.getter',
392+
DartFixKindPriority.standard,
393+
"Convert '{0}' to a getter",
394+
);
390395
static const CONVERT_FOR_EACH_TO_FOR_LOOP = FixKind(
391396
'dart.fix.convert.toForLoop',
392397
DartFixKindPriority.standard,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import 'package:analysis_server/src/services/correction/dart/convert_flutter_chi
5252
import 'package:analysis_server/src/services/correction/dart/convert_flutter_children.dart';
5353
import 'package:analysis_server/src/services/correction/dart/convert_for_each_to_for_loop.dart';
5454
import 'package:analysis_server/src/services/correction/dart/convert_into_block_body.dart';
55+
import 'package:analysis_server/src/services/correction/dart/convert_into_getter.dart';
5556
import 'package:analysis_server/src/services/correction/dart/convert_into_is_not.dart';
5657
import 'package:analysis_server/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart';
5758
import 'package:analysis_server/src/services/correction/dart/convert_null_check_to_null_aware_element_or_entry.dart';
@@ -762,9 +763,15 @@ final _builtInNonLintProducers = <ErrorCode, List<ProducerGenerator>>{
762763
CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT: [
763764
RemoveMethodDeclaration.new,
764765
],
766+
CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD: [
767+
ConvertIntoGetter.new,
768+
],
765769
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_MEMBER_OF_OBJECT: [
766770
RemoveMethodDeclaration.new,
767771
],
772+
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_INSTANCE_FIELD: [
773+
ConvertIntoGetter.new,
774+
],
768775
CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER: [
769776
ReplaceWithExtensionName.new,
770777
],

0 commit comments

Comments
 (0)