check method

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

Implementation

@override
void check(
  DcqRegistry registry,
) {
  registry.addForStatement((node) {
    final parts = node.forLoopParts;
    if (parts is! ForPartsWithDeclarations) return;

    final variables = parts.variables.variables;
    if (variables.length != 1) return;
    final loopVar = variables.first;
    final initializer = loopVar.initializer;
    if (initializer is! IntegerLiteral || initializer.value != 0) return;
    final loopVarName = loopVar.name.lexeme;

    final condition = parts.condition;
    if (condition is! BinaryExpression) return;
    if (condition.operator.lexeme != '<') return;

    final left = condition.leftOperand;
    if (left is! SimpleIdentifier || left.name != loopVarName) return;

    final right = condition.rightOperand;
    final collectionSource = _extractCollectionSource(right);
    if (collectionSource == null) return;

    if (!_isSimpleIncrement(parts.updaters, loopVarName)) return;

    final visitor = _IndexUsageVisitor(loopVarName, collectionSource);
    node.body.accept(visitor);

    if (!visitor.hasUsages) return;
    if (visitor.hasNonIndexUsage) return;

    reportAtNode(node);
  });
}