Record references for AssertInitializer.

R=brianwilkerson@google.com

Change-Id: Ic8d354781d4298c79edbd41d7ae9448462814931
Reviewed-on: https://dart-review.googlesource.com/c/86984
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
index dcc3838..4740d58 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
@@ -320,7 +320,7 @@
       implTokenSignature,
       enclosingClassName: enclosingClassName,
       enclosingSuperClass: enclosingSuperClass,
-      formalParametersForDefaultValues: node.parameters,
+      formalParametersForImpl: node.parameters,
       constructorInitializers: node.initializers,
       redirectedConstructor: node.redirectedConstructor,
       functionBody: node.body,
@@ -434,7 +434,7 @@
     var impl = referenceCollector.collect(
       implTokenSignature,
       thisNodeName: node.name.name,
-      formalParametersForDefaultValues: functionExpression.parameters,
+      formalParametersForImpl: functionExpression.parameters,
       functionBody: body,
     );
 
@@ -551,7 +551,7 @@
       implTokenSignature,
       enclosingClassName: enclosingClassName,
       thisNodeName: node.name.name,
-      formalParametersForDefaultValues: node.parameters,
+      formalParametersForImpl: node.parameters,
       functionBody: node.body,
     );
 
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 b191634..09b4dae 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -62,7 +62,7 @@
       Expression expression,
       ExtendsClause extendsClause,
       FormalParameterList formalParameters,
-      FormalParameterList formalParametersForDefaultValues,
+      FormalParameterList formalParametersForImpl,
       FunctionBody functionBody,
       ImplementsClause implementsClause,
       OnClause onClause,
@@ -96,7 +96,7 @@
 
     // Parts of executables.
     _visitFormalParameterList(formalParameters);
-    _visitFormalParameterListDefaults(formalParametersForDefaultValues);
+    _visitFormalParameterListImpl(formalParametersForImpl);
     _visitTypeAnnotation(returnType);
     _visitFunctionBody(functionBody);
 
@@ -254,7 +254,8 @@
     for (var i = 0; i < initializers.length; i++) {
       var initializer = initializers[i];
       if (initializer is AssertInitializer) {
-        // TODO(scheglov) implement
+        _visitExpression(initializer.condition);
+        _visitExpression(initializer.message);
       } else if (initializer is ConstructorFieldInitializer) {
         _visitExpression(initializer.expression);
       } else if (initializer is SuperConstructorInvocation) {
@@ -417,14 +418,21 @@
     }
   }
 
-  void _visitFormalParameterListDefaults(FormalParameterList node) {
+  void _visitFormalParameterListImpl(FormalParameterList node) {
     if (node == null) return;
 
     var parameters = node.parameters;
     for (var i = 0; i < parameters.length; i++) {
       FormalParameter parameter = parameters[i];
+
       if (parameter is DefaultFormalParameter) {
-        _visitExpression(parameter.defaultValue);
+        DefaultFormalParameter defaultParameter = parameter;
+        _visitExpression(defaultParameter.defaultValue);
+        parameter = defaultParameter.parameter;
+      }
+
+      if (parameter.identifier != null) {
+        _localScopes.add(parameter.identifier.name);
       }
     }
   }
@@ -470,7 +478,7 @@
     _localScopes.enter();
     _visitTypeParameterList(node.typeParameters);
     _visitFormalParameterList(node.parameters);
-    _visitFormalParameterListDefaults(node.parameters);
+    _visitFormalParameterListImpl(node.parameters);
     _visitFunctionBody(node.body);
     _localScopes.exit();
   }
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 f76fe69..aacbb42 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
@@ -1503,6 +1503,16 @@
         memberOf: 'X', unprefixed: ['A']);
   }
 
+  test_class_constructor_initializer_assert() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C.test(a) : assert(a > x, y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['x', 'y']);
+  }
+
   test_class_constructor_initializer_field() async {
     var library = await buildTestLibrary(a, r'''
 class C {
@@ -1733,6 +1743,20 @@
     _assertImpl(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'X');
   }
 
+  test_syntacticScope_class_constructor_parameters() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  X.test(a, b, c) {
+    a; b; c;
+    d;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'X');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X', unprefixed: ['d']);
+  }
+
   test_syntacticScope_class_field() async {
     var library = await buildTestLibrary(a, r'''
 class X {
@@ -1761,6 +1785,20 @@
         memberOf: 'X', unprefixed: ['B']);
   }
 
+  test_syntacticScope_class_method_parameters() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  test(a, b, c) {
+    a; b; c;
+    d;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD, memberOf: 'X');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'X', unprefixed: ['d']);
+  }
+
   test_syntacticScope_class_typeParameter_ofClass() async {
     var library = await buildTestLibrary(a, r'''
 class X<T extends A<B, X, T>> {}
@@ -1787,6 +1825,17 @@
     _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['B']);
   }
 
+  test_syntacticScope_unit_function_parameters() async {
+    var library = await buildTestLibrary(a, r'''
+test(a, b, {c}) {
+  a; b; c;
+  d;
+}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['d']);
+  }
+
   test_syntacticScope_unit_functionTypeAlias() async {
     var library = await buildTestLibrary(a, r'''
 typedef X(A a, X b);