check method
void
check(
- 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);
});
}