check method

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

Implementation

@override
void check(DcqRegistry registry) {
  registry.addClassDeclaration((node) {
    if (!isGetxControllerClass(node)) return;

    final body = node.body;
    if (body is! BlockClassBody) return;

    // Collect field names that are disposed/closed in onClose.
    final finder = _DisposeCallFinder();
    for (final member in body.members) {
      if (member is MethodDeclaration && member.name.lexeme == 'onClose') {
        member.body.accept(finder);
      }
    }

    // Check for fields whose type has a dispose() or close() method.
    for (final member in body.members) {
      if (member is! FieldDeclaration) continue;
      for (final v in member.fields.variables) {
        final type = v.declaredFragment?.element.type;
        if (type is! InterfaceType) continue;
        final lib = type.element.library;
        final disposable =
            type.lookUpMethod('dispose', lib) != null ||
            type.lookUpMethod('close', lib) != null;
        if (disposable && !finder.disposedFields.contains(v.name.lexeme)) {
          reportAtToken(v.name);
        }
      }
    }
  });
}