Deprecate IndexExpression.auxiliaryElements

Change-Id: I7359527db5bbf161a35296678ff2bd43052c1794
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/164740
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 2c91951..baa98f9 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -3241,11 +3241,15 @@
   /// The auxiliary elements hold the static and propagated elements associated
   /// with the getter context.
   // TODO(brianwilkerson) Replace this API.
+  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
+      'CompoundAssignmentExpression.writeElement')
   AuxiliaryElements get auxiliaryElements;
 
   /// Set the auxiliary elements associated with this identifier to the given
   /// [elements].
   // TODO(brianwilkerson) Replace this API.
+  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
+      'CompoundAssignmentExpression.writeElement')
   set auxiliaryElements(AuxiliaryElements elements);
 
   /// Return the expression used to compute the index.
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 8f36687..3a7cf4b 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5810,6 +5810,8 @@
   /// If this expression is both in a getter and setter context, the
   /// [AuxiliaryElements] will be set to hold onto the static element from the
   /// getter context.
+  @Deprecated('Use CompoundAssignmentExpression.readElement and/or '
+      'CompoundAssignmentExpression.writeElement')
   @override
   AuxiliaryElements auxiliaryElements;
 
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index d407077..1c7ffd9 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -4738,6 +4738,7 @@
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
         _isEqualNodes(node.index, toNode.index),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+      // ignore: deprecated_member_use_from_same_package
       toNode.auxiliaryElements = node.auxiliaryElements;
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 15a37c0..7082a55 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -321,6 +321,13 @@
       _checkForDeadNullCoalesce(node.readType, node.rightHandSide);
     }
     _checkForAssignmentToFinal(lhs);
+    if (lhs is IndexExpression) {
+      _checkIndexExpressionIndex(
+        lhs.index,
+        readElement: node.readElement,
+        writeElement: node.writeElement,
+      );
+    }
     super.visitAssignmentExpression(node);
   }
 
@@ -816,21 +823,11 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    void checkIndexExpression(MethodElement method) {
-      if (method != null) {
-        var parameters = method.parameters;
-        if (parameters.isNotEmpty) {
-          _checkForArgumentTypeNotAssignableForArgument2(
-            argument: node.index,
-            parameter: parameters[0],
-            promoteParameterToNullable: false,
-          );
-        }
-      }
-    }
-
-    checkIndexExpression(node.staticElement);
-    checkIndexExpression(node.auxiliaryElements?.staticElement);
+    _checkIndexExpressionIndex(
+      node.index,
+      readElement: node.staticElement,
+      writeElement: null,
+    );
 
     if (node.isNullAware) {
       _checkForUnnecessaryNullAware(
@@ -838,6 +835,7 @@
         node.question ?? node.period ?? node.leftBracket,
       );
     }
+
     super.visitIndexExpression(node);
   }
 
@@ -989,12 +987,20 @@
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
+    var operand = node.operand;
     if (node.operator.type == TokenType.BANG) {
       _checkForUseOfVoidResult(node);
-      _checkForUnnecessaryNullAware(node.operand, node.operator);
+      _checkForUnnecessaryNullAware(operand, node.operator);
     } else {
-      _checkForAssignmentToFinal(node.operand);
-      _checkForIntNotAssignable(node.operand);
+      _checkForAssignmentToFinal(operand);
+      _checkForIntNotAssignable(operand);
+    }
+    if (operand is IndexExpression) {
+      _checkIndexExpressionIndex(
+        operand.index,
+        readElement: node.readElement,
+        writeElement: node.writeElement,
+      );
     }
     super.visitPostfixExpression(node);
   }
@@ -1022,6 +1028,13 @@
       _checkForUseOfVoidResult(operand);
       _checkForIntNotAssignable(operand);
     }
+    if (operand is IndexExpression) {
+      _checkIndexExpressionIndex(
+        operand.index,
+        readElement: node.readElement,
+        writeElement: node.writeElement,
+      );
+    }
     super.visitPrefixExpression(node);
   }
 
@@ -4809,6 +4822,34 @@
     }
   }
 
+  void _checkIndexExpressionIndex(
+    Expression index, {
+    @required ExecutableElement readElement,
+    @required ExecutableElement writeElement,
+  }) {
+    if (readElement is MethodElement) {
+      var parameters = readElement.parameters;
+      if (parameters.isNotEmpty) {
+        _checkForArgumentTypeNotAssignableForArgument2(
+          argument: index,
+          parameter: parameters[0],
+          promoteParameterToNullable: false,
+        );
+      }
+    }
+
+    if (writeElement is MethodElement) {
+      var parameters = writeElement.parameters;
+      if (parameters.isNotEmpty) {
+        _checkForArgumentTypeNotAssignableForArgument2(
+          argument: index,
+          parameter: parameters[0],
+          promoteParameterToNullable: false,
+        );
+      }
+    }
+  }
+
   void _checkMixinInference(
       NamedCompilationUnitMember node, WithClause withClause) {
     if (withClause == null) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 839af0a..42e94d4 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -658,6 +658,7 @@
     if (left is IndexExpression) {
       if (hasRead) {
         left.staticElement = assignment.writeElement;
+        // ignore: deprecated_member_use_from_same_package
         left.auxiliaryElements = AuxiliaryElements(assignment.readElement);
       } else {
         left.staticElement = assignment.writeElement;
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index 47a4b20..d3699e0 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -568,6 +568,7 @@
     MethodElement staticElement = ElementFactory.methodElement(
         "m", interfaceTypeStar(ElementFactory.classElement2('C')));
     AuxiliaryElements auxiliaryElements = AuxiliaryElements(staticElement);
+    // ignore: deprecated_member_use_from_same_package
     fromNode.auxiliaryElements = auxiliaryElements;
     fromNode.staticElement = staticElement;
     DartType staticType = interfaceTypeStar(ElementFactory.classElement2('C'));
@@ -577,6 +578,7 @@
       index: AstTestFactory.integer(0),
     );
     ResolutionCopier.copyResolutionData(fromNode, toNode);
+    // ignore: deprecated_member_use_from_same_package
     expect(toNode.auxiliaryElements, same(auxiliaryElements));
     expect(toNode.staticElement, same(staticElement));
     expect(toNode.staticType, same(staticType));
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 003a597..49dd0da 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -112,23 +112,6 @@
     assertType(node, type);
   }
 
-  void assertAuxElement(AstNode node, Element expected) {
-    var auxElements = getNodeAuxElements(node);
-    expect(auxElements?.staticElement, same(expected));
-  }
-
-  void assertAuxMember(
-    Expression node,
-    Element expectedBase,
-    Map<String, String> expectedSubstitution,
-  ) {
-    var actual = getNodeAuxElements(node)?.staticElement as ExecutableMember;
-
-    expect(actual.declaration, same(expectedBase));
-
-    assertSubstitution(actual.substitution, expectedSubstitution);
-  }
-
   void assertBinaryExpression(
     BinaryExpression node, {
     @required Object element,
@@ -397,6 +380,7 @@
     var isRead = node.inGetterContext();
     var isWrite = node.inSetterContext();
     if (isRead && isWrite) {
+      // ignore: deprecated_member_use_from_same_package
       assertElement(node.auxiliaryElements?.staticElement, readElement);
       assertElement(node.staticElement, writeElement);
     } else if (isRead) {
@@ -824,14 +808,6 @@
     }
   }
 
-  AuxiliaryElements getNodeAuxElements(AstNode node) {
-    if (node is IndexExpression) {
-      return node.auxiliaryElements;
-    } else {
-      fail('Unsupported node: (${node.runtimeType}) $node');
-    }
-  }
-
   Element getNodeElement(AstNode node) {
     if (node is Annotation) {
       return node.element;
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 5ece142..eacdbcd 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -194,8 +194,12 @@
 }
 f(A a) {
   a['0'] += 0;
+  ++a['0'];
+  a['0']++;
 }''', [
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 103, 3),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 120, 3),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 130, 3),
     ]);
   }
 
@@ -219,8 +223,12 @@
 }
 f(A a) {
   a['0'] += 0;
+  ++a['0'];
+  a['0']++;
 }''', [
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 103, 3),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 120, 3),
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 130, 3),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 98788a3..a7945a6 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -770,10 +770,6 @@
     _writeln('IndexExpression');
     _withIndent(() {
       var properties = _Properties();
-      properties.addAuxiliaryElements(
-        'auxiliaryElements',
-        node.auxiliaryElements,
-      );
       properties.addNode('index', node.index);
       properties.addToken('period', node.period);
       properties.addNode('target', node.target);
@@ -1801,17 +1797,6 @@
   }
 }
 
-class _AuxiliaryElementsProperty extends _Property {
-  final AuxiliaryElements elements;
-
-  _AuxiliaryElementsProperty(String name, this.elements) : super(name);
-
-  @override
-  void write(ResolvedAstPrinter printer) {
-    printer._writeAuxiliaryElements(name, elements);
-  }
-}
-
 class _ElementProperty extends _Property {
   final Element element;
 
@@ -1848,12 +1833,6 @@
 class _Properties {
   final properties = <_Property>[];
 
-  void addAuxiliaryElements(String name, AuxiliaryElements elements) {
-    properties.add(
-      _AuxiliaryElementsProperty(name, elements),
-    );
-  }
-
   void addElement(String name, Element element) {
     properties.add(
       _ElementProperty(name, element),