check method

  1. @override
void check(
  1. 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);
      }
    }
  });
}