anchor.diff:        _recordStaticType(node, staticStaticType);
       }
   
  -    // Record propagated return type of the static element.
  -    DartType staticPropagatedType =
  -        _computePropagatedReturnType(staticMethodElement);
  -    _resolver.recordPropagatedTypeIfBetter(node, staticPropagatedType);
  -    // Check for special cases.
  -    bool needPropagatedType = true;
  -    String methodName = methodNameNode.name;
  -    if (!_strongMode && methodName == "then") {
  -      Expression target = node.realTarget;
  -      if (target != null) {
  -        DartType targetType = target.bestType;
  -        if (targetType.isDartAsyncFuture) {
  -          // Future.then(closure) return type is:
  -          // 1) the returned Future type, if the closure returns a Future;
  -          // 2) Future<valueType>, if the closure returns a value.
  -          NodeList<Expression> arguments = node.argumentList.arguments;
  -          if (arguments.length == 1) {
  -            // TODO(brianwilkerson) Handle the case where both arguments are
  -            // provided.
  -            Expression closureArg = arguments[0];
  -            if (closureArg is FunctionExpression) {
  -              FunctionExpression closureExpr = closureArg;
  -              DartType returnType =
  -                  _computePropagatedReturnType(closureExpr.element);
  -              if (returnType != null) {
  -                // prepare the type of the returned Future
  -                InterfaceType newFutureType = _typeProvider.futureType
  -                    .instantiate([returnType.flattenFutures(_typeSystem)]);
  -                // set the 'then' invocation type
  -                _resolver.recordPropagatedTypeIfBetter(node, newFutureType);
  -                needPropagatedType = false;
  -                return null;
  +    if (propagateTypes) {
  +      // Record propagated return type of the static element.
  +      DartType staticPropagatedType =
  +          _computePropagatedReturnType(staticMethodElement);
  +      _resolver.recordPropagatedTypeIfBetter(node, staticPropagatedType);
  +      // Check for special cases.
  +      bool needPropagatedType = true;
  +      String methodName = methodNameNode.name;
  +      if (!_strongMode && methodName == "then") {
  +        Expression target = node.realTarget;
  +        if (target != null) {
  +          DartType targetType = target.bestType;
  +          if (targetType.isDartAsyncFuture) {
  +            // Future.then(closure) return type is:
  +            // 1) the returned Future type, if the closure returns a Future;
  +            // 2) Future<valueType>, if the closure returns a value.
  +            NodeList<Expression> arguments = node.argumentList.arguments;
  +            if (arguments.length == 1) {
  +              // TODO(brianwilkerson) Handle the case where both arguments are
  +              // provided.
  +              Expression closureArg = arguments[0];
  +              if (closureArg is FunctionExpression) {
  +                FunctionExpression closureExpr = closureArg;
  +                DartType returnType =
  +                    _computePropagatedReturnType(closureExpr.element);
  +                if (returnType != null) {
  +                  // prepare the type of the returned Future
  +                  InterfaceType newFutureType = _typeProvider.futureType
  +                      .instantiate([returnType.flattenFutures(_typeSystem)]);
  +                  // set the 'then' invocation type
  +                  _resolver.recordPropagatedTypeIfBetter(node, newFutureType);
  +                  needPropagatedType = false;
  +                  return null;
  +                }
                 }
               }
             }
           }
  -      }
  -    } else if (methodName == "\$dom_createEvent") {
  -      Expression target = node.realTarget;
  -      if (target != null) {
  -        DartType targetType = target.bestType;
  -        if (targetType is InterfaceType &&
  -            (targetType.name == "HtmlDocument" ||
  -                targetType.name == "Document")) {
  -          LibraryElement library = targetType.element.library;
  -          if (_isHtmlLibrary(library)) {
  -            DartType returnType =
  -                _getFirstArgumentAsType(library, node.argumentList);
  -            if (returnType != null) {
  -              _recordPropagatedType(node, returnType);
  -              needPropagatedType = false;
  +      } else if (methodName == "\$dom_createEvent") {
  +        Expression target = node.realTarget;
  +        if (target != null) {
  +          DartType targetType = target.bestType;
  +          if (targetType is InterfaceType &&
  +              (targetType.name == "HtmlDocument" ||
  +                  targetType.name == "Document")) {
  +            LibraryElement library = targetType.element.library;
  +            if (_isHtmlLibrary(library)) {
  +              DartType returnType =
  +                  _getFirstArgumentAsType(library, node.argumentList);
  +              if (returnType != null) {
  +                _recordPropagatedType(node, returnType);
  +                needPropagatedType = false;
  +              }
               }
             }
           }
  -      }
  -    } else if (methodName == "query") {
  -      Expression target = node.realTarget;
  -      if (target == null) {
  -        Element methodElement = methodNameNode.bestElement;
  -        if (methodElement != null) {
  -          LibraryElement library = methodElement.library;
  -          if (_isHtmlLibrary(library)) {
  -            DartType returnType =
  -                _getFirstArgumentAsQuery(library, node.argumentList);
  -            if (returnType != null) {
  -              _recordPropagatedType(node, returnType);
  -              needPropagatedType = false;
  +      } else if (methodName == "query") {
  +        Expression target = node.realTarget;
  +        if (target == null) {
  +          Element methodElement = methodNameNode.bestElement;
  +          if (methodElement != null) {
  +            LibraryElement library = methodElement.library;
  +            if (_isHtmlLibrary(library)) {
  +              DartType returnType =
  +                  _getFirstArgumentAsQuery(library, node.argumentList);
  +              if (returnType != null) {
  +                _recordPropagatedType(node, returnType);
  +                needPropagatedType = false;
  +              }
               }
             }
  -        }
  -      } else {
  -        DartType targetType = target.bestType;
  -        if (targetType is InterfaceType &&
  -            (targetType.name == "HtmlDocument" ||
  -                targetType.name == "Document")) {
  -          LibraryElement library = targetType.element.library;
  -          if (_isHtmlLibrary(library)) {
  -            DartType returnType =
  -                _getFirstArgumentAsQuery(library, node.argumentList);
  -            if (returnType != null) {
  -              _recordPropagatedType(node, returnType);
  -              needPropagatedType = false;
  +        } else {
  +          DartType targetType = target.bestType;
  +          if (targetType is InterfaceType &&
  +              (targetType.name == "HtmlDocument" ||
  +                  targetType.name == "Document")) {
  +            LibraryElement library = targetType.element.library;
  +            if (_isHtmlLibrary(library)) {
  +              DartType returnType =
  +                  _getFirstArgumentAsQuery(library, node.argumentList);
  +              if (returnType != null) {
  +                _recordPropagatedType(node, returnType);
  +                needPropagatedType = false;
  +              }
               }
             }
           }
  -      }
  -    } else if (methodName == "\$dom_createElement") {
  -      Expression target = node.realTarget;
  -      if (target != null) {
  -        DartType targetType = target.bestType;
  -        if (targetType is InterfaceType &&
  -            (targetType.name == "HtmlDocument" ||
  -                targetType.name == "Document")) {
  -          LibraryElement library = targetType.element.library;
  -          if (_isHtmlLibrary(library)) {
  -            DartType returnType =
  -                _getFirstArgumentAsQuery(library, node.argumentList);
  -            if (returnType != null) {
  -              _recordPropagatedType(node, returnType);
  -              needPropagatedType = false;
  +      } else if (methodName == "\$dom_createElement") {
  +        Expression target = node.realTarget;
  +        if (target != null) {
  +          DartType targetType = target.bestType;
  +          if (targetType is InterfaceType &&
  +              (targetType.name == "HtmlDocument" ||
  +                  targetType.name == "Document")) {
  +            LibraryElement library = targetType.element.library;
  +            if (_isHtmlLibrary(library)) {
  +              DartType returnType =
  +                  _getFirstArgumentAsQuery(library, node.argumentList);
  +              if (returnType != null) {
  +                _recordPropagatedType(node, returnType);
  +                needPropagatedType = false;
  +              }
               }
             }
           }
  -      }
  -    } else if (methodName == "JS") {
  -      DartType returnType = _getFirstArgumentAsType(
  -          _typeProvider.objectType.element.library, node.argumentList);
  -      if (returnType != null) {
  -        _recordPropagatedType(node, returnType);
  -        needPropagatedType = false;
  -      }
  -    } else if (methodName == "getContext") {
  -      Expression target = node.realTarget;
  -      if (target != null) {
  -        DartType targetType = target.bestType;
  -        if (targetType is InterfaceType &&
  -            (targetType.name == "CanvasElement")) {
  -          NodeList<Expression> arguments = node.argumentList.arguments;
  -          if (arguments.length == 1) {
  -            Expression argument = arguments[0];
  -            if (argument is StringLiteral) {
  -              String value = argument.stringValue;
  -              if ("2d" == value) {
  -                PropertyAccessorElement getter =
  -                    targetType.element.getGetter("context2D");
  -                if (getter != null) {
  -                  DartType returnType = getter.returnType;
  -                  if (returnType != null) {
  -                    _recordPropagatedType(node, returnType);
  -                    needPropagatedType = false;
  +      } else if (methodName == "JS") {
  +        DartType returnType = _getFirstArgumentAsType(
  +            _typeProvider.objectType.element.library, node.argumentList);
  +        if (returnType != null) {
  +          _recordPropagatedType(node, returnType);
  +          needPropagatedType = false;
  +        }
  +      } else if (methodName == "getContext") {
  +        Expression target = node.realTarget;
  +        if (target != null) {
  +          DartType targetType = target.bestType;
  +          if (targetType is InterfaceType &&
  +              (targetType.name == "CanvasElement")) {
  +            NodeList<Expression> arguments = node.argumentList.arguments;
  +            if (arguments.length == 1) {
  +              Expression argument = arguments[0];
  +              if (argument is StringLiteral) {
  +                String value = argument.stringValue;
  +                if ("2d" == value) {
  +                  PropertyAccessorElement getter =
  +                      targetType.element.getGetter("context2D");
  +                  if (getter != null) {
  +                    DartType returnType = getter.returnType;
  +                    if (returnType != null) {
  +                      _recordPropagatedType(node, returnType);
  +                      needPropagatedType = false;
  +                    }
                     }
                   }
                 }
  
positive.code:       ExecutableElement staticMethodElement = node.staticElement;
        DartType staticType = _computeArgumentType(staticMethodElement);
        _recordStaticType(node, staticType);
        MethodElement propagatedMethodElement = node.propagatedElement;
        if (!identical(propagatedMethodElement, staticMethodElement)) {
          DartType propagatedType = _computeArgumentType(propagatedMethodElement);
          _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
        }
      } else {
        ExecutableElement staticMethodElement = node.staticElement;
        DartType staticType = _computeStaticReturnType(staticMethodElement);
        _recordStaticType(node, staticType);
        MethodElement propagatedMethodElement = node.propagatedElement;
        if (!identical(propagatedMethodElement, staticMethodElement)) {
          DartType propagatedType =
              _computeStaticReturnType(propagatedMethodElement);
          _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
        }
      }
      return null;
  
negative.code:   Object visitNamedExpression(NamedExpression node) {
      Expression expression = node.expression;
      _recordStaticType(node, _getStaticType(expression));
      if (propagateTypes) {
        _resolver.recordPropagatedTypeIfBetter(node, expression.propagatedType);
      }
      return null;
    }
  
  