check method

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

Implementation

@override
void check(DcqRegistry registry) {
  final eventBaseNames = <String>{};
  final candidates = <(ClassDeclaration, String)>[];

  registry.addClassDeclaration((node) {
    final superclass = node.extendsClause?.superclass.type;

    // Collect event base class names from Bloc type parameters.
    if (superclass is InterfaceType && isBloc(superclass)) {
      final typeArgs =
          node.extendsClause?.superclass.typeArguments?.arguments;
      if (typeArgs != null && typeArgs.isNotEmpty) {
        final eventType = typeArgs.first;
        if (eventType is NamedType) {
          eventBaseNames.add(eventType.name.lexeme);
        }
      }
    }

    // Collect candidate event subclasses missing @immutable.
    if (superclass is! InterfaceType) return;
    final superName = superclass.element.name ?? '';
    if (!superName.endsWith('Event')) return;

    final hasImmutable = node.metadata.any((a) {
      final name = a.name;
      if (name is SimpleIdentifier) return name.name == 'immutable';
      if (name is PrefixedIdentifier) {
        return name.identifier.name == 'immutable';
      }
      return false;
    });
    if (hasImmutable) return;

    candidates.add((node, superName));
  });

  registry.afterLibrary(() {
    if (eventBaseNames.isEmpty) return;
    for (final (classNode, superName) in candidates) {
      if (eventBaseNames.contains(superName)) {
        reportAtToken(classNode.namePart.typeName);
      }
    }
  });
}