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

Commit 0265151

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Fix identifyWidgetExpression() for Flutter.
Probably a bit pessimistic approach, allow only cases that we know to be valid and useful. R=brianwilkerson@google.com Bug: flutter/flutter-intellij#2714 Change-Id: I8835c03d919c1f00a986ff3ef677c7f69995682f Reviewed-on: https://dart-review.googlesource.com/c/80985 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
1 parent f5cd6cc commit 0265151

File tree

3 files changed

+175
-20
lines changed

3 files changed

+175
-20
lines changed

pkg/analysis_server/lib/src/utilities/flutter.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,18 @@ InstanceCreationExpression identifyNewExpression(AstNode node) {
229229

230230
/**
231231
* Attempt to find and return the closest expression that encloses the [node]
232-
* and is a Flutter `Widget`. Return `null` if nothing found.
232+
* and is an independent Flutter `Widget`. Return `null` if nothing found.
233233
*/
234234
Expression identifyWidgetExpression(AstNode node) {
235235
for (; node != null; node = node.parent) {
236236
if (isWidgetExpression(node)) {
237-
return node;
237+
var parent = node.parent;
238+
if (parent is ArgumentList ||
239+
parent is ListLiteral ||
240+
parent is NamedExpression && parent.expression == node ||
241+
parent is Statement) {
242+
return node;
243+
}
238244
}
239245
if (node is ArgumentList || node is Statement || node is FunctionBody) {
240246
return null;

pkg/analysis_server/test/services/correction/assist_test.dart

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5014,6 +5014,60 @@ class FakeFlutter {\r
50145014
}
50155015
}
50165016

5017+
test_flutterWrapWidget_OK_prefixedIdentifier_identifier() async {
5018+
addFlutterPackage();
5019+
await resolveTestUnit('''
5020+
import 'package:flutter/widgets.dart';
5021+
5022+
abstract class Foo extends Widget {
5023+
Widget bar;
5024+
}
5025+
5026+
main(Foo foo) {
5027+
return foo./*caret*/bar;
5028+
}
5029+
''');
5030+
_setCaretLocation();
5031+
await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
5032+
import 'package:flutter/widgets.dart';
5033+
5034+
abstract class Foo extends Widget {
5035+
Widget bar;
5036+
}
5037+
5038+
main(Foo foo) {
5039+
return widget(child: foo./*caret*/bar);
5040+
}
5041+
''');
5042+
}
5043+
5044+
test_flutterWrapWidget_OK_prefixedIdentifier_prefix() async {
5045+
addFlutterPackage();
5046+
await resolveTestUnit('''
5047+
import 'package:flutter/widgets.dart';
5048+
5049+
abstract class Foo extends Widget {
5050+
Widget bar;
5051+
}
5052+
5053+
main(Foo foo) {
5054+
return /*caret*/foo.bar;
5055+
}
5056+
''');
5057+
_setCaretLocation();
5058+
await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
5059+
import 'package:flutter/widgets.dart';
5060+
5061+
abstract class Foo extends Widget {
5062+
Widget bar;
5063+
}
5064+
5065+
main(Foo foo) {
5066+
return /*caret*/widget(child: foo.bar);
5067+
}
5068+
''');
5069+
}
5070+
50175071
test_flutterWrapWidget_OK_singleLine1() async {
50185072
addFlutterPackage();
50195073
await resolveTestUnit('''

pkg/analysis_server/test/src/utilities/flutter_test.dart

Lines changed: 113 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -90,22 +90,7 @@ var w = new Foo();
9090
expect(getWidgetPresentationText(w), isNull);
9191
}
9292

93-
test_identifyWidgetExpression_identifier() async {
94-
await resolveTestUnit('''
95-
import 'package:flutter/widgets.dart';
96-
97-
main() {
98-
var text = new Text('abc');
99-
text;
100-
}
101-
''');
102-
{
103-
Expression expression = findNodeAtString("text;");
104-
expect(identifyWidgetExpression(expression), expression);
105-
}
106-
}
107-
108-
test_identifyWidgetExpression_instanceCreation() async {
93+
test_identifyWidgetExpression_node_instanceCreation() async {
10994
await resolveTestUnit('''
11095
import 'package:flutter/widgets.dart';
11196
@@ -155,7 +140,7 @@ class MyWidget extends StatelessWidget {
155140
}
156141
}
157142

158-
test_identifyWidgetExpression_invocation() async {
143+
test_identifyWidgetExpression_node_invocation() async {
159144
await resolveTestUnit('''
160145
import 'package:flutter/widgets.dart';
161146
@@ -185,7 +170,7 @@ Text createText(String txt) => new Text(txt);
185170
}
186171
}
187172

188-
test_identifyWidgetExpression_namedExpression() async {
173+
test_identifyWidgetExpression_node_namedExpression() async {
189174
await resolveTestUnit('''
190175
import 'package:flutter/widgets.dart';
191176
@@ -199,6 +184,50 @@ Text createEmptyText() => new Text('');
199184
expect(identifyWidgetExpression(childExpression), isNull);
200185
}
201186

187+
test_identifyWidgetExpression_node_prefixedIdentifier_identifier() async {
188+
await resolveTestUnit('''
189+
import 'package:flutter/widgets.dart';
190+
191+
abstract class Foo extends Widget {
192+
Widget bar;
193+
}
194+
195+
main(Foo foo) {
196+
foo.bar; // ref
197+
}
198+
''');
199+
SimpleIdentifier bar = findNodeAtString('bar; // ref');
200+
expect(identifyWidgetExpression(bar), bar.parent);
201+
}
202+
203+
test_identifyWidgetExpression_node_prefixedIdentifier_prefix() async {
204+
await resolveTestUnit('''
205+
import 'package:flutter/widgets.dart';
206+
207+
abstract class Foo extends Widget {
208+
Widget bar;
209+
}
210+
211+
main(Foo foo) {
212+
foo.bar; // ref
213+
}
214+
''');
215+
SimpleIdentifier foo = findNodeAtString('foo.bar');
216+
expect(identifyWidgetExpression(foo), foo.parent);
217+
}
218+
219+
test_identifyWidgetExpression_node_simpleIdentifier() async {
220+
await resolveTestUnit('''
221+
import 'package:flutter/widgets.dart';
222+
223+
main(Widget widget) {
224+
widget; // ref
225+
}
226+
''');
227+
Expression expression = findNodeAtString('widget; // ref');
228+
expect(identifyWidgetExpression(expression), expression);
229+
}
230+
202231
test_identifyWidgetExpression_null() async {
203232
await resolveTestUnit('''
204233
import 'package:flutter/widgets.dart';
@@ -222,6 +251,72 @@ Text createEmptyText() => new Text('');
222251
}
223252
}
224253

254+
test_identifyWidgetExpression_parent_argumentList() async {
255+
await resolveTestUnit('''
256+
import 'package:flutter/widgets.dart';
257+
258+
main() {
259+
var text = new Text('abc');
260+
useWidget(text); // ref
261+
}
262+
263+
void useWidget(Widget w) {}
264+
''');
265+
Expression expression = findNodeAtString("text); // ref");
266+
expect(identifyWidgetExpression(expression), expression);
267+
}
268+
269+
test_identifyWidgetExpression_parent_expressionStatement() async {
270+
await resolveTestUnit('''
271+
import 'package:flutter/widgets.dart';
272+
273+
main(Widget widget) {
274+
widget; // ref
275+
}
276+
''');
277+
Expression expression = findNodeAtString("widget; // ref");
278+
expect(identifyWidgetExpression(expression), expression);
279+
}
280+
281+
test_identifyWidgetExpression_parent_listLiteral() async {
282+
await resolveTestUnit('''
283+
import 'package:flutter/widgets.dart';
284+
285+
main(Widget widget) {
286+
return [widget]; // ref
287+
}
288+
''');
289+
Expression expression = findNodeAtString("widget]; // ref");
290+
expect(identifyWidgetExpression(expression), expression);
291+
}
292+
293+
test_identifyWidgetExpression_parent_namedExpression() async {
294+
await resolveTestUnit('''
295+
import 'package:flutter/widgets.dart';
296+
297+
main() {
298+
var text = new Text('abc');
299+
useWidget(child: text); // ref
300+
}
301+
302+
void useWidget({Widget child}) {}
303+
''');
304+
Expression expression = findNodeAtString("text); // ref");
305+
expect(identifyWidgetExpression(expression), expression);
306+
}
307+
308+
test_identifyWidgetExpression_parent_returnStatement() async {
309+
await resolveTestUnit('''
310+
import 'package:flutter/widgets.dart';
311+
312+
main(Widget widget) {
313+
return widget; // ref
314+
}
315+
''');
316+
Expression expression = findNodeAtString("widget; // ref");
317+
expect(identifyWidgetExpression(expression), expression);
318+
}
319+
225320
test_isWidget() async {
226321
await resolveTestUnit('''
227322
import 'package:flutter/widgets.dart';

0 commit comments

Comments
 (0)