Skip to content

Commit ac25e95

Browse files
FMorschelCommit Queue
authored andcommitted
[DAS] Fixes Add final initializing formal parameters quick-fix on enum
Fixes: #61798 Change-Id: I2ef9a8086efc091207b1651d45b4a9e4b665f8e1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/457400 Commit-Queue: Paul Berry <[email protected]> Auto-Submit: Felipe Morschel <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent baf4639 commit ac25e95

File tree

3 files changed

+77
-16
lines changed

3 files changed

+77
-16
lines changed

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ typedef _FieldRecord = ({bool isRequired, String parameter});
1717
class AddFieldFormalParameters extends ResolvedCorrectionProducer {
1818
final _Style _style;
1919

20-
bool _useRequired = false;
21-
2220
@override
2321
final FixKind fixKind;
2422

@@ -43,13 +41,10 @@ class AddFieldFormalParameters extends ResolvedCorrectionProducer {
4341
}
4442
List<FormalParameter> parameters = constructor.parameters.parameters;
4543

46-
var classNode = constructor.parent;
47-
if (classNode is! ClassDeclaration) {
48-
return;
49-
}
50-
51-
var superType = classNode.declaredFragment!.element.supertype;
52-
if (superType == null) {
44+
var instanceNodeDeclaration = constructor.parent;
45+
if (instanceNodeDeclaration is! NamedCompilationUnitMember ||
46+
instanceNodeDeclaration is TypeAlias ||
47+
instanceNodeDeclaration is FunctionDeclaration) {
5348
return;
5449
}
5550

@@ -78,10 +73,6 @@ class AddFieldFormalParameters extends ResolvedCorrectionProducer {
7873
}
7974
}
8075

81-
if (_style == _Style.requiredNamed) {
82-
_useRequired = true;
83-
}
84-
8576
var fieldsRecords = fields.map(_parameterForField).toList();
8677
var requiredFirst = getCodeStyleOptions(
8778
unitResult.file,
@@ -125,6 +116,9 @@ class AddFieldFormalParameters extends ResolvedCorrectionProducer {
125116
write += fieldParametersCode;
126117
}
127118
builder.addSimpleInsertion(parameters.last.end, write);
119+
} else {
120+
var offset = constructor.parameters.leftParenthesis.end;
121+
builder.addSimpleInsertion(offset, '{$fieldParametersCode}');
128122
}
129123
} else if (lastRequiredParameter != null) {
130124
return builder.addSimpleInsertion(
@@ -144,7 +138,8 @@ class AddFieldFormalParameters extends ResolvedCorrectionProducer {
144138
_FieldRecord _parameterForField(FieldElement field) {
145139
var prefix = '';
146140
var isRequired = false;
147-
if (typeSystem.isPotentiallyNonNullable(field.type) && _useRequired) {
141+
if (typeSystem.isPotentiallyNonNullable(field.type) &&
142+
_style == _Style.requiredNamed) {
148143
isRequired = true;
149144
prefix = 'required ';
150145
}

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,27 @@ class AddFieldFormalNamedParametersTest extends FixProcessorTest {
2121
@override
2222
FixKind get kind => DartFixKind.addInitializingFormalNamesParameters;
2323

24+
Future<void> test_enum() async {
25+
await resolveTestCode('''
26+
enum MyEnum {
27+
a;
28+
29+
const MyEnum();
30+
31+
final int value;
32+
}
33+
''');
34+
await assertHasFix('''
35+
enum MyEnum {
36+
a;
37+
38+
const MyEnum({required this.value});
39+
40+
final int value;
41+
}
42+
''');
43+
}
44+
2445
Future<void> test_flutter_nullable() async {
2546
writeTestPackageConfig(flutter: true);
2647
await resolveTestCode('''
@@ -206,6 +227,27 @@ class AddFieldFormalParametersTest extends FixProcessorTest {
206227
@override
207228
FixKind get kind => DartFixKind.addInitializingFormalParameters;
208229

230+
Future<void> test_enum() async {
231+
await resolveTestCode('''
232+
enum MyEnum {
233+
a;
234+
235+
const MyEnum();
236+
237+
final int value;
238+
}
239+
''');
240+
await assertHasFix('''
241+
enum MyEnum {
242+
a;
243+
244+
const MyEnum(this.value);
245+
246+
final int value;
247+
}
248+
''');
249+
}
250+
209251
Future<void> test_flutter() async {
210252
writeTestPackageConfig(flutter: true);
211253
await resolveTestCode('''

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6342,8 +6342,32 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
63426342
ConstructorDeclaration constructor,
63436343
) {
63446344
var fields = <FieldElement>{};
6345-
var classDeclaration = constructor.parent as ClassDeclaration;
6346-
for (ClassMember fieldDeclaration in classDeclaration.members) {
6345+
var unitMemberDeclaration =
6346+
constructor.parent as NamedCompilationUnitMember;
6347+
late NodeList<ClassMember> membersList;
6348+
switch (unitMemberDeclaration) {
6349+
case TypeAlias() || FunctionDeclaration():
6350+
assert(
6351+
false,
6352+
'How can a constructor be declared in type alias or function?',
6353+
);
6354+
return [];
6355+
case ExtensionTypeDeclaration():
6356+
// Extension types do not have fields to be initialized.
6357+
return [];
6358+
case ClassDeclaration(:var members) ||
6359+
MixinDeclaration(:var members) ||
6360+
EnumDeclaration(:var members):
6361+
membersList = members;
6362+
default:
6363+
assert(
6364+
false,
6365+
'Unexpected parent of constructor: '
6366+
'${unitMemberDeclaration.runtimeType}',
6367+
);
6368+
return [];
6369+
}
6370+
for (ClassMember fieldDeclaration in membersList) {
63476371
if (fieldDeclaration is FieldDeclaration) {
63486372
for (VariableDeclaration field in fieldDeclaration.fields.variables) {
63496373
if (field.initializer == null) {

0 commit comments

Comments
 (0)