Update assertSimpleIdentifier() to accept separate 'readElement' and 'writeElement'.

Not yet fully enforced, and probably not fully implemented currently.

R=brianwilkerson@google.com

Change-Id: Ibbb43506cf7abb4104d348077e2d5bafeb60ba0e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/158504
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index e6cd991..b1dc776 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -8415,10 +8415,11 @@
       SimpleIdentifier identifier = prefixed.identifier;
       assertSimpleIdentifier(
         identifier,
-        element: elementMatcher(
+        readElement: elementMatcher(
           objectHashCode,
           isLegacy: isNullSafetySdkAndLegacyLibrary,
         ),
+        writeElement: null,
         type: 'int',
       );
     }
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 629a69a..2761663 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -67,9 +67,12 @@
     );
     assertType(assignment, 'num'); // num + int = num
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.localVar('v'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: findElement.localVar('v'),
+      writeElement: findElement.localVar('v'),
+      type: 'num',
+    );
 
     Expression right = assignment.rightHandSide;
     assertType(right, 'int');
@@ -376,9 +379,12 @@
     assertElementNull(assignment);
     assertType(assignment, 'int');
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.localVar('v'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: null,
+      writeElement: findElement.localVar('v'),
+      type: 'num',
+    );
 
     Expression right = assignment.rightHandSide;
     assertType(right, 'int');
@@ -550,9 +556,12 @@
     assertElementNull(assignment);
     assertType(assignment, 'int');
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.setter('f'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: null,
+      writeElement: findElement.setter('f'),
+      type: 'num',
+    );
 
     var right = assignment.rightHandSide;
     assertType(right, 'int');
@@ -569,9 +578,12 @@
     assertElementNull(assignment);
     assertType(assignment, 'int');
 
-    SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.topSet('v'));
-    assertType(left, 'num');
+    assertSimpleIdentifier(
+      assignment.leftHandSide,
+      readElement: null,
+      writeElement: findElement.topSet('v'),
+      type: 'num',
+    );
 
     var right = assignment.rightHandSide;
     assertType(right, 'int');
diff --git a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
index 74fe485..dfd1530 100644
--- a/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/postfix_expression_test.dart
@@ -64,7 +64,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('x++'),
-      element: findElement.topSet('x'),
+      readElement: findElement.topGet('x'),
+      writeElement: findElement.topSet('x'),
       type: 'num',
     );
 
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 1bf149e..163de13 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -164,7 +164,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo?'),
-      element: findElement.topGet('foo'),
+      readElement: findElement.topGet('foo'),
+      writeElement: null,
       type: 'A?',
     );
 
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index f9dc242..e6f5143 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -594,11 +594,30 @@
 
   void assertSimpleIdentifier(
     SimpleIdentifier node, {
-    @required Object element,
+    @required Object readElement,
+    @required Object writeElement,
     @required String type,
   }) {
-    assertElement(node.staticElement, element);
-    assertType(node, type);
+    var isRead = node.inGetterContext();
+    var isWrite = node.inSetterContext();
+    if (isRead && isWrite) {
+      // TODO(scheglov) enable this
+//      assertElement(node.auxiliaryElements?.staticElement, readElement);
+      assertElement(node.staticElement, writeElement);
+    } else if (isRead) {
+      assertElement(node.staticElement, readElement);
+    } else {
+      expect(isWrite, isTrue);
+      assertElement(node.staticElement, writeElement);
+    }
+
+    if (isRead) {
+      assertType(node, type);
+    } else {
+      // TODO(scheglov) enforce this
+//      expect(type, isNull);
+//      assertTypeNull(node);
+    }
   }
 
   void assertSubstitution(
diff --git a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
index 76881d5..1214c58 100644
--- a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
@@ -27,7 +27,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('dynamic;'),
-      element: dynamicElement,
+      readElement: dynamicElement,
+      writeElement: null,
       type: 'Type',
     );
   }
@@ -45,7 +46,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('dynamic;'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'dynamic',
     );
   }
@@ -59,7 +61,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('dynamic;'),
-      element: dynamicElement,
+      readElement: dynamicElement,
+      writeElement: null,
       type: 'Type',
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 0cfcca7..440c7a7 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -386,7 +386,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'Never',
     );
   }
@@ -400,7 +401,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
-      element: objectElement.getGetter('hashCode'),
+      readElement: objectElement.getGetter('hashCode'),
+      writeElement: null,
       type: 'Never',
     );
   }
@@ -416,7 +418,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'Never',
     );
 
@@ -436,7 +439,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('toString'),
-      element: objectElement.getMethod('toString'),
+      readElement: objectElement.getMethod('toString'),
+      writeElement: null,
       type: 'Never',
     );
   }
@@ -452,7 +456,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'Never',
     );
 
@@ -474,7 +479,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('foo'),
-      element: null,
+      readElement: null,
+      writeElement: null,
       type: 'dynamic',
     );
   }
@@ -488,7 +494,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
-      element: objectElement.getGetter('hashCode'),
+      readElement: objectElement.getGetter('hashCode'),
+      writeElement: null,
       type: 'int',
     );
   }
@@ -502,7 +509,8 @@
 
     assertSimpleIdentifier(
       findNode.simple('toString'),
-      element: objectElement.getMethod('toString'),
+      readElement: objectElement.getMethod('toString'),
+      writeElement: null,
       type: 'String Function()',
     );
   }
@@ -571,10 +579,11 @@
 
     assertSimpleIdentifier(
       findNode.simple('toString'),
-      element: elementMatcher(
+      readElement: elementMatcher(
         objectElement.getMethod('toString'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
+      writeElement: null,
       type: 'String Function()',
     );
   }
@@ -588,10 +597,11 @@
 
     assertSimpleIdentifier(
       findNode.simple('hashCode'),
-      element: elementMatcher(
+      readElement: elementMatcher(
         objectElement.getGetter('hashCode'),
         isLegacy: isNullSafetySdkAndLegacyLibrary,
       ),
+      writeElement: null,
       type: 'int',
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 6e71b13..e59a967 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -764,7 +764,8 @@
     ]);
     assertSimpleIdentifier(
       findNode.simple('isEven'),
-      element: intElement.getGetter('isEven'),
+      readElement: intElement.getGetter('isEven'),
+      writeElement: null,
       type: 'bool',
     );
   }