Support constructor declarations (issue 37196)

Change-Id: I276e897a02c999c7c1ab08d12f51e5bd9676bb0a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105543
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index e7c5778..44a7475 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -61,6 +61,13 @@
   }
 
   @override
+  DecoratedType visitConstructorDeclaration(ConstructorDeclaration node) {
+    _handleExecutableDeclaration(
+        node.declaredElement, null, node.parameters, node.body, node);
+    return null;
+  }
+
+  @override
   DecoratedType visitDefaultFormalParameter(DefaultFormalParameter node) {
     var decoratedType = node.parameter.accept(this);
     if (node.declaredElement.hasRequired || node.defaultValue != null) {
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index a7f3966..8f3e7d7 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -224,6 +224,22 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  test_constructorDeclaration_namedParameter() async {
+    var content = '''
+class C {
+  C({Key key});
+}
+class Key {}
+''';
+    var expected = '''
+class C {
+  C({Key? key});
+}
+class Key {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_data_flow_assignment_field() async {
     var content = '''
 class C {