Skip to content

Commit dd93f6f

Browse files
keertipCommit Queue
authored and
Commit Queue
committed
Fix for create constructor for Widget with private fields.
Fixes #56182 Change-Id: I25a94dbb5af5dda4db1fde9494783df215587fd5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/410520 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Keerti Parthasarathy <[email protected]>
1 parent c6077da commit dd93f6f

File tree

2 files changed

+84
-10
lines changed

2 files changed

+84
-10
lines changed

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

+32-10
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,19 @@ class CreateConstructorForFinalFields extends ResolvedCorrectionProducer {
174174
),
175175
);
176176
builder.write(' key');
177+
var fieldsForInitializers = <_Field>[];
177178

178179
_writeFlutterParameters(
179180
builder: builder,
180181
variableLists: fixContext.variableLists,
182+
fieldsForInitializers: fieldsForInitializers,
181183
);
182184

183-
builder.write('}) : super(key: key);');
185+
builder.write('}) : ');
186+
if (fieldsForInitializers.isNotEmpty) {
187+
builder.write('${_getInitalizersString(fieldsForInitializers)}, ');
188+
}
189+
builder.write('super(key: key);');
184190
});
185191
});
186192
}
@@ -198,16 +204,29 @@ class CreateConstructorForFinalFields extends ResolvedCorrectionProducer {
198204
builder.write('({');
199205
builder.write('super.key');
200206

207+
var fieldsForInitializers = <_Field>[];
201208
_writeFlutterParameters(
202209
builder: builder,
203210
variableLists: fixContext.variableLists,
211+
fieldsForInitializers: fieldsForInitializers,
204212
);
205213

206-
builder.write('});');
214+
builder.write('})');
215+
if (fieldsForInitializers.isNotEmpty) {
216+
builder.write(' : ${_getInitalizersString(fieldsForInitializers)}');
217+
}
218+
builder.write(';');
207219
});
208220
});
209221
}
210222

223+
String _getInitalizersString(List<_Field> fieldsForInitializers) =>
224+
fieldsForInitializers
225+
.map((field) {
226+
return '${field.fieldName} = ${field.namedFormalParameterName}';
227+
})
228+
.join(', ');
229+
211230
Future<void> _notFlutterNamed({
212231
required _FixContext fixContext,
213232
required NamedCompilationUnitMember containerDeclaration,
@@ -259,12 +278,7 @@ class CreateConstructorForFinalFields extends ResolvedCorrectionProducer {
259278
builder.write('})');
260279

261280
if (fieldsForInitializers.isNotEmpty) {
262-
var code = fieldsForInitializers
263-
.map((field) {
264-
return '${field.fieldName} = ${field.namedFormalParameterName}';
265-
})
266-
.join(', ');
267-
builder.write(' : $code');
281+
builder.write(' : ${_getInitalizersString(fieldsForInitializers)}');
268282
}
269283

270284
builder.write(';');
@@ -332,6 +346,7 @@ class CreateConstructorForFinalFields extends ResolvedCorrectionProducer {
332346
void _writeFlutterParameters({
333347
required DartEditBuilder builder,
334348
required Iterable<VariableDeclarationList> variableLists,
349+
required List<_Field> fieldsForInitializers,
335350
}) {
336351
var fields = _fieldsToWrite(variableLists);
337352
if (fields == null) {
@@ -345,8 +360,15 @@ class CreateConstructorForFinalFields extends ResolvedCorrectionProducer {
345360
if (field.hasNonNullableType) {
346361
builder.write('required ');
347362
}
348-
builder.write('this.');
349-
builder.write(field.fieldName);
363+
if (field.namedFormalParameterName == field.fieldName) {
364+
builder.write('this.');
365+
builder.write(field.fieldName);
366+
} else {
367+
builder.write(utils.getNodeText(field.typeAnnotation));
368+
builder.write(' ');
369+
builder.write(field.namedFormalParameterName);
370+
fieldsForInitializers.add(field);
371+
}
350372
}
351373
}
352374
}

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

+52
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,31 @@ class Test {
4646
''');
4747
}
4848

49+
Future<void> test_class_flutter() async {
50+
writeTestPackageConfig(flutter: true);
51+
await resolveTestCode('''
52+
import 'package:flutter/widgets.dart';
53+
54+
class Test extends StatelessWidget {
55+
final int _a;
56+
}
57+
''');
58+
await assertHasFix(
59+
'''
60+
import 'package:flutter/widgets.dart';
61+
62+
class Test extends StatelessWidget {
63+
final int _a;
64+
65+
const Test({super.key, required int a}) : _a = a;
66+
}
67+
''',
68+
errorFilter: (error) {
69+
return error.message.contains("'_a' must be initialized");
70+
},
71+
);
72+
}
73+
4974
Future<void> test_class_hasSuperClass_withOptionalNamed() async {
5075
await resolveTestCode('''
5176
class A {
@@ -556,4 +581,31 @@ class MyWidget extends StatelessWidget {
556581
},
557582
);
558583
}
584+
585+
Future<void> test_class_flutter_private_field() async {
586+
writeTestPackageConfig(flutter: true);
587+
await resolveTestCode('''
588+
import 'package:flutter/widgets.dart';
589+
590+
class MyWidget extends StatelessWidget {
591+
final int _a;
592+
final int b;
593+
}
594+
''');
595+
await assertHasFix(
596+
'''
597+
import 'package:flutter/widgets.dart';
598+
599+
class MyWidget extends StatelessWidget {
600+
final int _a;
601+
final int b;
602+
603+
const MyWidget({Key? key, required int a, required this.b}) : _a = a, super(key: key);
604+
}
605+
''',
606+
errorFilter: (error) {
607+
return error.message.contains("'b'");
608+
},
609+
);
610+
}
559611
}

0 commit comments

Comments
 (0)