anchor.diff:        : this._typeSystem = typeSystem ?? new Dart2TypeSystem(null);
   
     @override
  +  void visitAssignmentExpression(AssignmentExpression node) {
  +    TokenType operatorType = node.operator.type;
  +    if (operatorType == TokenType.QUESTION_QUESTION_EQ) {
  +      _checkForDeadNullCoalesce(
  +          node.leftHandSide.staticType, node.rightHandSide);
  +    }
  +    super.visitAssignmentExpression(node);
  +  }
  +
  +  @override
     void visitBinaryExpression(BinaryExpression node) {
       Token operator = node.operator;
       bool isAmpAmp = operator.type == TokenType.AMPERSAND_AMPERSAND;
  
positive.code:         _errorReporter
              .reportErrorForNode(hintCode, name, [library.identifier, nameStr]);
        }
      }
    }
  
  
negative.code:     }
    }
  
    void _pushCollectionTypesDown(CollectionElement element,
        {DartType elementType,
        @required DartType iterableType,
        DartType keyType,
        DartType valueType}) {
      if (element is ForElement) {
        _pushCollectionTypesDown(element.body,
            elementType: elementType,
            iterableType: iterableType,
            keyType: keyType,
            valueType: valueType);
      } else if (element is IfElement) {
        _pushCollectionTypesDown(element.thenElement,
            elementType: elementType,
            iterableType: iterableType,
            keyType: keyType,
            valueType: valueType);
        _pushCollectionTypesDown(element.elseElement,
            elementType: elementType,
            iterableType: iterableType,
            keyType: keyType,
            valueType: valueType);
      } else if (element is Expression) {
        InferenceContext.setType(
            element, elementType ?? typeProvider.undefinedType);
      } else if (element is MapLiteralEntry) {
        InferenceContext.setType(
            element.key, keyType ?? typeProvider.undefinedType);
        InferenceContext.setType(
            element.value, valueType ?? typeProvider.undefinedType);
      } else if (element is SpreadElement) {
        InferenceContext.setType(element.expression, iterableType);
      }
    }
  
    void _pushCollectionTypesDownToAll(List<CollectionElement> elements,
        {DartType elementType,
        @required DartType iterableType,
        DartType keyType,
        DartType valueType}) {
      assert(iterableType != null);
      for (CollectionElement element in elements) {
        _pushCollectionTypesDown(element,
            elementType: elementType,
            iterableType: iterableType,
            keyType: keyType,
            valueType: valueType);
      }
    }
  
  