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