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 {