check method

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

Implementation

@override
void check(DcqRegistry registry) {
  final ignoredInvocations =
      configStringList(ruleConfig, 'ignored-invocations') ??
      const ['print', 'debugPrint'];
  final allowOnlyOnce = configBool(ruleConfig, 'allow-only-once') ?? false;
  final pending = <_StringInfo>[];

  void found(AstNode node, String value) {
    if (allowOnlyOnce) {
      pending.add(_StringInfo(node, value));
    } else {
      reportAtNode(node);
    }
  }

  registry.addSimpleStringLiteral((node) {
    if (node.parent is AdjacentStrings) return;
    if (node.value.isEmpty) return;
    if (_shouldSkip(node, ignoredInvocations)) return;
    found(node, node.value);
  });

  registry.addAdjacentStrings((node) {
    final value = node.strings
        .whereType<SimpleStringLiteral>()
        .map((s) => s.value)
        .join();
    if (value.isEmpty) return;
    if (_shouldSkip(node, ignoredInvocations)) return;
    found(node, value);
  });

  if (allowOnlyOnce) {
    registry.afterLibrary(() {
      final counts = <String, List<_StringInfo>>{};
      for (final info in pending) {
        (counts[info.value] ??= []).add(info);
      }
      for (final entry in counts.entries) {
        if (entry.value.length >= 2) {
          for (final info in entry.value) {
            reportAtNode(info.node);
          }
        }
      }
    });
  }
}