Convert DeferredAccessor to DeferredAccessGenerator

Change-Id: I591895d94b051534c0151e30689d1798d803796d
Reviewed-on: https://dart-review.googlesource.com/55466
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
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 147b088..99e4b4c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -84,7 +84,7 @@
     show
         BuilderHelper,
         CalleeDesignation,
-        DeferredAccessor,
+        DeferredAccessGenerator,
         ErrorAccessor,
         FastaAccessor,
         FunctionTypeAccessor,
@@ -1415,7 +1415,7 @@
       TypeDeclarationAccessor accessor = new TypeDeclarationAccessor(
           this, token, prefix, charOffset, builder, name);
       return (prefix?.deferred == true)
-          ? new DeferredAccessor(this, token, prefix, accessor)
+          ? new DeferredAccessGenerator(this, token, prefix, accessor)
           : accessor;
     } else if (builder.isLocal) {
       if (constantContext != ConstantContext.none &&
@@ -1468,7 +1468,7 @@
       StaticAccessGenerator accessor =
           new StaticAccessGenerator(this, token, builder.target, null);
       return (prefix?.deferred == true)
-          ? new DeferredAccessor(this, token, prefix, accessor)
+          ? new DeferredAccessGenerator(this, token, prefix, accessor)
           : accessor;
     } else if (builder is PrefixBuilder) {
       if (constantContext != ConstantContext.none && builder.deferred) {
@@ -1505,7 +1505,7 @@
         }
       }
       return (prefix?.deferred == true)
-          ? new DeferredAccessor(this, token, prefix, accessor)
+          ? new DeferredAccessGenerator(this, token, prefix, accessor)
           : accessor;
     }
   }
@@ -2780,8 +2780,8 @@
     var type = pop();
     PrefixBuilder deferredPrefix;
     int checkOffset;
-    if (type is DeferredAccessor) {
-      DeferredAccessor accessor = type;
+    if (type is DeferredAccessGenerator) {
+      DeferredAccessGenerator accessor = type;
       type = accessor.accessor;
       deferredPrefix = accessor.builder;
       checkOffset = accessor.token.charOffset;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 71ed96d..e0ac25a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1253,14 +1253,22 @@
   }
 }
 
-abstract class _DeferredAccessor<Arguments> extends Accessor<Arguments> {
+class DeferredAccessGenerator<Arguments> extends Generator<Arguments> {
   final PrefixBuilder builder;
-  final Accessor accessor;
 
-  _DeferredAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper,
+  final FastaAccessor accessor;
+
+  DeferredAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
       Token token, this.builder, this.accessor)
       : super(helper, token);
 
+  String get plainNameForRead {
+    return unsupported(
+        "deferredAccessor.plainNameForRead", offsetForToken(token), uri);
+  }
+
+  String get debugName => "DeferredAccessGenerator";
+
   kernel.Expression _makeSimpleRead() {
     return helper.wrapInDeferredCheck(
         accessor._makeSimpleRead(), builder, token.charOffset);
@@ -1278,6 +1286,45 @@
         builder,
         token.charOffset);
   }
+
+  buildPropertyAccess(
+      IncompleteSend send, int operatorOffset, bool isNullAware) {
+    var propertyAccess =
+        accessor.buildPropertyAccess(send, operatorOffset, isNullAware);
+    if (propertyAccess is FastaAccessor) {
+      return new DeferredAccessGenerator(
+          helper, token, builder, propertyAccess);
+    } else {
+      kernel.Expression expression = propertyAccess;
+      return helper.wrapInDeferredCheck(expression, builder, token.charOffset);
+    }
+  }
+
+  @override
+  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+      {bool nonInstanceAccessIsError: false}) {
+    helper.addProblem(
+        templateDeferredTypeAnnotation.withArguments(
+            accessor.buildTypeWithBuiltArguments(arguments,
+                nonInstanceAccessIsError: nonInstanceAccessIsError),
+            builder.name),
+        offsetForToken(token),
+        lengthForToken(token));
+    return const InvalidType();
+  }
+
+  kernel.Expression doInvocation(int offset, Arguments arguments) {
+    return helper.wrapInDeferredCheck(
+        accessor.doInvocation(offset, arguments), builder, token.charOffset);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", builder: ");
+    sink.write(builder);
+    sink.write(", accessor: ");
+    sink.write(accessor);
+  }
 }
 
 abstract class _ReadOnlyAccessor<Arguments> extends Accessor<Arguments> {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
index 9955340..74e4545 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
@@ -780,60 +780,6 @@
   }
 }
 
-class DeferredAccessor<Arguments> extends _DeferredAccessor<Arguments>
-    with FastaAccessor<Arguments> {
-  DeferredAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper,
-      Token token, PrefixBuilder builder, FastaAccessor expression)
-      : super(helper, token, builder, expression);
-
-  String get plainNameForRead {
-    return unsupported(
-        "deferredAccessor.plainNameForRead", offsetForToken(token), uri);
-  }
-
-  String get debugName => "DeferredAccessor";
-
-  FastaAccessor get accessor => super.accessor;
-
-  buildPropertyAccess(
-      IncompleteSend send, int operatorOffset, bool isNullAware) {
-    var propertyAccess =
-        accessor.buildPropertyAccess(send, operatorOffset, isNullAware);
-    if (propertyAccess is FastaAccessor) {
-      return new DeferredAccessor(helper, token, builder, propertyAccess);
-    } else {
-      kernel.Expression expression = propertyAccess;
-      return helper.wrapInDeferredCheck(expression, builder, token.charOffset);
-    }
-  }
-
-  @override
-  DartType buildTypeWithBuiltArguments(List<DartType> arguments,
-      {bool nonInstanceAccessIsError: false}) {
-    helper.addProblem(
-        templateDeferredTypeAnnotation.withArguments(
-            accessor.buildTypeWithBuiltArguments(arguments,
-                nonInstanceAccessIsError: nonInstanceAccessIsError),
-            builder.name),
-        offsetForToken(token),
-        lengthForToken(token));
-    return const InvalidType();
-  }
-
-  kernel.Expression doInvocation(int offset, Arguments arguments) {
-    return helper.wrapInDeferredCheck(
-        accessor.doInvocation(offset, arguments), builder, token.charOffset);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", builder: ");
-    sink.write(builder);
-    sink.write(", accessor: ");
-    sink.write(accessor);
-  }
-}
-
 int adjustForImplicitCall(String name, int offset) {
   // Normally the offset is at the start of the token, but in this case,
   // because we insert a '.call', we want it at the end instead.
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 42c85c0..3fc5207 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -46,7 +46,7 @@
 
 import 'package:front_end/src/fasta/kernel/expression_generator.dart'
     show
-        DeferredAccessor,
+        DeferredAccessGenerator,
         FastaAccessor,
         IncompleteError,
         IncompletePropertyAccessor,
@@ -202,10 +202,11 @@
     check("IncompletePropertyAccessor(offset: 4, name: bar)",
         new IncompletePropertyAccessor<Arguments>(helper, token, name));
     check(
-        "DeferredAccessor(offset: 4, builder: Instance of 'PrefixBuilder',"
+        "DeferredAccessGenerator(offset: 4, "
+        "builder: Instance of 'PrefixBuilder',"
         " accessor: ThisAccessor(offset: 4, isInitializer: false,"
         " isSuper: false))",
-        new DeferredAccessor<Arguments>(
+        new DeferredAccessGenerator<Arguments>(
             helper, token, prefixBuilder, accessor));
     check("ReadOnlyAccessor(offset: 4, plainNameForRead: foo)",
         new ReadOnlyAccessor<Arguments>(helper, token, expression, "foo"));