Add generator for unlinked names

Change-Id: I5841b3ff86133eedd14d8bef26c3d1b2dd78f34d
Reviewed-on: https://dart-review.googlesource.com/57703
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
index 54af172..cc8d11d 100644
--- a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
+++ b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
@@ -7,19 +7,20 @@
 import 'package:analyzer/src/fasta/ast_building_factory.dart';
 import 'package:front_end/src/fasta/kernel/expression_generator.dart' as fasta;
 import 'package:front_end/src/fasta/kernel/expression_generator_helper.dart';
-import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart' as fasta;
 import 'package:front_end/src/scanner/token.dart';
 import 'package:kernel/ast.dart' show DartType, Initializer, Name, Procedure;
 
 abstract class AnalyzerExpressionGenerator
-    implements Generator<Expression, Statement, Arguments> {
+    implements fasta.Generator<Expression, Statement, Arguments> {
   final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
 
   final AstFactory astFactory;
 
   AnalyzerExpressionGenerator(this.helper, this.astFactory);
 
-  Forest<Expression, Statement, Token, Arguments> get forest => helper.forest;
+  fasta.Forest<Expression, Statement, Token, Arguments> get forest =>
+      helper.forest;
 
   @override
 // TODO: implement isInitializer
@@ -146,6 +147,46 @@
   }
 }
 
+class AnalyzerUnlinkedNameGenerator extends AnalyzerExpressionGenerator
+    with
+        fasta.ErroneousExpressionGenerator<Expression, Statement, Arguments>,
+        fasta.UnlinkedGenerator<Expression, Statement, Arguments> {
+  @override
+  final Token token;
+
+  @override
+  final fasta.UnlinkedDeclaration declaration;
+
+  AnalyzerUnlinkedNameGenerator(
+      ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
+      AstFactory astFactory,
+      this.token,
+      this.declaration)
+      : super(helper, astFactory);
+
+  @override
+  DartType buildErroneousTypeNotAPrefix(fasta.Identifier suffix) {
+    // TODO: implement buildErroneousTypeNotAPrefix
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression buildError(Arguments arguments,
+      {bool isGetter: false, bool isSetter: false, int offset}) {
+    // TODO: implement buildError
+    throw new UnimplementedError();
+  }
+
+  @override
+  Expression buildSimpleRead() => astFactory.simpleIdentifier(token);
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+}
+
 class AnalyzerUnresolvedNameGenerator extends AnalyzerExpressionGenerator
     with
         fasta.ErroneousExpressionGenerator<Expression, Statement, Arguments>,
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 9ffd99a..8cd6406 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -614,8 +614,8 @@
       ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
       Token token,
       UnlinkedDeclaration declaration) {
-    // TODO(brianwilkerson) Implement this.
-    throw new UnimplementedError();
+    return new AnalyzerUnlinkedNameGenerator(
+        helper, astFactory, token, declaration);
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index be1221a..f3cd289 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -22,6 +22,11 @@
   });
 }
 
+void dart2Failure() {
+  fail(
+      'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+}
+
 @reflectiveTest
 class ClassMemberParserTest_Forest extends FastaBodyBuilderTestCase
     with ClassMemberParserTestMixin {
@@ -627,8 +632,7 @@
   @failingTest
   void test_logicalAndExpression() {
     super.test_logicalAndExpression();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -649,22 +653,19 @@
   @failingTest
   void test_logicalOrExpression() {
     super.test_logicalOrExpression();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     super.test_logicalOrExpression_precedence_logicalAnd_left();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalOrExpression_precedence_logicalAnd_right() {
     super.test_logicalOrExpression_precedence_logicalAnd_right();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -683,13 +684,6 @@
   }
 
   @failingTest
-  void test_multipleLabels_statement() {
-    super.test_multipleLabels_statement();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
-  }
-
-  @failingTest
   void test_multiplicativeExpression_normal() {
     super.test_multiplicativeExpression_normal();
   }
@@ -1779,8 +1773,7 @@
   @failingTest
   void test_missingAssignableSelector_identifiersAssigned() {
     super.test_missingAssignableSelector_identifiersAssigned();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -1806,8 +1799,7 @@
   @failingTest
   void test_missingAssignableSelector_superPropertyAccessAssigned() {
     super.test_missingAssignableSelector_superPropertyAccessAssigned();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -2671,11 +2663,6 @@
   }
 
   @failingTest
-  void test_parseAwaitExpression() {
-    super.test_parseAwaitExpression();
-  }
-
-  @failingTest
   void test_parseBitwiseAndExpression_normal() {
     super.test_parseBitwiseAndExpression_normal();
   }
@@ -2833,8 +2820,7 @@
   @failingTest
   void test_parseConditionalExpression() {
     super.test_parseConditionalExpression();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -3086,15 +3072,13 @@
   @failingTest
   void test_parseLogicalAndExpression() {
     super.test_parseLogicalAndExpression();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_parseLogicalOrExpression() {
     super.test_parseLogicalOrExpression();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -3211,8 +3195,7 @@
   @failingTest
   void test_parsePrimaryExpression_const() {
     super.test_parsePrimaryExpression_const();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -3396,16 +3379,6 @@
   }
 
   @failingTest
-  void test_parseThrowExpression() {
-    super.test_parseThrowExpression();
-  }
-
-  @failingTest
-  void test_parseThrowExpressionWithoutCascade() {
-    super.test_parseThrowExpressionWithoutCascade();
-  }
-
-  @failingTest
   void test_parseUnaryExpression_decrement_normal() {
     super.test_parseUnaryExpression_decrement_normal();
   }
@@ -3451,11 +3424,6 @@
   }
 
   @failingTest
-  void test_parseUnaryExpression_not_normal() {
-    super.test_parseUnaryExpression_not_normal();
-  }
-
-  @failingTest
   void test_parseUnaryExpression_not_super() {
     super.test_parseUnaryExpression_not_super();
   }
@@ -4061,15 +4029,13 @@
   @failingTest
   void test_conditionalExpression_missingElse() {
     super.test_conditionalExpression_missingElse();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_conditionalExpression_missingThen() {
     super.test_conditionalExpression_missingThen();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -4160,8 +4126,7 @@
   @failingTest
   void test_incomplete_conditionalExpression() {
     super.test_incomplete_conditionalExpression();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -4342,22 +4307,19 @@
   @failingTest
   void test_logicalAndExpression_missing_LHS() {
     super.test_logicalAndExpression_missing_LHS();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalAndExpression_missing_LHS_RHS() {
     super.test_logicalAndExpression_missing_LHS_RHS();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalAndExpression_missing_RHS() {
     super.test_logicalAndExpression_missing_RHS();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -4373,36 +4335,31 @@
   @failingTest
   void test_logicalOrExpression_missing_LHS() {
     super.test_logicalOrExpression_missing_LHS();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalOrExpression_missing_LHS_RHS() {
     super.test_logicalOrExpression_missing_LHS_RHS();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalOrExpression_missing_RHS() {
     super.test_logicalOrExpression_missing_RHS();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     super.test_logicalOrExpression_precedence_logicalAnd_left();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
   void test_logicalOrExpression_precedence_logicalAnd_right() {
     super.test_logicalOrExpression_precedence_logicalAnd_right();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
+    dart2Failure();
   }
 
   @failingTest
@@ -4867,11 +4824,6 @@
   }
 
   @failingTest
-  void test_parseReturnStatement_value() {
-    super.test_parseReturnStatement_value();
-  }
-
-  @failingTest
   void test_parseStatement_function_noReturnType() {
     super.test_parseStatement_function_noReturnType();
   }
@@ -5077,31 +5029,6 @@
   }
 
   @failingTest
-  void test_parseAssertStatement() {
-    super.test_parseAssertStatement();
-  }
-
-  @failingTest
-  void test_parseAssertStatement_messageLowPrecedence() {
-    super.test_parseAssertStatement_messageLowPrecedence();
-  }
-
-  @failingTest
-  void test_parseAssertStatement_messageString() {
-    super.test_parseAssertStatement_messageString();
-  }
-
-  @failingTest
-  void test_parseAssertStatement_trailingComma_message() {
-    super.test_parseAssertStatement_trailingComma_message();
-  }
-
-  @failingTest
-  void test_parseAssertStatement_trailingComma_noMessage() {
-    super.test_parseAssertStatement_trailingComma_noMessage();
-  }
-
-  @failingTest
   void test_parseBreakStatement_noLabel() {
     super.test_parseBreakStatement_noLabel();
   }
@@ -5112,11 +5039,6 @@
   }
 
   @failingTest
-  void test_parseDoStatement() {
-    super.test_parseDoStatement();
-  }
-
-  @failingTest
   void test_parseForStatement_each_await() {
     super.test_parseForStatement_each_await();
   }
@@ -5217,28 +5139,11 @@
   }
 
   @failingTest
-  void test_parseIfStatement_else_block() {
-    super.test_parseIfStatement_else_block();
-  }
-
-  @failingTest
-  void test_parseIfStatement_else_emptyStatements() {
-    super.test_parseIfStatement_else_emptyStatements();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
-  }
-
-  @failingTest
   void test_parseIfStatement_else_statement() {
     super.test_parseIfStatement_else_statement();
   }
 
   @failingTest
-  void test_parseIfStatement_noElse_block() {
-    super.test_parseIfStatement_noElse_block();
-  }
-
-  @failingTest
   void test_parseIfStatement_noElse_statement() {
     super.test_parseIfStatement_noElse_statement();
   }
@@ -5403,18 +5308,6 @@
   }
 
   @failingTest
-  void test_parseStatement_multipleLabels() {
-    super.test_parseStatement_multipleLabels();
-    fail(
-        'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
-  }
-
-  @failingTest
-  void test_parseStatement_noLabels() {
-    super.test_parseStatement_noLabels();
-  }
-
-  @failingTest
   void test_parseStatement_singleLabel() {
     super.test_parseStatement_singleLabel();
   }
@@ -5570,11 +5463,6 @@
   }
 
   @failingTest
-  void test_parseWhileStatement() {
-    super.test_parseWhileStatement();
-  }
-
-  @failingTest
   void test_parseYieldStatement_each() {
     super.test_parseYieldStatement_each();
   }
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 350f96f..439c137 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -292,7 +292,7 @@
   @override
   Expression toValue(Object node) {
     if (node is Generator) {
-      return toExpression(node.buildSimpleRead());
+      return node.buildSimpleRead();
     } else if (node is Expression) {
       return node;
     } else if (node is PrefixBuilder) {