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 {
  if (node is! ListLiteral) {
    return;
  }
  if ((node as ListLiteral).elements.any(
    (element) =>
        !(element is InstanceCreationExpression &&
            element.isComponentCreation),
  )) {
    return;
  }
  final eol = unitResult.content.endOfLine ?? builder.defaultEol;
  final literalSrc = utils.getNodeText(node);
  final newlineIdx = literalSrc.lastIndexOf(eol);
  if (newlineIdx < 0 || newlineIdx == literalSrc.length - 1) {
    return; // Lists need to be in multi-line format already.
  }
  final indentOld = utils.getLinePrefix(
    node.offset + eol.length + newlineIdx,
  );
  final indentArg = '$indentOld${utils.oneIndent}';
  final indentList = '$indentOld${utils.twoIndents}';

  await builder.addDartFileEdit(file, (builder) {
    builder.addReplacement(range.node(node), (builder) {
      builder.write('[');
      builder.write(eol);
      builder.write(indentArg);
      builder.addSimpleLinkedEdit('COMPONENT', 'component');
      builder.write('(');
      builder.write(eol);
      builder.write(indentList);
      // Linked editing not needed since arg is always a list.
      builder.write('children: ');
      builder.write(
        utils.replaceSourceIndent(literalSrc, indentOld, indentList),
      );
      builder.write(',');
      builder.write(eol);
      builder.write(indentArg);
      builder.write('),');
      builder.write(eol);
      builder.write(indentOld);
      builder.write(']');
    });
  });
}