compute method

  1. @override
Future<void> compute(
  1. ChangeBuilder builder
)
override

Computes the changes for this producer using builder.

This method should not modify fixKind.

Implementation

@override
Future<void> compute(ChangeBuilder builder) async {
  final MethodDeclaration? disposeMethod = node
      .thisOrAncestorOfType<MethodDeclaration>();
  if (disposeMethod == null) return;
  if (disposeMethod.name.lexeme != 'dispose') return;
  if (disposeMethod.body is! BlockFunctionBody) return;

  final ClassDeclaration? classDecl = disposeMethod
      .thisOrAncestorOfType<ClassDeclaration>();
  if (classDecl == null) return;

  final ClassElement? classEl = classDecl.declaredFragment?.element;
  if (classEl == null) return;

  final Set<String> fields = _fieldsNeedingDispose(classEl, classDecl);
  if (fields.isEmpty) return;

  final BlockFunctionBody body = disposeMethod.body as BlockFunctionBody;
  final Set<String> disposed = _collectDisposedFieldNames(body);

  final List<String> missing =
      fields.difference(disposed).toList(growable: false)..sort();
  if (missing.isEmpty) return;

  final int insertOffset = body.block.leftBracket.end; // сразу после '{'

  final StringBuffer insertion = StringBuffer();
  for (final String f in missing) {
    insertion.writeln();
    insertion.write('    $f.dispose();');
  }

  await builder.addDartFileEdit(file, (DartFileEditBuilder edit) {
    edit.addInsertion(
      insertOffset,
      (DartEditBuilder w) => w.write(insertion.toString()),
    );
    try {
      edit.format(classDecl.sourceRange);
    } catch (_) {}
  });
}