Skip to content

Commit eaa7368

Browse files
fshcheglovCommit Queue
authored andcommitted
Fix an issue where add_field_formal_parameter would attempt to access the null name offset of a synthetic value.
Bug: #61853 Change-Id: Ic308b5baffcc9ef93dbe3aacbaefd53fdf408f5d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/457940 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 2efbf96 commit eaa7368

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/element.dart';
99
import 'package:analyzer/src/generated/error_verifier.dart';
1010
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
1111
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
12+
import 'package:collection/collection.dart';
1213

1314
/// The boolean value indicates whether the field is required.
1415
/// The string value is the field/parameter name.
@@ -49,11 +50,16 @@ class AddFieldFormalParameters extends ResolvedCorrectionProducer {
4950
}
5051

5152
// Compute uninitialized final fields.
52-
var fields = ErrorVerifier.computeNotInitializedFields(constructor);
53-
fields.retainWhere((FieldElement field) => field.isFinal);
54-
fields.sort(
55-
(a, b) => a.firstFragment.nameOffset! - b.firstFragment.nameOffset!,
56-
);
53+
var fields = ErrorVerifier.computeNotInitializedFields(constructor)
54+
.where((field) => field.isFinal)
55+
.map((field) {
56+
var nameOffset = field.firstFragment.nameOffset;
57+
return nameOffset != null ? (field, nameOffset) : null;
58+
})
59+
.nonNulls
60+
.sortedBy((pair) => pair.$2)
61+
.map((pair) => pair.$1)
62+
.toList();
5763

5864
// Prepare the last required parameter.
5965
FormalParameter? lastRequiredParameter;

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

Lines changed: 21 additions & 0 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:analyzer/src/error/codes.dart';
67
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
78
import 'package:linter/src/lint_names.dart';
89
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -370,4 +371,24 @@ class Test {
370371
}
371372
''');
372373
}
374+
375+
Future<void> test_synthetic_field() async {
376+
await resolveTestCode('''
377+
class Test {
378+
final int foo,;
379+
Test();
380+
}
381+
''');
382+
await assertHasFix(
383+
'''
384+
class Test {
385+
final int foo,;
386+
Test(this.foo);
387+
}
388+
''',
389+
filter: (diagnostic) =>
390+
diagnostic.diagnosticCode ==
391+
CompileTimeErrorCode.finalNotInitializedConstructor1,
392+
);
393+
}
373394
}

0 commit comments

Comments
 (0)