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? propsGetter = node
.thisOrAncestorOfType<MethodDeclaration>();
if (propsGetter == null) return;
final ClassDeclaration? classDecl = propsGetter
.thisOrAncestorOfType<ClassDeclaration>();
if (classDecl == null) return;
final ClassElement? classEl = classDecl.declaredFragment?.element;
if (classEl == null) return;
if (!_isEquatableish(classEl)) return;
final ListLiteral? list = _extractPropsListLiteral(propsGetter);
if (list == null) return;
final Set<String> allFields = _finalInstanceFieldNames(classEl);
if (allFields.isEmpty) return;
final Set<String> inProps = _collectFieldRefsFromProps(list);
final Set<String> missing = allFields.difference(inProps);
if (missing.isEmpty) return;
// Определим стиль: если где-то в props есть this.foo, будем писать this.<field>.
final bool usesThisStyle = _propsUsesThisPrefix(list);
// Если в списке есть ...super.props, добавим после него; иначе — перед ']'
final int insertOffset =
_findOffsetAfterSuperPropsSpread(list) ?? list.rightBracket.offset;
final String insertion = _buildInsertion(
list: list,
fields: missing.toList()..sort(),
usesThisStyle: usesThisStyle,
insertAtEnd: insertOffset == list.rightBracket.offset,
);
await builder.addDartFileEdit(file, (DartFileEditBuilder editBuilder) {
editBuilder.addSimpleInsertion(insertOffset, insertion);
try {
editBuilder.format(classDecl.sourceRange);
} catch (_) {}
});
}