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('''