Restore type arguments on Forest

Change-Id: I3bdce8f470e31e4b95a028842a3f188102b74ba4
Reviewed-on: https://dart-review.googlesource.com/54386
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index 7b9bc03..8046271 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -60,6 +60,15 @@
     expect(binaryExpression.rightOperand, isNotNull);
   }
 
+  void test_int_literal() {
+    Expression expression = parseAdditiveExpression('1');
+    expect(expression, isNotNull);
+    // assertNoErrors();
+    expect(expression is IntegerLiteral, isTrue);
+    IntegerLiteral literal = expression;
+    expect(literal.value, equals(1));
+  }
+
   @failingTest
   void test_namedArgument() {
     super.test_namedArgument();
@@ -1220,7 +1229,7 @@
         false /* strong mode */,
       ));
 
-      BodyBuilder builder = new BodyBuilder(
+      BodyBuilder builder = new AstBodyBuilder(
         library,
         procedureBuilder,
         library.scope,
@@ -1289,3 +1298,34 @@
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+// TODO(ahe): Remove this class when we no longer need to override `forest`.
+class AstBodyBuilder extends BodyBuilder {
+  AstBodyBuilder(
+      library,
+      member,
+      scope,
+      formalParameterScope,
+      hierarchy,
+      coreTypes,
+      classBuilder,
+      isInstanceMember,
+      uri,
+      typeInferrer,
+      forestInternal)
+      : super(
+            library,
+            member,
+            scope,
+            formalParameterScope,
+            hierarchy,
+            coreTypes,
+            classBuilder,
+            isInstanceMember,
+            uri,
+            typeInferrer,
+            forestInternal);
+
+  // ignore: STRONG_MODE_INVALID_METHOD_OVERRIDE
+  dynamic get forest => super.forestInternal;
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index c8c3b63..6862dd6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -88,7 +88,12 @@
 // TODO(ahe): Remove this and ensure all nodes have a location.
 const noLocation = null;
 
-class BodyBuilder<Arguments> extends ScopeListener<JumpTarget>
+class BodyBuilder<
+        OpaqueExpression, // TODO(ahe): Rename to Expression when we've removed
+        // all references to kernel's Expression.
+        OpaqueStatement, // TODO(ahe): Rename to Statement when we've removed
+        // all references to kernel's Statement.
+        Arguments> extends ScopeListener<JumpTarget>
     implements BuilderHelper<Arguments> {
   @override
   final KernelLibraryBuilder library;
@@ -182,9 +187,7 @@
   /// and where that was.
   Map<String, int> initializedFields;
 
-  // TODO(ahe): Update type parameters.
-  @override
-  Forest<dynamic, dynamic, Token, dynamic> forest;
+  final Forest forestInternal;
 
   BodyBuilder(
       KernelLibraryBuilder library,
@@ -197,7 +200,7 @@
       this.isInstanceMember,
       this.uri,
       this._typeInferrer,
-      [this.forest = const Fangorn()])
+      [this.forestInternal = const Fangorn()])
       : enclosingScope = scope,
         library = library,
         enableNative =
@@ -211,6 +214,12 @@
         typePromoter = _typeInferrer.typePromoter,
         super(scope);
 
+  Forest<
+      Expression, // TODO(ahe): Should be OpaqueExpression.
+      OpaqueStatement,
+      Token,
+      Arguments> get forest => forestInternal;
+
   bool get hasParserError => recoverableErrors.isNotEmpty;
 
   bool get inConstructor {