void visitMethodInvocation()

in lib/src/rules/prefer_iterable_whereType.dart [52:89]


  void visitMethodInvocation(MethodInvocation node) {
    if (node.methodName.name != 'where') return;
    var target = node.realTarget;
    if (target == null ||
        !DartTypeUtilities.implementsInterface(
            target.staticType, 'Iterable', 'dart.core')) {
      return;
    }

    var args = node.argumentList.arguments;
    if (args.length != 1) return;

    var arg = args.first;
    if (arg is FunctionExpression) {
      if (arg.parameters?.parameters.length != 1) return;

      var body = arg.body;
      Expression? expression;
      if (body is BlockFunctionBody) {
        var statements = body.block.statements;
        if (statements.length != 1) return;
        var statement = body.block.statements.first;
        if (statement is ReturnStatement) {
          expression = statement.expression;
        }
      } else if (body is ExpressionFunctionBody) {
        expression = body.expression;
      }
      expression = expression?.unParenthesized;
      if (expression is IsExpression && expression.notOperator == null) {
        var target = expression.expression;
        if (target is SimpleIdentifier &&
            target.name == arg.parameters?.parameters.first.identifier?.name) {
          rule.reportLint(node.methodName);
        }
      }
    }
  }