// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// Computes measurements about sends in a function.
library compiler.src.info.send_info;

import 'dart:convert';
import 'package:dart2js_info/src/measurements.dart';
import 'package:dart2js_info/src/util.dart' show recursiveDiagnosticString;

import '../diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
import '../diagnostics/messages.dart' show MessageKind;
import '../compiler.dart' show Compiler;
import '../common/tasks.dart' show CompilerTask;
import '../dart_types.dart';
import '../closure.dart';
import '../elements/elements.dart';
import '../elements/visitor.dart' show ElementVisitor;
import '../resolution/operators.dart';
import '../resolution/semantic_visitor.dart';
import '../resolution/send_resolver.dart';
import '../resolution/tree_elements.dart';
import '../constants/expressions.dart';
import '../parser/partial_elements.dart' show PartialElement;
import '../tree/tree.dart';
import '../universe/selector.dart' show Selector;
import '../universe/call_structure.dart' show CallStructure;

import 'analysis_result.dart';
import 'naive_analysis_result.dart';
import 'trusted_types_analysis_result.dart';

/// Collects a set of [Measurements] about send expressions in the function [f].
// TODO(sigmund): collect information on initializers too.
Measurements collectSendMeasurements(FunctionElement f,
                                     Compiler compiler) {
  DiagnosticReporter reporter = compiler.reporter;
  return reporter.withCurrentElement(f, () {
    // TODO(sigmund): enable for platform too.
    if (f.library.isPlatformLibrary) return null;
    var name = _qualifiedName(f);
    if (!f.hasNode) {
      if (f is PartialElement) return const Measurements.unreachableFunction();
      assert (f is ConstructorElement && f.isSynthesized);
      // TODO(sigmund): measure synthethic forwarding sends, measure
      // initializers
      return new Measurements.reachableFunction();
    }
    if (!f.hasResolvedAst) {
      _debug('no resolved ast ${f.runtimeType}');
      return null;
    }
    var resolvedAst = f.resolvedAst;
    if (resolvedAst.node == null) {
      _debug('no node ${f.runtimeType}');
      return null;
    }
    var def = resolvedAst.elements.getFunctionDefinition(resolvedAst.node);
    if (def == null) {
      assert (f is PartialElement);
      return const Measurements.unreachableFunction();
    }

    var visitor = new _StatsTraversalVisitor(
        compiler, resolvedAst.elements,
        reporter.spanFromSpannable(resolvedAst.node).uri);
    resolvedAst.node.accept(visitor);
    return visitor.measurements;
  });
}

_qualifiedName(FunctionElement f) {
  var cls = f.enclosingClass;
  return (cls != null) ? '${cls.name}.${f.name}' : f.name;
}

/// Visitor that categorizes data about an individual send.
class _StatsVisitor<T> extends Visitor
    with SendResolverMixin, SemanticSendResolvedMixin<dynamic, T>
    implements SemanticSendVisitor<dynamic, T> {

  // TODO(sigmund): consider passing in several AnalysisResults at once, so we
  // can compute the different metrics together.
  /// Information we know about the program from static analysis.
  final AnalysisResult info;

  /// Results from this function.
  final Measurements measurements;

  final DiagnosticReporter reporter;
  final TreeElements elements;

  SemanticSendVisitor<dynamic, T> get sendVisitor => this;

  _StatsVisitor(this.reporter, this.elements, this.info, Uri sourceUri)
      : measurements = new Measurements.reachableFunction(sourceUri);

  visitNode(Node node) => throw "unhandled ${node.runtimeType}: $node";
  apply(Node node, T arg) => throw "missing apply ${node.runtimeType}: $node";
  internalError(Node node, String arg) => throw "internal error on $node";

  visitSend(Send node) {
    _checkInvariant(node, 'before');
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.send, span.begin, span.end);
    if (node is SendSet) {
      if ((node.assignmentOperator != null &&
                node.assignmentOperator.source != '=') ||
            node.isPrefix ||
            node.isPostfix) {
        assert(!node.isIfNullAssignment);
        // We count get and set separately in case one of them is defined by the
        // other could be a nSM error.
        measurements.record(Metric.send, span.begin, span.end);
        measurements.record(Metric.send, span.begin, span.end);
      } else if (node.isIfNullAssignment) {
        measurements.record(Metric.send, span.begin, span.end);
      }
    }
    super.visitSend(node);
    _checkInvariant(node, 'after ');
  }

  visitNewExpression(NewExpression node) {
    _checkInvariant(node, 'before');
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.send, span.begin, span.end);
    super.visitNewExpression(node);
    _checkInvariant(node, 'after ');
  }

  /// A monomorphic local variable read.
  ///
  /// See [Metric.send] for a full categorization of sends.
  handleLocal(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.localSend, span.begin, span.end);
  }

  /// A monomorphic virual call on [node], where we know which function is the
  /// target of the call (for example, because only one type in a class
  /// hierarchy implements a function with a given name).
  ///
  /// See [Metric.send] for a full categorization of sends.
  handleSingleInstance(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.instanceSend, span.begin, span.end);
  }

  /// A monomorphic call that goes through an interceptor. This is equivalent in
  /// terms of what the compiler knows as we do with [handleSignleInstance], and
  /// because we know the target of the call, we also know that it doesn't live
  /// in the object instance, but on an interceptor on the side.
  ///
  /// See [Metric.send] for a full categorization of sends.
  handleSingleInterceptor(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.interceptorSend, span.begin, span.end);
  }

  /// A polymorphic call that goes through an interceptor.
  ///
  /// See [Metric.send] for a full categorization of sends.
  handleMultiInterceptor(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.polymorphicSend, span.begin, span.end);
    measurements.record(Metric.multiInterceptorSend, span.begin, span.end);
  }

  handleConstructor(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.constructorSend, span.begin, span.end);
  }

  handleDynamic(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.polymorphicSend, span.begin, span.end);
    measurements.record(Metric.dynamicSend, span.begin, span.end);
  }

  handleVirtual(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.polymorphicSend, span.begin, span.end);
    measurements.record(Metric.virtualSend, span.begin, span.end);
  }

  handleNSMError(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.nsmErrorSend, span.begin, span.end);
  }

  handleNSMSingle(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.singleNsmCallSend, span.begin, span.end);
  }

  handleNSMSuper(Node node, ClassElement type) {
    var superclass = type.superclass;
    var member = superclass.lookupMember('noSuchMethod');
    if (!member.enclosingClass.isObject) {
      handleNSMSingle(node);
    } else {
      handleNSMError(node);
    }
  }

  handleNSMAny(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.polymorphicSend, span.begin, span.end);
    measurements.record(Metric.multiNsmCallSend, span.begin, span.end);
  }

  handleSuper(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.superSend, span.begin, span.end);
  }
  handleTypeVariable(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.typeVariableSend, span.begin, span.end);
  }
  handleStatic(Node node) {
    var span = reporter.spanFromSpannable(node);
    measurements.record(Metric.monomorphicSend, span.begin, span.end);
    measurements.record(Metric.staticSend, span.begin, span.end);
  }

  handleNoSend(Node node) {
    measurements.popLast(Metric.send);
  }

  void handleDynamicProperty(Node node, Node receiver, Selector selector) {
    // staticSend: no (automatically)
    // superSend: no (automatically)
    // localSend: no (automatically)
    // constructorSend: no (automatically)
    // typeVariableSend: no (automatically)

    // nsmErrorSend:      receiver has no `selector` nor nSM.
    // singleNsmCallSend: receiver has no `selector`, but definitely has `nSM`
    // instanceSend:      receiver has `selector`, no need to use an interceptor
    // interceptorSend:   receiver has `selector`, but we know we need an
    //                    interceptor to get it

    // multiNsmCallSend:  receiver has no `selector`, not sure if receiver has
    //                    nSM, or not sure which nSM is called (does this one
    //                    matter, or does nSM is treated like an instance method
    //                    call)?
    // virtualSend:       receiver has `selector`, we know we do not need an
    //                    interceptor, not sure which specific type implements
    //                    the selector.
    // multiInterceptorSend: multiple possible receiver types, all using an
    //                       interceptor to get the `selector`, might be
    //                       possbile to pick a special selector logic for this
    //                       combination?
    // dynamicSend: any combination of the above.

    ReceiverInfo receiverInfo = info.infoForReceiver(receiver);
    SelectorInfo selectorInfo = info.infoForSelector(receiver, selector);
    Boolish hasSelector = selectorInfo.exists;
    Boolish hasNsm = receiverInfo.hasNoSuchMethod;

    if (hasSelector == Boolish.no) {
      if (hasNsm == Boolish.no) {
        handleNSMError(node);
      } else if (hasNsm == Boolish.yes) {
        if (receiverInfo.possibleNsmTargets == 1) {
          handleNSMSingle(node);
        } else {
          handleNSMAny(node);
        }
      } else {
        handleDynamic(node);
      }
      return;
    }

    Boolish usesInterceptor = selectorInfo.usesInterceptor;
    if (hasSelector == Boolish.yes) {
      if (selectorInfo.isAccurate && selectorInfo.possibleTargets == 1) {
        assert (usesInterceptor != Boolish.maybe);
        if (usesInterceptor == Boolish.yes) {
          handleSingleInterceptor(node);
        } else {
          handleSingleInstance(node);
        }
      } else {
        if (usesInterceptor == Boolish.no) {
          handleVirtual(node);
        } else if (usesInterceptor == Boolish.yes) {
          handleMultiInterceptor(node);
        } else {
          handleDynamic(node);
        }
      }
      return;
    }
    handleDynamic(node);
  }

  void handleThisProperty(Send node, Selector selector) {
    handleDynamicProperty(node, node.receiver, selector);
  }

  void handleIndex(Node node) {
    handleDynamic(node);
  }

  void handleOperator(Node node) {
    handleDynamic(node);
  }

  void handleInvoke(Node node) {
    handleDynamic(node);
  }

  void handleEquals(Node node) {
    handleDynamic(node);
  }

  // Constructors

  void visitAbstractClassConstructorInvoke(NewExpression node,
      ConstructorElement element, InterfaceType type, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleConstructor(node);
  }

  void visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
      BoolFromEnvironmentConstantExpression constant, T arg) {
    handleConstructor(node);
  }

  void visitConstConstructorInvoke(
      NewExpression node, ConstructedConstantExpression constant, T arg) {
    handleConstructor(node);
  }

  void visitGenerativeConstructorInvoke(NewExpression node,
      ConstructorElement constructor, InterfaceType type, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleConstructor(node);
  }

  void visitIntFromEnvironmentConstructorInvoke(NewExpression node,
      IntFromEnvironmentConstantExpression constant, T arg) {
    handleConstructor(node);
  }

  void visitRedirectingFactoryConstructorInvoke(NewExpression node,
      ConstructorElement constructor, InterfaceType type,
      ConstructorElement effectiveTarget, InterfaceType effectiveTargetType,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleConstructor(node);
  }

  void visitRedirectingGenerativeConstructorInvoke(NewExpression node,
      ConstructorElement constructor, InterfaceType type, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleConstructor(node);
  }

  void visitStringFromEnvironmentConstructorInvoke(NewExpression node,
      StringFromEnvironmentConstantExpression constant, T arg) {
    handleConstructor(node);
  }

  // Dynamic sends


  // TODO(sigmund): many many things to add:
  // -- support for operators, indexers, etc.
  // -- logic about nullables
  // -- int, JSArray
  // -- all interceptors

  void visitBinary(
      Send node, Node left, BinaryOperator operator, Node right, T arg) {
    handleOperator(node);
  }

  void visitCompoundIndexSet(SendSet node, Node receiver, Node index,
      AssignmentOperator operator, Node rhs, T arg) {
    handleIndex(node); // t1 = receiver[index]
    handleOperator(node); // t2 = t1 op rhs
    handleIndex(node); // receiver[index] = t2
  }

  void visitDynamicPropertyCompound(Send node, Node receiver,
      Name name, AssignmentOperator operator, Node rhs, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleOperator(node);
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }


  void visitDynamicPropertyGet(
      Send node, Node receiver, Name name, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
  }

  void visitDynamicPropertyInvoke(
      Send node, Node receiver, NodeList arguments, Selector selector, T arg) {
    handleDynamicProperty(node, receiver, selector);
  }

  void visitDynamicPropertyPostfix(Send node, Node receiver,
       Name name, IncDecOperator operator, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleOperator(node);
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitDynamicPropertyPrefix(Send node, Node receiver, Name name,
      IncDecOperator operator, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleOperator(node);
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitDynamicPropertySet(
      SendSet node, Node receiver, Name name, Node rhs, T arg) {
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitDynamicPropertySetIfNull(
      Send node, Node receiver, Name name, Node rhs, T arg) {
    // read to check for null?
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitEquals(Send node, Node left, Node right, T arg) {
    handleEquals(node);
  }

  void visitExpressionInvoke(Send node, Node expression, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitIfNotNullDynamicPropertyCompound(Send node, Node receiver,
      Name name, AssignmentOperator operator, Node rhs, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleOperator(node);
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitIfNotNullDynamicPropertyGet(
      Send node, Node receiver, Name name, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
  }

  void visitIfNotNullDynamicPropertyInvoke(
      Send node, Node receiver, NodeList arguments, Selector selector, T arg) {
    handleDynamicProperty(node, receiver, selector);
  }

  void visitIfNotNullDynamicPropertyPostfix(Send node, Node receiver, Name name,
      IncDecOperator operator, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleOperator(node);
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitIfNotNullDynamicPropertyPrefix(Send node, Node receiver, Name name,
      IncDecOperator operator, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleOperator(node);
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitIfNotNullDynamicPropertySet(
      SendSet node, Node receiver, Name name, Node rhs, T arg) {
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitIfNotNullDynamicPropertySetIfNull(
      Send node, Node receiver, Name name, Node rhs, T arg) {
    handleDynamicProperty(node, receiver, new Selector.getter(name));
    handleDynamicProperty(node, receiver, new Selector.setter(name));
  }

  void visitIndex(Send node, Node receiver, Node index, T arg) {
    handleIndex(node);
  }

  void visitIndexPostfix(
      Send node, Node receiver, Node index, IncDecOperator operator, T arg) {
    handleIndex(node);
    handleOperator(node);
    handleIndex(node);
  }

  void visitIndexPrefix(
      Send node, Node receiver, Node index, IncDecOperator operator, T arg) {
    handleIndex(node);
    handleOperator(node);
    handleIndex(node);
  }

  void visitIndexSet(SendSet node, Node receiver, Node index, Node rhs, T arg) {
    handleIndex(node);
  }

  void visitLocalVariableCompound(Send node, LocalVariableElement variable,
      AssignmentOperator operator, Node rhs, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleLocal(node);
  }

  void visitLocalVariableInvoke(Send node, LocalVariableElement variable,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitLocalVariablePostfix(Send node, LocalVariableElement variable,
      IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleLocal(node);
  }

  void visitLocalVariablePrefix(Send node, LocalVariableElement variable,
      IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleLocal(node);
  }

  void visitNotEquals(Send node, Node left, Node right, T arg) {
    handleEquals(node);
  }

  void visitParameterCompound(Send node, ParameterElement parameter,
      AssignmentOperator operator, Node rhs, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleLocal(node);
  }

  void visitParameterInvoke(Send node, ParameterElement parameter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitParameterPostfix(
      Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleLocal(node);
  }

  void visitParameterPrefix(
      Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleLocal(node);
  }

  void visitStaticFieldCompound(Send node, FieldElement field,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitStaticFieldPostfix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitStaticFieldPrefix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitStaticGetterInvoke(Send node, FunctionElement getter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitStaticGetterSetterCompound(Send node, FunctionElement getter,
      FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitSuperFieldCompound(Send node, FieldElement field,
      AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldFieldCompound(Send node, FieldElement readField,
      FieldElement writtenField, AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldFieldPostfix(Send node, FieldElement readField,
      FieldElement writtenField, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldFieldPrefix(Send node, FieldElement readField,
      FieldElement writtenField, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldFieldSetIfNull(
      Send node, FieldElement readField, FieldElement writtenField, Node rhs,
      T arg) {
    handleSuper(node);
    handleNSMSuper(node, readField.enclosingClass);
  }

  void visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitSuperFieldPostfix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldPrefix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldSetterCompound(Send node, FieldElement field,
      FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldSetterPostfix(Send node, FieldElement field,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldSetterPrefix(Send node, FieldElement field,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperFieldSetterSetIfNull(Send node, FieldElement field,
      FunctionElement setter, Node rhs, T arg) {
    handleSuper(node);
    handleSuper(node);
  }

  void visitSuperGetterFieldCompound(Send node, FunctionElement getter,
      FieldElement field, AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
      FieldElement field, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
      FieldElement field, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperGetterFieldSetIfNull(Send node, FunctionElement getter,
      FieldElement field, Node rhs, T arg) {
    handleSuper(node);
    handleSuper(node);
  }

  void visitSuperGetterInvoke(Send node, FunctionElement getter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitSuperGetterSetterCompound(Send node, FunctionElement getter,
      FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
      FunctionElement setter, Node rhs, T arg) {
    handleSuper(node);
    handleSuper(node);
  }

  void visitSuperIndexPostfix(Send node, MethodElement indexFunction,
      MethodElement indexSetFunction, Node index, IncDecOperator operator,
      T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperIndexPrefix(Send node, MethodElement indexFunction,
      MethodElement indexSetFunction, Node index, IncDecOperator operator,
      T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitSuperMethodSetterCompound(Send node, FunctionElement method,
      FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleNSMSuper(node, method.enclosingClass);
    handleSuper(node);
  }

  void visitSuperMethodSetterPostfix(Send node, FunctionElement method,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleNSMSuper(node, method.enclosingClass);
    handleSuper(node);
  }

  void visitSuperMethodSetterPrefix(Send node, FunctionElement method,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleNSMSuper(node, method.enclosingClass);
    handleSuper(node);
  }

  void visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
      FunctionElement setter, Node rhs, T arg) {
    handleSuper(node);
    handleSuper(node);
  }

  void visitThisPropertyCompound(Send node, Name name,
      AssignmentOperator operator, Node rhs, T arg) {
    handleThisProperty(node, new Selector.getter(name));
    handleOperator(node);
    handleThisProperty(node, new Selector.setter(name));
  }

  void visitThisPropertyInvoke(
      Send node, NodeList arguments, Selector selector, T arg) {
    handleThisProperty(node, selector);
  }

  void visitThisPropertyPostfix(Send node, Name name, IncDecOperator operator,
      T arg) {
    handleThisProperty(node, new Selector.getter(name));
    handleOperator(node);
    handleThisProperty(node, new Selector.setter(name));
  }

  void visitThisPropertyPrefix(Send node, Name name, IncDecOperator operator,
      T arg) {
    handleThisProperty(node, new Selector.getter(name));
    handleOperator(node);
    handleThisProperty(node, new Selector.setter(name));
  }

  void visitTopLevelFieldCompound(Send node, FieldElement field,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitTopLevelFieldInvoke(Send node, FieldElement field,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitTopLevelFieldPostfix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitTopLevelFieldPrefix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitTopLevelGetterInvoke(Send node, FunctionElement getter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleInvoke(node);
  }

  void visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
      FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleStatic(node);
  }

  void visitUnary(Send node, UnaryOperator operator, Node expression, T arg) {
    handleDynamic(node);
  }

  // Local variable sends

  void visitLocalFunctionGet(Send node, LocalFunctionElement function, T arg) {
    handleLocal(node);
  }

  void visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleLocal(node);
  }

  void visitLocalVariableGet(Send node, LocalVariableElement variable, T arg) {
    handleLocal(node);
  }

  void visitLocalVariableSet(
      SendSet node, LocalVariableElement variable, Node rhs, T arg) {
    handleLocal(node);
  }

  void visitLocalVariableSetIfNull(
      SendSet node, LocalVariableElement variable, Node rhs, T arg) {
    handleLocal(node);
    handleLocal(node);
  }

  void visitParameterGet(Send node, ParameterElement parameter, T arg) {
    handleLocal(node);
  }

  void visitParameterSet(
      SendSet node, ParameterElement parameter, Node rhs, T arg) {
    handleLocal(node);
  }

  void visitParameterSetIfNull(
      Send node, ParameterElement parameter, Node rhs, T arg) {
    handleLocal(node);
    handleLocal(node);
  }

  // Super monomorphic sends

  void visitSuperBinary(Send node, FunctionElement function,
      BinaryOperator operator, Node argument, T arg) {
    handleSuper(node);
  }

  void visitSuperEquals(
      Send node, FunctionElement function, Node argument, T arg) {
    handleSuper(node);
  }

  void visitSuperFieldGet(Send node, FieldElement field, T arg) {
    handleSuper(node);
  }

  void visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, T arg) {
    handleSuper(node);
  }

  void visitSuperFieldSetIfNull(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleSuper(node);
    handleSuper(node);
  }

  void visitSuperGetterGet(Send node, FunctionElement getter, T arg) {
    handleSuper(node);
  }

  void visitSuperGetterSet(
      SendSet node, FunctionElement getter, Node rhs, T arg) {
    handleSuper(node);
  }

  void visitSuperIndex(Send node, FunctionElement function, Node index, T arg) {
    handleSuper(node);
  }

  void visitSuperIndexSet(
      SendSet node, FunctionElement function, Node index, Node rhs, T arg) {
    handleSuper(node);
  }

  void visitSuperMethodGet(Send node, MethodElement method, T arg) {
    handleSuper(node);
  }

  void visitSuperMethodInvoke(Send node, MethodElement method,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleSuper(node);
  }

  void visitSuperNotEquals(
      Send node, FunctionElement function, Node argument, T arg) {
    handleSuper(node);
  }

  void visitSuperSetterSet(
      SendSet node, FunctionElement setter, Node rhs, T arg) {
    handleSuper(node);
  }

  void visitSuperUnary(
      Send node, UnaryOperator operator, FunctionElement function, T arg) {
    handleSuper(node);
  }

  // Statically known "no such method" sends

  void visitConstructorIncompatibleInvoke(NewExpression node,
      ConstructorElement constructor, InterfaceType type, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
      AssignmentOperator operator, Node rhs, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalLocalVariablePostfix(Send node, LocalVariableElement variable,
      IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalLocalVariablePrefix(Send node, LocalVariableElement variable,
      IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalLocalVariableSet(
      SendSet node, LocalVariableElement variable, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitFinalLocalVariableSetIfNull(
      SendSet node, LocalVariableElement variable, Node rhs, T arg) {
    handleLocal(node); // read for null
    handleNSMError(node); // set fails
  }

  void visitFinalParameterCompound(Send node, ParameterElement parameter,
      AssignmentOperator operator, Node rhs, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalParameterPostfix(
      Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalParameterPrefix(
      Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
    handleLocal(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalParameterSet(
      SendSet node, ParameterElement parameter, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitFinalParameterSetIfNull(
      SendSet node, ParameterElement parameter, Node rhs, T arg) {
    handleLocal(node);
    handleNSMError(node);
  }

  void visitFinalStaticFieldCompound(Send node, FieldElement field,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalStaticFieldPostfix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalStaticFieldPrefix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalStaticFieldSet(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitFinalStaticFieldSetIfNull(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitFinalSuperFieldSetIfNull(Send node, FieldElement field,
      Node rhs, T arg) {
    handleSuper(node);
    handleNSMSuper(node, field.enclosingClass);
  }

  void visitFinalSuperFieldCompound(Send node, FieldElement field,
      AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, field.enclosingClass);
  }

  void visitFinalSuperFieldPostfix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, field.enclosingClass);
  }

  void visitFinalSuperFieldPrefix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, field.enclosingClass);
  }

  void visitFinalSuperFieldSet(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleNSMSuper(node, field.enclosingClass);
  }

  void visitFinalTopLevelFieldCompound(Send node, FieldElement field,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalTopLevelFieldPostfix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalTopLevelFieldPrefix(
      Send node, FieldElement field, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleOperator(node);
    handleNSMError(node);
  }

  void visitFinalTopLevelFieldSet(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitFinalTopLevelFieldSetIfNull(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
      FunctionElement setter, Node rhs, T arg) {
    handleStatic(node);
    handleStatic(node);
  }

  void visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
      FunctionElement setter, Node rhs, T arg) {
    handleStatic(node);
    handleStatic(node);
  }

  void visitTopLevelMethodSetIfNull(Send node, FunctionElement method,
      Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitLocalFunctionIncompatibleInvoke(Send node,
      LocalFunctionElement function, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitLocalFunctionCompound(Send node, LocalFunctionElement function,
      AssignmentOperator operator, Node rhs, T arg) {
    handleLocal(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitLocalFunctionPostfix(Send node, LocalFunctionElement function,
      IncDecOperator operator, T arg) {
    handleLocal(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitLocalFunctionPrefix(Send node, LocalFunctionElement function,
      IncDecOperator operator, T arg) {
    handleLocal(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitLocalFunctionSet(
      SendSet node, LocalFunctionElement function, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitLocalFunctionSetIfNull(
      SendSet node, LocalFunctionElement function, Node rhs, T arg) {
    handleLocal(node);
    handleNSMError(node);
  }

  void visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitStaticFunctionSet(
      Send node, MethodElement function, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitStaticMethodCompound(Send node, MethodElement method,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node); // operator on a method closure yields nSM
    handleNoSend(node); // setter is not invoked, don't count it.
  }

  void visitStaticMethodPostfix(
      Send node, MethodElement method, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitStaticMethodPrefix(
      Send node, MethodElement method, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitStaticMethodSetterCompound(Send node, MethodElement method,
      MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node); // operator on a method closure yields nSM
    handleNoSend(node); // setter is not invoked, don't count it.
  }

  void visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitStaticSetterGet(Send node, FunctionElement setter, T arg) {
    handleNSMError(node);
  }

  void visitStaticSetterInvoke(Send node, FunctionElement setter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitSuperMethodCompound(Send node, FunctionElement method,
      AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);

    // An operator send on a method closure yields nSM
    handleNSMSuper(node, method.enclosingClass);

    handleNoSend(node); // setter is not invoked, don't count it.
  }

  void visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMSuper(node, method.enclosingClass);
  }

  void visitSuperMethodPostfix(
      Send node, FunctionElement method, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleNSMSuper(node, method.enclosingClass);
    handleNoSend(node);
  }

  void visitSuperMethodPrefix(
      Send node, FunctionElement method, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleNSMSuper(node, method.enclosingClass);
    handleNoSend(node);
  }

  void visitSuperMethodSet(Send node, MethodElement method, Node rhs, T arg) {
    handleNSMSuper(node, method.enclosingClass);
  }

  void visitSuperMethodSetIfNull(
      Send node, MethodElement method, Node rhs, T arg) {
    handleNSMSuper(node, method.enclosingClass);
  }

  void visitSuperSetterGet(Send node, FunctionElement setter, T arg) {
    handleNSMSuper(node, setter.enclosingClass);
  }

  void visitSuperSetterInvoke(Send node, FunctionElement setter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMSuper(node, setter.enclosingClass);
  }

  void visitTopLevelFunctionIncompatibleInvoke(Send node,
      MethodElement function, NodeList arguments, CallStructure callStructure,
      T arg) {
    handleNSMError(node);
  }

  void visitTopLevelFunctionSet(
      Send node, MethodElement function, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitTopLevelGetterSet(
      SendSet node, FunctionElement getter, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitTopLevelMethodCompound(Send node, FunctionElement method,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node); // operator on a method closure yields nSM
    handleNoSend(node); // setter is not invoked, don't count it.
  }

  void visitTopLevelMethodPostfix(
      Send node, MethodElement method, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTopLevelMethodPrefix(
      Send node, MethodElement method, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
      FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node); // operator on a method closure yields nSM
    handleNoSend(node); // setter is not invoked, don't count it.
  }

  void visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
      FunctionElement setter, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTopLevelSetterGet(Send node, FunctionElement setter, T arg) {
    handleNSMError(node);
  }

  void visitTopLevelSetterInvoke(Send node, FunctionElement setter,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitTypeVariableTypeLiteralCompound(Send node,
      TypeVariableElement element, AssignmentOperator operator, Node rhs,
      T arg) {
    handleTypeVariable(node);
    handleNSMError(node); // operator on a method closure yields nSM
    handleNoSend(node); // setter is not invoked, don't count it.
  }

  void visitTypeVariableTypeLiteralGet(
      Send node, TypeVariableElement element, T arg) {
    handleTypeVariable(node);
  }

  void visitTypeVariableTypeLiteralInvoke(Send node,
      TypeVariableElement element, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitTypeVariableTypeLiteralPostfix(
      Send node, TypeVariableElement element, IncDecOperator operator, T arg) {
    handleTypeVariable(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTypeVariableTypeLiteralPrefix(
      Send node, TypeVariableElement element, IncDecOperator operator, T arg) {
    handleTypeVariable(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTypeVariableTypeLiteralSet(
      SendSet node, TypeVariableElement element, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitTypeVariableTypeLiteralSetIfNull(
      SendSet node, TypeVariableElement element, Node rhs, T arg) {
    handleTypeVariable(node);
    handleNSMError(node);
  }

  void visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
      AssignmentOperator operator, Node rhs, T arg) {
    handleTypeVariable(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTypedefTypeLiteralGet(
      Send node, ConstantExpression constant, T arg) {
    handleTypeVariable(node);
  }

  void visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitTypedefTypeLiteralPostfix(
      Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
    handleTypeVariable(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTypedefTypeLiteralPrefix(
      Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
    handleTypeVariable(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitTypedefTypeLiteralSet(
      SendSet node, ConstantExpression constant, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitTypedefTypeLiteralSetIfNull(
      SendSet node, ConstantExpression constant, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitUnresolvedClassConstructorInvoke(NewExpression node,
      Element element, DartType type, NodeList arguments, Selector selector,
      T arg) {
    handleNSMError(node);
  }

  void visitUnresolvedCompound(Send node, Element element,
      AssignmentOperator operator, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
      DartType type, NodeList arguments, Selector selector, T arg) {
    handleNSMError(node);
  }

  void visitUnresolvedGet(Send node, Element element, T arg) {
    handleNSMError(node);
  }

  void visitUnresolvedInvoke(Send node, Element element, NodeList arguments,
      Selector selector, T arg) {
    handleNSMError(node);
  }

  void visitUnresolvedPostfix(
      Send node, Element element, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedPrefix(
      Send node, Element element, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedRedirectingFactoryConstructorInvoke(NewExpression node,
      ConstructorElement constructor, InterfaceType type, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitUnresolvedSet(Send node, Element element, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitUnresolvedSetIfNull(Send node, Element element, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticGetterCompound(Send node, Element element,
      MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticGetterPostfix(Send node, Element element,
      MethodElement setter, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticGetterPrefix(Send node, Element element,
      MethodElement setter, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticGetterSetIfNull(Send node, Element element,
      MethodElement setter, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
      Element element, AssignmentOperator operator, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
      Element element, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
      Element element, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedStaticSetterSetIfNull(Send node, MethodElement getter,
      Element element, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitUnresolvedSuperBinary(Send node, Element element,
      BinaryOperator operator, Node argument, T arg) {
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperCompound(Send node, Element element,
      AssignmentOperator operator, Node rhs, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    // TODO(sigmund): we should only count the next 2 if we know that the
    // superclass has a nSM method.
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperCompoundIndexSet(Send node, Element element,
      Node index, AssignmentOperator operator, Node rhs, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleNoSend(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperGet(Send node, Element element, T arg) {
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetIfNull(
      Send node, Element element, Node rhs, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleNoSend(node);
  }

  void visitUnresolvedSuperGetterCompound(Send node, Element element,
      MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleSuper(node);
  }

  void visitUnresolvedSuperGetterCompoundIndexSet(Send node, Element element,
      MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
      T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleSuper(node);
  }

  void visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
      MethodElement setter, Node index, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleSuper(node);
  }

  void visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
      MethodElement setter, Node index, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleSuper(node);
  }

  void visitUnresolvedSuperGetterPostfix(Send node, Element element,
      MethodElement setter, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleSuper(node);
  }

  void visitUnresolvedSuperGetterPrefix(Send node, Element element,
      MethodElement setter, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleSuper(node);
  }

  void visitUnresolvedSuperGetterSetIfNull(Send node, Element element,
      MethodElement setter, Node rhs, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleSuper(node);
  }

  void visitUnresolvedSuperIndex(
      Send node, Element element, Node index, T arg) {
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperIndexPostfix(
      Send node, Element element, Node index, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperIndexPrefix(
      Send node, Element element, Node index, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperIndexSet(
      Send node, Element element, Node index, Node rhs, T arg) {
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperInvoke(Send node, Element element,
      NodeList arguments, Selector selector, T arg) {
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperPostfix(
      Send node, Element element, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperPrefix(
      Send node, Element element, IncDecOperator operator, T arg) {
    handleNSMSuper(node, element.enclosingClass);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
      Element element, AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterCompoundIndexSet(Send node,
      MethodElement getter, Element element, Node index,
      AssignmentOperator operator, Node rhs, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterIndexPostfix(Send node,
      MethodElement indexFunction, Element element, Node index,
      IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterIndexPrefix(Send node,
      MethodElement indexFunction, Element element, Node index,
      IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
      Element element, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
      Element element, IncDecOperator operator, T arg) {
    handleSuper(node);
    handleOperator(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperSetterSetIfNull(Send node, MethodElement getter,
      Element element, Node rhs, T arg) {
    handleSuper(node);
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedSuperUnary(
      Send node, UnaryOperator operator, Element element, T arg) {
    handleNSMSuper(node, element.enclosingClass);
  }

  void visitUnresolvedTopLevelGetterCompound(Send node, Element element,
      MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
      MethodElement setter, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
      MethodElement setter, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelGetterSetIfNull(Send node, Element element,
      MethodElement setter, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
      Element element, AssignmentOperator operator, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
      Element element, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
      Element element, IncDecOperator operator, T arg) {
    handleNSMError(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void visitUnresolvedTopLevelSetterSetIfNull(Send node, MethodElement getter,
      Element element, Node rhs, T arg) {
    handleNSMError(node);
    handleNoSend(node);
  }

  // Static

  void visitConstantGet(Send node, ConstantExpression constant, T arg) {
    handleStatic(node);
  }

  void visitConstantInvoke(Send node, ConstantExpression constant,
      NodeList arguments, CallStructure callStreucture, T arg) {
    handleStatic(node);
  }

  void visitFactoryConstructorInvoke(NewExpression node,
      ConstructorElement constructor, InterfaceType type, NodeList arguments,
      CallStructure callStructure, T arg) {
    handleStatic(node);
  }

  void visitStaticFieldGet(Send node, FieldElement field, T arg) {
    handleStatic(node);
  }

  void visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, T arg) {
    handleStatic(node);
  }

  void visitStaticFieldSetIfNull(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleStatic(node);
    handleStatic(node);
  }

  void visitStaticFunctionGet(Send node, MethodElement function, T arg) {
    handleStatic(node);
  }

  void visitStaticFunctionInvoke(Send node, MethodElement function,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleStatic(node);
  }

  void visitStaticGetterGet(Send node, FunctionElement getter, T arg) {
    handleStatic(node);
  }

  void visitStaticGetterSet(
      SendSet node, FunctionElement getter, Node rhs, T arg) {
    handleStatic(node);
  }

  void visitStaticSetterSet(
      SendSet node, FunctionElement setter, Node rhs, T arg) {
    handleStatic(node);
  }

  void visitStaticGetterSetterSetIfNull(
      Send node,
      FunctionElement getter,
      FunctionElement setter,
      Node rhs,
      T arg) {
    handleStatic(node);
    handleStatic(node);
  }

  void visitStaticMethodSetterSetIfNull(
      Send node,
      MethodElement method,
      MethodElement setter,
      Node rhs,
      T arg) {
    handleStatic(node);
    handleStatic(node);
  }

  void visitStaticMethodSetIfNull(
      Send node,
      FunctionElement method,
      Node rhs,
      T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitTopLevelFieldGet(Send node, FieldElement field, T arg) {
    handleStatic(node);
  }

  void visitTopLevelFieldSet(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleStatic(node);
  }

  void visitTopLevelFieldSetIfNull(
      SendSet node, FieldElement field, Node rhs, T arg) {
    handleStatic(node);
    handleStatic(node);
  }

  void visitTopLevelFunctionGet(Send node, MethodElement function, T arg) {
    handleStatic(node);
  }

  void visitTopLevelFunctionInvoke(Send node, MethodElement function,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleStatic(node);
  }

  void visitTopLevelGetterGet(Send node, FunctionElement getter, T arg) {
    handleStatic(node);
  }

  void visitTopLevelSetterSet(
      SendSet node, FunctionElement setter, Node rhs, T arg) {
    handleStatic(node);
  }

  // Virtual

  void visitSuperCompoundIndexSet(SendSet node, MethodElement getter,
      MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
      T arg) {
    handleSuper(node);
    handleOperator(node);
    handleSuper(node);
  }

  void visitThisGet(Identifier node, T arg) {
    handleLocal(node); // TODO(sigmund): should we add a metric for "this"?
  }

  void visitThisInvoke(
      Send node, NodeList arguments, CallStructure callStructure, T arg) {
    // TODO(sigmund): implement (treat like this.call())
    handleDynamic(node);
  }

  void visitThisPropertyGet(Send node, Name name, T arg) {
    handleThisProperty(node, new Selector.getter(name));
  }

  void visitThisPropertySet(SendSet node, Name name, Node rhs, T arg) {
    handleThisProperty(node, new Selector.setter(name));
  }

  void visitThisPropertySetIfNull(Send node, Name name, Node rhs, T arg) {
    handleThisProperty(node, new Selector.getter(name));
    handleThisProperty(node, new Selector.setter(name));
  }

  // Not count

  void errorNonConstantConstructorInvoke(NewExpression node, Element element,
      DartType type, NodeList arguments, CallStructure callStructure, T arg) {
    handleNoSend(node);
  }

  void errorUndefinedBinaryExpression(
      Send node, Node left, Operator operator, Node right, T arg) {
    handleNoSend(node);
  }

  void errorUndefinedUnaryExpression(
      Send node, Operator operator, Node expression, T arg) {
    handleNoSend(node);
  }

  void errorInvalidGet(
      Send node,
      ErroneousElement error,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidInvoke(
      Send node,
      ErroneousElement error,
      NodeList arguments,
      Selector selector,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidSet(
      Send node,
      ErroneousElement error,
      Node rhs,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidSetIfNull(
      Send node, ErroneousElement error, Node rhs, T arg) {
    handleNoSend(node);
    handleNoSend(node);
  }


  void errorInvalidPrefix(
      Send node,
      ErroneousElement error,
      IncDecOperator operator,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidPostfix(
      Send node,
      ErroneousElement error,
      IncDecOperator operator,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidCompound(
      Send node,
      ErroneousElement error,
      AssignmentOperator operator,
      Node rhs,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidUnary(
      Send node,
      UnaryOperator operator,
      ErroneousElement error,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidEquals(
      Send node,
      ErroneousElement error,
      Node right,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidNotEquals(
      Send node,
      ErroneousElement error,
      Node right,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidBinary(
      Send node,
      ErroneousElement error,
      BinaryOperator operator,
      Node right,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidIndex(
      Send node,
      ErroneousElement error,
      Node index,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidIndexSet(
      Send node,
      ErroneousElement error,
      Node index,
      Node rhs,
      T arg) {
    handleNoSend(node);
  }

  void errorInvalidCompoundIndexSet(
      Send node,
      ErroneousElement error,
      Node index,
      AssignmentOperator operator,
      Node rhs,
      T arg) {
    handleNoSend(node);
    handleNoSend(node);
    handleNoSend(node);
  }

  void errorInvalidIndexPrefix(
      Send node,
      ErroneousElement error,
      Node index,
      IncDecOperator operator,
      T arg) {
    handleNoSend(node);
    handleNoSend(node);
  }

  void errorInvalidIndexPostfix(
      Send node,
      ErroneousElement error,
      Node index,
      IncDecOperator operator,
      T arg) {
    handleNoSend(node);
    handleNoSend(node);
  }

  void previsitDeferredAccess(
      Send node,
      PrefixElement prefix,
      T arg) {
  }


  void visitAs(Send node, Node expression, DartType type, T arg) {
    handleNoSend(node);
  }

  void visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitClassTypeLiteralGet(Send node, ConstantExpression constant, T arg) {
    handleStatic(node);
  }

  void visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitClassTypeLiteralPostfix(
      Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitClassTypeLiteralPrefix(
      Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitClassTypeLiteralSet(
      SendSet node, ConstantExpression constant, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitClassTypeLiteralSetIfNull(
      SendSet node, ConstantExpression constant, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
      AssignmentOperator operator, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitDynamicTypeLiteralGet(
      Send node, ConstantExpression constant, T arg) {
    handleNSMError(node);
  }

  void visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
      NodeList arguments, CallStructure callStructure, T arg) {
    handleNSMError(node);
  }

  void visitDynamicTypeLiteralPostfix(
      Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitDynamicTypeLiteralPrefix(
      Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
    handleStatic(node);
    handleNSMError(node);
    handleNoSend(node);
  }

  void visitDynamicTypeLiteralSet(
      SendSet node, ConstantExpression constant, Node rhs, T arg) {
    handleNSMError(node);
  }

  void visitDynamicTypeLiteralSetIfNull(
      SendSet node, ConstantExpression constant, Node rhs, T arg) {
    handleStatic(node);
    handleNSMError(node);
  }

  void visitIfNull(Send node, Node left, Node right, T arg) {
    handleNoSend(node);
  }

  void visitIs(Send node, Node expression, DartType type, T arg) {
    handleNoSend(node);
  }

  void visitIsNot(Send node, Node expression, DartType type, T arg) {
    handleNoSend(node);
  }

  void visitLogicalAnd(Send node, Node left, Node right, T arg) {
    handleNoSend(node);
  }

  void visitLogicalOr(Send node, Node left, Node right, T arg) {
    handleNoSend(node);
  }

  void visitNot(Send node, Node expression, T arg) {
    handleNoSend(node);
  }

  String last;
  _checkInvariant(node, String msg) {
    msg = '$msg ${recursiveDiagnosticString(measurements, Metric.send)}';
    if (!measurements.checkInvariant(Metric.send) ||
        !measurements.checkInvariant(Metric.monomorphicSend) ||
        !measurements.checkInvariant(Metric.polymorphicSend)) {
      reporter.reportErrorMessage(node,
          MessageKind.GENERIC, {'text': 'bad\n-- $msg\nlast:\n-- $last\n'});
      last = msg;
    } else {
      last = msg;
    }
  }
}

/// Visitor that collects statistics for a single function.
class _StatsTraversalVisitor<T> extends TraversalVisitor<dynamic, T>
    implements SemanticSendVisitor<dynamic, T> {
  final DiagnosticReporter reporter;
  final _StatsVisitor statsVisitor;
  Measurements get measurements => statsVisitor.measurements;
  _StatsTraversalVisitor(
      Compiler compiler, TreeElements elements, Uri sourceUri)
      : reporter = compiler.reporter,
        statsVisitor = new _StatsVisitor(compiler.reporter, elements,
            // TODO(sigmund): accept a list of analyses, so we can compare them
            // together.
            true
            ? new TrustTypesAnalysisResult(elements, compiler.world)
            : new NaiveAnalysisResult(),
            sourceUri),
        super(elements);

  void visitSend(Send node) {
    try {
      node.accept(statsVisitor);
    } catch (e, t) {
      reporter.reportErrorMessage(
          node, MessageKind.GENERIC, {'text': '$e\n$t'});
    }
    super.visitSend(node);
  }

  void visitNewExpression(NewExpression node) {
    try {
      node.accept(statsVisitor);
    } catch (e, t) {
      reporter.reportErrorMessage(
          node, MessageKind.GENERIC, {'text': '$e\n$t'});
    }
    super.visitNewExpression(node);
  }
}

/// Helper to visit elements recursively
// TODO(sigmund): maybe generalize and move to elements/visitor.dart?
abstract class RecursiveElementVisitor<R, A> extends ElementVisitor<R, A> {

  @override
  R visitWarnOnUseElement(WarnOnUseElement e, A arg) =>
      e.wrappedElement.accept(this, arg);

  R visitScopeContainerElement(ScopeContainerElement e, A arg) {
    e.forEachLocalMember((l) => l.accept(this, arg));
    return null;
  }

  @override
  R visitCompilationUnitElement(CompilationUnitElement e, A arg) {
    e.forEachLocalMember((l) => l.accept(this, arg));
    return null;
  }

  @override
  R visitLibraryElement(LibraryElement e, A arg) {
    e.implementation.compilationUnits.forEach((u) => u.accept(this, arg));
    return null;
  }

  @override
  R visitVariableElement(VariableElement e, A arg) => null;

  @override
  R visitParameterElement(ParameterElement e, A arg) => null;

  @override
  R visitFormalElement(FormalElement e, A arg) => null;

  @override
  R visitFieldElement(FieldElement e, A arg) => null;

  @override
  R visitFieldParameterElement(InitializingFormalElement e, A arg) => null;

  @override
  R visitAbstractFieldElement(AbstractFieldElement e, A arg) => null;

  @override
  R visitFunctionElement(FunctionElement e, A arg) => null;

  @override
  R visitConstructorElement(ConstructorElement e, A arg) {
    return visitFunctionElement(e, arg);
  }

  @override
  R visitConstructorBodyElement(ConstructorBodyElement e, A arg) {
    return visitFunctionElement(e.constructor, arg);
  }

  @override
  R visitClassElement(ClassElement e, A arg) {
    return visitScopeContainerElement(e, arg);
  }

  @override
  R visitEnumClassElement(EnumClassElement e, A arg) {
    return visitClassElement(e, arg);
  }

  @override
  R visitBoxFieldElement(BoxFieldElement e, A arg) => null;

  @override
  R visitClosureClassElement(ClosureClassElement e, A arg) {
    return visitClassElement(e, arg);
  }

  @override
  R visitClosureFieldElement(ClosureFieldElement e, A arg) {
    return visitVariableElement(e, arg);
  }
}

// TODO(sigmund): get rid of debug messages.
_debug(String message) {
  print('[33mdebug:[0m $message');
}
