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 {
  var widgetSrc = utils.getNodeText(widgetExpr);

  // If the wrapper class is specified, find its element.
  final parentLibraryUri = _parentLibraryUri;
  final parentClassName = _parentClassName;
  ClassElement? parentClassElement;
  if (parentLibraryUri != null && parentClassName != null) {
    parentClassElement = await sessionHelper.getClass(
      parentLibraryUri,
      parentClassName,
    );
    if (parentClassElement == null) {
      return;
    }
  }

  await builder.addDartFileEdit(file, (builder) {
    final eol = builder.eol;
    builder.addReplacement(range.node(widgetExpr), (builder) {
      if (parentClassElement == null) {
        builder.addSimpleLinkedEdit('COMPONENT', 'component');
      } else {
        builder.writeReference(parentClassElement);
      }
      builder.write('(');
      // When there's no linked edit for the widget name, leave the selection
      // inside the opening paren which is useful if you want to add
      // additional named arguments to the newly-created widget.
      if (parentClassElement != null) {
        builder.selectHere();
      }
      final leadingLines = _leadingLines;
      if (widgetSrc.contains(eol) || leadingLines.isNotEmpty) {
        final indentOld = utils.getLinePrefix(widgetExpr.offset);
        final indentNew = '$indentOld${utils.oneIndent}';

        for (final leadingLine in leadingLines) {
          builder.writeln();
          builder.write(indentNew);
          builder.write(leadingLine);
        }

        builder.writeln();
        builder.write(indentNew);
        widgetSrc = utils.replaceSourceIndent(
          widgetSrc,
          indentOld,
          indentNew,
        );
        widgetSrc += ',$eol$indentOld';
      }
      if (parentClassElement == null) {
        builder.addSimpleLinkedEdit('CHILD', 'child');
      } else {
        builder.write('child');
      }
      builder.write(': ');
      builder.write(widgetSrc);
      builder.write(')');
    });
  });
}