check method
void
check(
- DcqRegistry registry
)
Implementation
@override
void check(DcqRegistry registry) {
registry.addClassDeclaration((node) {
final className = node.namePart.typeName.lexeme;
if (className.startsWith('Sliver') || className.startsWith('_Sliver')) {
return;
}
final superclass = node.extendsClause?.superclass.type;
if (superclass is! InterfaceType) return;
// Walk the superclass chain to detect widgets extending custom base
// classes that themselves extend StatelessWidget/StatefulWidget.
if (!_isWidgetSubclass(superclass)) return;
final body = node.body;
if (body is! BlockClassBody) return;
for (final member in body.members) {
if (member is! MethodDeclaration) continue;
if (member.name.lexeme != 'build') continue;
// Check the return type annotation name (AST) or the resolved type.
final returnAnnotation = member.returnType;
if (returnAnnotation is NamedType &&
returnAnnotation.name.lexeme.startsWith('Sliver')) {
reportAtNode(node);
return;
}
final returnType = member.declaredFragment?.element.returnType;
if (returnType is InterfaceType &&
(returnType.element.name?.startsWith('Sliver') ?? false)) {
reportAtNode(node);
}
}
});
}