check method

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

Implementation

@override
void check(DcqRegistry registry) {
  registry.addMethodDeclaration((node) {
    if (node.name.lexeme != 'dispose') return;

    final bodyNode = node.parent;
    if (bodyNode is! BlockClassBody) return;
    final classNode = bodyNode.parent;
    if (classNode is! ClassDeclaration) return;

    final superclass = classNode.extendsClause?.superclass;
    if (superclass == null) return;
    if (superclass.name.lexeme != 'State') return;

    final classBody = classNode.body;
    if (classBody is! BlockClassBody) return;
    final lateFieldNames = <String>{};
    for (final member in classBody.members) {
      if (member is FieldDeclaration && member.fields.lateKeyword != null) {
        for (final variable in member.fields.variables) {
          lateFieldNames.add(variable.name.lexeme);
        }
      }
    }

    if (lateFieldNames.isEmpty) return;

    final visitor = _DisposeCallVisitor(lateFieldNames);
    node.accept(visitor);

    for (final call in visitor.flaggedCalls) {
      reportAtNode(call);
    }
  });
}