[cfe] Introduce a Kernel annotation builder

Introduce an annotation builder that will eventually be used to
compile Dart annotations to Kernel in outlines.

Change-Id: If882ce27b6012001c04257b867b5dcc596a72105
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103621
Commit-Queue: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Auto-Submit: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
index d3a43df..f43b4a6 100644
--- a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
@@ -4,8 +4,6 @@
 
 library fasta.metadata_builder;
 
-class MetadataBuilder {
-  final int charOffset;
-
-  MetadataBuilder(this.charOffset);
+abstract class MetadataBuilder {
+  int get charOffset;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
index afd74e5..0206595 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
@@ -34,6 +34,8 @@
 
 export 'kernel_library_builder.dart' show KernelLibraryBuilder;
 
+export 'kernel_metadata_builder.dart' show KernelMetadataBuilder;
+
 export 'kernel_mixin_application_builder.dart'
     show KernelMixinApplicationBuilder;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
new file mode 100644
index 0000000..7cfa901
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, 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.
+
+library fasta.kernel_metadata_builder;
+
+import 'kernel_builder.dart' show MetadataBuilder;
+
+import '../scanner.dart' show Token;
+
+class KernelMetadataBuilder extends MetadataBuilder {
+  final int charOffset;
+
+  KernelMetadataBuilder(Token beginToken) : charOffset = beginToken.charOffset;
+}
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 5cf43f9..43536a0 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -41,6 +41,7 @@
 // TODO(ahe): The outline isn't supposed to import kernel-specific builders.
 import '../kernel/kernel_builder.dart'
     show
+        KernelMetadataBuilder,
         KernelMixinApplicationBuilder,
         KernelNamedTypeBuilder,
         KernelTypeBuilder;
@@ -137,25 +138,17 @@
   @override
   void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
     debugEvent("Metadata");
-    List arguments = pop();
-    popIfNotNull(periodBeforeName); // charOffset.
-    String postfix = popIfNotNull(periodBeforeName);
-    List<TypeBuilder> typeArguments = pop();
-    if (arguments == null) {
-      pop(); // charOffset
-      pop(); // expression
-      push(new MetadataBuilder(beginToken.charOffset));
-    } else {
-      int charOffset = pop();
-      Object typeName = pop();
-      if (typeName is ParserRecovery) {
-        push(typeName);
-      } else {
-        library.addConstructorReference(
-            typeName, typeArguments, postfix, charOffset);
-        push(new MetadataBuilder(beginToken.charOffset));
-      }
+    pop(); // arguments
+    if (periodBeforeName != null) {
+      pop(); // offset
+      pop(); // constructor name
     }
+    pop(); // type arguments
+    pop(); // offset
+    Object sentinel = pop(); // prefix or constructor
+    push(sentinel is ParserRecovery
+        ? sentinel
+        : new KernelMetadataBuilder(beginToken));
   }
 
   @override