Support for FieldFormalParameter.

R=brianwilkerson@google.com

Change-Id: Iab871451cabc3136e1c6e0234fa6c73b0796577b
Reviewed-on: https://dart-review.googlesource.com/c/86829
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index 5e7de01..3f95cbf 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -351,14 +351,19 @@
       if (parameter.identifier != null) {
         _localScopes.add(parameter.identifier.name);
       }
-      if (parameter is FunctionTypedFormalParameter) {
+      if (parameter is FieldFormalParameter) {
+        _visitTypeAnnotation(parameter.type);
+        // Strongly speaking, we reference a field of the enclosing class.
+        //
+        // However the current plan is to resolve the whole library on a change.
+        // So, we will resolve the enclosing constructor anyway.
+      } else if (parameter is FunctionTypedFormalParameter) {
         _visitTypeAnnotation(parameter.returnType);
         _visitFormalParameterList(parameter.parameters);
       } else if (parameter is SimpleFormalParameter) {
         _visitTypeAnnotation(parameter.type);
       } else {
-        // TODO(scheglov) constructors and field formal parameters
-//        throw StateError('Unexpected: (${parameter.runtimeType}) $parameter');
+        throw StateError('Unexpected: (${parameter.runtimeType}) $parameter');
       }
     }
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
index 4b61ec2..30c0671 100644
--- a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
@@ -59,6 +59,30 @@
         memberOf: 'C', unprefixed: ['A']);
   }
 
+  test_class_constructor_named_parameter_field_named() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  A f1;
+  B f2;
+  C.test({A this.f1: x, this.f2: y});
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_constructor_named_parameter_field_required() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  A f1;
+  B f2;
+  C.test(A this.f1, this.f2);
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
   test_class_constructor_named_parameter_required() async {
     var library = await buildTestLibrary(a, r'''
 class C {
@@ -1381,13 +1405,14 @@
   test_class_constructor() async {
     var library = await buildTestLibrary(a, r'''
 class C {
-  C.test(A a, {b: x}) {
-    y;
+  var f;
+  C.test(A a, {b: x, this.f: y}) {
+    z;
   }
 }
 ''');
     _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
-        memberOf: 'C', unprefixed: ['x', 'y']);
+        memberOf: 'C', unprefixed: ['x', 'y', 'z']);
   }
 
   test_class_method() async {