| Index: tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
 | 
| diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
 | 
| similarity index 69%
 | 
| copy from tests/compiler/dart2js/inference/inference_test_helper.dart
 | 
| copy to tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
 | 
| index e518df210771f951cfe217d6988a6db670456db2..ab3b9a7f2cf596432565097b70262ec4dba134ae 100644
 | 
| --- a/tests/compiler/dart2js/inference/inference_test_helper.dart
 | 
| +++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
 | 
| @@ -9,15 +9,14 @@ import 'package:compiler/src/elements/elements.dart';
 | 
|  import 'package:compiler/src/elements/entities.dart';
 | 
|  import 'package:compiler/src/resolution/tree_elements.dart';
 | 
|  import 'package:compiler/src/tree/nodes.dart';
 | 
| -import 'package:compiler/src/types/types.dart';
 | 
|  import 'package:expect/expect.dart';
 | 
|  
 | 
|  import '../annotated_code_helper.dart';
 | 
|  import '../memory_compiler.dart';
 | 
| -import 'enumerator.dart';
 | 
| +import '../equivalence/id_equivalence.dart';
 | 
|  
 | 
|  typedef void CheckMemberFunction(
 | 
| -    Compiler compiler, Map<Id, String> expectedMap, MemberElement member);
 | 
| +    Compiler compiler, Map<Id, String> expectedMap, MemberEntity member);
 | 
|  
 | 
|  /// Compiles the [annotatedCode] with the provided [options] and calls
 | 
|  /// [checkMember] for each member in the code providing the map from [Id] to
 | 
| @@ -32,39 +31,29 @@ checkCode(String annotatedCode, CheckMemberFunction checkMember,
 | 
|    compiler.stopAfterTypeInference = true;
 | 
|    Uri mainUri = Uri.parse('memory:main.dart');
 | 
|    await compiler.run(mainUri);
 | 
| -  LibraryElement mainApp =
 | 
| -      compiler.frontendStrategy.elementEnvironment.mainLibrary;
 | 
| -  mainApp.forEachLocalMember((dynamic member) {
 | 
| -    if (member.isClass) {
 | 
| -      member.forEachLocalMember((member) {
 | 
| +  ElementEnvironment elementEnvironment =
 | 
| +      compiler.backendClosedWorldForTesting.elementEnvironment;
 | 
| +  LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
 | 
| +  elementEnvironment.forEachClass(mainLibrary, (ClassEntity cls) {
 | 
| +    elementEnvironment.forEachClassMember(cls,
 | 
| +        (ClassEntity declarer, MemberEntity member) {
 | 
| +      if (cls == declarer) {
 | 
|          checkMember(compiler, expectedMap, member);
 | 
| -      });
 | 
| -    } else if (member.isTypedef) {
 | 
| -      // Skip.
 | 
| -    } else {
 | 
| -      checkMember(compiler, expectedMap, member);
 | 
| -    }
 | 
| +      }
 | 
| +    });
 | 
| +  });
 | 
| +  elementEnvironment.forEachLibraryMember(mainLibrary, (MemberEntity member) {
 | 
| +    checkMember(compiler, expectedMap, member);
 | 
|    });
 | 
|    expectedMap.forEach((Id id, String expected) {
 | 
|      reportHere(
 | 
|          compiler.reporter,
 | 
| -        computeSpannable(compiler.resolution.elementEnvironment, mainUri, id),
 | 
| +        computeSpannable(elementEnvironment, mainUri, id),
 | 
|          'expected:${expected},actual:null');
 | 
|    });
 | 
|    Expect.isTrue(expectedMap.isEmpty, "Ids not found: $expectedMap.");
 | 
|  }
 | 
|  
 | 
| -void checkMemberAstTypeMasks(
 | 
| -    Compiler compiler, Map<Id, String> expectedMap, MemberElement member) {
 | 
| -  ResolvedAst resolvedAst = member.resolvedAst;
 | 
| -  if (resolvedAst.kind != ResolvedAstKind.PARSED) return;
 | 
| -  compiler.reporter.withCurrentElement(member.implementation, () {
 | 
| -    new TypeMaskChecker(compiler.reporter, expectedMap, resolvedAst,
 | 
| -            compiler.globalInference.results)
 | 
| -        .check();
 | 
| -  });
 | 
| -}
 | 
| -
 | 
|  Spannable computeSpannable(
 | 
|      ElementEnvironment elementEnvironment, Uri mainUri, Id id) {
 | 
|    if (id is NodeId) {
 | 
| @@ -101,16 +90,13 @@ Map<Id, String> computeExpectedMap(AnnotatedCode code) {
 | 
|    return map;
 | 
|  }
 | 
|  
 | 
| -class TypeMaskChecker extends Visitor with AstEnumeratorMixin {
 | 
| +abstract class AbstractResolvedAstChecker extends Visitor
 | 
| +    with AstEnumeratorMixin {
 | 
|    final DiagnosticReporter reporter;
 | 
|    final Map<Id, String> expectedMap;
 | 
|    final ResolvedAst resolvedAst;
 | 
| -  final GlobalTypeInferenceResults results;
 | 
| -  final GlobalTypeInferenceElementResult result;
 | 
|  
 | 
| -  TypeMaskChecker(
 | 
| -      this.reporter, this.expectedMap, this.resolvedAst, this.results)
 | 
| -      : result = results.resultOfMember(resolvedAst.element as MemberElement);
 | 
| +  AbstractResolvedAstChecker(this.reporter, this.expectedMap, this.resolvedAst);
 | 
|  
 | 
|    TreeElements get elements => resolvedAst.elements;
 | 
|  
 | 
| @@ -124,36 +110,36 @@ class TypeMaskChecker extends Visitor with AstEnumeratorMixin {
 | 
|  
 | 
|    void checkElement(AstElement element) {
 | 
|      ElementId id = computeElementId(element);
 | 
| -    GlobalTypeInferenceElementResult elementResult =
 | 
| -        results.resultOfElement(element);
 | 
| -    TypeMask value =
 | 
| -        element.isFunction ? elementResult.returnType : elementResult.type;
 | 
|      String expected = annotationForId(id);
 | 
| +    String value = computeElementValue(element);
 | 
|      checkValue(element, expected, value);
 | 
|    }
 | 
|  
 | 
| +  String computeElementValue(AstElement element);
 | 
| +
 | 
|    String annotationForId(Id id) {
 | 
|      if (id == null) return null;
 | 
|      return expectedMap.remove(id);
 | 
|    }
 | 
|  
 | 
| -  void checkValue(Spannable spannable, String expected, TypeMask value) {
 | 
| +  void checkValue(Spannable spannable, String expected, String value) {
 | 
|      if (value != null || expected != null) {
 | 
| -      String valueText = '$value';
 | 
| -      if (valueText != expected) {
 | 
| +      if (value != expected) {
 | 
|          reportHere(reporter, spannable, 'expected:${expected},actual:${value}');
 | 
|        }
 | 
| -      Expect.equals(expected, valueText);
 | 
| +      Expect.equals(expected, value);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  void checkSend(Send node) {
 | 
| -    NodeId id = computeNodeId(node);
 | 
| -    TypeMask value = result.typeOfSend(node);
 | 
| +  void checkNode(Node node, AstElement element) {
 | 
| +    NodeId id = computeNodeId(node, element);
 | 
|      String expected = annotationForId(id);
 | 
| +    String value = computeNodeValue(node, element);
 | 
|      checkValue(node, expected, value);
 | 
|    }
 | 
|  
 | 
| +  String computeNodeValue(Node node, [AstElement element]);
 | 
| +
 | 
|    visitVariableDefinitions(VariableDefinitions node) {
 | 
|      for (Node child in node.definitions) {
 | 
|        AstElement element = elements[child];
 | 
| @@ -161,6 +147,8 @@ class TypeMaskChecker extends Visitor with AstEnumeratorMixin {
 | 
|          reportHere(reporter, child, 'No element for variable.');
 | 
|        } else if (!element.isLocal) {
 | 
|          checkElement(element);
 | 
| +      } else {
 | 
| +        checkNode(child, element);
 | 
|        }
 | 
|      }
 | 
|      visitNode(node);
 | 
| @@ -168,17 +156,21 @@ class TypeMaskChecker extends Visitor with AstEnumeratorMixin {
 | 
|  
 | 
|    visitFunctionExpression(FunctionExpression node) {
 | 
|      AstElement element = elements.getFunctionDefinition(node);
 | 
| -    checkElement(element);
 | 
| +    if (!element.isLocal) {
 | 
| +      checkElement(element);
 | 
| +    } else {
 | 
| +      checkNode(node, element);
 | 
| +    }
 | 
|      visitNode(node);
 | 
|    }
 | 
|  
 | 
|    visitSend(Send node) {
 | 
| -    checkSend(node);
 | 
| +    checkNode(node, null);
 | 
|      visitNode(node);
 | 
|    }
 | 
|  
 | 
|    visitSendSet(SendSet node) {
 | 
| -    checkSend(node);
 | 
| +    checkNode(node, null);
 | 
|      visitNode(node);
 | 
|    }
 | 
|  }
 | 
| 
 |