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 selectionRange = SourceRange(selectionOffset, selectionLength);
  final analyzer = SelectionAnalyzer(selectionRange);
  unitResult.unit.accept(analyzer);

  final widgetExpressions = _extractSelectedWidgetExpressions(analyzer);
  if (widgetExpressions.isEmpty) {
    return;
  }

  final firstWidget = widgetExpressions.first;
  final lastWidget = widgetExpressions.last;
  final selectedRange = range.startEnd(firstWidget, lastWidget);
  final src = utils.getRangeText(selectedRange);

  final parentClassElement = await sessionHelper.getClass(noctermUri, 'Row');
  if (parentClassElement == null) {
    return;
  }

  await builder.addDartFileEdit(file, (builder) {
    builder.addReplacement(selectedRange, (builder) {
      builder.writeReference(parentClassElement);
      builder.write('(');

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

      builder.writeln();
      builder.write(indentNew1);
      builder.write('children: [');
      builder.writeln();

      final newSrc = utils.replaceSourceIndent(src, indentOld, indentNew2);
      builder.write(indentNew2);
      builder.write(newSrc);

      builder.write(',');
      builder.writeln();

      builder.write(indentNew1);
      builder.write('],');
      builder.writeln();

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