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