Refactor Analyzer/CFE body builder tests

Change-Id: Icbcd0e16fce448afe340598975d67154a5478df3
Reviewed-on: https://dart-review.googlesource.com/54601
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index 0210b98..d383259 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -2,37 +2,10 @@
 // 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.
 
-import 'dart:async';
-import 'dart:io' show File;
-
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/fasta/ast_body_builder.dart';
-import "package:front_end/src/api_prototype/front_end.dart";
-import "package:front_end/src/api_prototype/memory_file_system.dart";
-import "package:front_end/src/base/processed_options.dart";
-import "package:front_end/src/compute_platform_binaries_location.dart";
-import 'package:front_end/src/fasta/compiler_context.dart';
-import 'package:front_end/src/fasta/constant_context.dart';
-import 'package:front_end/src/fasta/dill/dill_target.dart';
-import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/forest.dart';
-import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
-import "package:front_end/src/fasta/kernel/kernel_target.dart";
-import 'package:front_end/src/fasta/modifier.dart' as Modifier;
-import 'package:front_end/src/fasta/parser/parser.dart';
-import 'package:front_end/src/fasta/scanner.dart';
-import 'package:front_end/src/fasta/ticker.dart';
-import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
-import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
-import 'package:front_end/src/fasta/uri_translator_impl.dart';
-import 'package:kernel/class_hierarchy.dart' as kernel;
-import 'package:kernel/core_types.dart' as kernel;
-import 'package:kernel/kernel.dart' as kernel;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../src/fasta/body_builder_test_helper.dart';
 import 'parser_test.dart';
-import 'test_support.dart';
 
 main() async {
   defineReflectiveSuite(() {
@@ -44,8 +17,10 @@
  * Tests of the fasta parser based on [ExpressionParserTestMixin].
  */
 @reflectiveTest
-class ExpressionParserTest_Forest extends FastaParserTestCase
+class ExpressionParserTest_Forest extends FastaBodyBuilderTestCase
     with ExpressionParserTestMixin {
+  ExpressionParserTest_Forest() : super(false);
+
   @failingTest
   void test_namedArgument() {
     super.test_namedArgument();
@@ -997,379 +972,3 @@
     super.test_parseUnaryExpression_tilda_super();
   }
 }
-
-/**
- * Implementation of [AbstractParserTestCase] specialized for testing building
- * Analyzer AST using the fasta [Forest] API.
- */
-class FastaParserTestCase extends Object
-    with ParserTestHelpers
-    implements AbstractParserTestCase {
-  // TODO(danrubel): Consider HybridFileSystem.
-  static final MemoryFileSystem fs =
-      new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
-
-  /// The custom URI used to locate the dill file in the MemoryFileSystem.
-  static final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
-
-  /// The in memory test code URI
-  static final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
-
-  static ProcessedOptions options;
-
-  static KernelTarget kernelTarget;
-
-  @override
-  void assertNoErrors() {
-    // TODO(brianwilkerson) Implement this.
-  }
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  @override
-  Expression parseAdditiveExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseAssignableExpression(String code, bool primaryAllowed) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseAssignableSelector(String code, bool optional,
-      {bool allowConditional: true}) {
-    return parseExpression(code);
-  }
-
-  @override
-  AwaitExpression parseAwaitExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseBitwiseAndExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseBitwiseOrExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseBitwiseXorExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseCascadeSection(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  CompilationUnit parseCompilationUnit(String source,
-      {List<ErrorCode> codes, List<ExpectedError> errors}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  ConditionalExpression parseConditionalExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseConstExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  ConstructorInitializer parseConstructorInitializer(String code) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  CompilationUnit parseDirectives(String source,
-      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  BinaryExpression parseEqualityExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseExpression(String source,
-      {List<ErrorCode> codes,
-      List<ExpectedError> errors,
-      int expectedEndOffset}) {
-    ScannerResult scan = scanString(source);
-
-    return CompilerContext.runWithOptions(options, (CompilerContext c) {
-      KernelLibraryBuilder library = new KernelLibraryBuilder(
-        entryPoint,
-        entryPoint,
-        kernelTarget.loader,
-        null /* actualOrigin */,
-        null /* enclosingLibrary */,
-      );
-      List<KernelTypeVariableBuilder> typeVariableBuilders =
-          <KernelTypeVariableBuilder>[];
-      List<KernelFormalParameterBuilder> formalParameterBuilders =
-          <KernelFormalParameterBuilder>[];
-      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
-          null /* metadata */,
-          Modifier.staticMask /* or Modifier.varMask */,
-          kernelTarget.dynamicType,
-          "analyzerTest",
-          typeVariableBuilders,
-          formalParameterBuilders,
-          kernel.ProcedureKind.Method,
-          library,
-          -1 /* charOffset */,
-          -1 /* charOpenParenOffset */,
-          -1 /* charEndOffset */);
-
-      TypeInferrerDisabled typeInferrer =
-          new TypeInferrerDisabled(new TypeSchemaEnvironment(
-        kernelTarget.loader.coreTypes,
-        kernelTarget.loader.hierarchy,
-        // TODO(danrubel): Enable strong mode.
-        false /* strong mode */,
-      ));
-
-      AstBodyBuilder builder = new AstBodyBuilder(
-        library,
-        procedureBuilder,
-        library.scope,
-        procedureBuilder.computeFormalParameterScope(library.scope),
-        kernelTarget.loader.hierarchy,
-        kernelTarget.loader.coreTypes,
-        null /* classBuilder */,
-        false /* isInstanceMember */,
-        null /* uri */,
-        typeInferrer,
-        null,
-      )..constantContext = ConstantContext.none; // .inferred ?
-
-      Parser parser = new Parser(builder);
-      parser.parseExpression(parser.syntheticPreviousToken(scan.tokens));
-      return builder.pop();
-    });
-  }
-
-  @override
-  List<Expression> parseExpressionList(String code) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parseExpressionWithoutCascade(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  FormalParameter parseFormalParameter(String code, ParameterKind kind,
-      {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  FormalParameterList parseFormalParameterList(String code,
-      {bool inFunctionType: false,
-      List<ErrorCode> errorCodes: const <ErrorCode>[],
-      List<ExpectedError> errors}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  CompilationUnitMember parseFullCompilationUnitMember() {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Directive parseFullDirective() {
-    throw new UnimplementedError();
-  }
-
-  @override
-  FunctionExpression parseFunctionExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  InstanceCreationExpression parseInstanceCreationExpression(
-      String code, Token newToken) {
-    return parseExpression(code);
-  }
-
-  @override
-  ListLiteral parseListLiteral(
-      Token token, String typeArgumentsCode, String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseLogicalAndExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseLogicalOrExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  MapLiteral parseMapLiteral(
-      Token token, String typeArgumentsCode, String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  MapLiteralEntry parseMapLiteralEntry(String code) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parseMultiplicativeExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  InstanceCreationExpression parseNewExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  NormalFormalParameter parseNormalFormalParameter(String code,
-      {bool inFunctionType: false,
-      List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parsePostfixExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Identifier parsePrefixedIdentifier(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parsePrimaryExpression(String code,
-      {int expectedEndOffset, List<ExpectedError> errors}) {
-    return parseExpression(code,
-        expectedEndOffset: expectedEndOffset, errors: errors);
-  }
-
-  @override
-  Expression parseRelationalExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  RethrowExpression parseRethrowExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  BinaryExpression parseShiftExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  SimpleIdentifier parseSimpleIdentifier(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Statement parseStatement(String source,
-      {bool enableLazyAssignmentOperators, int expectedEndOffset}) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Expression parseStringLiteral(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  SymbolLiteral parseSymbolLiteral(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseThrowExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  Expression parseThrowExpressionWithoutCascade(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  PrefixExpression parseUnaryExpression(String code) {
-    return parseExpression(code);
-  }
-
-  @override
-  VariableDeclarationList parseVariableDeclarationList(String source) {
-    throw new UnimplementedError();
-  }
-
-  Future setUp() async {
-    // TODO(danrubel): Tear down once all tests in group have been run.
-    if (options != null) {
-      return;
-    }
-
-    // Read the dill file containing kernel platform summaries into memory.
-    List<int> sdkSummaryBytes = await new File.fromUri(
-            computePlatformBinariesLocation().resolve("vm_platform.dill"))
-        .readAsBytes();
-    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
-
-    final CompilerOptions optionBuilder = new CompilerOptions()
-      ..strongMode = false // TODO(danrubel): enable strong mode.
-      ..reportMessages = true
-      ..verbose = false
-      ..fileSystem = fs
-      ..sdkSummary = sdkSummary
-      ..onProblem = (FormattedMessage problem, Severity severity,
-          List<FormattedMessage> context) {
-        // TODO(danrubel): Capture problems and check against expectations.
-        print(problem.formatted);
-      };
-
-    options = new ProcessedOptions(optionBuilder, false, [entryPoint]);
-
-    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
-
-    await CompilerContext.runWithOptions(options, (CompilerContext c) async {
-      DillTarget dillTarget = new DillTarget(
-          new Ticker(isVerbose: false), uriTranslator, options.target);
-
-      kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
-
-      // Load the dill file containing platform code.
-      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
-      kernel.Component sdkComponent =
-          kernel.loadComponentFromBytes(sdkSummaryBytes);
-      dillTarget.loader
-          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
-      await dillTarget.buildOutlines();
-      await kernelTarget.buildOutlines();
-      kernelTarget.computeCoreTypes();
-      assert(kernelTarget.loader.coreTypes != null);
-    });
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
new file mode 100644
index 0000000..30ddead
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -0,0 +1,466 @@
+// Copyright (c) 2018, 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.
+
+import 'dart:async';
+import 'dart:io' show File;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/fasta/ast_body_builder.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import "package:front_end/src/api_prototype/front_end.dart";
+import "package:front_end/src/api_prototype/memory_file_system.dart";
+import "package:front_end/src/base/processed_options.dart";
+import "package:front_end/src/compute_platform_binaries_location.dart";
+import 'package:front_end/src/fasta/compiler_context.dart';
+import 'package:front_end/src/fasta/constant_context.dart';
+import 'package:front_end/src/fasta/dill/dill_target.dart';
+import "package:front_end/src/fasta/fasta_codes.dart";
+import 'package:front_end/src/fasta/kernel/body_builder.dart' hide Identifier;
+import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
+import "package:front_end/src/fasta/kernel/kernel_target.dart";
+import 'package:front_end/src/fasta/modifier.dart' as Modifier;
+import 'package:front_end/src/fasta/parser/parser.dart';
+import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/ticker.dart';
+import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
+import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
+import 'package:front_end/src/fasta/uri_translator_impl.dart';
+import 'package:kernel/class_hierarchy.dart' as kernel;
+import 'package:kernel/core_types.dart' as kernel;
+import 'package:kernel/kernel.dart' as kernel;
+
+import '../../generated/parser_test.dart';
+import '../../generated/test_support.dart';
+
+/**
+ * Implementation of [AbstractParserTestCase] specialized for testing building
+ * Analyzer AST using the fasta [Forest] API.
+ */
+class FastaBodyBuilderTestCase extends Object
+    with ParserTestHelpers
+    implements AbstractParserTestCase {
+  // TODO(danrubel): Consider HybridFileSystem.
+  static final MemoryFileSystem fs =
+      new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
+
+  /// The custom URI used to locate the dill file in the MemoryFileSystem.
+  static final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
+
+  /// The in memory test code URI
+  static final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
+
+  static ProcessedOptions options;
+
+  static KernelTarget kernelTarget;
+
+  static TypeProvider _typeProvider;
+
+  final bool resolveTypes;
+
+  FastaBodyBuilderTestCase(this.resolveTypes);
+
+  TypeProvider get typeProvider => _typeProvider;
+
+  @override
+  void assertNoErrors() {
+    // TODO(brianwilkerson) Implement this.
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  Expression parseAdditiveExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseAssignableExpression(String code, bool primaryAllowed) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseAssignableSelector(String code, bool optional,
+      {bool allowConditional: true}) {
+    return parseExpression(code);
+  }
+
+  @override
+  AwaitExpression parseAwaitExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseBitwiseAndExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseBitwiseOrExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseBitwiseXorExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseCascadeSection(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  CompilationUnit parseCompilationUnit(String source,
+      {List<ErrorCode> codes, List<ExpectedError> errors}) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  ConditionalExpression parseConditionalExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseConstExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  ConstructorInitializer parseConstructorInitializer(String code) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  CompilationUnit parseDirectives(String source,
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  BinaryExpression parseEqualityExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseExpression(String source,
+      {List<ErrorCode> codes,
+      List<ExpectedError> errors,
+      int expectedEndOffset}) {
+    ScannerResult scan = scanString(source);
+
+    return CompilerContext.runWithOptions(options, (CompilerContext c) {
+      KernelLibraryBuilder library = new KernelLibraryBuilder(
+        entryPoint,
+        entryPoint,
+        kernelTarget.loader,
+        null /* actualOrigin */,
+        null /* enclosingLibrary */,
+      );
+      List<KernelTypeVariableBuilder> typeVariableBuilders =
+          <KernelTypeVariableBuilder>[];
+      List<KernelFormalParameterBuilder> formalParameterBuilders =
+          <KernelFormalParameterBuilder>[];
+      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
+          null /* metadata */,
+          Modifier.staticMask /* or Modifier.varMask */,
+          kernelTarget.dynamicType,
+          "analyzerTest",
+          typeVariableBuilders,
+          formalParameterBuilders,
+          kernel.ProcedureKind.Method,
+          library,
+          -1 /* charOffset */,
+          -1 /* charOpenParenOffset */,
+          -1 /* charEndOffset */);
+
+      TypeInferrerDisabled typeInferrer =
+          new TypeInferrerDisabled(new TypeSchemaEnvironment(
+        kernelTarget.loader.coreTypes,
+        kernelTarget.loader.hierarchy,
+        // TODO(danrubel): Enable strong mode.
+        false /* strong mode */,
+      ));
+
+      BodyBuilder builder = new AstBodyBuilder(
+        library,
+        procedureBuilder,
+        library.scope,
+        procedureBuilder.computeFormalParameterScope(library.scope),
+        kernelTarget.loader.hierarchy,
+        kernelTarget.loader.coreTypes,
+        null /* classBuilder */,
+        false /* isInstanceMember */,
+        null /* uri */,
+        typeInferrer,
+        typeProvider,
+      )..constantContext = ConstantContext.none; // .inferred ?
+
+      Parser parser = new Parser(builder);
+      parser.parseExpression(parser.syntheticPreviousToken(scan.tokens));
+      return builder.pop();
+    });
+  }
+
+  @override
+  List<Expression> parseExpressionList(String code) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression parseExpressionWithoutCascade(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  FormalParameter parseFormalParameter(String code, ParameterKind kind,
+      {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  FormalParameterList parseFormalParameterList(String code,
+      {bool inFunctionType: false,
+      List<ErrorCode> errorCodes: const <ErrorCode>[],
+      List<ExpectedError> errors}) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  CompilationUnitMember parseFullCompilationUnitMember() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Directive parseFullDirective() {
+    throw new UnimplementedError();
+  }
+
+  @override
+  FunctionExpression parseFunctionExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  InstanceCreationExpression parseInstanceCreationExpression(
+      String code, Token newToken) {
+    return parseExpression(code);
+  }
+
+  @override
+  ListLiteral parseListLiteral(
+      Token token, String typeArgumentsCode, String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseLogicalAndExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseLogicalOrExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  MapLiteral parseMapLiteral(
+      Token token, String typeArgumentsCode, String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  MapLiteralEntry parseMapLiteralEntry(String code) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression parseMultiplicativeExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  InstanceCreationExpression parseNewExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  NormalFormalParameter parseNormalFormalParameter(String code,
+      {bool inFunctionType: false,
+      List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression parsePostfixExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Identifier parsePrefixedIdentifier(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parsePrimaryExpression(String code,
+      {int expectedEndOffset, List<ExpectedError> errors}) {
+    return parseExpression(code,
+        expectedEndOffset: expectedEndOffset, errors: errors);
+  }
+
+  @override
+  Expression parseRelationalExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  RethrowExpression parseRethrowExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  BinaryExpression parseShiftExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  SimpleIdentifier parseSimpleIdentifier(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Statement parseStatement(String source,
+      {bool enableLazyAssignmentOperators, int expectedEndOffset}) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression parseStringLiteral(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  SymbolLiteral parseSymbolLiteral(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseThrowExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  Expression parseThrowExpressionWithoutCascade(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  PrefixExpression parseUnaryExpression(String code) {
+    return parseExpression(code);
+  }
+
+  @override
+  VariableDeclarationList parseVariableDeclarationList(String source) {
+    throw new UnimplementedError();
+  }
+
+  Future setUp() async {
+    // TODO(danrubel): Tear down once all tests in group have been run.
+    if (options != null) {
+      return;
+    }
+
+    // Read the dill file containing kernel platform summaries into memory.
+    List<int> sdkSummaryBytes = await new File.fromUri(
+            computePlatformBinariesLocation().resolve("vm_platform.dill"))
+        .readAsBytes();
+    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
+
+    final CompilerOptions optionBuilder = new CompilerOptions()
+      ..strongMode = false // TODO(danrubel): enable strong mode.
+      ..reportMessages = true
+      ..verbose = false
+      ..fileSystem = fs
+      ..sdkSummary = sdkSummary
+      ..onProblem = (FormattedMessage problem, Severity severity,
+          List<FormattedMessage> context) {
+        // TODO(danrubel): Capture problems and check against expectations.
+        print(problem.formatted);
+      };
+
+    options = new ProcessedOptions(optionBuilder, false, [entryPoint]);
+
+    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
+
+    await CompilerContext.runWithOptions(options, (CompilerContext c) async {
+      DillTarget dillTarget = new DillTarget(
+          new Ticker(isVerbose: false), uriTranslator, options.target);
+
+      kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
+
+      // Load the dill file containing platform code.
+      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
+      kernel.Component sdkComponent =
+          kernel.loadComponentFromBytes(sdkSummaryBytes);
+      dillTarget.loader
+          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
+      await dillTarget.buildOutlines();
+      await kernelTarget.buildOutlines();
+      kernelTarget.computeCoreTypes();
+      assert(kernelTarget.loader.coreTypes != null);
+
+      // Initialize the typeProvider if types should be resolved.
+      if (resolveTypes) {
+        Map<String, Element> map = <String, Element>{};
+        var coreTypes = kernelTarget.loader.coreTypes;
+        for (var coreType in [
+          coreTypes.boolClass,
+          coreTypes.doubleClass,
+          coreTypes.functionClass,
+          coreTypes.futureClass,
+          coreTypes.futureOrClass,
+          coreTypes.intClass,
+          coreTypes.iterableClass,
+          coreTypes.iteratorClass,
+          coreTypes.listClass,
+          coreTypes.mapClass,
+          coreTypes.nullClass,
+          coreTypes.numClass,
+          coreTypes.objectClass,
+          coreTypes.stackTraceClass,
+          coreTypes.streamClass,
+          coreTypes.stringClass,
+          coreTypes.symbolClass,
+          coreTypes.typeClass
+        ]) {
+          map[coreType.name] = _buildElement(coreType);
+        }
+        Namespace namespace = new Namespace(map);
+        _typeProvider =
+            new TypeProviderImpl.forNamespaces(namespace, namespace);
+      }
+    });
+  }
+
+  Element _buildElement(kernel.Class coreType) {
+    ClassElementImpl element =
+        new ClassElementImpl(coreType.name, coreType.fileOffset);
+    element.typeParameters = coreType.typeParameters.map((parameter) {
+      TypeParameterElementImpl element =
+          new TypeParameterElementImpl(parameter.name, parameter.fileOffset);
+      element.type = new TypeParameterTypeImpl(element);
+      return element;
+    }).toList();
+    return element;
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/resolution_test.dart b/pkg/analyzer/test/src/fasta/resolution_test.dart
index cd4b5d9..0eedb6b 100644
--- a/pkg/analyzer/test/src/fasta/resolution_test.dart
+++ b/pkg/analyzer/test/src/fasta/resolution_test.dart
@@ -2,43 +2,13 @@
 // 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.
 
-import 'dart:async';
-import 'dart:io' show File;
-
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/dart/resolver/scope.dart';
-import 'package:analyzer/src/fasta/ast_body_builder.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import "package:front_end/src/api_prototype/front_end.dart";
-import "package:front_end/src/api_prototype/memory_file_system.dart";
-import "package:front_end/src/base/processed_options.dart";
-import "package:front_end/src/compute_platform_binaries_location.dart";
-import 'package:front_end/src/fasta/compiler_context.dart';
-import 'package:front_end/src/fasta/constant_context.dart';
-import 'package:front_end/src/fasta/dill/dill_target.dart';
-import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/body_builder.dart';
-import 'package:front_end/src/fasta/kernel/forest.dart';
-import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
-import "package:front_end/src/fasta/kernel/kernel_target.dart";
-import 'package:front_end/src/fasta/modifier.dart' as Modifier;
-import 'package:front_end/src/fasta/parser/parser.dart';
-import 'package:front_end/src/fasta/scanner.dart';
-import 'package:front_end/src/fasta/ticker.dart';
-import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
-import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
-import 'package:front_end/src/fasta/uri_translator_impl.dart';
-import 'package:kernel/class_hierarchy.dart' as kernel;
-import 'package:kernel/core_types.dart' as kernel;
-import 'package:kernel/kernel.dart' as kernel;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/parser_test.dart';
+import 'body_builder_test_helper.dart';
 
 main() async {
   defineReflectiveSuite(() {
@@ -47,261 +17,83 @@
 }
 
 /**
- * Implementation of [AbstractParserTestCase] specialized for testing building
- * Analyzer AST using the fasta [Forest] API.
- */
-class FastaParserTestCase {
-  // TODO(danrubel): Consider HybridFileSystem.
-  static final MemoryFileSystem fs =
-      new MemoryFileSystem(Uri.parse("org-dartlang-test:///"));
-
-  /// The custom URI used to locate the dill file in the MemoryFileSystem.
-  static final Uri sdkSummary = fs.currentDirectory.resolve("vm_platform.dill");
-
-  /// The in memory test code URI
-  static final Uri entryPoint = fs.currentDirectory.resolve("main.dart");
-
-  static ProcessedOptions options;
-
-  static KernelTarget kernelTarget;
-
-  static TypeProvider _typeProvider;
-
-  TypeProvider get typeProvider => _typeProvider;
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  Expression parseExpression(String code) {
-    ScannerResult scan = scanString(code);
-
-    return CompilerContext.runWithOptions(options, (CompilerContext c) {
-      KernelLibraryBuilder library = new KernelLibraryBuilder(
-        entryPoint,
-        entryPoint,
-        kernelTarget.loader,
-        null /* actualOrigin */,
-        null /* enclosingLibrary */,
-      );
-      List<KernelTypeVariableBuilder> typeVariableBuilders =
-          <KernelTypeVariableBuilder>[];
-      List<KernelFormalParameterBuilder> formalParameterBuilders =
-          <KernelFormalParameterBuilder>[];
-      KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
-          null /* metadata */,
-          Modifier.staticMask /* or Modifier.varMask */,
-          kernelTarget.dynamicType,
-          "analyzerTest",
-          typeVariableBuilders,
-          formalParameterBuilders,
-          kernel.ProcedureKind.Method,
-          library,
-          -1 /* charOffset */,
-          -1 /* charOpenParenOffset */,
-          -1 /* charEndOffset */);
-
-      TypeInferrerDisabled typeInferrer =
-          new TypeInferrerDisabled(new TypeSchemaEnvironment(
-        kernelTarget.loader.coreTypes,
-        kernelTarget.loader.hierarchy,
-        // TODO(danrubel): Enable strong mode.
-        false /* strong mode */,
-      ));
-
-      BodyBuilder builder = new AstBodyBuilder(
-        library,
-        procedureBuilder,
-        library.scope,
-        procedureBuilder.computeFormalParameterScope(library.scope),
-        kernelTarget.loader.hierarchy,
-        kernelTarget.loader.coreTypes,
-        null /* classBuilder */,
-        false /* isInstanceMember */,
-        null /* uri */,
-        typeInferrer,
-        _typeProvider,
-      )..constantContext = ConstantContext.none; // .inferred ?
-
-      Parser parser = new Parser(builder);
-      parser.parseExpression(parser.syntheticPreviousToken(scan.tokens));
-      return builder.pop();
-    });
-  }
-
-  Future setUp() async {
-    // TODO(danrubel): Tear down once all tests in group have been run.
-    if (options != null) {
-      return;
-    }
-
-    // Read the dill file containing kernel platform summaries into memory.
-    List<int> sdkSummaryBytes = await new File.fromUri(
-            computePlatformBinariesLocation().resolve("vm_platform.dill"))
-        .readAsBytes();
-    fs.entityForUri(sdkSummary).writeAsBytesSync(sdkSummaryBytes);
-
-    final CompilerOptions optionBuilder = new CompilerOptions()
-      ..strongMode = false // TODO(danrubel): enable strong mode.
-      ..reportMessages = true
-      ..verbose = false
-      ..fileSystem = fs
-      ..sdkSummary = sdkSummary
-      ..onProblem = (FormattedMessage problem, Severity severity,
-          List<FormattedMessage> context) {
-        // TODO(danrubel): Capture problems and check against expectations.
-        print(problem.formatted);
-      };
-
-    options = new ProcessedOptions(optionBuilder, false, [entryPoint]);
-
-    UriTranslatorImpl uriTranslator = await options.getUriTranslator();
-
-    await CompilerContext.runWithOptions(options, (CompilerContext c) async {
-      DillTarget dillTarget = new DillTarget(
-          new Ticker(isVerbose: false), uriTranslator, options.target);
-
-      kernelTarget = new KernelTarget(fs, true, dillTarget, uriTranslator);
-
-      // Load the dill file containing platform code.
-      dillTarget.loader.read(Uri.parse('dart:core'), -1, fileUri: sdkSummary);
-      kernel.Component sdkComponent =
-          kernel.loadComponentFromBytes(sdkSummaryBytes);
-      dillTarget.loader
-          .appendLibraries(sdkComponent, byteCount: sdkSummaryBytes.length);
-      await dillTarget.buildOutlines();
-      await kernelTarget.buildOutlines();
-      kernelTarget.computeCoreTypes();
-      assert(kernelTarget.loader.coreTypes != null);
-      Map<String, Element> map = <String, Element>{};
-      var coreTypes = kernelTarget.loader.coreTypes;
-      for (var coreType in [
-        coreTypes.boolClass,
-        coreTypes.doubleClass,
-        coreTypes.functionClass,
-        coreTypes.futureClass,
-        coreTypes.futureOrClass,
-        coreTypes.intClass,
-        coreTypes.iterableClass,
-        coreTypes.iteratorClass,
-        coreTypes.listClass,
-        coreTypes.mapClass,
-        coreTypes.nullClass,
-        coreTypes.numClass,
-        coreTypes.objectClass,
-        coreTypes.stackTraceClass,
-        coreTypes.streamClass,
-        coreTypes.stringClass,
-        coreTypes.symbolClass,
-        coreTypes.typeClass
-      ]) {
-        map[coreType.name] = _buildElement(coreType);
-      }
-      Namespace namespace = new Namespace(map);
-      _typeProvider = new TypeProviderImpl.forNamespaces(namespace, namespace);
-    });
-  }
-
-  Element _buildElement(kernel.Class coreType) {
-    ClassElementImpl element =
-        new ClassElementImpl(coreType.name, coreType.fileOffset);
-    element.typeParameters = coreType.typeParameters.map((parameter) {
-      TypeParameterElementImpl element =
-          new TypeParameterElementImpl(parameter.name, parameter.fileOffset);
-      element.type = new TypeParameterTypeImpl(element);
-      return element;
-    }).toList();
-    return element;
-  }
-}
-
-// TODO(ahe): Remove this class when we no longer need to override `forest`.
-/**
  * Tests of the fasta parser based on [ExpressionParserTestMixin].
  */
 @reflectiveTest
-class ResolutionTest extends FastaParserTestCase {
+class ResolutionTest extends FastaBodyBuilderTestCase {
+  ResolutionTest() : super(true);
+
   test_booleanLiteral_false() {
     Expression result = parseExpression('false');
     expect(result, new isInstanceOf<BooleanLiteral>());
-    expect((result as BooleanLiteral).staticType,
-        FastaParserTestCase._typeProvider.boolType);
+    expect((result as BooleanLiteral).staticType, typeProvider.boolType);
   }
 
   test_booleanLiteral_true() {
     Expression result = parseExpression('true');
     expect(result, new isInstanceOf<BooleanLiteral>());
-    expect((result as BooleanLiteral).staticType,
-        FastaParserTestCase._typeProvider.boolType);
+    expect((result as BooleanLiteral).staticType, typeProvider.boolType);
   }
 
   test_doubleLiteral() {
     Expression result = parseExpression('4.2');
     expect(result, new isInstanceOf<DoubleLiteral>());
-    expect((result as DoubleLiteral).staticType,
-        FastaParserTestCase._typeProvider.doubleType);
+    expect((result as DoubleLiteral).staticType, typeProvider.doubleType);
   }
 
   test_integerLiteral() {
     Expression result = parseExpression('3');
     expect(result, new isInstanceOf<IntegerLiteral>());
-    expect((result as IntegerLiteral).staticType,
-        FastaParserTestCase._typeProvider.intType);
+    expect((result as IntegerLiteral).staticType, typeProvider.intType);
   }
 
   @failingTest
   test_listLiteral_explicitType() {
     Expression result = parseExpression('<int>[]');
     expect(result, new isInstanceOf<ListLiteral>());
-    InterfaceType listType = FastaParserTestCase._typeProvider.listType;
+    InterfaceType listType = typeProvider.listType;
     expect((result as ListLiteral).staticType,
-        listType.instantiate([FastaParserTestCase._typeProvider.intType]));
+        listType.instantiate([typeProvider.intType]));
   }
 
   @failingTest
   test_listLiteral_noType() {
     Expression result = parseExpression('[]');
     expect(result, new isInstanceOf<ListLiteral>());
-    InterfaceType listType = FastaParserTestCase._typeProvider.listType;
+    InterfaceType listType = typeProvider.listType;
     expect((result as ListLiteral).staticType,
-        listType.instantiate([FastaParserTestCase._typeProvider.dynamicType]));
+        listType.instantiate([typeProvider.dynamicType]));
   }
 
   @failingTest
   test_mapLiteral_explicitType() {
     Expression result = parseExpression('<String, int>{}');
     expect(result, new isInstanceOf<MapLiteral>());
-    InterfaceType mapType = FastaParserTestCase._typeProvider.mapType;
-    expect(
-        (result as MapLiteral).staticType,
-        mapType.instantiate([
-          FastaParserTestCase._typeProvider.stringType,
-          FastaParserTestCase._typeProvider.intType
-        ]));
+    InterfaceType mapType = typeProvider.mapType;
+    expect((result as MapLiteral).staticType,
+        mapType.instantiate([typeProvider.stringType, typeProvider.intType]));
   }
 
   @failingTest
   test_mapLiteral_noType() {
     Expression result = parseExpression('{}');
     expect(result, new isInstanceOf<MapLiteral>());
-    InterfaceType mapType = FastaParserTestCase._typeProvider.mapType;
+    InterfaceType mapType = typeProvider.mapType;
     expect(
         (result as MapLiteral).staticType,
-        mapType.instantiate([
-          FastaParserTestCase._typeProvider.dynamicType,
-          FastaParserTestCase._typeProvider.dynamicType
-        ]));
+        mapType
+            .instantiate([typeProvider.dynamicType, typeProvider.dynamicType]));
   }
 
   test_nullLiteral() {
     Expression result = parseExpression('null');
     expect(result, new isInstanceOf<NullLiteral>());
-    expect((result as NullLiteral).staticType,
-        FastaParserTestCase._typeProvider.nullType);
+    expect((result as NullLiteral).staticType, typeProvider.nullType);
   }
 
   test_simpleStringLiteral() {
     Expression result = parseExpression('"abc"');
     expect(result, new isInstanceOf<SimpleStringLiteral>());
-    expect((result as SimpleStringLiteral).staticType,
-        FastaParserTestCase._typeProvider.stringType);
+    expect((result as SimpleStringLiteral).staticType, typeProvider.stringType);
   }
 }