Skip to content

Commit ce12a27

Browse files
stereotype441commit-bot@chromium.org
authored andcommitted
Migration: handle named parameters in _substituteFunctionAfterFormals.
Should address ~758 exceptions whose stacktrace includes the line: new DecoratedType.<anonymous closure> (package:nnbd_migration/src/decorated_type.dart:83:52) Change-Id: I0c7e64ee54af204bed40f28891274f03d85fdf7c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114746 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent a290271 commit ce12a27

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

pkg/nnbd_migration/lib/src/decorated_type.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,18 +414,27 @@ class DecoratedType {
414414
DecoratedType _substituteFunctionAfterFormals(FunctionType undecoratedResult,
415415
Map<TypeParameterElement, DecoratedType> substitution) {
416416
var newPositionalParameters = <DecoratedType>[];
417+
var numRequiredParameters = undecoratedResult.normalParameterTypes.length;
417418
for (int i = 0; i < positionalParameters.length; i++) {
418-
var numRequiredParameters = undecoratedResult.normalParameterTypes.length;
419419
var undecoratedParameterType = i < numRequiredParameters
420420
? undecoratedResult.normalParameterTypes[i]
421421
: undecoratedResult.optionalParameterTypes[i - numRequiredParameters];
422422
newPositionalParameters.add(positionalParameters[i]
423423
._substitute(substitution, undecoratedParameterType));
424424
}
425+
var newNamedParameters = <String, DecoratedType>{};
426+
for (var entry in namedParameters.entries) {
427+
var name = entry.key;
428+
var undecoratedParameterType =
429+
undecoratedResult.namedParameterTypes[name];
430+
newNamedParameters[name] =
431+
(entry.value._substitute(substitution, undecoratedParameterType));
432+
}
425433
return DecoratedType(undecoratedResult, node,
426434
returnType:
427435
returnType._substitute(substitution, undecoratedResult.returnType),
428-
positionalParameters: newPositionalParameters);
436+
positionalParameters: newPositionalParameters,
437+
namedParameters: newNamedParameters);
429438
}
430439

431440
List<DecoratedType> _substituteList(List<DecoratedType> list,

pkg/nnbd_migration/test/edge_builder_test.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,6 +2005,25 @@ f(int i) => C<int>(i/*check*/);
20052005
assertEdge(nullable_i, nullable_c_t_or_nullable_t, hard: true));
20062006
}
20072007

2008+
test_instanceCreation_generic_parameter_named() async {
2009+
await analyze('''
2010+
class C<T> {
2011+
C({T t});
2012+
}
2013+
f(int i) => C<int>(t: i/*check*/);
2014+
''');
2015+
var nullable_i = decoratedTypeAnnotation('int i').node;
2016+
var nullable_c_t = decoratedTypeAnnotation('C<int>').typeArguments[0].node;
2017+
var nullable_t = decoratedTypeAnnotation('T t').node;
2018+
var check_i = checkExpression('i/*check*/');
2019+
var nullable_c_t_or_nullable_t =
2020+
check_i.edges.single.destinationNode as NullabilityNodeForSubstitution;
2021+
expect(nullable_c_t_or_nullable_t.innerNode, same(nullable_c_t));
2022+
expect(nullable_c_t_or_nullable_t.outerNode, same(nullable_t));
2023+
assertNullCheck(check_i,
2024+
assertEdge(nullable_i, nullable_c_t_or_nullable_t, hard: true));
2025+
}
2026+
20082027
test_instanceCreation_parameter_named_optional() async {
20092028
await analyze('''
20102029
class C {

0 commit comments

Comments
 (0)