anchor.diff:    ///
     /// TODO(scheglov) this is duplicate
     void _analyzeLeastUpperBound(
  -      Expression node, Expression expr1, Expression expr2,
  -      {bool read = false}) {
  -    DartType staticType1 = _getExpressionType(expr1, read: read);
  -    DartType staticType2 = _getExpressionType(expr2, read: read);
  +      Expression node, Expression expr1, Expression expr2) {
  +    DartType staticType1 = getReadType(expr1);
  +    DartType staticType2 = getReadType(expr2);
   
       _analyzeLeastUpperBoundTypes(node, staticType1, staticType2);
     }
  
positive.code:     Token operator = node.operator;
      TokenType operatorType = operator.type;
      Expression leftHandSide = node.leftHandSide;
      DartType staticType = _getStaticType1(leftHandSide, read: true);
  
      if (identical(staticType, NeverTypeImpl.instance)) {
        return;
      }
  
  
negative.code:       );
        _inferenceHelper.recordStaticType(node, type);
  
        var leftWriteType = _getWriteType(node.leftHandSide);
        if (!_typeSystem.isAssignableTo2(type, leftWriteType)) {
          _resolver.errorReporter.reportErrorForNode(
            CompileTimeErrorCode.INVALID_ASSIGNMENT,
  