[Kernel] Add serializers for public names

This will enable serialization of expressions blocked on names.
Supporting private names requires a map from from serialized library
ID to library.  More generally, we need to support something like the
dill file's canonical names.

Change-Id: I7d470e6a49b167f7755d130ea6c3e543e188da65
Reviewed-on: https://dart-review.googlesource.com/c/88703
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Daniel Hillerström <hillerstrom@google.com>
Commit-Queue: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 0f55b44a..2848583 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -14,6 +14,40 @@
   String tag(T node);
 }
 
+class NameTagger implements Tagger<Name> {
+  const NameTagger();
+
+  String tag(Name name) => name.isPrivate ? "private" : "public";
+}
+
+TextSerializer<Name> publicName =
+    new Wrapped(unwrapPublicName, wrapPublicName, const DartString());
+
+String unwrapPublicName(Name name) => name.name;
+
+Name wrapPublicName(String name) => new Name(name);
+
+TextSerializer<Name> privateName = new Wrapped(unwrapPrivateName,
+    wrapPrivateName, Tuple2Serializer(const DartString(), const DartString()));
+
+Tuple2<String, String> unwrapPrivateName(Name name) {
+  return new Tuple2(name.library.importUri.toString(), name.name);
+}
+
+Name wrapPrivateName(Tuple2<String, String> tuple) {
+  // We need a map from import URI to libraries.  More generally, we will need
+  // a way to map any 'named' node to the node's reference.
+  throw UnimplementedError('deserialization of private names');
+}
+
+TextSerializer<Name> nameSerializer = new Case(const NameTagger(), [
+  "public",
+  "private",
+], [
+  publicName,
+  privateName
+]);
+
 class ExpressionTagger extends ExpressionVisitor<String>
     implements Tagger<Expression> {
   const ExpressionTagger();