Merge pull request #638 from JPaulsen/fiX_linted_node_avoid_types_on_closure_parameters

Fix linted node: avoid_types_on_closure_parameters
diff --git a/lib/src/rules/avoid_types_on_closure_parameters.dart b/lib/src/rules/avoid_types_on_closure_parameters.dart
index 207f786..bcf393b 100644
--- a/lib/src/rules/avoid_types_on_closure_parameters.dart
+++ b/lib/src/rules/avoid_types_on_closure_parameters.dart
@@ -26,20 +26,6 @@
 
 ''';
 
-NormalFormalParameter _getNormalFormalParameter(FormalParameter node) {
-  if (node is DefaultFormalParameter) {
-    return node.parameter;
-  }
-  return node;
-}
-
-bool _hasNonDynamicType(NormalFormalParameter parameter) {
-  if (parameter is SimpleFormalParameter) {
-    return parameter.type != null && parameter.type.name.name != 'dynamic';
-  }
-  return true;
-}
-
 class AvoidTypesOnClosureParameters extends LintRule {
   _Visitor _visitor;
   AvoidTypesOnClosureParameters()
@@ -55,20 +41,46 @@
   AstVisitor getVisitor() => _visitor;
 }
 
-class _Visitor extends SimpleAstVisitor {
-  final LintRule rule;
-  _Visitor(this.rule);
+class AvoidTypesOnClosureParametersVisitor extends SimpleAstVisitor {
+  LintRule rule;
+
+  AvoidTypesOnClosureParametersVisitor(this.rule);
+
+  @override
+  visitDefaultFormalParameter(DefaultFormalParameter node) {
+    node.parameter.accept(this);
+  }
 
   @override
   visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       return;
     }
-    final nonDynamicParameters = node.parameters.parameters
-        .map(_getNormalFormalParameter)
-        .where(_hasNonDynamicType);
-    if (nonDynamicParameters.isNotEmpty) {
-      rule.reportLint(nonDynamicParameters.first);
+    for (final parameter in node.parameters.parameters) {
+      parameter.accept(this);
     }
   }
+
+  @override
+  visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    rule.reportLint(node);
+  }
+
+  @override
+  visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.type != null && node.type.name.name != 'dynamic') {
+      rule.reportLint(node.type);
+    }
+  }
+}
+
+class _Visitor extends SimpleAstVisitor {
+  final LintRule rule;
+  _Visitor(this.rule);
+
+  @override
+  visitFunctionExpression(FunctionExpression node) {
+    final visitor = new AvoidTypesOnClosureParametersVisitor(rule);
+    visitor.visitFunctionExpression(node);
+  }
 }
diff --git a/test/rules/avoid_types_on_closure_parameters.dart b/test/rules/avoid_types_on_closure_parameters.dart
index 665d7b0..48246ed 100644
--- a/test/rules/avoid_types_on_closure_parameters.dart
+++ b/test/rules/avoid_types_on_closure_parameters.dart
@@ -16,7 +16,7 @@
 var goodName2 = ({person}) => person.name; // OK
 var badName2 = ({Person person}) => person.name; // LINT
 
-var goodName3 = ({person = ""}) => person; // OK
+var goodName3 = ({person : ""}) => person; // OK
 var badName3 = ([String person = ""]) => person; // LINT
 
 var goodName4 = ([person]) => person.name; // OK