compute method

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

Computes the changes for this producer using builder.

This method should not modify fixKind.

Implementation

@override
Future<void> compute(ChangeBuilder builder) async {
  final widgetExpr = node.findComponentExpression;
  if (widgetExpr == null) {
    return;
  }
  if (!canWrapOn(widgetExpr.typeOrThrow)) {
    return;
  }
  var widgetSrc = utils.getNodeText(widgetExpr);

  final builderElement = await sessionHelper.getClass(
    noctermUri,
    builderName,
  );
  if (builderElement == null) {
    return;
  }

  final params = ['context', ...extraBuilderParams];

  await builder.addDartFileEdit(file, (builder) {
    builder.addReplacement(range.node(widgetExpr), (builder) {
      builder.writeReference(builderElement);

      builder.writeln('(');

      final indentOld = utils.getLinePrefix(widgetExpr.offset);
      final indentNew1 = indentOld + utils.oneIndent;
      final indentNew2 = indentOld + utils.twoIndents;

      final namedParams = extraNamedParams.join(', ');

      if (namedParams.isNotEmpty) {
        builder.write(indentNew1);
        builder.write('$namedParams: ');
        builder.addSimpleLinkedEdit('variable', namedParams);
        builder.writeln(',');
      }

      builder.write(indentNew1);
      builder.writeln('builder: (${params.join(', ')}) {');

      widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
      builder.write(indentNew2);
      builder.write('return $widgetSrc');
      builder.writeln(';');

      builder.write(indentNew1);
      final addTrailingCommas = getCodeStyleOptions(
        unitResult.file,
      ).addTrailingCommas;
      builder.writeln('}${addTrailingCommas ? "," : ""}');

      builder.write(indentOld);
      builder.write(')');
    });
  });
}