check method

  1. @override
void check(
  1. DcqRegistry registry
)

Implementation

@override
void check(
  DcqRegistry registry,
) {
  registry.addMethodInvocation((node) {
    final methodName = node.methodName.name;
    if (methodName != 'firstWhere' && methodName != 'singleWhere') return;

    if (methodName == 'firstWhere') {
      final hasOrElse = node.argumentList.arguments.any(
        (a) => a is NamedExpression && a.name.label.name == 'orElse',
      );
      if (hasOrElse) return;
    }

    final args = node.argumentList.arguments;
    if (args.isEmpty) return;
    final firstArg = args.first;
    if (firstArg is! FunctionExpression) return;

    final body = firstArg.body;
    if (body is! ExpressionFunctionBody) return;

    final params = firstArg.parameters?.parameters;
    if (params == null || params.length != 1) return;
    final paramName = params.first.name?.lexeme;
    if (paramName == null) return;

    final expression = body.expression;
    if (expression is! BinaryExpression) return;
    if (expression.operator.lexeme != '==') return;

    if (!_isNameAccess(expression.leftOperand, paramName) &&
        !_isNameAccess(expression.rightOperand, paramName)) {
      return;
    }

    final target = node.target;
    if (target == null) return;
    final targetType = target.staticType;
    if (targetType is! InterfaceType) return;

    final typeArgs = targetType.typeArguments;
    if (typeArgs.isEmpty) return;
    final elementType = typeArgs.first;
    if (elementType is! InterfaceType) return;
    if (elementType.element is! EnumElement) return;

    reportAtNode(node);
  });
}