anchor.diff:      }
     }
   
  -  void _pushCollectionTypesDown(
  -      CollectionElement element, DartType elementType, DartType iterableType) {
  +  void _pushCollectionTypesDown(CollectionElement element,
  +      {DartType elementType,
  +      @required DartType iterableType,
  +      DartType keyType,
  +      DartType valueType}) {
       if (element is ForElement) {
  -      _pushCollectionTypesDown(element.body, elementType, iterableType);
  +      _pushCollectionTypesDown(element.body,
  +          elementType: elementType,
  +          iterableType: iterableType,
  +          keyType: keyType,
  +          valueType: valueType);
       } else if (element is IfElement) {
  -      _pushCollectionTypesDown(element.thenElement, elementType, iterableType);
  -      _pushCollectionTypesDown(element.elseElement, elementType, iterableType);
  +      _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);
  +      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);
       }
     }
   
  
positive.code:         _errorReporter
              .reportErrorForNode(hintCode, name, [library.identifier, nameStr]);
        }
      }
    }
  
  
negative.code:       DartType elementType = listType.typeArguments[0];
        DartType iterableType =
            typeProvider.iterableType.instantiate([elementType]);
        _pushCollectionTypesDownToAll(node.elements2,
            elementType: elementType, iterableType: iterableType);
        InferenceContext.setType(node, listType);
      } else {
        InferenceContext.clearType(node);
  