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;