Issue 18270. Improve 'Extract Widget' to handle return statement selection.
R=brianwilkerson@google.com
Bug: https://github.com/flutter/flutter/issues/18270
Change-Id: Id8143dd72de6222eb2d64ccde6fa12856971c7fd
Reviewed-on: https://dart-review.googlesource.com/59120
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 1ad85d0..b42abf0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -171,7 +171,12 @@
/// Checks if [offset] is a widget creation expression that can be extracted.
RefactoringStatus _checkSelection() {
- AstNode node = new NodeLocator2(offset, offset + length).searchWithin(unit);
+ AstNode node = new NodeLocator(offset, offset + length).searchWithin(unit);
+
+ // Treat single ReturnStatement as its expression.
+ if (node is ReturnStatement) {
+ node = (node as ReturnStatement).expression;
+ }
// Find the enclosing class.
_enclosingClassNode = node?.getAncestor((n) => n is ClassDeclaration);
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 0573853..55a9cff 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -231,6 +231,54 @@
''');
}
+ test_expression_selection() async {
+ addFlutterPackage();
+ await indexTestUnit('''
+import 'package:flutter/material.dart';
+
+Widget main() {
+ return new Container();
+}
+''');
+
+ Future<void> assertResult(String str) async {
+ int offset = findOffset(str);
+ _createRefactoring(offset, str.length);
+
+ await _assertSuccessfulRefactoring('''
+import 'package:flutter/material.dart';
+
+Widget main() {
+ return new Test();
+}
+
+class Test extends StatelessWidget {
+ const Test({
+ Key key,
+ }) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return new Container();
+ }
+}
+''');
+ }
+
+ await assertResult('Container');
+ await assertResult('new Container');
+ await assertResult('new Container(');
+ await assertResult('new Container()');
+ await assertResult('new Container();');
+ await assertResult('taine');
+ await assertResult('tainer');
+ await assertResult('tainer(');
+ await assertResult('tainer()');
+ await assertResult('turn new Container');
+ await assertResult('return new Container()');
+ await assertResult('return new Container();');
+ }
+
test_expression_topFunction() async {
addFlutterPackage();
await indexTestUnit('''