Fix an exception in flutter outline when using ui-as-code elements (issue 36772)
Change-Id: If0cb8972cc172581d0365e4d9e0bab0cfee598c6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/100629
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 59c4686..2df986e 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -202,10 +202,25 @@
} else if (isWidgetListArgument) {
if (childrenExpression is ListLiteral) {
for (var element in childrenExpression.elements) {
- var child = _createOutline(element, true);
- if (child != null) {
- children.add(child);
+ void addChildrenFrom(CollectionElement element) {
+ if (element is Expression) {
+ var child = _createOutline(element, true);
+ if (child != null) {
+ children.add(child);
+ }
+ } else if (element is IfElement) {
+ addChildrenFrom(element.thenElement);
+ addChildrenFrom(element.elseElement);
+ } else if (element is ForElement) {
+ addChildrenFrom(element.body);
+ } else if (element is SpreadElement) {
+ // Ignored. It's possible that we might be able to extract
+ // some information from some spread expressions, but it seems
+ // unlikely enough that we're not handling it at the moment.
+ }
}
+
+ addChildrenFrom(element);
}
}
} else {
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index 0109174..fe6ebd6 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -205,6 +205,33 @@
}
}
+ test_children_withCollectionElements() async {
+ FlutterOutline unitOutline = await _computeOutline('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ bool includeB = true;
+ return new Column(children: [
+ const Text('aaa'),
+ if (includeB) const Text('bbb'),
+ for (int s in ['ccc', 'ddd'] const Text(s),
+ ]);
+ }
+}
+''');
+
+ expect(_toText(unitOutline), r'''
+(D) MyWidget
+ (D) build
+ Column
+ Text
+ Text
+ Text
+''');
+ }
+
test_codeOffsetLength() async {
FlutterOutline unitOutline = await _computeOutline('''
import 'package:flutter/widgets.dart';