anchor.diff:    if (identical(a, b)) return true;
     if (a == null || b == null) return false;
     if (a.kind != b.kind) return false;
  -  // TODO(johnniwinther): Compute a deep equivalence.
  -  return true;
  +
  +  var ad = a;
  +  var bd = b;
  +  switch (a.kind) {
  +    case NewStructureKind.NEW_INVOKE:
  +      return ad.semantics.kind == bd.semantics.kind &&
  +          areElementsEquivalent(ad.semantics.element, bd.semantics.element) &&
  +          areTypesEquivalent(ad.semantics.type, bd.semantics.type) &&
  +          areSelectorsEquivalent(ad.selector, bd.selector);
  +    case NewStructureKind.CONST_INVOKE:
  +      return ad.constantInvokeKind == bd.constantInvokeKind &&
  +          areConstantsEquivalent(ad.constant, bd.constant);
  +    case NewStructureKind.LATE_CONST:
  +      throw new UnsupportedError('Unsupported NewStructure kind ${a.kind}.');
  +  }
   }
   
   /// Strategy for testing equivalence.
  
positive.code:       a.isEmpty == b.isEmpty;
  }
  
  /// Returns `true` if the send structures [a] and [b] are equivalent.
  bool areSendStructuresEquivalent(SendStructure a, SendStructure b) {
    if (identical(a, b)) return true;
    if (a == null || b == null) return false;
    if (a.kind != b.kind) return false;
    // TODO(johnniwinther): Compute a deep equivalence.
    return true;
  }
  
  /// Returns `true` if the new structures [a] and [b] are equivalent.
  
negative.code: import '../dart_types.dart';
  import '../elements/elements.dart';
  import '../elements/visitor.dart';
  import '../resolution/access_semantics.dart';
  import '../resolution/send_structure.dart';
  import '../resolution/tree_elements.dart';
  import '../tokens/token.dart';
  