Skip to content

Commit 19fce85

Browse files
stereotype441Commit Queue
authored andcommitted
[analyzer] Fix crash with improperly nested named parameters.
Fixes #61066. Bug: #61066 Change-Id: I97f9882f99fa8f8cfad9c96c10d0025f7e6d1050 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439000 Reviewed-by: Konstantin Shcheglov <[email protected]> Auto-Submit: Paul Berry <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent 45d622c commit 19fce85

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,9 @@ abstract class BaseDeprecatedMemberUseVerifier {
340340
namedParameters = {};
341341
for (var parameter in parameters) {
342342
if (parameter.isNamed) {
343-
namedParameters[parameter.name3!] = parameter;
343+
if (parameter.name3 case var name?) {
344+
namedParameters[name] = parameter;
345+
}
344346
}
345347
}
346348
}

pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/file_system/file_system.dart';
66
import 'package:analyzer/src/error/codes.dart';
7+
import 'package:analyzer/src/generated/parser.dart';
78
import 'package:analyzer/utilities/package_config_file_builder.dart';
89
import 'package:test_reflective_loader/test_reflective_loader.dart';
910

@@ -688,6 +689,31 @@ import 'package:aaa/a.dart';
688689
);
689690
}
690691

692+
test_incorrectlyNestedNamedParameterDeclaration() async {
693+
// This is a regression test; previously this code would cause an analyzer
694+
// crash in DeprecatedMemberUseVerifier.
695+
await assertErrorsInCode(
696+
r'''
697+
class C {
698+
final String x;
699+
final bool y;
700+
701+
const C({
702+
required this.x,
703+
{this.y = false}
704+
});
705+
}
706+
707+
const z = C(x: '');
708+
''',
709+
[
710+
error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1, 53, 1),
711+
error(ParserErrorCode.MISSING_IDENTIFIER, 82, 1),
712+
error(ParserErrorCode.EXPECTED_TOKEN, 82, 1),
713+
],
714+
);
715+
}
716+
691717
test_inDeprecatedClass() async {
692718
await assertNoErrorsInCode2(
693719
externalCode: r'''
@@ -1330,6 +1356,28 @@ class B = Object with A;
13301356
''');
13311357
}
13321358

1359+
test_namedParameterMissingName() async {
1360+
// This is a regression test; previously this code would cause an analyzer
1361+
// crash in DeprecatedMemberUseVerifier.
1362+
await assertErrorsInCode(
1363+
r'''
1364+
class C {
1365+
const C({this.});
1366+
}
1367+
var z = C(x: '');
1368+
''',
1369+
[
1370+
error(
1371+
CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
1372+
21,
1373+
5,
1374+
),
1375+
error(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
1376+
error(CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER, 42, 1),
1377+
],
1378+
);
1379+
}
1380+
13331381
test_operator() async {
13341382
await assertErrorsInCode2(
13351383
externalCode: r'''

0 commit comments

Comments
 (0)