| Index: pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| index c343b17c1352041c672b0917a48610e11227a0d2..18d32b1d712c8e215e82a5748824be0c6614e36f 100644
|
| --- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| +++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| @@ -121,6 +121,7 @@ class AssistProcessor {
|
| _addProposal_convertDocumentationIntoLine();
|
| _addProposal_convertToBlockFunctionBody();
|
| _addProposal_convertToExpressionFunctionBody();
|
| + _addProposal_convertFlutterChild();
|
| _addProposal_convertToForIndexLoop();
|
| _addProposal_convertToIsNot_onIs();
|
| _addProposal_convertToIsNot_onNot();
|
| @@ -505,6 +506,73 @@ class AssistProcessor {
|
| _addAssist(DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE, []);
|
| }
|
|
|
| + void _addProposal_convertFlutterChild() {
|
| + NamedExpression namedExp;
|
| + // Allow assist to activate from either the new-expr or the child: arg.
|
| + if (node is SimpleIdentifier &&
|
| + node.parent is Label &&
|
| + node.parent.parent is NamedExpression) {
|
| + namedExp = node.parent.parent as NamedExpression;
|
| + if ((node as SimpleIdentifier).name != 'child' ||
|
| + namedExp.expression == null) {
|
| + return;
|
| + }
|
| + if (namedExp.parent?.parent is! InstanceCreationExpression) {
|
| + return;
|
| + }
|
| + InstanceCreationExpression newExpr = namedExp.parent.parent;
|
| + if (newExpr == null || !_isFlutterInstanceCreationExpression(newExpr)) {
|
| + return;
|
| + }
|
| + } else {
|
| + InstanceCreationExpression newExpr = _identifyNewExpression();
|
| + if (newExpr == null || !_isFlutterInstanceCreationExpression(newExpr)) {
|
| + _coverageMarker();
|
| + return;
|
| + }
|
| + namedExp = _findChildArgument(newExpr);
|
| + if (namedExp == null || namedExp.expression == null) {
|
| + _coverageMarker();
|
| + return;
|
| + }
|
| + }
|
| + InstanceCreationExpression childArg = _getChildWidget(namedExp, false);
|
| + if (childArg == null) {
|
| + _coverageMarker();
|
| + return;
|
| + }
|
| + int childLoc = namedExp.offset + 'child'.length;
|
| + _addInsertEdit(childLoc, 'ren');
|
| + int listLoc = childArg.offset;
|
| + String childArgSrc = utils.getNodeText(childArg);
|
| + if (!childArgSrc.contains(eol)) {
|
| + _addInsertEdit(listLoc, '<Widget>[');
|
| + _addInsertEdit(listLoc + childArg.length, ']');
|
| + } else {
|
| + int newlineLoc = childArgSrc.lastIndexOf(eol);
|
| + if (newlineLoc == childArgSrc.length) {
|
| + newlineLoc -= 1;
|
| + }
|
| + String indentOld = utils.getLinePrefix(childArg.offset + 1 + newlineLoc);
|
| + String indentNew = '$indentOld${utils.getIndent(1)}';
|
| + // The separator includes 'child:' but that has no newlines.
|
| + String separator =
|
| + utils.getText(namedExp.offset, childArg.offset - namedExp.offset);
|
| + String prefix = separator.contains(eol) ? "" : "$eol$indentNew";
|
| + if (prefix.isEmpty) {
|
| + _addInsertEdit(namedExp.offset + 'child:'.length, ' <Widget>[');
|
| + _addRemoveEdit(rangeStartLength(childArg.offset - 2, 2));
|
| + } else {
|
| + _addInsertEdit(listLoc, '<Widget>[');
|
| + }
|
| + String newChildArgSrc = childArgSrc.replaceAll(
|
| + new RegExp("^$indentOld", multiLine: true), "$indentNew");
|
| + newChildArgSrc = "$prefix$newChildArgSrc,$eol$indentOld]";
|
| + _addReplaceEdit(rangeNode(childArg), newChildArgSrc);
|
| + }
|
| + _addAssist(DartAssistKind.CONVERT_FLUTTER_CHILD, []);
|
| + }
|
| +
|
| void _addProposal_convertIntoFinalField() {
|
| // Find the enclosing getter.
|
| MethodDeclaration getter;
|
| @@ -2311,11 +2379,12 @@ class AssistProcessor {
|
| return _getChildWidget(child);
|
| }
|
|
|
| - InstanceCreationExpression _getChildWidget(NamedExpression child) {
|
| + InstanceCreationExpression _getChildWidget(NamedExpression child,
|
| + [bool strict = false]) {
|
| if (child?.expression is InstanceCreationExpression) {
|
| InstanceCreationExpression childNewExpr = child.expression;
|
| if (_isFlutterInstanceCreationExpression(childNewExpr)) {
|
| - if (_findChildArgument(childNewExpr) != null) {
|
| + if (!strict || (_findChildArgument(childNewExpr) != null)) {
|
| return childNewExpr;
|
| }
|
| }
|
|
|