Issue 52296. Fix NPE in AddTypeAnnotation, when formal parameter without name.

Bug: https://github.com/dart-lang/sdk/issues/52296
Change-Id: I6f3952faa9f3fc9e7f9e1d83c4699222be8dbcdc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/301731
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov
2023-05-08 14:54:48 +00:00
committed by Commit Queue
parent c63263cbf5
commit bf5bdc97ff
2 changed files with 18 additions and 3 deletions
@@ -47,10 +47,12 @@ class AddTypeAnnotation extends CorrectionProducer {
@override
Future<void> compute(ChangeBuilder builder) async {
final node = this.node;
if (node is SimpleFormalParameter) {
await _forSimpleFormalParameter(builder, node.name!, node);
await _forSimpleFormalParameter(builder, node);
return;
}
if (node is DeclaredVariablePattern) {
var type = node.matchedValueType;
var keyword = node.keyword;
@@ -133,12 +135,17 @@ class AddTypeAnnotation extends CorrectionProducer {
builder, declaredIdentifier.keyword, declaredIdentifier.name, type);
}
Future<void> _forSimpleFormalParameter(ChangeBuilder builder, Token name,
SimpleFormalParameter parameter) async {
Future<void> _forSimpleFormalParameter(
ChangeBuilder builder, SimpleFormalParameter parameter) async {
// Ensure that there isn't already a type annotation.
if (parameter.type != null) {
return;
}
// Ensure that the parameter is named.
final name = parameter.name;
if (name == null) {
return;
}
// Prepare the type.
var type = parameter.declaredElement!.type;
// TODO(scheglov) If the parameter is in a method declaration, and if the
@@ -689,6 +689,14 @@ void f() {
''');
}
Future<void> test_parameter_final_type_noName() async {
verifyNoTestUnitErrors = false;
await resolveTestCode('''
typedef F = void Function(final int);
''');
await assertNoAssistAt('final');
}
@FailingTest(reason: '''
This functionality is disabled in `AddTypeAnnotation._forSimpleFormalParameter`
because `writeType` is writing the names of the parameters when it shouldn't.