Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit fc17a90

Browse files
pqcommit-bot@chromium.org
authored andcommitted
assist for sorting child properties last
Change-Id: Ia39f5b170858789897579f952ece03dcf6765e3f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103860 Commit-Queue: Phil Quitslund <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent b0a11c9 commit fc17a90

File tree

4 files changed

+151
-0
lines changed

4 files changed

+151
-0
lines changed

pkg/analysis_server/lib/src/services/correction/assist.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,13 @@ class DartAssistKind {
205205
'dart.assist.convert.ifElseToConditional',
206206
30,
207207
"Replace 'if-else' with conditional ('c ? x : y')");
208+
static const SORT_CHILD_PROPERTY_LAST = const AssistKind(
209+
'dart.assist.sort.child.properties.last',
210+
30,
211+
"Move child property to end of arguments",
212+
associatedErrorCodes: <String>[
213+
'sort_child_properties_last',
214+
]);
208215
static const SPLIT_AND_CONDITION = const AssistKind(
209216
'dart.assist.splitIfConjunction', 30, "Split && condition");
210217
static const SPLIT_VARIABLE_DECLARATION = const AssistKind(

pkg/analysis_server/lib/src/services/correction/assist_internal.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ class AssistProcessor {
145145
await _addProposal_reparentFlutterList();
146146
await _addProposal_replaceConditionalWithIfElse();
147147
await _addProposal_replaceIfElseWithConditional();
148+
await _addProposal_sortChildPropertyLast();
148149
await _addProposal_splitAndCondition();
149150
await _addProposal_splitVariableDeclaration();
150151
await _addProposal_surroundWith();
@@ -3547,6 +3548,47 @@ class AssistProcessor {
35473548
}
35483549
}
35493550

3551+
Future<void> _addProposal_sortChildPropertyLast() async {
3552+
NamedExpression childProp = flutter.findNamedExpression(node, 'child');
3553+
if (childProp == null) {
3554+
childProp = flutter.findNamedExpression(node, 'children');
3555+
}
3556+
if (childProp == null) {
3557+
return;
3558+
}
3559+
3560+
var parent = childProp.parent?.parent;
3561+
if (parent is! InstanceCreationExpression ||
3562+
!flutter.isWidgetCreation(parent)) {
3563+
return;
3564+
}
3565+
3566+
InstanceCreationExpression creationExpression = parent;
3567+
var args = creationExpression.argumentList;
3568+
3569+
var last = args.arguments.last;
3570+
if (last == childProp) {
3571+
// Already sorted.
3572+
return;
3573+
}
3574+
3575+
var changeBuilder = _newDartChangeBuilder();
3576+
await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
3577+
var start = childProp.beginToken.previous.end;
3578+
var end = childProp.endToken.next.end;
3579+
var childRange = range.startOffsetEndOffset(start, end);
3580+
3581+
var childText = utils.getRangeText(childRange);
3582+
builder.addSimpleReplacement(childRange, '');
3583+
builder.addSimpleInsertion(last.end + 1, childText);
3584+
3585+
changeBuilder.setSelection(new Position(file, last.end + 1));
3586+
});
3587+
3588+
_addAssistFromBuilder(
3589+
changeBuilder, DartAssistKind.SORT_CHILD_PROPERTY_LAST);
3590+
}
3591+
35503592
Future<void> _addProposal_splitAndCondition() async {
35513593
// TODO(brianwilkerson) Determine whether this await is necessary.
35523594
await null;
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analysis_server/src/services/correction/assist.dart';
6+
import 'package:analyzer_plugin/utilities/assist/assist.dart';
7+
import 'package:test_reflective_loader/test_reflective_loader.dart';
8+
9+
import 'assist_processor.dart';
10+
11+
main() {
12+
defineReflectiveSuite(() {
13+
defineReflectiveTests(SortChildPropertyLastTest);
14+
});
15+
}
16+
17+
@reflectiveTest
18+
class SortChildPropertyLastTest extends AssistProcessorTest {
19+
@override
20+
AssistKind get kind => DartAssistKind.SORT_CHILD_PROPERTY_LAST;
21+
22+
test_already_sorted() async {
23+
addFlutterPackage();
24+
await resolveTestUnit('''
25+
import 'package:flutter/material.dart';
26+
main() {
27+
Column(
28+
crossAxisAlignment: CrossAxisAlignment.center,
29+
children: <Widget>[
30+
Text('aaa'),
31+
Text('bbbbbb'),
32+
Text('ccccccccc'),
33+
],
34+
);
35+
}
36+
''');
37+
await assertNoAssist();
38+
}
39+
40+
test_already_sorted_one_prop() async {
41+
addFlutterPackage();
42+
await resolveTestUnit('''
43+
import 'package:flutter/material.dart';
44+
main() {
45+
Column(
46+
children: <Widget>[
47+
Text('aaa'),
48+
Text('bbbbbb'),
49+
Text('ccccccccc'),
50+
],
51+
);
52+
}
53+
''');
54+
await assertNoAssist();
55+
}
56+
57+
test_no_children() async {
58+
addFlutterPackage();
59+
await resolveTestUnit('''
60+
import 'package:flutter/material.dart';
61+
main() {
62+
Column(
63+
crossAxisAlignment: CrossAxisAlignment.center,
64+
);
65+
}
66+
''');
67+
await assertNoAssist();
68+
}
69+
70+
test_sort() async {
71+
addFlutterPackage();
72+
await resolveTestUnit('''
73+
import 'package:flutter/material.dart';
74+
main() {
75+
Column(
76+
/*caret*/children: <Widget>[
77+
Text('aaa'),
78+
Text('bbbbbb'),
79+
Text('ccccccccc'),
80+
],
81+
crossAxisAlignment: CrossAxisAlignment.center,
82+
);
83+
}
84+
''');
85+
await assertHasAssist('''
86+
import 'package:flutter/material.dart';
87+
main() {
88+
Column(
89+
crossAxisAlignment: CrossAxisAlignment.center,
90+
children: <Widget>[
91+
Text('aaa'),
92+
Text('bbbbbb'),
93+
Text('ccccccccc'),
94+
],
95+
);
96+
}
97+
''');
98+
assertExitPosition(after: "],");
99+
}
100+
}

pkg/analysis_server/test/src/services/correction/assist/test_all.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import 'replace_conditional_with_if_else_test.dart'
6767
as replace_conditional_with_if_else;
6868
import 'replace_if_else_with_conditional_test.dart'
6969
as replace_if_else_with_conditional;
70+
import 'sort_child_property_last_test.dart' as sort_child_property_last;
7071
import 'split_and_condition_test.dart' as split_and_condition;
7172
import 'split_variable_declaration_test.dart' as split_variable_declaration;
7273
import 'surround_with_block_test.dart' as surround_with_block;
@@ -135,6 +136,7 @@ main() {
135136
remove_type_annotation.main();
136137
replace_conditional_with_if_else.main();
137138
replace_if_else_with_conditional.main();
139+
sort_child_property_last.main();
138140
split_and_condition.main();
139141
split_variable_declaration.main();
140142
surround_with_block.main();

0 commit comments

Comments
 (0)