Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(374)

Unified Diff: pkg/analysis_server/lib/src/services/correction/assist_internal.dart

Issue 2749283004: Add assist to convert child: to children: in Flutter new-exprs (Closed)
Patch Set: Fail fast for named args not in instance creation exprs Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}
}

Powered by Google App Engine
This is Rietveld 408576698