add migration engine support for named parameters in imported packages

This adds support for decorating named parameters in packages
that are imported by the package being migrated.

Change-Id: I1f803b28ad8fedcedca14421b391dc7ab879d05f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106682
Commit-Queue: Dan Rubel <danrubel@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index 92bd15c..5205490 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -54,16 +54,17 @@
           NullabilitySuffix.star); // TODO(paulberry)
       if (type is FunctionType) {
         var positionalParameters = <DecoratedType>[];
+        var namedParameters = <String, DecoratedType>{};
         for (var parameter in type.parameters) {
           if (parameter.isPositional) {
             positionalParameters.add(decorate(parameter.type));
           } else {
-            // TODO(paulberry)
-            throw UnimplementedError('Decorating (${parameter.displayName})');
+            namedParameters[parameter.name] = decorate(parameter.type);
           }
         }
         return DecoratedType(type, graph.never,
             returnType: decorate(type.returnType),
+            namedParameters: namedParameters,
             positionalParameters: positionalParameters);
       } else if (type is InterfaceType) {
         if (type.typeParameters.isNotEmpty) {
diff --git a/pkg/nnbd_migration/test/graph_builder_test.dart b/pkg/nnbd_migration/test/graph_builder_test.dart
index 0bc9ba1..9f516d6 100644
--- a/pkg/nnbd_migration/test/graph_builder_test.dart
+++ b/pkg/nnbd_migration/test/graph_builder_test.dart
@@ -1143,6 +1143,23 @@
         assertEdge(nullable_j, nullable_i, hard: true));
   }
 
+  test_methodInvocation_parameter_named_differentPackage() async {
+    addPackageFile('pkgC', 'c.dart', '''
+class C {
+  void f({int i}) {}
+}
+''');
+    await analyze('''
+import "package:pkgC/c.dart";
+void g(C c, int j) {
+  c.f(i: j/*check*/);
+}
+''');
+    var nullable_j = decoratedTypeAnnotation('int j');
+    assertNullCheck(checkExpression('j/*check*/'),
+        assertEdge(nullable_j.node, never, hard: true));
+  }
+
   test_methodInvocation_return_type() async {
     await analyze('''
 class C {