compute method
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 (_) {}
});
}