Issue 2972. Fix 'Wrap with...' for assignment.

R=brianwilkerson@google.com, pquitslund@google.com

Bug: https://github.com/flutter/flutter-intellij/issues/2972
Change-Id: I4dda6f73516d1715686884d55dc43405b36f3631
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105180
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 867a30b..f18247a 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -283,6 +283,17 @@
     for (; node != null; node = node.parent) {
       if (isWidgetExpression(node)) {
         var parent = node.parent;
+
+        if (node is AssignmentExpression) {
+          return null;
+        }
+        if (parent is AssignmentExpression) {
+          if (parent.rightHandSide == node) {
+            return node;
+          }
+          return null;
+        }
+
         if (parent is ArgumentList ||
             parent is ExpressionFunctionBody && parent.expression == node ||
             parent is ListLiteral ||
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 798bedb..0dbadd0 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -28,6 +29,7 @@
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
+  FindNode findNode;
 
   void addTestSource(String code, [Uri uri]) {
     testCode = code;
@@ -128,6 +130,7 @@
     }
     testUnitElement = testUnit.declaredElement;
     testLibraryElement = testUnitElement.library;
+    findNode = FindNode(code, testUnit);
   }
 
   @override
diff --git a/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart b/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart
index cf8517b..b325134 100644
--- a/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart
+++ b/pkg/analysis_server/test/src/nullability/migration_visitor_test.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -971,8 +970,6 @@
 class MigrationVisitorTestBase extends AbstractSingleUnitTest {
   final _Variables _variables;
 
-  FindNode findNode;
-
   final NullabilityGraph graph;
 
   MigrationVisitorTestBase() : this._(NullabilityGraph());
@@ -989,7 +986,6 @@
     await resolveTestUnit(code);
     testUnit.accept(
         NodeBuilder(_variables, testSource, false, graph, typeProvider));
-    findNode = FindNode(code, testUnit);
     return testUnit;
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
index 4e1af86..caca61e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
@@ -82,6 +82,26 @@
 ''');
   }
 
+  test_assignment() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = /*caret*/Container();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget w;
+  w = Center(child: Container());
+}
+''');
+  }
+
   test_expressionFunctionBody() async {
     addFlutterPackage();
     await resolveTestUnit('''
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index 5a558ac..cad467a 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -279,6 +279,36 @@
     expect(flutter.identifyWidgetExpression(expression), expression);
   }
 
+  test_identifyWidgetExpression_parent_assignmentExpression() async {
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  Widget text;
+  text = Text('abc');
+}
+
+void useWidget(Widget w) {}
+''');
+    // Assignment itself.
+    {
+      var expression = findNode.simple('text =');
+      expect(flutter.identifyWidgetExpression(expression), isNull);
+    }
+
+    // Left hand side.
+    {
+      var expression = findNode.assignment('text =');
+      expect(flutter.identifyWidgetExpression(expression), isNull);
+    }
+
+    // Right hand side.
+    {
+      var expression = findNode.instanceCreation('Text(');
+      expect(flutter.identifyWidgetExpression(expression), expression);
+    }
+  }
+
   test_identifyWidgetExpression_parent_expressionFunctionBody() async {
     await resolveTestUnit('''
 import 'package:flutter/widgets.dart';