compute method
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(')');
});
});
}