Issue 44220. Fix for NPE when checking for INVALID_REQUIRED_* for GenericFunctionType.

Bug: https://github.com/dart-lang/sdk/issues/44220
Change-Id: I7a88a8b34fbda140ab12e6861c0b00a5e5c420b7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/172360
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index acc8ac7..4fc82c5 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -1360,17 +1360,17 @@
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM,
           param,
-          [param.identifier.name]);
+          [_formalParameterNameOrEmpty(param)]);
     }
     for (final param in nonNamedParamsWithRequired.where((p) => p.isRequired)) {
       _errorReporter.reportErrorForNode(
           HintCode.INVALID_REQUIRED_POSITIONAL_PARAM,
           param,
-          [param.identifier.name]);
+          [_formalParameterNameOrEmpty(param)]);
     }
     for (final param in namedParamsWithRequiredAndDefault) {
       _errorReporter.reportErrorForNode(HintCode.INVALID_REQUIRED_NAMED_PARAM,
-          param, [param.identifier.name]);
+          param, [_formalParameterNameOrEmpty(param)]);
     }
   }
 
@@ -1629,6 +1629,11 @@
     return true;
   }
 
+  static String _formalParameterNameOrEmpty(FormalParameter node) {
+    var identifier = node.identifier;
+    return identifier?.name ?? '';
+  }
+
   static bool _hasNonVirtualAnnotation(ExecutableElement element) {
     if (element == null) {
       return false;
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_required_positional_param_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_required_positional_param_test.dart
index 39caa76..072131e 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_required_positional_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_required_positional_param_test.dart
@@ -21,7 +21,7 @@
     writeTestPackageConfigWithMeta();
   }
 
-  test_requiredPositionalParameter() async {
+  test_ofFunction_first() async {
     await assertErrorsInCode(r'''
 import 'package:meta/meta.dart';
 
@@ -31,7 +31,7 @@
     ]);
   }
 
-  test_requiredPositionalParameter_asSecond() async {
+  test_ofFunction_second() async {
     await assertErrorsInCode(r'''
 import 'package:meta/meta.dart';
 
@@ -41,6 +41,26 @@
     ]);
   }
 
+  test_ofGenericFunctionType_named() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+typedef F = void Function(@required int a);
+''', [
+      error(HintCode.INVALID_REQUIRED_POSITIONAL_PARAM, 60, 15),
+    ]);
+  }
+
+  test_ofGenericFunctionType_unnamed() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+typedef F = void Function(@required int);
+''', [
+      error(HintCode.INVALID_REQUIRED_POSITIONAL_PARAM, 60, 13),
+    ]);
+  }
+
   test_valid() async {
     await assertNoErrorsInCode(r'''
 m1() => null;